From de2b7dd6ce934312bf50be9d7c22bb66d8ac5847 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Tue, 10 Feb 2026 20:13:11 +0900 Subject: [PATCH] =?UTF-8?q?fix(WEB):=20=EC=9E=91=EC=97=85=EC=A7=80?= =?UTF-8?q?=EC=8B=9C=20=EC=83=81=EC=84=B8/=EC=9E=91=EC=97=85=EC=9E=90=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EA=B0=9C=EC=86=8C(=EC=B8=B5/=EB=B6=80?= =?UTF-8?q?=ED=98=B8)=20=ED=91=9C=EC=8B=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WorkOrderDetail: 개소 그룹핑을 order_node_id → floor_code/symbol_code 기반으로 변경 - WorkerScreen: 아이템 그룹핑을 floor_code/symbol_code 기반으로 변경, '미지정' 라벨 제거 - types.ts: source_order_item에 floor_code/symbol_code 필드 추가, floorCode 변환 로직 적용 --- .../production/WorkOrders/WorkOrderDetail.tsx | 11 ++++++----- src/components/production/WorkOrders/types.ts | 4 +++- src/components/production/WorkerScreen/actions.ts | 11 ++++++++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/components/production/WorkOrders/WorkOrderDetail.tsx b/src/components/production/WorkOrders/WorkOrderDetail.tsx index 1456b607..b381992d 100644 --- a/src/components/production/WorkOrders/WorkOrderDetail.tsx +++ b/src/components/production/WorkOrders/WorkOrderDetail.tsx @@ -511,12 +511,13 @@ export function WorkOrderDetail({ orderId }: WorkOrderDetailProps) { {(() => { - // 개소별로 그룹화 - const nodeGroups = new Map(); + // 개소(층/부호)별로 그룹화 + const nodeGroups = new Map(); for (const item of order.items) { - const key = item.orderNodeId != null ? String(item.orderNodeId) : 'none'; + const key = item.floorCode !== '-' ? item.floorCode : (item.orderNodeId != null ? String(item.orderNodeId) : 'none'); + const label = item.floorCode !== '-' ? item.floorCode : item.orderNodeName; if (!nodeGroups.has(key)) { - nodeGroups.set(key, { nodeName: item.orderNodeName, items: [] }); + nodeGroups.set(key, { label, items: [] }); } nodeGroups.get(key)!.items.push(item); } @@ -528,7 +529,7 @@ export function WorkOrderDetail({ orderId }: WorkOrderDetailProps) { {idx === 0 && ( - {group.nodeName} + {group.label} )} {item.productName} diff --git a/src/components/production/WorkOrders/types.ts b/src/components/production/WorkOrders/types.ts index 5ae206a6..b220ac41 100644 --- a/src/components/production/WorkOrders/types.ts +++ b/src/components/production/WorkOrders/types.ts @@ -258,6 +258,8 @@ export interface WorkOrderItemApi { source_order_item?: { id: number; order_node_id: number | null; + floor_code?: string | null; + symbol_code?: string | null; node?: { id: number; name: string; @@ -452,7 +454,7 @@ export function transformApiToFrontend(api: WorkOrderApi): WorkOrder { no: idx + 1, status: (item.status as ItemStatus) || 'waiting', productName: item.item_name, - floorCode: '-', + floorCode: [item.source_order_item?.floor_code, item.source_order_item?.symbol_code].filter(Boolean).join('/') || '-', specification: item.specification || '-', quantity: item.quantity, unit: item.unit || '-', diff --git a/src/components/production/WorkerScreen/actions.ts b/src/components/production/WorkerScreen/actions.ts index d9a72b2a..aba72e41 100644 --- a/src/components/production/WorkerScreen/actions.ts +++ b/src/components/production/WorkerScreen/actions.ts @@ -46,6 +46,8 @@ interface WorkOrderApiItem { source_order_item?: { id: number; order_node_id: number | null; + floor_code?: string | null; + symbol_code?: string | null; node?: { id: number; name: string; code: string } | null; } | null; }[]; @@ -111,12 +113,15 @@ function transformToWorkerScreenFormat(api: WorkOrderApiItem): WorkOrder { processInfo = { code: rawProcessCode || 'unknown', name: rawProcessName || '알수없음' }; } - // 아이템을 개소(node)별로 그룹핑 + // 아이템을 개소(floor_code/symbol_code)별로 그룹핑 const nodeMap = new Map(); for (const item of (api.items || [])) { const nodeId = item.source_order_item?.order_node_id ?? null; - const nodeName = item.source_order_item?.node?.name || '미지정'; - const key = nodeId != null ? String(nodeId) : 'unassigned'; + const floorCode = item.source_order_item?.floor_code; + const symbolCode = item.source_order_item?.symbol_code; + const floorLabel = [floorCode, symbolCode].filter(Boolean).join('/'); + const nodeName = floorLabel || item.source_order_item?.node?.name || '미지정'; + const key = floorLabel || (nodeId != null ? String(nodeId) : `unassigned-${item.id}`); if (!nodeMap.has(key)) { nodeMap.set(key, { nodeId, nodeName, items: [] }); }