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; } // 소재발주수량: 저장된 값이 있으면 유지, 없으면 계산