From 2ca4dbb821bb1a6adb5fcf220c1eab235f4139d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sun, 22 Mar 2026 18:50:15 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20[=EC=9E=91=EC=97=85=EC=9E=90=ED=99=94?= =?UTF-8?q?=EB=A9=B4]=20=EC=9E=91=EC=97=85=EC=A0=95=EB=B3=B4=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20=EC=A0=84=EB=A9=B4=20=EC=9E=AC?= =?UTF-8?q?=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - saveWorkOrderField 헬퍼: API 저장 + workOrders state 동시 동기화 - 부서/담당자/생산일자 onChange → saveWorkOrderField로 통일 - workOrders state 동기화로 다른 작업지시 선택 후 돌아와도 값 유지 - useEffect: selectedSidebarOrderId 변경 시에만 workOrders state에서 로드 - 단계 완료/검사 완료/자동 완료 시 생산일자도 saveWorkOrderField 사용 --- .../production/WorkerScreen/index.tsx | 78 ++++++++++--------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/src/components/production/WorkerScreen/index.tsx b/src/components/production/WorkerScreen/index.tsx index 2c28c50d..ae210fab 100644 --- a/src/components/production/WorkerScreen/index.tsx +++ b/src/components/production/WorkerScreen/index.tsx @@ -178,6 +178,22 @@ export default function WorkerScreen() { const [departmentList, setDepartmentList] = useState([]); const [departmentUsers, setDepartmentUsers] = useState([]); + // 작업정보 변경 → API 저장 + workOrders state 동기화 + const saveWorkOrderField = useCallback((field: 'scheduled_date' | 'team_id' | 'assignee_id', value: string | number | null) => { + const orderId = selectedSidebarOrderId; + if (!orderId) return; + // API 저장 + updateWorkOrderInfo(orderId, { [field]: value }); + // workOrders state 동기화 (다른 작업지시 선택 후 돌아와도 값 유지) + setWorkOrders(prev => prev.map(wo => { + if (wo.id !== orderId) return wo; + if (field === 'scheduled_date') return { ...wo, scheduledDate: value as string }; + if (field === 'team_id') return { ...wo, teamId: value as number }; + if (field === 'assignee_id') return { ...wo, assigneeId: value as number }; + return wo; + })); + }, [selectedSidebarOrderId]); + // 좌측 사이드바 const [selectedSidebarOrderId, setSelectedSidebarOrderId] = useState(''); const [isSidebarOpen, setIsSidebarOpen] = useState(false); @@ -863,33 +879,31 @@ export default function WorkerScreen() { }, [selectedSidebarOrderId, workItems.length]); - // ===== 작업지시 변경 시 작업 정보 자동 세팅 (선택 변경 시에만) ===== - const prevSidebarOrderIdRef = useRef(null); + // ===== 작업지시 변경 시 작업 정보 자동 세팅 ===== + // selectedSidebarOrderId 변경 시 workOrders state에서 저장된 값을 로드 useEffect(() => { - // 같은 작업지시를 다시 선택한 경우 덮어쓰지 않음 (사용자 수정값 보존) - if (prevSidebarOrderIdRef.current === selectedSidebarOrderId) return; - prevSidebarOrderIdRef.current = selectedSidebarOrderId; - - const apiOrder = filteredWorkOrders.find((wo) => wo.id === selectedSidebarOrderId); - if (apiOrder) { - // 부서 세팅: 1순위 work_orders.team_id → 2순위 process.department(부서명 매칭) - if (apiOrder.teamId) { - setDepartmentId(String(apiOrder.teamId)); - } else if (apiOrder.processDepartment && departmentList.length > 0) { - const matched = departmentList.find((d) => d.name === apiOrder.processDepartment); - setDepartmentId(matched ? String(matched.id) : ''); - } else { - setDepartmentId(''); - } - // 생산담당자 세팅 - setProductionManagerId(apiOrder.assigneeId ? String(apiOrder.assigneeId) : ''); - // 생산일자 세팅 - setProductionDate(apiOrder.scheduledDate || ''); - } else { + if (!selectedSidebarOrderId) { setDepartmentId(''); setProductionManagerId(''); setProductionDate(''); + return; } + const apiOrder = workOrders.find((wo) => wo.id === selectedSidebarOrderId); + if (!apiOrder) return; + + // 부서 세팅: 1순위 work_orders.team_id → 2순위 process.department(부서명 매칭) + if (apiOrder.teamId) { + setDepartmentId(String(apiOrder.teamId)); + } else if (apiOrder.processDepartment && departmentList.length > 0) { + const matched = departmentList.find((d) => d.name === apiOrder.processDepartment); + setDepartmentId(matched ? String(matched.id) : ''); + } else { + setDepartmentId(''); + } + // 생산담당자 세팅 + setProductionManagerId(apiOrder.assigneeId ? String(apiOrder.assigneeId) : ''); + // 생산일자 세팅 + setProductionDate(apiOrder.scheduledDate || ''); // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedSidebarOrderId]); @@ -1048,15 +1062,15 @@ export default function WorkerScreen() { if (result.data.is_completed && !productionDate) { const today = new Date().toISOString().slice(0, 10); setProductionDate(today); - updateWorkOrderInfo(orderId, { scheduled_date: today }); + saveWorkOrderField('scheduled_date', today); } // 모든 단계 완료 시 작업지시 자동 완료 → 생산일자 저장 + 목록 새로고침 if (result.data.work_order_status_changed) { toast.success('모든 공정 단계 완료 — 작업지시가 자동 완료되었습니다.'); const today = new Date().toISOString().slice(0, 10); - await updateWorkOrderInfo(orderId, { scheduled_date: today }); setProductionDate(today); + saveWorkOrderField('scheduled_date', today); try { const refreshResult = await getMyWorkOrders(); if (refreshResult.success) setWorkOrders(refreshResult.data); @@ -1384,10 +1398,10 @@ export default function WorkerScreen() { setStepCompletionMap((prev) => ({ ...prev, [buildStepKey(stepName)]: true })); } // 4. 생산일자 자동 저장 (검사 완료 시점 = 생산일자) - if (selectedOrder) { + { const today = new Date().toISOString().slice(0, 10); - await updateWorkOrderInfo(selectedOrder.id, { scheduled_date: today }); setProductionDate(today); + saveWorkOrderField('scheduled_date', today); } // 5. 작업 목록 리프레시 (상태 변경 반영 → 사이드바 대기/완료 탭 갱신) @@ -1596,9 +1610,7 @@ export default function WorkerScreen() { value={departmentId} onValueChange={(v) => { setDepartmentId(v); - if (selectedOrder && v) { - updateWorkOrderInfo(selectedOrder.id, { team_id: Number(v) }); - } + if (v) saveWorkOrderField('team_id', Number(v)); }} > @@ -1620,9 +1632,7 @@ export default function WorkerScreen() { value={productionManagerId} onValueChange={(v) => { setProductionManagerId(v); - if (selectedOrder && v) { - updateWorkOrderInfo(selectedOrder.id, { assignee_id: Number(v) }); - } + if (v) saveWorkOrderField('assignee_id', Number(v)); }} disabled={!departmentId} > @@ -1644,9 +1654,7 @@ export default function WorkerScreen() { value={productionDate} onChange={(date) => { setProductionDate(date); - if (selectedOrder && date) { - updateWorkOrderInfo(selectedOrder.id, { scheduled_date: date }); - } + if (date) saveWorkOrderField('scheduled_date', date); }} />