ebom, mbom

E-BOM & M-BOM 파트 추가 삭제시 반제품 추가 삭제하면 하위 품목 같이 추가 삭제 되는 기능
E-BOM & M-BOM 파트 추가시 원하는 위치로 집어 넣는 기능(현재는 왼쪽에서 선택한 하위레벨의 제일 밑으로만 들어감)
E-BOM & M-BOM 파트 추가 삭제시 자동저장이 아니라, 저장/닫기 버튼이 있어서 저장버튼 누를때만 저장되도록 변경 필요
신규 프로젝트 생성하고, M-BOM 처음 만들때 E-BOM 을 가져와서 할당할때
최상위 제품을 변경하는 로직이 필요(최상위 제품을 삭제하고 반제품을 최상위 품으로 만드는 로직)
최상위 제품으로 만들려고 하는 반제품의 하위 부품도 딸려와서 구성이 되어야 하며,
M-BOM 의 이름도 변경된 최상위 제품의 품번으로 변경되어 저장되어야 함
This commit is contained in:
2026-02-27 18:50:47 +09:00
parent ac189cd114
commit 3e27278599
10 changed files with 1191 additions and 461 deletions

View File

@@ -1223,6 +1223,58 @@ public class PartMngController {
return bomTreeList != null ? bomTreeList : new ArrayList<Map>();
}
/**
* 품번 기준 E-BOM 하위 구조 조회 (반제품 추가 시 하위 품목 연동용)
* 품번에 해당하는 E-BOM이 있으면 하위 트리를 반환, 없으면 빈 리스트 반환
*/
@RequestMapping("/partMng/getEbomSubTreeByPartNo.do")
@ResponseBody
public Map<String, Object> getEbomSubTreeByPartNo(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
Map<String, Object> result = new HashMap<>();
try {
String partNo = CommonUtils.checkNull((String)paramMap.get("partNo"));
if(partNo.isEmpty()) {
result.put("hasEbom", false);
result.put("subTree", new ArrayList<>());
return result;
}
// 1차: 품번으로 단독 E-BOM 존재 여부 확인 (PART_BOM_REPORT)
Map bomReport = partMngService.getBomObjIdByPartNo(partNo);
if(bomReport != null && !bomReport.isEmpty()) {
String bomReportObjId = CommonUtils.checkNull(bomReport.get("OBJID"));
if(bomReportObjId.isEmpty()) {
bomReportObjId = CommonUtils.checkNull(bomReport.get("objid"));
}
Map<String, Object> treeParam = new HashMap<>();
treeParam.put("bomReportObjId", bomReportObjId);
treeParam.put("search_type", "working");
List subTree = partMngService.getBOMPartTreeListSimple(treeParam);
result.put("hasEbom", true);
result.put("bomReportObjId", bomReportObjId);
result.put("subTree", subTree != null ? subTree : new ArrayList<>());
return result;
}
// 2차 fallback: 다른 E-BOM 안에서 해당 품번이 하위 구조를 가진 경우 조회
List subTreeFallback = partMngService.findEbomSubTreeForPart(partNo);
if(subTreeFallback != null && !subTreeFallback.isEmpty()) {
result.put("hasEbom", true);
result.put("subTree", subTreeFallback);
return result;
}
result.put("hasEbom", false);
result.put("subTree", new ArrayList<>());
} catch(Exception e) {
e.printStackTrace();
result.put("hasEbom", false);
result.put("subTree", new ArrayList<>());
}
return result;
}
@RequestMapping("/partMng/structurePopupCenter.do")
public String structurePopupCenter(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
@@ -1250,6 +1302,44 @@ public class PartMngController {
return "/partMng/structurePopupCenter";
}
/**
* E-BOM 일괄 저장 (클라이언트 편집 후 저장)
*/
@RequestMapping("/partMng/saveEbom.do")
@ResponseBody
public Map<String, Object> saveEbom(HttpServletRequest request, @RequestBody Map<String, Object> paramMap) {
Map<String, Object> result = new HashMap<>();
try {
String bomReportObjId = CommonUtils.checkNull((String)paramMap.get("bomReportObjId"));
List<Map<String, Object>> ebomData = (List<Map<String, Object>>) paramMap.get("ebomData");
if(bomReportObjId.isEmpty() || ebomData == null || ebomData.isEmpty()) {
result.put("result", "fail");
result.put("message", "저장할 데이터가 없습니다.");
return result;
}
HttpSession session = request.getSession();
PersonBean person = (PersonBean) session.getAttribute(Constants.PERSON_BEAN);
Map info = person.getLoginInfo();
String userId = CommonUtils.checkNull(info.get("userId"));
boolean saved = partMngService.saveEbomBatch(bomReportObjId, ebomData, userId);
if(saved) {
result.put("result", "success");
} else {
result.put("result", "fail");
result.put("message", "저장에 실패했습니다.");
}
} catch(Exception e) {
e.printStackTrace();
result.put("result", "fail");
result.put("message", e.getMessage());
}
return result;
}
/**
* 구조등록 우측 프레임
* @param request