From 255e0be37040f260bda5d7519d74088d4e3f3236 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:21:39 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20[=EC=9E=91=EC=97=85=EC=9E=90=ED=99=94?= =?UTF-8?q?=EB=A9=B4]=20=EB=B6=80=EC=84=9C/=EB=8B=B4=EB=8B=B9=EC=9E=90/?= =?UTF-8?q?=EC=83=9D=EC=82=B0=EC=9D=BC=EC=9E=90=20onChange=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - updateWorkOrderInfo: 범용 작업정보 업데이트 API (scheduled_date + team_id + assignee_id) - 부서 변경 → team_id 즉시 저장 - 담당자 변경 → assignee_id 즉시 저장 - 생산일자 변경 → scheduled_date 즉시 저장 - selectedOrder 변경 시 저장된 담당자(assigneeId) 복원 - WorkOrder 타입에 assigneeId 필드 추가 --- .../production/ProductionDashboard/types.ts | 1 + .../production/WorkerScreen/actions.ts | 11 ++++---- .../production/WorkerScreen/index.tsx | 27 +++++++++++++++---- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/components/production/ProductionDashboard/types.ts b/src/components/production/ProductionDashboard/types.ts index 267b232c..87903135 100644 --- a/src/components/production/ProductionDashboard/types.ts +++ b/src/components/production/ProductionDashboard/types.ts @@ -33,6 +33,7 @@ export interface WorkOrder { salesOrderNo?: string; // 수주번호 salesManager?: string; // 수주 담당자 (orders.options.manager_name) managerPhone?: string; // 담당자 연락처 (orders.client_contact) + assigneeId?: number | null; // 주 담당자 ID (work_orders.assignee_id) teamId?: number | null; // 배정 부서 ID (work_orders.team_id) teamName?: string; // 배정 부서명 processDepartment?: string; // 공정 담당부서명 (processes.department) diff --git a/src/components/production/WorkerScreen/actions.ts b/src/components/production/WorkerScreen/actions.ts index 084b6644..ac554c95 100644 --- a/src/components/production/WorkerScreen/actions.ts +++ b/src/components/production/WorkerScreen/actions.ts @@ -200,6 +200,7 @@ function transformToWorkerScreenFormat(api: WorkOrderApiItem): WorkOrder { salesOrderNo: api.sales_order?.order_no || undefined, salesManager: api.sales_order?.options?.manager_name as string || undefined, managerPhone: api.sales_order?.client_contact || undefined, + assigneeId: api.assignee?.id ?? null, teamId: api.team_id ?? null, teamName: api.team?.name || undefined, processDepartment: api.process?.department || undefined, @@ -251,16 +252,16 @@ export async function completeWorkOrder( return { success: true, lotNo }; } -// ===== 작업지시 생산일자 업데이트 ===== -export async function updateWorkOrderScheduledDate( +// ===== 작업지시 작업정보 업데이트 (생산일자/부서/담당자) ===== +export async function updateWorkOrderInfo( id: string, - scheduledDate: string + data: { scheduled_date?: string; team_id?: number | null; assignee_id?: number | null } ): Promise<{ success: boolean; error?: string }> { const result = await executeServerAction({ url: `${API_URL}/api/v1/work-orders/${id}`, method: 'PUT', - body: { scheduled_date: scheduledDate }, - errorMessage: '생산일자 저장에 실패했습니다.', + body: data, + errorMessage: '작업정보 저장에 실패했습니다.', }); return { success: result.success, error: result.error }; } diff --git a/src/components/production/WorkerScreen/index.tsx b/src/components/production/WorkerScreen/index.tsx index 5a4a2eaa..10ffea83 100644 --- a/src/components/production/WorkerScreen/index.tsx +++ b/src/components/production/WorkerScreen/index.tsx @@ -49,7 +49,7 @@ import { Button } from '@/components/ui/button'; import { PageLayout } from '@/components/organisms/PageLayout'; import { cn } from '@/lib/utils'; import { toast } from 'sonner'; -import { getMyWorkOrders, completeWorkOrder, saveItemInspection, getWorkOrderInspectionData, saveInspectionDocument, getInspectionTemplate, getStepProgress, toggleStepProgress, deleteMaterialInput, updateMaterialInput, getDepartments, getDepartmentUsers, updateWorkOrderScheduledDate } from './actions'; +import { getMyWorkOrders, completeWorkOrder, saveItemInspection, getWorkOrderInspectionData, saveInspectionDocument, getInspectionTemplate, getStepProgress, toggleStepProgress, deleteMaterialInput, updateMaterialInput, getDepartments, getDepartmentUsers, updateWorkOrderInfo } from './actions'; import type { StepProgressItem, DepartmentOption, DepartmentUser } from './actions'; import type { InspectionTemplateData } from './types'; import { getProcessList } from '@/components/process-management/actions'; @@ -876,6 +876,8 @@ export default function WorkerScreen() { } else { setDepartmentId(''); } + // 생산담당자 세팅 + setProductionManagerId(apiOrder.assigneeId ? String(apiOrder.assigneeId) : ''); // 생산일자 세팅 setProductionDate(apiOrder.scheduledDate || ''); } else { @@ -1369,7 +1371,7 @@ export default function WorkerScreen() { // 4. 생산일자 자동 저장 (검사 완료 시점 = 생산일자) if (selectedOrder) { const today = new Date().toISOString().slice(0, 10); - await updateWorkOrderScheduledDate(selectedOrder.id, today); + await updateWorkOrderInfo(selectedOrder.id, { scheduled_date: today }); setProductionDate(today); } @@ -1577,7 +1579,12 @@ export default function WorkerScreen() { { + setProductionManagerId(v); + if (selectedOrder && v) { + updateWorkOrderInfo(selectedOrder.id, { assignee_id: Number(v) }); + } + }} disabled={!departmentId} > @@ -1615,7 +1627,12 @@ export default function WorkerScreen() { setProductionDate(date)} + onChange={(date) => { + setProductionDate(date); + if (selectedOrder && date) { + updateWorkOrderInfo(selectedOrder.id, { scheduled_date: date }); + } + }} />