From 8c2cdc40ada658936b53260901e2bf57425f02c9 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Mon, 9 Mar 2026 17:03:58 +0900 Subject: [PATCH] =?UTF-8?q?=EC=83=9D=EC=82=B0=EA=B4=80=EB=A6=AC=5Fmbom=20?= =?UTF-8?q?=EC=A0=9C=EC=9E=91=EC=88=98=EB=9F=89=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20(=ED=95=AD=EB=AA=A9=EC=88=98=EB=9F=89*?= =?UTF-8?q?=EC=B4=9D=EC=83=9D=EC=82=B0=EC=88=98=EB=9F=89=20->=20=EC=83=81?= =?UTF-8?q?=EC=9C=84=EC=9D=98=20=ED=95=AD=EB=AA=A9=EC=88=98=EB=9F=89=20?= =?UTF-8?q?=EA=B3=84=EC=86=8D=20=EA=B3=B1=ED=95=B4=EA=B0=80=EB=A9=B4?= =?UTF-8?q?=EC=84=9C=20=EA=B3=84=EC=82=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/productionplanning/mBomPopupLeft.jsp | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp b/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp index 224b40c..67184fe 100644 --- a/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp +++ b/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp @@ -957,6 +957,9 @@ function fn_initGrid() { function fn_preprocessBomData(dataList) { if(!dataList || dataList.length === 0) return dataList; + // 레벨별 항목수량 추적 (제작수량 누적 곱 계산용) + var parentItemQtyByLevel = {}; + dataList.forEach(function(row) { // 필드명 정규화 (소문자 → 대문자 복사, 기존 대문자 유지) if(row.part_unit_qty !== undefined && row.PART_UNIT_QTY === undefined) { @@ -985,13 +988,27 @@ function fn_initGrid() { console.log("전처리 - PART_NO:", row.PART_NO, "소재품번:", row.RAW_MATERIAL_NO, "소재소요량(DB):", savedRequiredQty, "소재소요량(최종):", row.REQUIRED_QTY); - // 제작수량: 저장된 값이 있으면 유지, 없으면 항목수량 × 총생산수량으로 자동계산 + // 제작수량: 상위 항목수량을 누적 곱하여 계산 + var level = parseInt(row.LEVEL) || 1; + var itemQty = parseFloat(row.ITEM_QTY || row.item_qty) || 0; + + // 현재 레벨의 항목수량 저장 (하위 레벨 계산에 사용) + parentItemQtyByLevel[level] = itemQty; + // 현재 레벨보다 깊은 레벨 데이터 제거 (형제 노드 전환 시 오염 방지) + for(var l = level + 1; l <= _maxLevel; l++) { + delete parentItemQtyByLevel[l]; + } + var savedProdQty = parseFloat(row.PRODUCTION_QTY) || 0; if(savedProdQty > 0) { row.PRODUCTION_QTY = savedProdQty; } else { - var itemQty = parseFloat(row.ITEM_QTY || row.item_qty) || 0; - row.PRODUCTION_QTY = itemQty * totalProductionQty; + // 최상위(1)부터 현재 레벨까지 항목수량 누적 곱 × 총생산수량 + var cumulativeItemQty = 1; + for(var l = 1; l <= level; l++) { + cumulativeItemQty *= (parentItemQtyByLevel[l] || 1); + } + row.PRODUCTION_QTY = cumulativeItemQty * totalProductionQty; } // 소재발주수량: 저장된 값이 있으면 유지, 없으면 계산