summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-11-02 17:49:22 +0900
committerjoonhoekim <26rote@gmail.com>2025-11-02 17:49:22 +0900
commit503ff56f5471818472eeb44b74cb35c4f977e6d1 (patch)
tree56be6b2773e6025cf0bfedef9319f44a6ec2ce58 /lib
parent9694acd0ec21b3f50a8bd65d3a328befd85cbbee (diff)
(김준회) dolce: GTT(B4) 건수 계산을 현재 페이지가 아닌 DB 기준으로 변경
Diffstat (limited to 'lib')
-rw-r--r--lib/vendor-document-list/enhanced-document-service.ts68
-rw-r--r--lib/vendor-document-list/ship/enhanced-doc-table-columns.tsx2
-rw-r--r--lib/vendor-document-list/ship/enhanced-documents-table.tsx41
3 files changed, 54 insertions, 57 deletions
diff --git a/lib/vendor-document-list/enhanced-document-service.ts b/lib/vendor-document-list/enhanced-document-service.ts
index 43eea6eb..e5cce1b1 100644
--- a/lib/vendor-document-list/enhanced-document-service.ts
+++ b/lib/vendor-document-list/enhanced-document-service.ts
@@ -1139,38 +1139,50 @@ export async function getDocumentDetails(documentId: number) {
const companyId = session?.user?.companyId;
- if (!companyId) {
- return { stats: {}, totalDocuments: 0, primaryDrawingKind: null }
- }
+ if (!companyId) {
+ return { stats: {}, totalDocuments: 0, primaryDrawingKind: null, b4Stats: { gttDeliverableCount: 0, shiInputCount: 0 } }
+ }
- // DrawingKind별 통계 조회
- const documents = await db
- .select({
- drawingKind: simplifiedDocumentsView.drawingKind,
- })
- .from(simplifiedDocumentsView)
- .where(eq(simplifiedDocumentsView.vendorId, Number(companyId)))
-
- // 통계 계산
- const stats = documents.reduce((acc, doc) => {
- if (doc.drawingKind) {
- acc[doc.drawingKind] = (acc[doc.drawingKind] || 0) + 1
- }
- return acc
- }, {} as Record<string, number>)
-
- // 가장 많은 DrawingKind 찾기
- const primaryDrawingKind = Object.entries(stats)
- .sort(([,a], [,b]) => b - a)[0]?.[0] as 'B3' | 'B4' | 'B5' | undefined
-
- return {
- stats,
- totalDocuments: documents.length,
- primaryDrawingKind: primaryDrawingKind || null
+ // DrawingKind별 통계 조회 (B4의 경우 drawingMoveGbn도 함께 조회)
+ const documents = await db
+ .select({
+ drawingKind: simplifiedDocumentsView.drawingKind,
+ drawingMoveGbn: simplifiedDocumentsView.drawingMoveGbn,
+ })
+ .from(simplifiedDocumentsView)
+ .where(eq(simplifiedDocumentsView.vendorId, Number(companyId)))
+
+ // 통계 계산
+ const stats = documents.reduce((acc, doc) => {
+ if (doc.drawingKind) {
+ acc[doc.drawingKind] = (acc[doc.drawingKind] || 0) + 1
}
+ return acc
+ }, {} as Record<string, number>)
+
+ // B4 세부 통계 계산 (GTT Deliverable vs SHI Input)
+ const b4Stats = {
+ gttDeliverableCount: documents.filter(doc =>
+ doc.drawingKind === 'B4' && doc.drawingMoveGbn === '도면입수'
+ ).length,
+ shiInputCount: documents.filter(doc =>
+ doc.drawingKind === 'B4' && doc.drawingMoveGbn === '도면제출'
+ ).length,
+ }
+
+ // 가장 많은 DrawingKind 찾기
+ const primaryDrawingKind = Object.entries(stats)
+ .sort(([,a], [,b]) => b - a)[0]?.[0] as 'B3' | 'B4' | 'B5' | undefined
+
+ return {
+ stats,
+ totalDocuments: documents.length,
+ primaryDrawingKind: primaryDrawingKind || null,
+ b4Stats, // B4 세부 통계 추가
+ }
} catch (err) {
console.error("Error fetching user vendor document stats:", err)
- return { stats: {}, totalDocuments: 0, primaryDrawingKind: null }
+ return { stats: {}, totalDocuments: 0, primaryDrawingKind: null, b4Stats: { gttDeliverableCount: 0, shiInputCount: 0 } }
}
}
diff --git a/lib/vendor-document-list/ship/enhanced-doc-table-columns.tsx b/lib/vendor-document-list/ship/enhanced-doc-table-columns.tsx
index 096f9b24..882ef885 100644
--- a/lib/vendor-document-list/ship/enhanced-doc-table-columns.tsx
+++ b/lib/vendor-document-list/ship/enhanced-doc-table-columns.tsx
@@ -32,7 +32,7 @@ import { SimplifiedDocumentsView } from "@/db/schema"
import { DocumentSelectionContext } from "@/components/ship-vendor-document/user-vendor-document-table-container"
interface GetColumnsProps {
- setRowAction: React.Dispatch<React.SetStateAction<DataTableRowAction<SimplifiedDocumentsView> | null>>
+ setRowAction?: React.Dispatch<React.SetStateAction<DataTableRowAction<SimplifiedDocumentsView> | null>>
}
// 날짜 표시 컴포넌트 (간단 버전)
diff --git a/lib/vendor-document-list/ship/enhanced-documents-table.tsx b/lib/vendor-document-list/ship/enhanced-documents-table.tsx
index cae0fe06..dabb05bb 100644
--- a/lib/vendor-document-list/ship/enhanced-documents-table.tsx
+++ b/lib/vendor-document-list/ship/enhanced-documents-table.tsx
@@ -4,17 +4,14 @@
import React from "react"
import type {
DataTableAdvancedFilterField,
- DataTableFilterField,
- DataTableRowAction,
} from "@/types/table"
import { useDataTable } from "@/hooks/use-data-table"
import { getUserVendorDocuments, getUserVendorDocumentStats } from "@/lib/vendor-document-list/enhanced-document-service"
import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar"
-import { toast } from "sonner"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
-import { FileText, FileInput, FileOutput, FolderOpen, Building2 } from "lucide-react"
+import { FileText, FileInput, FileOutput, Building2 } from "lucide-react"
import { Label } from "@/components/ui/label"
import { DataTable } from "@/components/data-table/data-table"
@@ -67,8 +64,11 @@ export function SimplifiedDocumentsTable({
const [documentResult, statsResult] = promiseResults
// 🔥 데이터 구조분해를 메모이제이션
- const { data, pageCount, total, drawingKind, vendorInfo } = React.useMemo(() => documentResult, [documentResult])
- const { stats, totalDocuments, primaryDrawingKind } = React.useMemo(() => statsResult, [statsResult])
+ const documentData = React.useMemo(() => documentResult as Awaited<ReturnType<typeof getUserVendorDocuments>>, [documentResult])
+ const statsData = React.useMemo(() => statsResult as Awaited<ReturnType<typeof getUserVendorDocumentStats>>, [statsResult])
+
+ const { data, pageCount, drawingKind } = documentData
+ const { primaryDrawingKind, b4Stats: serverB4Stats } = statsData
// 🔥 B4 필터 상태 추가
const [b4FilterType, setB4FilterType] = React.useState<'all' | 'gtt_deliverable' | 'shi_input'>('all')
@@ -98,7 +98,7 @@ export function SimplifiedDocumentsTable({
// 🔥 B4 및 Project Code 필터링된 데이터 메모이제이션
const filteredData = React.useMemo(() => {
- let result = data
+ let result: SimplifiedDocumentsView[] = data
// B4 필터 적용
if (b4FilterType !== 'all') {
@@ -126,15 +126,9 @@ export function SimplifiedDocumentsTable({
}
}, [filteredData, handleDataLoaded])
- // 🔥 상태들을 안정적으로 관리
- const [rowAction, setRowAction] = React.useState<DataTableRowAction<SimplifiedDocumentsView> | null>(null)
- const [expandedRows] = React.useState<Set<string>>(() => new Set())
-
// 🔥 컬럼 메모이제이션 최적화
const columns = React.useMemo(
- () => getSimplifiedDocumentColumns({
- setRowAction,
- }),
+ () => getSimplifiedDocumentColumns({}),
[]
)
@@ -284,7 +278,7 @@ export function SimplifiedDocumentsTable({
// 🔥 테이블 초기 상태 메모이제이션
const tableInitialState = React.useMemo(() => ({
- sorting: [{ id: "createdAt", desc: true }],
+ sorting: [{ id: "createdAt" as const, desc: true }],
columnPinning: { right: ["actions"] },
}), [])
@@ -314,20 +308,11 @@ export function SimplifiedDocumentsTable({
return activeDrawingKind ? DRAWING_KIND_INFO[activeDrawingKind] : null
}, [activeDrawingKind])
- // 🔥 B4 문서 통계 계산
+ // 🔥 B4 문서 통계 - 서버에서 받아온 전체 통계 사용
const b4Stats = React.useMemo(() => {
- if (!hasB4Documents) return null
-
- const gttDeliverableCount = data.filter(doc =>
- doc.drawingKind === 'B4' && doc.drawingMoveGbn === '도면입수'
- ).length
-
- const shiInputCount = data.filter(doc =>
- doc.drawingKind === 'B4' && doc.drawingMoveGbn === '도면제출'
- ).length
-
- return { gttDeliverableCount, shiInputCount }
- }, [data, hasB4Documents])
+ if (!hasB4Documents || !serverB4Stats) return null
+ return serverB4Stats
+ }, [hasB4Documents, serverB4Stats])
return (
<div className="w-full space-y-4">