개발관리>E-BOM 등록 — BOM 구조 다이얼로그 신설 + 트리 조인 버그 정정
사용자 검증 중 두 가지 문제 발견:
1) 트리가 1레벨만 표시되고 자식들이 안 풀림 — ascending/descending CTE 의 재귀
조인 조건 버그.
잘못된 조인: B.parent_objid = T.objid
올바른 조인: B.parent_objid = T.child_objid (ascending),
B.child_objid = T.parent_objid (descending)
wace relatePartInfo 1:1 패턴 — BOM_PART_QTY INSERT 시 OBJID 와 별도로
createObjId() 따로 발급되는 CHILD_OBJID 가 부모 식별자. 자식 행의 PARENT_OBJID
는 부모 행의 CHILD_OBJID 와 매칭됨 (PARENT_OBJID = T.OBJID 가 아님).
4 함수 일괄 정정 : ascending / descending / ascendingForExcel / descendingForExcel
검증 : test-20003-0082 BOM → Level 1 루트 + Level 2 자식 2건 정상 트리 출력.
2) E-BOM 컬럼이 숫자(bom_cnt)로 표시되어 어디를 눌러 BOM 구조를 봐야 할지 불명확.
운영판 wace 는 fnc_getFolderIcon 으로 폴더 아이콘 + 클릭 → setStructurePopupMainFS.
backend:
- GET /api/development/ebom-tree/full → ascendingForExcel 1:1, 풀 컬럼 JSON 노출
(HEAT_TREATMENT_HARDNESS/METHOD/SURFACE_TREATMENT/MAKER/PART_TYPE_TITLE/CU_파일 카운트 포함)
frontend:
- BomReportTreeDialog.tsx 신설 (wace 4-Frame 팝업 → 단일 다이얼로그 통합)
· 헤더 메타 8필드 (제품구분/품번/품명/Version/상태/등록자/등록일/확정일)
· 동적 LEVEL 컬럼 (L1..LMaxLevel, "*" 표시) + 운영판 14컬럼
· 노란 배경 헤더 (운영판 스타일 1:1)
· 엑셀 다운로드 버튼 (해당 BOM 만 ascendingForExcel 호출)
- lib/api/devBom.ts : treeFull() API + BomTreeFullRow 타입
- app/.../ebom-regist/page.tsx :
· bom_cnt 컬럼 formatNumber → renderType: "folder" (wace fnc_getFolderIcon 1:1)
· 클릭 핸들러를 품번 → E-BOM 폴더 셀로 이동 (운영판 fn_openSetStructure 동작)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -167,6 +167,18 @@ export async function ascending(req: AuthenticatedRequest, res: Response) {
|
||||
}
|
||||
}
|
||||
|
||||
// ─── E-BOM 트리 보기 (M3 행 클릭 → 다이얼로그) ─────────────
|
||||
// GET /api/development/ebom-tree/full?bom_report_objid=... — ascendingForExcel 1:1, 풀 컬럼 JSON
|
||||
export async function treeFull(req: AuthenticatedRequest, res: Response) {
|
||||
try {
|
||||
const data = await svc.ascendingForExcel(req.query as svc.BomTreeFilter);
|
||||
return res.json({ success: true, data });
|
||||
} catch (e: any) {
|
||||
logger.error("E-BOM 트리 조회 실패", { error: e.message });
|
||||
return res.status(500).json({ success: false, message: e.message });
|
||||
}
|
||||
}
|
||||
|
||||
// ─── M4 엑셀 다운로드 (정/역전개) ──────────────────────────
|
||||
// GET /api/development/ebom-tree/ascending/excel
|
||||
// GET /api/development/ebom-tree/descending/excel
|
||||
|
||||
@@ -21,6 +21,7 @@ router.get("/ebom-tree/ascending", ctrl.ascending);
|
||||
router.get("/ebom-tree/descending", ctrl.descending);
|
||||
router.get("/ebom-tree/ascending/excel", ctrl.excelAscending);
|
||||
router.get("/ebom-tree/descending/excel", ctrl.excelDescending);
|
||||
router.get("/ebom-tree/full", ctrl.treeFull);
|
||||
|
||||
// M3 Excel Import — /:objid 보다 위에 (라우트 충돌 방지)
|
||||
router.post("/ebom/excel-parse", excelUpload.single("file"), ctrl.excelParse);
|
||||
|
||||
@@ -251,7 +251,7 @@ export async function ascending(filter: BomTreeFilter) {
|
||||
B.part_no, B.qty, B.seq, B.status,
|
||||
T.lev + 1, T.path || B.objid::varchar, B.objid::varchar = ANY(T.path)
|
||||
FROM bom_part_qty B
|
||||
JOIN TREE T ON B.parent_objid = T.objid AND NOT T.cycle
|
||||
JOIN TREE T ON B.parent_objid = T.child_objid AND NOT T.cycle
|
||||
)
|
||||
SELECT T.bom_report_objid, T.objid, T.parent_objid, T.child_objid, T.part_no, T.qty, T.seq, T.status,
|
||||
T.lev, T.path,
|
||||
@@ -327,7 +327,7 @@ export async function ascendingForExcel(filter: BomTreeFilter) {
|
||||
B.part_no, B.qty, B.item_qty, B.seq, B.status,
|
||||
T.lev + 1, T.path || B.objid::varchar, B.objid::varchar = ANY(T.path)
|
||||
FROM bom_part_qty B
|
||||
JOIN TREE T ON B.parent_objid = T.objid AND NOT T.cycle
|
||||
JOIN TREE T ON B.parent_objid = T.child_objid AND NOT T.cycle
|
||||
)
|
||||
SELECT T.lev,
|
||||
PM.part_no AS pm_part_no,
|
||||
@@ -389,7 +389,7 @@ export async function descendingForExcel(filter: BomTreeFilter) {
|
||||
B.part_no, B.qty, B.item_qty, B.seq, B.status,
|
||||
T.lev + 1, T.path || B.objid::varchar, B.objid::varchar = ANY(T.path)
|
||||
FROM bom_part_qty B
|
||||
JOIN TREE T ON B.objid = T.parent_objid AND NOT T.cycle
|
||||
JOIN TREE T ON B.child_objid = T.parent_objid AND NOT T.cycle
|
||||
)
|
||||
SELECT T.lev,
|
||||
PM.part_no AS pm_part_no,
|
||||
@@ -457,7 +457,7 @@ export async function descending(filter: BomTreeFilter) {
|
||||
B.part_no, B.qty, B.seq, B.status,
|
||||
T.lev + 1, T.path || B.objid::varchar, B.objid::varchar = ANY(T.path)
|
||||
FROM bom_part_qty B
|
||||
JOIN TREE T ON B.objid = T.parent_objid AND NOT T.cycle
|
||||
JOIN TREE T ON B.child_objid = T.parent_objid AND NOT T.cycle
|
||||
)
|
||||
SELECT T.bom_report_objid, T.objid, T.parent_objid, T.child_objid, T.part_no, T.qty, T.seq, T.status,
|
||||
T.lev, T.path,
|
||||
|
||||
Reference in New Issue
Block a user