fix(WEB): 작업지시 상세/작업자 화면 개소(층/부호) 표시 수정
- WorkOrderDetail: 개소 그룹핑을 order_node_id → floor_code/symbol_code 기반으로 변경 - WorkerScreen: 아이템 그룹핑을 floor_code/symbol_code 기반으로 변경, '미지정' 라벨 제거 - types.ts: source_order_item에 floor_code/symbol_code 필드 추가, floorCode 변환 로직 적용
This commit is contained in:
@@ -511,12 +511,13 @@ export function WorkOrderDetail({ orderId }: WorkOrderDetailProps) {
|
||||
</TableHeader>
|
||||
<TableBody>
|
||||
{(() => {
|
||||
// 개소별로 그룹화
|
||||
const nodeGroups = new Map<string, { nodeName: string; items: typeof order.items }>();
|
||||
// 개소(층/부호)별로 그룹화
|
||||
const nodeGroups = new Map<string, { label: string; items: typeof order.items }>();
|
||||
for (const item of order.items) {
|
||||
const key = item.orderNodeId != null ? String(item.orderNodeId) : 'none';
|
||||
const key = item.floorCode !== '-' ? item.floorCode : (item.orderNodeId != null ? String(item.orderNodeId) : 'none');
|
||||
const label = item.floorCode !== '-' ? item.floorCode : item.orderNodeName;
|
||||
if (!nodeGroups.has(key)) {
|
||||
nodeGroups.set(key, { nodeName: item.orderNodeName, items: [] });
|
||||
nodeGroups.set(key, { label, items: [] });
|
||||
}
|
||||
nodeGroups.get(key)!.items.push(item);
|
||||
}
|
||||
@@ -528,7 +529,7 @@ export function WorkOrderDetail({ orderId }: WorkOrderDetailProps) {
|
||||
<TableRow key={`node-${key}-${item.id}`} className={idx === 0 ? 'border-t-2' : ''}>
|
||||
{idx === 0 && (
|
||||
<TableCell rowSpan={group.items.length} className="align-top font-medium bg-muted/30">
|
||||
{group.nodeName}
|
||||
{group.label}
|
||||
</TableCell>
|
||||
)}
|
||||
<TableCell>{item.productName}</TableCell>
|
||||
|
||||
@@ -258,6 +258,8 @@ export interface WorkOrderItemApi {
|
||||
source_order_item?: {
|
||||
id: number;
|
||||
order_node_id: number | null;
|
||||
floor_code?: string | null;
|
||||
symbol_code?: string | null;
|
||||
node?: {
|
||||
id: number;
|
||||
name: string;
|
||||
@@ -452,7 +454,7 @@ export function transformApiToFrontend(api: WorkOrderApi): WorkOrder {
|
||||
no: idx + 1,
|
||||
status: (item.status as ItemStatus) || 'waiting',
|
||||
productName: item.item_name,
|
||||
floorCode: '-',
|
||||
floorCode: [item.source_order_item?.floor_code, item.source_order_item?.symbol_code].filter(Boolean).join('/') || '-',
|
||||
specification: item.specification || '-',
|
||||
quantity: item.quantity,
|
||||
unit: item.unit || '-',
|
||||
|
||||
@@ -46,6 +46,8 @@ interface WorkOrderApiItem {
|
||||
source_order_item?: {
|
||||
id: number;
|
||||
order_node_id: number | null;
|
||||
floor_code?: string | null;
|
||||
symbol_code?: string | null;
|
||||
node?: { id: number; name: string; code: string } | null;
|
||||
} | null;
|
||||
}[];
|
||||
@@ -111,12 +113,15 @@ function transformToWorkerScreenFormat(api: WorkOrderApiItem): WorkOrder {
|
||||
processInfo = { code: rawProcessCode || 'unknown', name: rawProcessName || '알수없음' };
|
||||
}
|
||||
|
||||
// 아이템을 개소(node)별로 그룹핑
|
||||
// 아이템을 개소(floor_code/symbol_code)별로 그룹핑
|
||||
const nodeMap = new Map<string, { nodeId: number | null; nodeName: string; items: typeof api.items }>();
|
||||
for (const item of (api.items || [])) {
|
||||
const nodeId = item.source_order_item?.order_node_id ?? null;
|
||||
const nodeName = item.source_order_item?.node?.name || '미지정';
|
||||
const key = nodeId != null ? String(nodeId) : 'unassigned';
|
||||
const floorCode = item.source_order_item?.floor_code;
|
||||
const symbolCode = item.source_order_item?.symbol_code;
|
||||
const floorLabel = [floorCode, symbolCode].filter(Boolean).join('/');
|
||||
const nodeName = floorLabel || item.source_order_item?.node?.name || '미지정';
|
||||
const key = floorLabel || (nodeId != null ? String(nodeId) : `unassigned-${item.id}`);
|
||||
if (!nodeMap.has(key)) {
|
||||
nodeMap.set(key, { nodeId, nodeName, items: [] });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user