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

@@ -65,7 +65,7 @@ function buildSubTreeFlatList(subTree, parentObjid, baseLevel) {
var originalChildObjid = item.CHILD_OBJID || item.child_objid || '';
if(originalChildObjid) originalChildToNew[originalChildObjid] = newChildObjid;
flatList.push({
var subPartData = {
OBJID: generateTempId(),
CHILD_OBJID: newChildObjid,
PARENT_OBJID: parentObjid,
@@ -80,7 +80,11 @@ function buildSubTreeFlatList(subTree, parentObjid, baseLevel) {
REVISION: item.REVISION || item.revision || '',
STATUS: 'ACTIVE',
_IS_SUB_PART: true
});
};
for(var lv = 1; lv <= 10; lv++) {
subPartData['LEVEL_' + lv] = (lv == subPartData.LEVEL) ? '*' : '';
}
flatList.push(subPartData);
}
// 2레벨 이상 항목의 부모 OBJID 재매핑
@@ -160,7 +164,7 @@ $(function(){
var rowData = rightSelectedRows[i].getData();
var partChildObjid = generateTempId();
newParts.push({
var newPartData = {
OBJID: generateTempId(),
CHILD_OBJID: partChildObjid,
PARENT_OBJID: parentObjid,
@@ -174,7 +178,11 @@ $(function(){
SPEC: rowData.SPEC || '',
REVISION: rowData.REVISION || '',
STATUS: 'ACTIVE'
});
};
for(var lv = 1; lv <= 10; lv++) {
newPartData['LEVEL_' + lv] = (lv == newPartData.LEVEL) ? '*' : '';
}
newParts.push(newPartData);
// 반제품 E-BOM 하위 구조 조회
var ebomResult = fetchEbomSubTree(rowData.PART_NO);

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")));