// ============================================================ // 생산관리 > M-BOM 관리 — wace productionplanning.xml 1:1 이식. // 라우트: // GET /api/production/mbom/list 그리드 (PROJECT_MGMT × CONTRACT_ITEM 펼침) // GET /api/production/mbom/detail/:objid 단건 상세 (mBomHeaderPopup.do 1:1) // GET /api/production/mbom/tree/:objid read-only 트리 4분기 자동 판별 (mBomPopupLeft.do 1:1) // ============================================================ import { Response } from "express"; import { AuthenticatedRequest } from "../types/auth"; import * as svc from "../services/mbomService"; import { logger } from "../utils/logger"; function parseFilter(q: Record): svc.MbomListFilter { const filter: svc.MbomListFilter = { ...q }; if (q.page) filter.page = Number(q.page); if (q.page_size) filter.page_size = Number(q.page_size); return filter; } export async function getList(req: AuthenticatedRequest, res: Response) { try { const data = await svc.list(parseFilter(req.query as Record)); return res.json({ success: true, data }); } catch (e: any) { logger.error("M-BOM 관리 목록 실패", { error: e.message }); return res.status(500).json({ success: false, message: e.message }); } } export async function getDetail(req: AuthenticatedRequest, res: Response) { try { const objid = String(req.params.objid ?? "").trim(); if (!objid) return res.status(400).json({ success: false, message: "objid 누락" }); const data = await svc.getDetail(objid); if (!data) return res.status(404).json({ success: false, message: "프로젝트를 찾을 수 없습니다" }); return res.json({ success: true, data }); } catch (e: any) { logger.error("M-BOM 단건 상세 실패", { error: e.message }); return res.status(500).json({ success: false, message: e.message }); } } export async function getTree(req: AuthenticatedRequest, res: Response) { try { const objid = String(req.params.objid ?? "").trim(); if (!objid) return res.status(400).json({ success: false, message: "objid 누락" }); const data = await svc.getTree(objid); return res.json({ success: true, data }); } catch (e: any) { logger.error("M-BOM 트리 조회 실패", { error: e.message }); return res.status(500).json({ success: false, message: e.message }); } } // PR-B1 — 본 편집 저장 (운영 saveMbom.do 1:1) export async function save(req: AuthenticatedRequest, res: Response) { try { const payload = req.body as svc.MbomSavePayload; if (!payload?.project_obj_id) { return res.status(400).json({ success: false, message: "project_obj_id 누락" }); } if (!Array.isArray(payload.rows)) { return res.status(400).json({ success: false, message: "rows 누락" }); } const userId = req.user?.userId ?? "system"; const data = await svc.save(payload, userId); return res.json({ success: true, data }); } catch (e: any) { logger.error("M-BOM 저장 실패", { error: e.message }); return res.status(500).json({ success: false, message: e.message }); } }