feat: [작업자화면] 부서/담당자/생산일자 onChange 자동 저장

- updateWorkOrderInfo: 범용 작업정보 업데이트 API (scheduled_date + team_id + assignee_id)
- 부서 변경 → team_id 즉시 저장
- 담당자 변경 → assignee_id 즉시 저장
- 생산일자 변경 → scheduled_date 즉시 저장
- selectedOrder 변경 시 저장된 담당자(assigneeId) 복원
- WorkOrder 타입에 assigneeId 필드 추가
This commit is contained in:
김보곤
2026-03-22 18:21:39 +09:00
parent 39ff4b2984
commit 255e0be370
3 changed files with 29 additions and 10 deletions

View File

@@ -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)

View File

@@ -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 };
}

View File

@@ -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() {
<Select
key={`dept-${departmentId}`}
value={departmentId}
onValueChange={setDepartmentId}
onValueChange={(v) => {
setDepartmentId(v);
if (selectedOrder && v) {
updateWorkOrderInfo(selectedOrder.id, { team_id: Number(v) });
}
}}
>
<SelectTrigger>
<SelectValue placeholder="선택" />
@@ -1596,7 +1603,12 @@ export default function WorkerScreen() {
<Select
key={`manager-${departmentId}-${productionManagerId}`}
value={productionManagerId}
onValueChange={setProductionManagerId}
onValueChange={(v) => {
setProductionManagerId(v);
if (selectedOrder && v) {
updateWorkOrderInfo(selectedOrder.id, { assignee_id: Number(v) });
}
}}
disabled={!departmentId}
>
<SelectTrigger>
@@ -1615,7 +1627,12 @@ export default function WorkerScreen() {
<Label className="text-sm text-gray-600"></Label>
<DatePicker
value={productionDate}
onChange={(date) => setProductionDate(date)}
onChange={(date) => {
setProductionDate(date);
if (selectedOrder && date) {
updateWorkOrderInfo(selectedOrder.id, { scheduled_date: date });
}
}}
/>
</div>
</div>