diff --git a/frontend/app/(main)/COMPANY_30/logistics/outbound/page.tsx b/frontend/app/(main)/COMPANY_30/logistics/outbound/page.tsx index 2fd39734..1aabe849 100644 --- a/frontend/app/(main)/COMPANY_30/logistics/outbound/page.tsx +++ b/frontend/app/(main)/COMPANY_30/logistics/outbound/page.tsx @@ -123,6 +123,7 @@ const getStatusColor = (status: string) => OUTBOUND_STATUS_OPTIONS.find((s) => s // 소스 테이블 한글명 매핑 const SOURCE_TYPE_LABEL: Record = { shipment_instruction_detail: "출하지시", + shipmentInstruction: "출하지시", purchase_order_mng: "발주", item_info: "품목", }; diff --git a/frontend/app/(main)/COMPANY_30/logistics/receiving/page.tsx b/frontend/app/(main)/COMPANY_30/logistics/receiving/page.tsx index 771e624e..9ca6a1fe 100644 --- a/frontend/app/(main)/COMPANY_30/logistics/receiving/page.tsx +++ b/frontend/app/(main)/COMPANY_30/logistics/receiving/page.tsx @@ -259,6 +259,7 @@ const getStatusVariant = (status: string): "default" | "secondary" | "outline" | // 소스 테이블 한글명 매핑 const SOURCE_TABLE_LABEL: Record = { purchase_order_mng: "발주", + purchase_detail: "발주", shipment_instruction_detail: "출하", item_info: "품목", }; diff --git a/frontend/app/(main)/COMPANY_30/production/result/page.tsx b/frontend/app/(main)/COMPANY_30/production/result/page.tsx index e150ab8a..ea737207 100644 --- a/frontend/app/(main)/COMPANY_30/production/result/page.tsx +++ b/frontend/app/(main)/COMPANY_30/production/result/page.tsx @@ -33,6 +33,7 @@ import { DynamicSearchFilter, FilterValue } from "@/components/common/DynamicSea const WI_TABLE = "work_instruction"; const WOP_TABLE = "work_order_process"; +const WOPR_TABLE = "work_order_process_result"; const fmtNum = (v: any) => { const n = Number(v); @@ -194,7 +195,36 @@ export default function ProductionResultPage() { autoFilter: true, sort: { columnName: "seq_no", order: "asc" }, }); - setProcessData(res.data?.data?.data || res.data?.data?.rows || []); + const wopRows: any[] = res.data?.data?.data || res.data?.data?.rows || []; + + // wopr 일별 실적 집계 → wop별 합산하여 wop row에 덮어씀 + const woprAgg = new Map(); + for (const w of wopRows) { + if (!w.id) continue; + try { + const wr = await apiClient.post(`/table-management/tables/${WOPR_TABLE}/data`, { + page: 1, size: 0, + dataFilter: { enabled: true, filters: [{ columnName: "wop_id", operator: "equals", value: w.id }] }, + autoFilter: true, + }); + const rows: any[] = wr.data?.data?.data || wr.data?.data?.rows || []; + const sum = rows.reduce( + (a, r) => ({ + good: a.good + (Number(r.good_qty) || 0), + defect: a.defect + (Number(r.defect_qty) || 0), + input: a.input + (Number(r.input_qty) || 0), + }), + { good: 0, defect: 0, input: 0 }, + ); + if (sum.good > 0 || sum.defect > 0 || sum.input > 0) woprAgg.set(w.id, sum); + } catch { /* skip */ } + } + const enriched = wopRows.map((w) => { + const agg = woprAgg.get(w.id); + if (!agg) return w; + return { ...w, good_qty: agg.good, defect_qty: agg.defect, input_qty: agg.input }; + }); + setProcessData(enriched); } catch { setProcessData([]); } finally { setProcessLoading(false); } }; diff --git a/frontend/components/layout/MobileMenu.tsx b/frontend/components/layout/MobileMenu.tsx index ff92c09c..51d4130d 100644 --- a/frontend/components/layout/MobileMenu.tsx +++ b/frontend/components/layout/MobileMenu.tsx @@ -1,5 +1,5 @@ import { Button } from "@/components/ui/button"; -import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"; +import { Sheet, SheetContent, SheetTrigger, SheetHeader, SheetTitle } from "@/components/ui/sheet"; import { Menu } from "lucide-react"; import { MenuItem } from "@/types/menu"; import { LAYOUT_CONFIG } from "@/constants/layout"; @@ -44,6 +44,9 @@ export function SideMenu({ + + 메뉴 +

{LAYOUT_CONFIG.COMPANY_NAME}

diff --git a/frontend/components/ui/command.tsx b/frontend/components/ui/command.tsx index 4f81df63..a7d6650b 100644 --- a/frontend/components/ui/command.tsx +++ b/frontend/components/ui/command.tsx @@ -35,11 +35,12 @@ function CommandDialog({ }) { return ( - - {title} - {description} - + {/* DialogTitle은 DialogContent 내부에 있어야 Radix UI가 a11y 인식 (sr-only로 시각적 숨김) */} + + {title} + {description} + {children}