mbom 복사 시 프로젝트의 파트를 1레벨로

This commit is contained in:
2025-12-30 11:48:15 +09:00
parent ba09a208cf
commit b53b20945b
4 changed files with 132 additions and 3 deletions

View File

@@ -949,8 +949,7 @@ function compareItemFields(before, after) {
<td>
<input type="text" name="search_part_name" id="search_part_name" style="width: 300px;" value="" readonly>
</td>
</tr>
<tr>
<td><label for="search_mbom_part_no">M-BOM 품번</label></td>
<td>
<input type="text" name="search_mbom_part_no" id="search_mbom_part_no" style="width: 300px;" value="" readonly>

View File

@@ -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<String, Object> partParam = new HashMap<>();
partParam.put("partObjId", partObjId);
Map<String, Object> 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<Map<String, Object>> newMbomDetailList = new ArrayList<>();
// 1레벨의 CHILD_OBJID 생성 (부모-자식 관계 연결용)
String newLevel1ChildObjid = CommonUtils.createObjId();
// 1레벨: PART_MNG 테이블의 파트 정보로 생성
Map<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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;
}

View File

@@ -8115,4 +8115,21 @@ SELECT PM.OBJID
ORDER BY REGDATE DESC, PART_NO
</select>
<!-- PART_OBJID로 PART_MNG 테이블에서 파트 정보 조회 -->
<select id="getPartInfoByObjId" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID,
PART_NO,
PART_NAME,
PART_TYPE,
UNIT,
MATERIAL,
SPEC,
MAKER,
SUPPLY_CODE
FROM PART_MNG
WHERE OBJID::VARCHAR = #{partObjId}
LIMIT 1
</select>
</mapper>

View File

@@ -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,