feat(WEB): 작업자 화면 부서/담당자/생산일자 API 연동 및 사원관리 날짜필터 개선
- 작업자 화면 작업정보 부서: 하드코딩 → 테넌트 부서 목록 동적 로드 (getDepartments API) - 작업자 화면 작업정보 생산담당자: 선택된 부서별 사용자 목록 연동 (getDepartmentUsers API) - 작업자 화면 작업정보 생산일자: scheduled_date 필드 조회 연동 - 작업지시 선택 시 공정 담당부서(process.department) 기반 부서 자동 세팅 - 사이드바 자동 선택 시 API 작업지시 우선 선택 (목업보다 우선) - 사원관리 초기 진입 시 날짜 필터 기본값 제거 (전체 기간 조회)
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
|
||||
|
||||
import { executeServerAction } from '@/lib/api/execute-server-action';
|
||||
import { buildApiUrl } from '@/lib/api/query-params';
|
||||
import type { WorkOrder, WorkOrderStatus } from '../ProductionDashboard/types';
|
||||
import type { WorkItemData, WorkStepData, ProcessTab } from './types';
|
||||
|
||||
@@ -40,7 +41,10 @@ interface WorkOrderApiItem {
|
||||
client?: { id: number; name: string };
|
||||
root_nodes_count?: number;
|
||||
};
|
||||
team_id?: number | null;
|
||||
team?: { id: number; name: string } | null;
|
||||
assignee?: { id: number; name: string };
|
||||
assignees?: { id: number; user_id: number; user?: { id: number; name: string } }[];
|
||||
items?: {
|
||||
id: number;
|
||||
item_name: string;
|
||||
@@ -172,7 +176,9 @@ function transformToWorkerScreenFormat(api: WorkOrderApiItem): WorkOrder {
|
||||
processName: processInfo.name,
|
||||
client: api.sales_order?.client?.name || '-',
|
||||
projectName: api.project_name || '-',
|
||||
assignees: api.assignee ? [api.assignee.name] : [],
|
||||
assignees: api.assignees?.length
|
||||
? api.assignees.map((a) => a.user?.name || '').filter(Boolean)
|
||||
: api.assignee ? [api.assignee.name] : [],
|
||||
quantity: totalQuantity,
|
||||
shutterCount: nodeGroups.length || api.sales_order?.root_nodes_count || 0,
|
||||
dueDate,
|
||||
@@ -183,6 +189,10 @@ function transformToWorkerScreenFormat(api: WorkOrderApiItem): WorkOrder {
|
||||
delayDays,
|
||||
instruction: api.memo || undefined,
|
||||
salesOrderNo: api.sales_order?.order_no || undefined,
|
||||
teamId: api.team_id ?? null,
|
||||
teamName: api.team?.name || undefined,
|
||||
processDepartment: api.process?.department || undefined,
|
||||
scheduledDate: api.scheduled_date || undefined,
|
||||
createdAt: api.created_at,
|
||||
processOptions: {
|
||||
needsInspection: api.process?.options?.needs_inspection ?? false,
|
||||
@@ -782,4 +792,52 @@ export async function saveInspectionDocument(
|
||||
errorMessage: '검사 문서 동기화에 실패했습니다.',
|
||||
});
|
||||
return { success: result.success, data: result.data, error: result.error };
|
||||
}
|
||||
|
||||
// ===== 부서 목록 조회 (작업 정보용) =====
|
||||
export interface DepartmentOption {
|
||||
id: number;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export async function getDepartments(): Promise<{
|
||||
success: boolean;
|
||||
data: DepartmentOption[];
|
||||
error?: string;
|
||||
}> {
|
||||
interface DeptApiItem { id: number; name: string; parent_id?: number | null; [key: string]: unknown }
|
||||
const result = await executeServerAction<{ data: DeptApiItem[] } | DeptApiItem[]>({
|
||||
url: buildApiUrl('/api/v1/departments', { per_page: 100 }),
|
||||
errorMessage: '부서 목록 조회에 실패했습니다.',
|
||||
});
|
||||
if (!result.success || !result.data) return { success: false, data: [], error: result.error };
|
||||
const list = Array.isArray(result.data) ? result.data : (result.data.data || []);
|
||||
return {
|
||||
success: true,
|
||||
data: list.map((d) => ({ id: d.id, name: d.name })),
|
||||
};
|
||||
}
|
||||
|
||||
// ===== 부서별 사용자 목록 조회 =====
|
||||
export interface DepartmentUser {
|
||||
id: number;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export async function getDepartmentUsers(departmentId: number): Promise<{
|
||||
success: boolean;
|
||||
data: DepartmentUser[];
|
||||
error?: string;
|
||||
}> {
|
||||
interface UserApiItem { id: number; name: string; [key: string]: unknown }
|
||||
const result = await executeServerAction<{ data: UserApiItem[] } | UserApiItem[]>({
|
||||
url: buildApiUrl(`/api/v1/departments/${departmentId}/users`),
|
||||
errorMessage: '부서 사용자 목록 조회에 실패했습니다.',
|
||||
});
|
||||
if (!result.success || !result.data) return { success: false, data: [], error: result.error };
|
||||
const list = Array.isArray(result.data) ? result.data : (result.data.data || []);
|
||||
return {
|
||||
success: true,
|
||||
data: list.map((u) => ({ id: u.id, name: u.name })),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user