생산관리 M-BOM 변경이력 다이얼로그(PR-B4) + 그리드 컬럼 폭 다듬기

운영 productionplanning.getMbomHistory (3448~3470) 1:1 이식:
  · backend mbomService.getHistory(projectObjid) — project 단위 mbom_header 변경이력
    시간순 최신 우선, USER_INFO join 으로 변경자명 함께
  · GET /api/production/mbom/history/:projectObjid
  · frontend MbomHistoryDialog — 5컬럼 그리드(변경일시/유형/내용/변경자/M-BOM품번)
    CREATE=파란 뱃지, UPDATE=황색 뱃지, max-w-900px
  · MbomDetailDialog toolbar 에 "변경이력" 버튼 (편집 모드 아닐 때만 노출)

PR-B1 의 history 저장 결과를 사용자가 직접 확인할 수 있도록 보는 화면 마무리.

부수: production/mbom/page 그리드 컬럼 폭 정돈 + summaryStats(전체/페이지/수주합/M-BOM 비율).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
hjjeong
2026-05-14 16:39:48 +09:00
parent a6692c4e21
commit 8dd5f184ae
6 changed files with 192 additions and 1 deletions
@@ -53,6 +53,19 @@ export async function getTree(req: AuthenticatedRequest, res: Response) {
}
}
// PR-B4 — 변경이력 조회 (운영 getMbomHistory.do 1:1)
export async function getHistory(req: AuthenticatedRequest, res: Response) {
try {
const projectObjid = String(req.params.projectObjid ?? "").trim();
if (!projectObjid) return res.status(400).json({ success: false, message: "projectObjid 누락" });
const data = await svc.getHistory(projectObjid);
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 {
@@ -14,5 +14,6 @@ router.get("/list", ctrl.getList);
router.get("/detail/:objid", ctrl.getDetail);
router.get("/tree/:objid", ctrl.getTree);
router.post("/save", ctrl.save); // PR-B1 본 편집 저장
router.get("/history/:projectObjid", ctrl.getHistory); // PR-B4 변경이력 조회
export default router;
+42
View File
@@ -1208,6 +1208,48 @@ export async function save(payload: MbomSavePayload, sessionUserId: string): Pro
}
}
// ─── 변경이력 조회 (PR-B4) ──────────────────────────────────
//
// 매퍼 productionplanning.getMbomHistory (3448~3470) 1:1.
// project_objid 로 그 프로젝트의 모든 mbom_header 변경이력 시간순 (최신 우선).
export interface MbomHistoryRow {
objid: string;
mbom_header_objid: string;
change_type: string;
change_description: string | null;
change_user: string | null;
change_user_name: string | null;
change_date: string;
mbom_part_no: string | null;
mbom_regdate: string | null;
}
export async function getHistory(projectObjid: string): Promise<MbomHistoryRow[]> {
const pool = getPool();
const sql = `
SELECT
MH.OBJID AS objid,
MH.MBOM_HEADER_OBJID AS mbom_header_objid,
MH.CHANGE_TYPE AS change_type,
MH.CHANGE_DESCRIPTION AS change_description,
MH.CHANGE_USER AS change_user,
COALESCE(
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MH.CHANGE_USER LIMIT 1),
MH.CHANGE_USER
) AS change_user_name,
TO_CHAR(MH.CHANGE_DATE, 'YYYY-MM-DD HH24:MI:SS') AS change_date,
MHD.MBOM_NO AS mbom_part_no,
TO_CHAR(MHD.REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS mbom_regdate
FROM MBOM_HISTORY MH
INNER JOIN MBOM_HEADER MHD ON MH.MBOM_HEADER_OBJID = MHD.OBJID
WHERE MHD.PROJECT_OBJID = $1
ORDER BY MH.CHANGE_DATE DESC
`;
const r = await pool.query(sql, [projectObjid]);
return r.rows;
}
async function insertHistory(
client: any,
mbomHeaderObjid: string,