fix(WEB): 작업일지 담당자 정보 및 슬랫 데이터 파이프라인 연동

- 작업일지(스크린/슬랫/절곡): 담당자→수주담당자, 연락처→담당자연락처, 생산담당자 분리 표시
- SlatWorkLogContent: 방화유리 수량을 slatInfo.glassQty에서 표시
- SlatInfo 타입에 glassQty 추가 (WorkOrders/types, WorkerScreen/types)
- WorkerScreen: salesManager/managerPhone API 연동
- slat_info 변환 로직에 glass_qty 매핑 추가
This commit is contained in:
2026-02-19 20:59:02 +09:00
parent 5b987d057b
commit f695977cbc
9 changed files with 87 additions and 48 deletions

View File

@@ -39,6 +39,8 @@ interface WorkOrderApiItem {
id: number;
order_no: string;
client?: { id: number; name: string };
client_contact?: string;
options?: { manager_name?: string; [key: string]: unknown };
root_nodes_count?: number;
};
team_id?: number | null;
@@ -189,6 +191,8 @@ function transformToWorkerScreenFormat(api: WorkOrderApiItem): WorkOrder {
delayDays,
instruction: api.memo || undefined,
salesOrderNo: api.sales_order?.order_no || undefined,
salesManager: api.sales_order?.options?.manager_name as string || undefined,
managerPhone: api.sales_order?.client_contact || undefined,
teamId: api.team_id ?? null,
teamName: api.team?.name || undefined,
processDepartment: api.process?.department || undefined,
@@ -635,8 +639,8 @@ export async function getWorkOrderDetail(
workItem.cuttingInfo = { width: ci.width, sheets: ci.sheets };
}
if (opts.slat_info) {
const si = opts.slat_info as { length: number; slat_count: number; joint_bar: number };
workItem.slatInfo = { length: si.length, slatCount: si.slat_count, jointBar: si.joint_bar };
const si = opts.slat_info as { length: number; slat_count: number; joint_bar: number; glass_qty: number };
workItem.slatInfo = { length: si.length, slatCount: si.slat_count, jointBar: si.joint_bar, glassQty: si.glass_qty || 0 };
}
if (opts.bending_info) {
const bi = opts.bending_info as {

View File

@@ -118,7 +118,7 @@ const MOCK_ITEMS: Record<ProcessTab, WorkItemData[]> = {
{
id: 'mock-l1', itemNo: 1, itemCode: 'KQTS01', itemName: '슬랫코일', floor: '1층', code: 'FSS-01',
width: 8260, height: 8350, quantity: 2, processType: 'slat',
slatInfo: { length: 3910, slatCount: 40, jointBar: 4 },
slatInfo: { length: 3910, slatCount: 40, jointBar: 4, glassQty: 2 },
steps: [
{ id: 'l1-1', name: '자재투입', isMaterialInput: true, isCompleted: true },
{ id: 'l1-2', name: '포밍/절단', isMaterialInput: false, isCompleted: false },
@@ -132,7 +132,7 @@ const MOCK_ITEMS: Record<ProcessTab, WorkItemData[]> = {
{
id: 'mock-l2', itemNo: 2, itemCode: 'KQTS03', itemName: '슬랫코일(광폭)', floor: '2층', code: 'FSS-02',
width: 10500, height: 6200, quantity: 3, processType: 'slat',
slatInfo: { length: 5200, slatCount: 55, jointBar: 6 },
slatInfo: { length: 5200, slatCount: 55, jointBar: 6, glassQty: 3 },
steps: [
{ id: 'l2-1', name: '자재투입', isMaterialInput: true, isCompleted: false },
{ id: 'l2-2', name: '포밍/절단', isMaterialInput: false, isCompleted: false },
@@ -709,8 +709,8 @@ export default function WorkerScreen() {
workItem.cuttingInfo = { width: ci.width, sheets: ci.sheets };
}
if (opts.slat_info) {
const si = opts.slat_info as { length: number; slat_count: number; joint_bar: number };
workItem.slatInfo = { length: si.length, slatCount: si.slat_count, jointBar: si.joint_bar };
const si = opts.slat_info as { length: number; slat_count: number; joint_bar: number; glass_qty: number };
workItem.slatInfo = { length: si.length, slatCount: si.slat_count, jointBar: si.joint_bar, glassQty: si.glass_qty || 0 };
}
if (opts.bending_info) {
const bi = opts.bending_info as {
@@ -864,8 +864,8 @@ export default function WorkerScreen() {
salesOrderNo: apiOrder.salesOrderNo || '-',
siteName: apiOrder.projectName || '-',
client: apiOrder.client || '-',
salesManager: apiOrder.assignees?.[0] || '-',
managerPhone: '-',
salesManager: apiOrder.salesManager || '-',
managerPhone: apiOrder.managerPhone || '-',
shippingDate: apiOrder.dueDate ? new Date(apiOrder.dueDate).toLocaleDateString('ko-KR') : '-',
};
}
@@ -892,8 +892,8 @@ export default function WorkerScreen() {
salesOrderNo: first.salesOrderNo || '-',
siteName: first.projectName || '-',
client: first.client || '-',
salesManager: first.assignees?.[0] || '-',
managerPhone: '-',
salesManager: first.salesManager || '-',
managerPhone: first.managerPhone || '-',
shippingDate: first.dueDate ? new Date(first.dueDate).toLocaleDateString('ko-KR') : '-',
};
}, [filteredWorkOrders, selectedSidebarOrderId, activeProcessTabKey]);

View File

@@ -60,7 +60,7 @@ export const MOCK_ITEMS: Record<ProcessTab, WorkItemData[]> = {
{
id: 'mock-l1', itemNo: 1, itemCode: 'KQTS01', itemName: '슬랫코일', floor: '1층', code: 'FSS-01',
width: 8260, height: 8350, quantity: 2, processType: 'slat',
slatInfo: { length: 3910, slatCount: 40, jointBar: 4 },
slatInfo: { length: 3910, slatCount: 40, jointBar: 4, glassQty: 2 },
steps: [
{ id: 'l1-1', name: '자재투입', isMaterialInput: true, isCompleted: true },
{ id: 'l1-2', name: '포밍/절단', isMaterialInput: false, isCompleted: false },
@@ -73,7 +73,7 @@ export const MOCK_ITEMS: Record<ProcessTab, WorkItemData[]> = {
{
id: 'mock-l2', itemNo: 2, itemCode: 'KQTS03', itemName: '슬랫코일(광폭)', floor: '2층', code: 'FSS-02',
width: 10500, height: 6200, quantity: 3, processType: 'slat',
slatInfo: { length: 5200, slatCount: 55, jointBar: 6 },
slatInfo: { length: 5200, slatCount: 55, jointBar: 6, glassQty: 3 },
steps: [
{ id: 'l2-1', name: '자재투입', isMaterialInput: true, isCompleted: false },
{ id: 'l2-2', name: '포밍/절단', isMaterialInput: false, isCompleted: false },

View File

@@ -77,6 +77,7 @@ export interface SlatInfo {
length: number; // 길이 (mm)
slatCount: number; // 슬랫 매수
jointBar: number; // 조인트바 개수
glassQty: number; // 방화유리 수량
}
// ===== 슬랫 조인트바 전용 정보 =====