dd88dc6e8c
행 더블클릭 → 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>
183 lines
5.7 KiB
TypeScript
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;
|
|
},
|
|
};
|