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:
@@ -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)
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user