From b87b94860bc4bfc8fd541a09fed6577805d81759 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Fri, 13 Mar 2026 23:46:55 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[worker-screen]=20=ED=94=84=EB=A1=A0?= =?UTF-8?q?=ED=8A=B8=20=EA=B0=80=EC=A7=9C=20LOT=20=EC=A0=9C=EA=B1=B0,=20?= =?UTF-8?q?=EB=B0=B1=EC=97=94=EB=93=9C=20=EC=8B=A4=EC=A0=9C=20LOT=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - actions.ts: 하드코딩 LOT(-01) 제거 → API 응답 lot_no 사용 - index.tsx: API 호출 후 실제 LOT으로 완료 다이얼로그 표시하도록 흐름 변경 --- .../production/WorkerScreen/actions.ts | 3 ++- .../production/WorkerScreen/index.tsx | 27 +++++++++---------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/components/production/WorkerScreen/actions.ts b/src/components/production/WorkerScreen/actions.ts index 6dc3ab90..04726d6e 100644 --- a/src/components/production/WorkerScreen/actions.ts +++ b/src/components/production/WorkerScreen/actions.ts @@ -243,7 +243,8 @@ export async function completeWorkOrder( errorMessage: '작업 완료 처리에 실패했습니다.', }); if (!result.success) return { success: false, error: result.error }; - const lotNo = `KD-SA-${new Date().toISOString().slice(2, 10).replace(/-/g, '')}-01`; + // 백엔드에서 생성한 실제 LOT 번호 사용 + const lotNo = result.data?.lot_no || null; return { success: true, lotNo }; } diff --git a/src/components/production/WorkerScreen/index.tsx b/src/components/production/WorkerScreen/index.tsx index 66dfbde7..f09ae389 100644 --- a/src/components/production/WorkerScreen/index.tsx +++ b/src/components/production/WorkerScreen/index.tsx @@ -1016,18 +1016,10 @@ export default function WorkerScreen() { setIsMaterialModalOpen(true); }, []); - // MaterialInputModal 완료 후 → 작업 완료 결과 팝업 - const handleWorkCompletion = useCallback(() => { + // MaterialInputModal 완료 후 → API 완료 처리 → 결과 팝업 + const handleWorkCompletion = useCallback(async () => { if (!selectedOrder) return; - const lotNo = `KD-SA-${new Date().toISOString().slice(2, 10).replace(/-/g, '')}-01`; - setCompletionLotNo(lotNo); - setIsCompletionResultOpen(true); setIsCompletionFlow(false); - }, [selectedOrder]); - - // 완료 결과 팝업 확인 → API 완료 처리 - const handleCompletionResultConfirm = useCallback(async () => { - if (!selectedOrder) return; try { const materials = inputMaterialsMap.get(selectedOrder.id); @@ -1041,7 +1033,9 @@ export default function WorkerScreen() { ); if (result.success) { - toast.success('작업이 완료되었습니다.'); + // 백엔드에서 받은 실제 LOT 번호로 결과 팝업 표시 + setCompletionLotNo(result.lotNo || ''); + setIsCompletionResultOpen(true); setInputMaterialsMap((prev) => { const next = new Map(prev); next.delete(selectedOrder.id); @@ -1053,14 +1047,17 @@ export default function WorkerScreen() { } } catch (error) { if (isNextRedirectError(error)) throw error; - console.error('[WorkerScreen] handleCompletionResultConfirm error:', error); + console.error('[WorkerScreen] handleWorkCompletion error:', error); toast.error('작업 완료 중 오류가 발생했습니다.'); - } finally { - setSelectedOrder(null); - setCompletionLotNo(''); } }, [selectedOrder, inputMaterialsMap]); + // 완료 결과 팝업 확인 → 상태 정리 + const handleCompletionResultConfirm = useCallback(() => { + setSelectedOrder(null); + setCompletionLotNo(''); + }, []); + // 하단 버튼용 합성 WorkOrder (사이드바 선택 우선, 없으면 첫 번째, 그래도 없으면 목업 폴백) const getTargetOrder = useCallback((): WorkOrder | null => { // 사이드바에서 선택된 작업지시 우선