diff --git a/WebContent/WEB-INF/view/productionplanning/mBomHeaderPopup.jsp b/WebContent/WEB-INF/view/productionplanning/mBomHeaderPopup.jsp
index eeab9c0..a543f83 100644
--- a/WebContent/WEB-INF/view/productionplanning/mBomHeaderPopup.jsp
+++ b/WebContent/WEB-INF/view/productionplanning/mBomHeaderPopup.jsp
@@ -98,6 +98,7 @@ $(function(){
if(response && response.MBOM_NO) {
console.log("저장된 M-BOM 발견:", response);
$("#search_mbom_part_no").val(response.MBOM_NO);
+ $("#btnChangeTopProduct").hide();
// 날짜 형식 변환 (타임스탬프 또는 문자열 -> YYYY-MM-DD)
var regDate = response.REGDATE;
@@ -1388,18 +1389,58 @@ function fn_changeTopProduct() {
// 새로운 M-BOM 트리 구성
var newTreeData = [];
+ var selectedPartObjid = leftPartNoObj.attr("data-PART_OBJID") || '';
+ var newLevel1ChildObjid = generateTempId();
+ // 1. 선택한 반제품을 Level 1 (최상위)로 추가
+ var level1Item = {
+ OBJID: generateTempId(),
+ CHILD_OBJID: newLevel1ChildObjid,
+ PARENT_OBJID: '',
+ LEVEL: 1,
+ PART_OBJID: selectedPartObjid,
+ PART_NO: selectedPartNo,
+ PART_NAME: selectedPartName,
+ QTY: 1,
+ ITEM_QTY: 1,
+ QTY_TEMP: 1,
+ SPEC: '',
+ REVISION: '',
+ SUPPLY_TYPE: '',
+ STATUS: 'ACTIVE'
+ };
+ for(var lv = 1; lv <= 10; lv++) {
+ level1Item['LEVEL_' + lv] = (lv == 1) ? '*' : '';
+ }
+ newTreeData.push(level1Item);
+
+ // 2. E-BOM 하위 구조를 Level 2+로 추가
if(ebomResult && ebomResult.hasEbom && ebomResult.subTree && ebomResult.subTree.length > 0) {
- // E-BOM 하위 구조를 M-BOM 트리로 변환
+ var originalRootChildObjid = '';
for(var i = 0; i < ebomResult.subTree.length; i++) {
var item = ebomResult.subTree[i];
var itemLevel = parseInt(item.LEVEL || item.level || 1);
+ if(itemLevel == 1 && !originalRootChildObjid) {
+ originalRootChildObjid = item.CHILD_OBJID || item.child_objid || '';
+ }
+ }
+
+ for(var i = 0; i < ebomResult.subTree.length; i++) {
+ var item = ebomResult.subTree[i];
+ var itemLevel = parseInt(item.LEVEL || item.level || 1);
+ var newLevel = itemLevel + 1;
+ var parentObjid = item.PARENT_OBJID || item.parent_objid || '';
- newTreeData.push({
+ // 원래 Level 1의 직접 자식은 새 Level 1의 자식으로 연결
+ if(parentObjid === originalRootChildObjid || itemLevel == 1) {
+ parentObjid = newLevel1ChildObjid;
+ }
+
+ var subItem = {
OBJID: generateTempId(),
CHILD_OBJID: item.CHILD_OBJID || item.child_objid || generateTempId(),
- PARENT_OBJID: item.PARENT_OBJID || item.parent_objid || '',
- LEVEL: itemLevel,
+ PARENT_OBJID: parentObjid,
+ LEVEL: newLevel,
PART_OBJID: item.PART_OBJID || item.part_objid || '',
PART_NO: item.PART_NO || item.part_no || '',
PART_NAME: item.PART_NAME || item.part_name || '',
@@ -1411,7 +1452,11 @@ function fn_changeTopProduct() {
REVISION: item.REVISION || item.revision || '',
SUPPLY_TYPE: '사급',
STATUS: 'ACTIVE'
- });
+ };
+ for(var lv = 1; lv <= 10; lv++) {
+ subItem['LEVEL_' + lv] = (lv == newLevel) ? '*' : '';
+ }
+ newTreeData.push(subItem);
}
}
diff --git a/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp b/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp
index 8158c37..532d0ab 100644
--- a/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp
+++ b/WebContent/WEB-INF/view/productionplanning/mBomPopupLeft.jsp
@@ -254,6 +254,7 @@ function fn_initGrid() {
return '';
+ 'data-LEVEL="' + (rowData.LEVEL || 1) + '">';
}
});
diff --git a/src/com/pms/controller/ProductionPlanningController.java b/src/com/pms/controller/ProductionPlanningController.java
index ef9073f..a8ff6c5 100644
--- a/src/com/pms/controller/ProductionPlanningController.java
+++ b/src/com/pms/controller/ProductionPlanningController.java
@@ -1223,108 +1223,10 @@ public class ProductionPlanningController extends BaseService {
}
if(mbomDetailList != null && !mbomDetailList.isEmpty()) {
- // 할당된 E-BOM/M-BOM인 경우: 프로젝트의 PART_OBJID로 PART_MNG에서 파트 정보 조회하여 1레벨로 사용
- if("ASSIGNED_EBOM".equals(bomDataType) || "ASSIGNED_MBOM".equals(bomDataType)) {
- String partObjId = CommonUtils.checkNull(projectInfo.get("PART_OBJID"));
-
- // PART_OBJID가 있으면 PART_MNG 테이블에서 파트 정보 조회
- String projectPartNo = "";
- String projectPartName = "";
- String projectPartObjId = "";
-
- if(!"".equals(partObjId)) {
- Map partParam = new HashMap<>();
- partParam.put("partObjId", partObjId);
- Map partInfo = commonService.selectOne("partMng.getPartInfoByObjId", request, partParam);
-
- if(partInfo != null) {
- projectPartNo = CommonUtils.checkNull(partInfo.get("PART_NO"));
- projectPartName = CommonUtils.checkNull(partInfo.get("PART_NAME"));
- projectPartObjId = partObjId;
- System.out.println("PART_MNG에서 파트 정보 조회 - PART_OBJID: " + partObjId + ", PART_NO: " + projectPartNo + ", PART_NAME: " + projectPartName);
- }
- }
-
- // PART_OBJID로 조회 실패 시 PROJECT_MGMT의 PART_NO, PART_NAME 사용 (fallback)
- if("".equals(projectPartNo)) {
- projectPartNo = CommonUtils.checkNull(projectInfo.get("PART_NO"));
- projectPartName = CommonUtils.checkNull(projectInfo.get("PART_NAME"));
- System.out.println("PROJECT_MGMT의 파트 정보 사용 (fallback) - PART_NO: " + projectPartNo + ", PART_NAME: " + projectPartName);
- }
-
- // 프로젝트에 파트 정보가 있고, PART_OBJID가 유효한 경우에만 1레벨 교체
- // PART_OBJID가 없으면 외래키 제약조건 위반으로 저장 불가
- if(!"".equals(projectPartNo) && !"".equals(projectPartName) && !"".equals(projectPartObjId)) {
- List