Files
wace_rps/frontend/lib/api/mbom.ts
T
hjjeong dd88dc6e8c 생산관리>M-BOM 관리 — PR-A2 단건 상세 + read-only 트리 4분기 (wace mBomPopupLeft.do 1:1)
행 더블클릭 → MbomDetailDialog (헤더 메타 + 동적 LEVEL × 19컬럼 트리 그리드).
운영판 ProductionPlanningController:1113~1276 의 4분기 자동 판별을 백엔드에서 처리:
  1) SAVED         mbom_header.status='Y' 우선 → getSavedMbomTreeList CTE
  2) ASSIGNED_EBOM source_bom_type='EBOM' → partMng.getBOMTreeList(working) CTE
  3) ASSIGNED_MBOM source_bom_type='MBOM' → getMbomStructureOnly CTE
  4) TEMPLATE      Machine 이외 + 동일 part_no → mbom_header 템플릿 CTE
  5) NONE          빈 트리

backend:
  - mbomService.getDetail (getProjectMgmtDetail 1:1, TOTAL_PROD_QTY = production_plan 우선)
  - mbomService.getTree   (4분기 orchestrator + 매퍼 4종 CTE 1:1)
  - GET /api/production/mbom/detail/:objid
  - GET /api/production/mbom/tree/:objid

frontend:
  - lib/api/mbom.ts  : MbomDetail / MbomTreeRow / MbomBomDataType / getDetail / getTree
  - components/production/MbomDetailDialog.tsx (max-w-1600px, 헤더 14필드 + 트리 그리드)
  - page.tsx 행 더블클릭 핸들러

검증: O-RING (593315995) SAVED 분기 5행 정상. TOTAL_PROD_QTY production_plan=5 / QUANTITY=2 fallback 확인.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 16:29:52 +09:00

183 lines
5.7 KiB
TypeScript

import { apiClient } from "./client";
// ============================================================
// 생산관리 > M-BOM 관리 — wace productionplanning.xml 1:1
// 라우트:
// GET /api/production/mbom/list (PR-A1, 그리드)
// GET /api/production/mbom/detail/:objid (PR-A2, 단건 상세)
// GET /api/production/mbom/tree/:objid (PR-A2, read-only 트리 4분기)
// ============================================================
export interface MbomListFilter {
search_category_cd?: string;
search_product_cd?: string;
search_area_cd?: string;
search_customer_objid?: string;
search_paid_type?: string;
search_serial_no?: string;
search_part_no?: string;
search_part_name?: string;
search_receipt_date_from?: string;
search_receipt_date_to?: string;
search_req_del_date_from?: string;
search_req_del_date_to?: string;
page?: number;
page_size?: number;
}
export interface MbomRow {
objid: string;
contract_objid: string | null;
project_no: string | null;
category_cd: string | null;
category_name: string | null;
product: string | null;
product_name: string | null;
area_cd: string | null;
area_name: string | null;
receipt_date: string | null;
writer_name: string | null;
customer_objid: string | null;
customer_name: string | null;
paid_type: string | null;
paid_type_name: string | null;
part_no: string | null;
part_name: string | null;
part_objid: string | null;
serial_no: string | null;
serial_no_list: string | null;
quantity: string | number | null;
req_del_date: string | null;
customer_request: string | null;
bom_report_objid: string | null;
ebom_status: string | null;
ebom_regdate: string | null;
mbom_header_objid: string | null;
purchase_list_objid: string | null;
purchase_list_date: string | null;
mbom_status: string | null;
mbom_part_no: string | null;
mbom_regdate: string | null;
mbom_editor: string | null;
mbom_version: number | null;
}
export interface MbomListResponse {
rows: MbomRow[];
totalCount: number;
page: number;
pageSize: number;
}
// ─── 단건 상세 (PR-A2) ──────────────────────────────────────
export interface MbomDetail {
objid: string;
contract_objid: string | null;
project_no: string | null;
bom_report_objid: string | null;
part_objid: string | null;
part_no: string | null;
part_name: string | null;
source_bom_type: string | null;
source_ebom_objid: string | null;
source_mbom_objid: string | null;
quantity: string | number | null;
total_prod_qty: string | number | null;
mbom_part_no: string | null;
category_cd: string | null;
category_name: string | null;
product: string | null;
product_code: string | null;
product_name: string | null;
area_cd: string | null;
area_name: string | null;
customer_objid: string | null;
customer_name: string | null;
paid_type: string | null;
req_del_date: string | null;
receipt_date: string | null;
mbom_regdate: string | null;
}
// ─── read-only 트리 (PR-A2) ─────────────────────────────────
// 운영판 mBomPopupLeft.do 4분기 자동 판별:
// SAVED — mbom_header.status='Y' 최신
// ASSIGNED_EBOM — source_bom_type='EBOM' + source_ebom_objid
// ASSIGNED_MBOM — source_bom_type='MBOM' + source_mbom_objid
// TEMPLATE — Machine 이외 + 동일 part_no 의 mbom_header
// NONE — 빈 트리
export type MbomBomDataType = "SAVED" | "ASSIGNED_EBOM" | "ASSIGNED_MBOM" | "TEMPLATE" | "NONE";
export interface MbomTreeRow {
objid: string;
parent_objid: string | null;
child_objid: string | null;
part_objid: string | null;
part_no: string | null;
part_name: string | null;
qty: string | number | null;
item_qty: string | number | null;
qty_temp: string | number | null;
level: number;
sub_part_cnt: number;
seq: number;
status: string | null;
unit: string | null;
unit_title: string | null;
supply_type: string | null;
make_or_buy: string | null;
raw_material_no: string | null;
raw_material_spec: string | null;
raw_material: string | null;
size: string | null;
processing_vendor: string | null;
processing_vendor_name: string | null;
processing_deadline: string | null;
grinding_deadline: string | null;
required_qty: string | number | null;
order_qty: string | number | null;
production_qty: string | number | null;
vendor: string | null;
vendor_name: string | null;
unit_price: string | number | null;
total_price: string | number | null;
currency: string | null;
writer: string | null;
regdate: string | null;
editer: string | null;
edit_date: string | null;
remark: string | null;
spec: string | null;
material: string | null;
weight: string | number | null;
revision: string | null;
cu01_cnt: number;
cu02_cnt: number;
cu03_cnt: number;
[key: string]: any;
}
export interface MbomTreeResponse {
bom_data_type: MbomBomDataType;
bom_report_objid: string | null;
max_level: number;
rows: MbomTreeRow[];
}
export const mbomApi = {
async list(filter: MbomListFilter = {}): Promise<MbomListResponse> {
const res = await apiClient.get("/production/mbom/list", { params: filter });
return res.data?.data as MbomListResponse;
},
async getDetail(objid: string): Promise<MbomDetail> {
const res = await apiClient.get(`/production/mbom/detail/${encodeURIComponent(objid)}`);
return res.data?.data as MbomDetail;
},
async getTree(objid: string): Promise<MbomTreeResponse> {
const res = await apiClient.get(`/production/mbom/tree/${encodeURIComponent(objid)}`);
return res.data?.data as MbomTreeResponse;
},
};