diff --git a/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp b/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp index c714553..4f9fa2c 100644 --- a/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp +++ b/WebContent/WEB-INF/view/partMng/openBomReportExcelImportPopUp.jsp @@ -433,30 +433,41 @@ var gridFn = { url: "/partMng/parsingExcelFile.do" ,datatype : "json" ,postData:{"targetObjId":"${objid}","docType":"PART_EXCEL_IMPORT","OBJID":"${CONTRACT_OBJID}"} - ,loadComplete : function(data) { - // CSV 파일에서만 LEVEL 값을 PARENT_PART_NO 컬럼에 표시 - if(data && data.rows) { - for(var i = 0; i < data.rows.length; i++) { - var row = data.rows[i]; - // CSV 파일이고 LEVEL 값이 있는 경우 - if(row.IS_CSV === 'Y' && row.LEVEL && row.LEVEL !== '') { - // LEVEL 값을 PARENT_PART_NO 컬럼에 표시 (화면용) - grid.jqGrid('setCell', row.id, 'PARENT_PART_NO', row.LEVEL); - } + ,loadComplete : function(data) { + gridFn.footerSummary(); } - } - gridFn.footerSummary(); - } ,gridComplete : function() { - //gridFn.opennEdit(); //수정가능 var valid = true; gridFn.closeEdit(); - //var tempGrid = $('#expenseDetailGrid'); + + // 1번 레벨(PARENT_PART_NO가 비어있는 행)의 품번/품명을 헤더에 자동 설정 + var isFirstLevelSet = false; + $.each(grid.getRowData(), function(i, d){ - console.log(d); + console.log("Row data:", d); + + // NOTE 검증 if(!fnc_isEmpty(d["NOTE"])){ valid = false; } + + // PARENT_PART_NO가 비어있으면 1번 레벨 (최상위) + var parentPartNo = d["PARENT_PART_NO"] || ''; + if(!isFirstLevelSet && parentPartNo === '') { + var partNo = d["PART_NO"] || ''; + var partName = d["PART_NAME"] || ''; + + console.log("Level 1 found - PART_NO:", partNo, ", PART_NAME:", partName); + + // 새로 CSV 업로드 시 항상 덮어쓰기 + if(partNo !== '') { + $('#bom_part_no').val(partNo); + } + if(partName !== '') { + $('#bom_part_name').val(partName); + } + isFirstLevelSet = true; + } }); gridFn.opennEdit(); @@ -967,11 +978,11 @@ function fn_save(){ - + - + diff --git a/WebContent/WEB-INF/view/productionplanning/mBomHeaderPopup.jsp b/WebContent/WEB-INF/view/productionplanning/mBomHeaderPopup.jsp index 066081b..4f70030 100644 --- a/WebContent/WEB-INF/view/productionplanning/mBomHeaderPopup.jsp +++ b/WebContent/WEB-INF/view/productionplanning/mBomHeaderPopup.jsp @@ -949,8 +949,7 @@ function compareItemFields(before, after) { - - + diff --git a/src/com/pms/controller/ProductionPlanningController.java b/src/com/pms/controller/ProductionPlanningController.java index 4b67033..ae6784d 100644 --- a/src/com/pms/controller/ProductionPlanningController.java +++ b/src/com/pms/controller/ProductionPlanningController.java @@ -1223,10 +1223,122 @@ 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> newMbomDetailList = new ArrayList<>(); + + // 1레벨의 CHILD_OBJID 생성 (부모-자식 관계 연결용) + String newLevel1ChildObjid = CommonUtils.createObjId(); + + // 1레벨: PART_MNG 테이블의 파트 정보로 생성 + Map level1Item = new HashMap<>(); + level1Item.put("LEVEL", 1); + level1Item.put("PART_NO", projectPartNo); + level1Item.put("PART_NAME", projectPartName); + level1Item.put("QTY", 1); // 1레벨 수량은 항상 1 + level1Item.put("PART_OBJID", projectPartObjId); // 실제 PART_MNG의 OBJID 사용 + level1Item.put("CHILD_OBJID", newLevel1ChildObjid); // 부모-자식 연결용 + level1Item.put("PARENT_OBJID", ""); // 1레벨은 부모 없음 + newMbomDetailList.add(level1Item); + + // 기존 BOM의 1레벨 CHILD_OBJID 찾기 (2레벨의 PARENT_OBJID 매핑용) + String originalLevel1ChildObjid = ""; + String originalLevel1PartNo = ""; + for(Map item : mbomDetailList) { + Integer level = null; + Object levelObj = item.get("LEVEL"); + if(levelObj instanceof Integer) { + level = (Integer) levelObj; + } else if(levelObj instanceof Long) { + level = ((Long) levelObj).intValue(); + } else if(levelObj instanceof String) { + try { level = Integer.parseInt((String) levelObj); } catch(Exception e) {} + } + + if(level != null && level == 1) { + originalLevel1ChildObjid = CommonUtils.checkNull(item.get("CHILD_OBJID")); + originalLevel1PartNo = CommonUtils.checkNull(item.get("PART_NO")); + break; + } + } + + // 2레벨 이상 데이터 추가 (레벨 조정 없이 그대로) + // 단, 원래 1레벨의 자식(2레벨)은 프로젝트 파트의 자식이 됨 + for(Map item : mbomDetailList) { + Integer level = null; + Object levelObj = item.get("LEVEL"); + if(levelObj instanceof Integer) { + level = (Integer) levelObj; + } else if(levelObj instanceof Long) { + level = ((Long) levelObj).intValue(); + } else if(levelObj instanceof String) { + try { level = Integer.parseInt((String) levelObj); } catch(Exception e) {} + } + + if(level != null && level >= 2) { + Map newItem = new HashMap<>(item); + // 원래 2레벨(1레벨의 직접 자식)은 부모를 프로젝트 파트로 변경 + if(level == 2) { + String parentObjid = CommonUtils.checkNull(item.get("PARENT_OBJID")); + String parentPartNo = CommonUtils.checkNull(item.get("PARENT_PART_NO")); + // PARENT_OBJID가 원래 1레벨의 CHILD_OBJID와 같으면 새 1레벨로 변경 + if(parentObjid.equals(originalLevel1ChildObjid) || parentPartNo.equals(originalLevel1PartNo)) { + newItem.put("PARENT_OBJID", newLevel1ChildObjid); + newItem.put("PARENT_PART_NO", projectPartNo); + } + } + newMbomDetailList.add(newItem); + } + } + + mbomDetailList = newMbomDetailList; + System.out.println("프로젝트 파트 정보로 1레벨 교체 완료 - " + projectPartNo + " / " + projectPartName + " / CHILD_OBJID: " + newLevel1ChildObjid); + } + } + // 저장된 M-BOM 데이터가 있으면 이를 표시 int maxLevel = 1; for(Map item : mbomDetailList) { - Integer level = (Integer) item.get("LEVEL"); + Integer level = null; + Object levelObj = item.get("LEVEL"); + if(levelObj instanceof Integer) { + level = (Integer) levelObj; + } else if(levelObj instanceof Long) { + level = ((Long) levelObj).intValue(); + } else if(levelObj instanceof String) { + try { level = Integer.parseInt((String) levelObj); } catch(Exception e) {} + } + if(level != null && level > maxLevel) { maxLevel = level; } diff --git a/src/com/pms/mapper/partMng.xml b/src/com/pms/mapper/partMng.xml index 1839857..e0261f1 100644 --- a/src/com/pms/mapper/partMng.xml +++ b/src/com/pms/mapper/partMng.xml @@ -8115,4 +8115,21 @@ SELECT PM.OBJID ORDER BY REGDATE DESC, PART_NO + + + \ No newline at end of file diff --git a/src/com/pms/mapper/productionplanning.xml b/src/com/pms/mapper/productionplanning.xml index a98532c..ec4bd5f 100644 --- a/src/com/pms/mapper/productionplanning.xml +++ b/src/com/pms/mapper/productionplanning.xml @@ -3137,6 +3137,7 @@ PM.CONTRACT_OBJID, PM.PROJECT_NO, PM.BOM_REPORT_OBJID, + PM.PART_OBJID, PM.PART_NO, PM.PART_NAME, PM.SOURCE_BOM_TYPE,