diff options
| author | joonhoekim <26rote@gmail.com> | 2025-11-02 17:49:22 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-11-02 17:49:22 +0900 |
| commit | 503ff56f5471818472eeb44b74cb35c4f977e6d1 (patch) | |
| tree | 56be6b2773e6025cf0bfedef9319f44a6ec2ce58 /lib | |
| parent | 9694acd0ec21b3f50a8bd65d3a328befd85cbbee (diff) | |
(김준회) dolce: GTT(B4) 건수 계산을 현재 페이지가 아닌 DB 기준으로 변경
Diffstat (limited to 'lib')
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"> |
