ebom 반제품 추가, 삭제 오류 수정

This commit is contained in:
2026-03-03 11:09:23 +09:00
parent 3283addc7d
commit 44290fe051
2 changed files with 45 additions and 12 deletions

View File

@@ -3960,7 +3960,8 @@ public class PartMngService extends BaseService {
}
}
// 새 데이터에서 참조는 PARENT_OBJID 셋 (삭제 보호용)
// 삭제 보호용: UI 새 데이터에서 참조는 PARENT_OBJID만 수집
// (DB 기존 데이터는 포함하지 않음 - 의도적 삭제를 막게 되므로)
Set<String> referencedParentObjids = new HashSet<>();
for(Map<String, Object> item : ebomData) {
String parentObjid = CommonUtils.checkNull(item.get("parentObjid"));
@@ -3969,12 +3970,22 @@ public class PartMngService extends BaseService {
}
}
// 2. 삭제: 기존에 있지만 새 데이터에 없는 항목 (다른 행이 참조하는 부모는 보호)
// 2. 삭제: 기존에 있지만 새 데이터에 없는 항목
for(String existingChildObjid : existingMap.keySet()) {
if(!newChildObjids.contains(existingChildObjid)) {
if(referencedParentObjids.contains(existingChildObjid)) {
// 루트 행(PARENT_OBJID 비어있음)은 절대 삭제하지 않음
Map<String, Object> existingRow = existingMap.get(existingChildObjid);
String existingParentObjid = CommonUtils.checkNull(existingRow.get("parent_objid"), CommonUtils.checkNull(existingRow.get("PARENT_OBJID")));
if(existingParentObjid.isEmpty()) {
System.out.println("[saveEbomBatch] 루트 행 삭제 방지: CHILD_OBJID=" + existingChildObjid);
continue;
}
// 다른 행이 이 CHILD_OBJID를 부모로 참조하면 삭제 방지
if(referencedParentObjids.contains(existingChildObjid)) {
System.out.println("[saveEbomBatch] 참조된 부모 행 삭제 방지: CHILD_OBJID=" + existingChildObjid);
continue;
}
System.out.println("[saveEbomBatch] 삭제: CHILD_OBJID=" + existingChildObjid);
Map<String, Object> deleteParam = new HashMap<>();
deleteParam.put("bomReportObjId", bomReportObjId);
deleteParam.put("childObjid", existingChildObjid);
@@ -3982,29 +3993,43 @@ public class PartMngService extends BaseService {
}
}
// 3. 추가/수정
// 3. 추가/수정 (임시ID → 새ID 매핑으로 부모-자식 관계 유지)
Map<String, String> tempIdToNewIdMap = new HashMap<>();
for(int i = 0; i < ebomData.size(); i++) {
Map<String, Object> item = ebomData.get(i);
String childObjid = CommonUtils.checkNull(item.get("childObjid"));
if(existingMap.containsKey(childObjid)) {
// 기존 항목 → 수정 (수량, 순서 등만 업데이트)
String parentObjid = CommonUtils.checkNull(item.get("parentObjid"));
// 부모가 임시ID였다면 새 ID로 치환
if(!parentObjid.isEmpty() && tempIdToNewIdMap.containsKey(parentObjid)) {
parentObjid = tempIdToNewIdMap.get(parentObjid);
}
Map<String, Object> updateParam = new HashMap<>();
updateParam.put("bomReportObjId", bomReportObjId);
updateParam.put("childObjid", childObjid);
updateParam.put("PARENT_OBJID", CommonUtils.checkNull(item.get("parentObjid")));
updateParam.put("PARENT_OBJID", parentObjid);
updateParam.put("QTY", CommonUtils.checkNull(item.get("qty"), "1"));
updateParam.put("ITEM_QTY", CommonUtils.checkNull(item.get("itemQty"), "1"));
updateParam.put("QTY_TEMP", CommonUtils.checkNull(item.get("qtyTemp"), "1"));
updateParam.put("SEQ", i + 1);
sqlSession.update("partMng.updateBomPartQtyByChildObjid", updateParam);
} else {
// 신규 항목 → INSERT
// 신규 항목 → INSERT (항상 새 CHILD_OBJID 생성, 매핑 추적)
String newChildObjid = CommonUtils.createObjId();
tempIdToNewIdMap.put(childObjid, newChildObjid);
String parentObjid = CommonUtils.checkNull(item.get("parentObjid"));
// 부모가 임시ID였다면 새 ID로 치환
if(!parentObjid.isEmpty() && tempIdToNewIdMap.containsKey(parentObjid)) {
parentObjid = tempIdToNewIdMap.get(parentObjid);
}
Map<String, Object> insertParam = new HashMap<>();
insertParam.put("BOM_REPORT_OBJID", bomReportObjId);
insertParam.put("OBJID", CommonUtils.createObjId());
insertParam.put("PARENT_OBJID", CommonUtils.checkNull(item.get("parentObjid")));
insertParam.put("CHILD_OBJID", childObjid.startsWith("-") ? CommonUtils.createObjId() : childObjid);
insertParam.put("PARENT_OBJID", parentObjid);
insertParam.put("CHILD_OBJID", newChildObjid);
insertParam.put("PARENT_PART_NO", CommonUtils.checkNull(item.get("parentPartNo")));
insertParam.put("PART_NO", CommonUtils.checkNull(item.get("partNo")));
insertParam.put("LAST_PART_OBJID", CommonUtils.checkNull(item.get("lastPartObjid")));