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:
2026-02-10 20:13:11 +09:00
parent e508014224
commit de2b7dd6ce
3 changed files with 17 additions and 9 deletions

View File

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

View File

@@ -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 || '-',

View File

@@ -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: [] });
}