package com.pms.service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Service; import com.pms.common.JsonUtil; import com.pms.common.Message; import com.pms.common.SqlMapConfig; import com.pms.common.bean.PersonBean; import com.pms.common.utils.CommonUtils; import com.pms.common.utils.Constants; @Service public class ProductionPlanningService { /** * 이슈관리 상세 조회 * @param paramMap * @return */ public Map issueFormPopUp(HttpServletRequest request,Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultMap = sqlSession.selectOne("productionplanning.selectPlanningIssueInfo", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } /** 이슈등록 * @param request * @param paramMap * @return */ public Map saveissueInfo(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); HttpSession session = request.getSession(); PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); String writer = CommonUtils.checkNull(person.getUserId()); paramMap.put("writer", writer); int cnt = sqlSession.update("productionplanning.mergeissueInfo", paramMap); if(cnt > 0){ resultMap.put("result", true); resultMap.put("msg", Message.SAVE_SUCCESS); } sqlSession.commit(); }catch(Exception e){ sqlSession.rollback(); resultMap.put("result", false); resultMap.put("msg", Message.SAVE_FAILED); e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } /** * 이슈 삭제 * @param request * @param paramMap * @return */ public Map planningDelete(HttpServletRequest request,Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); try{ String checkParam = CommonUtils.checkNull(paramMap.get("checkArr")); String[] targetObjIdList = checkParam.split(","); if(null != targetObjIdList && 0 < targetObjIdList.length){ HttpSession session = request.getSession(); sqlSession = SqlMapConfig.getInstance().getSqlSession(); PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); String userId = person.getUserId(); for(int i=0;i saveReleaseMgmtInfo(HttpServletRequest request,Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); String releaseWriter = CommonUtils.checkNull(paramMap.get("RELEASE_WRITER")); String releaseDate = CommonUtils.checkNull(paramMap.get("RELEASE_DATE")); if("".equals(releaseDate)){ paramMap.put("STATUS", "0000200"); }else{ paramMap.put("STATUS", "0000201"); } paramMap.put("WRITER", releaseWriter); System.out.println("paramMap :: " + paramMap); sqlSession.insert("releaseMgmt.saveReleaseMgmtInfo", paramMap); sqlSession.commit(); resultMap.put("result", true); resultMap.put("msg", Message.SAVE_SUCCESS); }catch(Exception e){ sqlSession.rollback(); resultMap.put("result", false); resultMap.put("msg", Message.SAVE_FAILED); e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } /** * 조립 WBS * @param paramMap * @return */ public List getassemblyWbsList(HttpServletRequest request,Map paramMap){ List> spareList = new ArrayList(); List> resultList = new ArrayList(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); try{ spareList = sqlSession.selectList("productionplanning.selectStructureAscendingList", paramMap); int maxLevel = 0; if(null != spareList && 0 < spareList.size()){ for(int i=0;i"+saveMap); sqlSession.update("productionplanning.mergeassemblyList", saveMap); } dateMap = sqlSession.selectOne("productionplanning.selectAssemblyDate", paramMap); dateMap.putAll(paramMap); sqlSession.update("project.mergeAssemblyDate",dateMap); } resultMap.put("result", true); resultMap.put("msg", Message.SAVE_SUCCESS); sqlSession.commit(); }catch(Exception e){ sqlSession.rollback(); resultMap.put("result", false); resultMap.put("msg", Message.SAVE_FAILED); e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } /** * 담당자별 작업현황 리스트 (프로젝트) * @param paramMap * @return */ public List getWorkStatusByImployeeList(HttpServletRequest request,Map paramMap){ List> resultList = new ArrayList(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); String countPerPage = CommonUtils.checkNull(request.getParameter("countPerPage"), Constants.ADMIN_COUNT_PER_PAGE+""); paramMap.put("COUNT_PER_PAGE", Integer.parseInt(countPerPage)); //Map pageMap = (HashMap)sqlSession.selectOne("productionplanning.workStatusByImployeeListCnt", paramMap); //pageMap = (HashMap)CommonUtils.setPagingInfo(request, pageMap); ///paramMap.put("PAGE_END", CommonUtils.checkNull(pageMap.get("PAGE_END"))); //paramMap.put("PAGE_START", CommonUtils.checkNull(pageMap.get("PAGE_START"))); resultList = (ArrayList)sqlSession.selectList("productionplanning.workStatusByImployeeList", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(resultList); } /** * 담당자별 작업현황 리스트 (비프로젝트) * @param paramMap * @return */ public List getWorkStatusByImployeeNPList(HttpServletRequest request,Map paramMap){ List> resultList = new ArrayList(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); String countPerPage = CommonUtils.checkNull(request.getParameter("countPerPage"), Constants.ADMIN_COUNT_PER_PAGE+""); paramMap.put("COUNT_PER_PAGE", Integer.parseInt(countPerPage)); resultList = (ArrayList)sqlSession.selectList("productionplanning.workStatusByImployeeNPList", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(resultList); } /** * 프로젝트별 작업현황 리스트 * @param paramMap * @return */ public List getworkStatusByProjectList(HttpServletRequest request,Map paramMap){ List> resultList = new ArrayList(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); String countPerPage = CommonUtils.checkNull(request.getParameter("countPerPage"), Constants.ADMIN_COUNT_PER_PAGE+""); paramMap.put("COUNT_PER_PAGE", Integer.parseInt(countPerPage)); //Map pageMap = (HashMap)sqlSession.selectOne("productionplanning.workStatusByImployeeListCnt", paramMap); //pageMap = (HashMap)CommonUtils.setPagingInfo(request, pageMap); ///paramMap.put("PAGE_END", CommonUtils.checkNull(pageMap.get("PAGE_END"))); //paramMap.put("PAGE_START", CommonUtils.checkNull(pageMap.get("PAGE_START"))); resultList = (ArrayList)sqlSession.selectList("productionplanning.workStatusByProjectList", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(resultList); } /** * 생산관리 -> 공정실적 등록 History 조회 * @param paramMap * @return */ public List getAssemblyWbsHistoryInfo(HttpServletRequest request, Map paramMap){ List> resultList = new ArrayList(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); try{ resultList = sqlSession.selectList("productionplanning.getAssemblyWbsHistoryList", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(resultList); } @SuppressWarnings({ "rawtypes", "unchecked" }) public Map deleteassemblyWbsHistoryList(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); int cnt = sqlSession.update("productionplanning.deleteassemblyWbsHistoryList", paramMap); if(cnt > 0){ resultMap.put("result", true); resultMap.put("msg", Message.DELETE_SUCCESS); } }catch(Exception e){ resultMap.put("result", false); resultMap.put("msg", Message.DELETE_FAILED); e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } /** 인수인계 History 내용을 저장한다. * @param request * @param paramMap * @return */ public Map saveAssemblyWbsHistory(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); paramMap.put("WRITER", person.getUserId()); String parentObjId = CommonUtils.checkNull(request.getParameter("projectObjId")); String partObjList[] = request.getParameterValues("OBJID"); if(parentObjId != null){ HashMap sqlParamMap = new HashMap(); sqlParamMap.put("parentObjId", parentObjId); sqlSession.delete("productionplanning.deleteAllAssemblyHistoryList",sqlParamMap); } if(null != partObjList && 0 < partObjList.length){ for(String targetObjId:partObjList){ Map sqlParamMep = new HashMap(); sqlParamMep.put("OBJID" , targetObjId); sqlParamMep.put("PART_OBJID" , CommonUtils.checkNull(request.getParameter("PART_OBJID_"+targetObjId ))); sqlParamMep.put("PARENT_OBJID" , CommonUtils.checkNull(request.getParameter("PARENT_OBJID_"+targetObjId ))); sqlParamMep.put("TRANSFER_USER_ID" , CommonUtils.checkNull(request.getParameter("TRANSFER_USER_ID_"+targetObjId ))); sqlParamMep.put("RECEIVE_DATE" , CommonUtils.checkNull(request.getParameter("RECEIVE_DATE_"+targetObjId ))); sqlParamMep.put("RECEIVE_QTY" , CommonUtils.checkNull(request.getParameter("RECEIVE_QTY_"+targetObjId ))); sqlParamMep.put("RECEIVE_USER_ID" , CommonUtils.checkNull(request.getParameter("RECEIVE_USER_ID_"+targetObjId ))); sqlParamMep.put("WRITER" , paramMap.get("WRITER")); System.out.println("sqlParamMep::"+sqlParamMep); sqlSession.update("productionplanning.saveAssemblyWbsHistory", sqlParamMep); } } resultMap.put("result", true); resultMap.put("msg", Message.SAVE_SUCCESS); sqlSession.commit(); }catch(Exception e){ sqlSession.rollback(); resultMap.put("result", false); resultMap.put("msg", Message.SAVE_FAILED); e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } /** * 작업일지 상세 조회 * @param paramMap * @return */ public Map workDiaryFormPopUp(HttpServletRequest request,Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultMap = sqlSession.selectOne("productionplanning.selectWorkDiaryInfo", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } /** 작업일지 등록 * @param request * @param paramMap * @return */ public Map saveWorkDiaryInfo(HttpServletRequest request,Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; List resultTempList = new ArrayList(); try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); List> dataList = JsonUtil.JsonToList(CommonUtils.checkNull(paramMap.get("dataListJson"))); if(CommonUtils.isNotEmpty(dataList)){ for (Map data : dataList) { String OBJID = CommonUtils.checkNull(data.get("OBJID")); if (OBJID.isEmpty()) { OBJID = CommonUtils.createObjId(); } paramMap.put("objId" , OBJID); paramMap.put("division" , data.get("DIVISION")); paramMap.put("project_objid" , data.get("CONTRACT_OBJID")); paramMap.put("unit_code" , data.get("UNIT_CODE")); paramMap.put("task_name" , data.get("TASK_NAME")); paramMap.put("work_start_date" , data.get("WORK_START_DATE")); paramMap.put("work_end_date" , data.get("WORK_END_DATE")); paramMap.put("work_hour" , data.get("WORK_HOUR")); paramMap.put("sourcing_type" , data.get("SOURCING_TYPE")); paramMap.put("worker_id" , data.get("WORKER_ID")); paramMap.put("remark" , data.get("REMARK")); paramMap.put("production_type" , data.get("PRODUCTION_TYPE")); paramMap.put("writer" , person.getUserId()); sqlSession.insert("productionplanning.mergeWorkDiaryInfo", paramMap); } } resultMap.put("result", true); resultMap.put("msg", Message.SAVE_SUCCESS); sqlSession.commit(); }catch(Exception e){ sqlSession.rollback(); resultMap.put("result", false); resultMap.put("msg", Message.SAVE_FAILED); e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } /** * 작업일지 삭제 * @param request * @param paramMap * @return */ public Map workDiaryDelete(HttpServletRequest request,Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); try{ String checkParam = CommonUtils.checkNull(paramMap.get("checkArr")); String[] targetObjIdList = checkParam.split(","); if(null != targetObjIdList && 0 < targetObjIdList.length){ HttpSession session = request.getSession(); sqlSession = SqlMapConfig.getInstance().getSqlSession(); PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); String userId = person.getUserId(); for(int i=0;i paramMap = new HashMap<>(); paramMap.put("projectMgmtObjid", projectMgmtObjid); paramMap.put("bomReportObjid", bomReportObjid); int result = sqlSession.update("productionplanning.assignEbomToProject", paramMap); sqlSession.commit(); return result; } catch(Exception e) { if(sqlSession != null) { sqlSession.rollback(); } throw e; } finally { if(sqlSession != null) { sqlSession.close(); } } } /** * E-BOM 정보 조회 * @param bomReportObjid * @return */ public Map getEbomInfo(String bomReportObjid) { Map resultMap = new HashMap<>(); SqlSession sqlSession = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(); Map paramMap = new HashMap<>(); paramMap.put("objid", bomReportObjid); resultMap = sqlSession.selectOne("productionplanning.getEbomInfo", paramMap); } catch(Exception e) { e.printStackTrace(); } finally { if(sqlSession != null) { sqlSession.close(); } } return resultMap; } /** * M-BOM 저장 * @param request * @param mbomData * @param partNo * @param partName * @return */ public int saveMbom(HttpServletRequest request, List> mbomData, String partNo, String partName) { return saveMbom(request, mbomData, partNo, partName, "", false); } public int saveMbom(HttpServletRequest request, List> mbomData, String partNo, String partName, String mbomPartNo, boolean isUpdate) { SqlSession sqlSession = null; int result = 0; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(false); HttpSession session = request.getSession(); PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); String userId = CommonUtils.checkNull(person.getUserId()); if(isUpdate && !"".equals(mbomPartNo)) { // M-BOM 수정: 기존 데이터 삭제 후 재저장 (동일 품번 유지) // 기존 M-BOM 상세 데이터 삭제 Map deleteParam = new HashMap<>(); deleteParam.put("MBOM_PART_NO", mbomPartNo); sqlSession.delete("productionplanning.deleteMbomDetailByPartNo", deleteParam); // M-BOM 헤더 업데이트 Map headerMap = new HashMap<>(); headerMap.put("MBOM_PART_NO", mbomPartNo); headerMap.put("PART_NO", partNo); headerMap.put("PART_NAME", partName); headerMap.put("UPDATE_USER", userId); sqlSession.update("productionplanning.updateMbomHeader", headerMap); // M-BOM 상세 데이터 재저장 for(Map item : mbomData) { item.put("MBOM_PART_NO", mbomPartNo); item.put("CREATE_USER", userId); item.put("UPDATE_USER", userId); sqlSession.insert("productionplanning.insertMbomDetail", item); } } else { // M-BOM 신규 저장 // M-BOM 헤더 정보 생성 Map headerMap = new HashMap<>(); headerMap.put("PART_NO", partNo); headerMap.put("PART_NAME", partName); headerMap.put("CREATE_USER", userId); headerMap.put("UPDATE_USER", userId); // M-BOM 헤더 저장 sqlSession.insert("productionplanning.insertMbomHeader", headerMap); String mbomHeaderObjid = (String) headerMap.get("OBJID"); // M-BOM 상세 데이터 저장 for(Map item : mbomData) { item.put("MBOM_HEADER_OBJID", mbomHeaderObjid); item.put("CREATE_USER", userId); item.put("UPDATE_USER", userId); sqlSession.insert("productionplanning.insertMbomDetail", item); } } sqlSession.commit(); result = 1; } catch(Exception e) { if(sqlSession != null) { sqlSession.rollback(); } e.printStackTrace(); } finally { if(sqlSession != null) { sqlSession.close(); } } return result; } /** * M-BOM Part 연결 (E-BOM의 relatePartInfo와 동일한 로직) * @param request * @param paramMap * @param partList * @return */ public boolean relateMbomPartInfo(HttpServletRequest request, Map paramMap, List partList){ boolean result = false; SqlSession sqlSession = null; try{ HttpSession session = request.getSession(); sqlSession = SqlMapConfig.getInstance().getSqlSession(); PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); Map info = person.getLoginInfo(); String userId = CommonUtils.checkNull(info.get("userId")); Map sqlParamMap = new HashMap(); sqlParamMap.put("BOM_REPORT_OBJID", CommonUtils.checkNull(paramMap.get("BOM_REPORT_OBJID"))); sqlParamMap.put("PARENT_OBJID", CommonUtils.checkNull(paramMap.get("leftObjId"))); sqlParamMap.put("PARENT_PART_OBJID", CommonUtils.checkNull(paramMap.get("leftObjId"))); sqlParamMap.put("PARENT_PART_NO", CommonUtils.checkNull(paramMap.get("leftPartNoQty"))); sqlParamMap.put("PARENT_QTY_CHILD_OBJID", CommonUtils.checkNull(paramMap.get("leftPartChildObjId"))); sqlParamMap.put("QTY", 1); sqlParamMap.put("QTY_TEMP", 1); sqlParamMap.put("STATUS", "adding"); sqlParamMap.put("WRITER", userId); // 각 Part를 BOM_PART_QTY 테이블에 삽입 for(String partObjId : partList){ sqlParamMap.put("OBJID", CommonUtils.createObjId()); sqlParamMap.put("CHILD_OBJID", CommonUtils.createObjId()); sqlParamMap.put("PART_NO", partObjId); sqlSession.insert("partMng.relatePartInfo", sqlParamMap); // 히스토리 저장 sqlParamMap.put("OBJID", CommonUtils.checkNull(partObjId)); sqlParamMap.put("OBJID_LEFT", CommonUtils.checkNull(paramMap.get("partObjId"))); sqlParamMap.put("CHANGE_TYPE", CommonUtils.checkNull(paramMap.get("CHANGE_TYPE"))); sqlParamMap.put("HIS_STATUS", "ADD"); sqlParamMap.put("CHANGE_OPTION", CommonUtils.checkNull(paramMap.get("CHANGE_OPTION"))); sqlSession.update("partMng.insertPartMngHistory",sqlParamMap); } // BOM 상태 변경 sqlSession.insert("partMng.changeStatusBomReport", sqlParamMap); sqlSession.commit(); result = true; }catch(Exception e){ if(sqlSession != null) { sqlSession.rollback(); } e.printStackTrace(); }finally{ if(sqlSession != null) { sqlSession.close(); } } return result; } /** * M-BOM Part 연결 해제 (E-BOM의 deleteStatusPartRelateInfo와 동일한 로직) * @param request * @param paramMap * @return */ public boolean deleteMbomPartRelateInfo(HttpServletRequest request, Map paramMap){ boolean result = false; SqlSession sqlSession = null; try{ HttpSession session = request.getSession(); sqlSession = SqlMapConfig.getInstance().getSqlSession(); PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); Map info = person.getLoginInfo(); String userId = CommonUtils.checkNull(info.get("userId")); Map sqlParamMap = new HashMap(); sqlParamMap.put("BOM_REPORT_OBJID", CommonUtils.checkNull(paramMap.get("BOM_REPORT_OBJID"))); sqlParamMap.put("OBJID", CommonUtils.checkNull(paramMap.get("leftObjId"))); sqlParamMap.put("PART_OBJID", CommonUtils.checkNull(paramMap.get("partObjId"))); sqlParamMap.put("leftPartChildObjId", CommonUtils.checkNull(paramMap.get("leftPartChildObjId"))); sqlParamMap.put("leftParentPartNo", CommonUtils.checkNull(paramMap.get("leftParentPartNo"))); sqlParamMap.put("leftParentObjId", CommonUtils.checkNull(paramMap.get("leftParentObjId"))); sqlParamMap.put("STATUS", "deleting"); sqlParamMap.put("WRITER", userId); // BOM_PART_QTY 테이블에서 상태를 'deleting'으로 변경 sqlSession.update("partMng.deleteStatusPartRelateInfo", sqlParamMap); // 히스토리 저장 sqlParamMap.put("HIS_STATUS", "DELETE"); sqlSession.update("partMng.insertPartMngHistory", sqlParamMap); // BOM 상태 변경 sqlSession.insert("partMng.changeStatusBomReport", sqlParamMap); sqlSession.commit(); result = true; }catch(Exception e){ if(sqlSession != null) { sqlSession.rollback(); } e.printStackTrace(); }finally{ if(sqlSession != null) { sqlSession.close(); } } return result; } /** * M-BOM Part 변경 (E-BOM의 changeRelatePartInfo와 동일한 로직) * @param request * @param paramMap * @return */ public boolean changeMbomPartInfo(HttpServletRequest request, Map paramMap){ boolean result = false; SqlSession sqlSession = null; try{ HttpSession session = request.getSession(); sqlSession = SqlMapConfig.getInstance().getSqlSession(); PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); Map info = person.getLoginInfo(); String userId = CommonUtils.checkNull(info.get("userId")); Map sqlParamMap = new HashMap(); sqlParamMap.put("BOM_REPORT_OBJID", CommonUtils.checkNull(paramMap.get("BOM_REPORT_OBJID"))); sqlParamMap.put("OBJID", CommonUtils.checkNull(paramMap.get("OBJID"))); sqlParamMap.put("rightObjId", CommonUtils.checkNull(paramMap.get("rightObjId"))); sqlParamMap.put("leftObjId", CommonUtils.checkNull(paramMap.get("leftObjId"))); sqlParamMap.put("leftPartNoQty", CommonUtils.checkNull(paramMap.get("leftPartNoQty"))); sqlParamMap.put("leftPartChildObjId", CommonUtils.checkNull(paramMap.get("leftPartChildObjId"))); sqlParamMap.put("leftPartObjid", CommonUtils.checkNull(paramMap.get("leftPartObjid"))); sqlParamMap.put("rightPartNo", CommonUtils.checkNull(paramMap.get("rightPartNo"))); sqlParamMap.put("rightPartRev", CommonUtils.checkNull(paramMap.get("rightPartRev"))); sqlParamMap.put("WRITER", userId); // BOM_PART_QTY 테이블에서 Part 변경 sqlSession.update("partMng.changeRelatePartInfo", sqlParamMap); // 히스토리 저장 sqlParamMap.put("HIS_STATUS", "CHANGE"); sqlSession.update("partMng.insertPartMngHistory", sqlParamMap); // BOM 상태 변경 sqlSession.insert("partMng.changeStatusBomReport", sqlParamMap); sqlSession.commit(); result = true; }catch(Exception e){ if(sqlSession != null) { sqlSession.rollback(); } e.printStackTrace(); }finally{ if(sqlSession != null) { sqlSession.close(); } } return result; } /** * BOM 할당 정보 저장 */ public boolean saveBomAssignment(HttpServletRequest request, Map paramMap) { SqlSession sqlSession = null; boolean result = false; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(false); // 수동 커밋 String projectObjId = CommonUtils.checkNull(paramMap.get("projectObjId")); // 1. 기존 M-BOM 데이터 비활성화 (새로운 BOM 할당 시 초기화) if(!"".equals(projectObjId)) { // 해당 프로젝트의 기존 활성 M-BOM HEADER 조회 Map queryParam = new HashMap<>(); queryParam.put("projectObjId", projectObjId); List> existingMboms = sqlSession.selectList("productionplanning.getActiveMbomsByProjectId", queryParam); if(existingMboms != null && !existingMboms.isEmpty()) { System.out.println("========== 기존 M-BOM 비활성화 =========="); System.out.println("Project OBJID: " + projectObjId); System.out.println("비활성화할 M-BOM 개수: " + existingMboms.size()); for(Map mbom : existingMboms) { String mbomHeaderObjid = CommonUtils.checkNull(mbom.get("OBJID")); if(!"".equals(mbomHeaderObjid)) { Map inactivateParam = new HashMap<>(); inactivateParam.put("mbomHeaderObjid", mbomHeaderObjid); // M-BOM DETAIL 비활성화 sqlSession.update("productionplanning.inactivateMbomDetail", inactivateParam); // M-BOM HEADER 비활성화 sqlSession.update("productionplanning.inactivateMbomHeader", inactivateParam); System.out.println("M-BOM 비활성화 완료: " + mbomHeaderObjid); } } } } // 2. PROJECT_MGMT 업데이트 (새로운 BOM 할당 정보) int updateCount = sqlSession.update("productionplanning.saveBomAssignment", paramMap); result = (updateCount > 0); sqlSession.commit(); } catch(Exception e) { if(sqlSession != null) { sqlSession.rollback(); } e.printStackTrace(); } finally { if(sqlSession != null) { sqlSession.close(); } } return result; } /** * M-BOM 할당 정보 조회 */ public Map getMbomAssignment(String projectObjId) { SqlSession sqlSession = null; Map result = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(); Map paramMap = new HashMap<>(); paramMap.put("projectObjId", projectObjId); result = sqlSession.selectOne("productionplanning.getMbomAssignment", paramMap); } catch(Exception e) { e.printStackTrace(); } finally { if(sqlSession != null) { sqlSession.close(); } } return result; } /** * M-BOM 품번 생성 * E-BOM 기준: M-{E-BOM품번}-YYMMDD-01 * M-BOM 기준: {기존품번앞부분}-YYMMDD-01 */ public String generateMbomNo(HttpServletRequest request, String sourceBomType, String baseBomPartNo) { SqlSession sqlSession = null; String mbomNo = ""; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(); // 현재 날짜 (YYMMDD) java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyMMdd"); String dateStr = sdf.format(new java.util.Date()); String mbomPrefix = ""; if("EBOM".equals(sourceBomType)) { // E-BOM 기준: M-{E-BOM품번}-YYMMDD // E-BOM 품번이 이미 M-으로 시작하면 중복 방지 String cleanPartNo = baseBomPartNo; if(cleanPartNo.startsWith("M-")) { cleanPartNo = cleanPartNo.substring(2); // "M-" 제거 } mbomPrefix = "M-" + cleanPartNo + "-" + dateStr; } else if("TEMPLATE".equals(sourceBomType)) { // 템플릿 기준: M-{품번}-YYMMDD String cleanPartNo = baseBomPartNo.trim(); if(cleanPartNo.startsWith("M-")) { cleanPartNo = cleanPartNo.substring(2); // "M-" 제거 } mbomPrefix = "M-" + cleanPartNo + "-" + dateStr; } else if("MBOM".equals(sourceBomType)) { // M-BOM 기준: 기존 M-BOM 품번에서 날짜/순번 부분 제거 후 새 날짜 추가 // 예: M-000AN014000-251124-01 → M-000AN014000 → M-000AN014000-251124 String basePart = baseBomPartNo; // 잘못된 형식 정규화 (M-M-..., M-E-... 등) // 예: M-M-000AN014000-251124-01-251124 → M-000AN014000-251124-01-251124 while(basePart.startsWith("M-M-") || basePart.startsWith("M-E-")) { basePart = "M-" + basePart.substring(4); } // 마지막 두 개의 "-XX" 부분 제거 (날짜-순번) // 여러 번 중복된 경우를 대비해 반복 제거 for(int i = 0; i < 2; i++) { int lastDashIndex = basePart.lastIndexOf("-"); if(lastDashIndex > 0) { String suffix = basePart.substring(lastDashIndex + 1); // 날짜(6자리) 또는 순번(2자리)인 경우만 제거 if(suffix.matches("\\d{2}") || suffix.matches("\\d{6}")) { basePart = basePart.substring(0, lastDashIndex); } else { break; } } } // 새 날짜 추가 mbomPrefix = basePart + "-" + dateStr; } // 같은 날짜의 최대 순번 조회 Map seqParam = new HashMap<>(); seqParam.put("mbomPrefix", mbomPrefix); Integer maxSeq = (Integer) sqlSession.selectOne("productionplanning.getMaxMbomSeqByDate", seqParam); int nextSeq = (maxSeq != null ? maxSeq : 0) + 1; // 최종 M-BOM 품번 생성 mbomNo = mbomPrefix + "-" + String.format("%02d", nextSeq); System.out.println("생성된 M-BOM 품번: " + mbomNo); } catch(Exception e) { e.printStackTrace(); } finally { if(sqlSession != null) { sqlSession.close(); } } return mbomNo; } /** * M-BOM 저장 * 최초 저장: MBOM_HEADER, MBOM_DETAIL 생성 * 수정 저장: 기존 데이터 업데이트 + MBOM_HISTORY 이력 저장 */ public boolean saveMbom(HttpServletRequest request, Map paramMap) { SqlSession sqlSession = null; boolean result = false; try { // 트랜잭션 처리를 위해 autoCommit = false로 설정 sqlSession = SqlMapConfig.getInstance().getSqlSession(false); // 세션에서 사용자 정보 가져오기 HttpSession session = request.getSession(); PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); String userId = CommonUtils.checkNull(person.getUserId()); paramMap.put("sessionUserId", userId); boolean isUpdate = (Boolean) paramMap.get("isUpdate"); String mbomNo = (String) paramMap.get("mbomNo"); if(isUpdate) { // 수정: 기존 M-BOM 조회 (최신 버전) System.out.println("========== UPDATE M-BOM =========="); System.out.println("projectObjId: " + paramMap.get("projectObjId")); System.out.println("mbomNo: " + paramMap.get("mbomNo")); Map existingMbom = sqlSession.selectOne("productionplanning.getMbomByNo", paramMap); if(existingMbom != null) { System.out.println("조회된 기존 M-BOM:"); System.out.println(" OBJID: " + existingMbom.get("OBJID")); System.out.println(" MBOM_NO: " + existingMbom.get("MBOM_NO")); System.out.println(" REGDATE: " + existingMbom.get("REGDATE")); // 기존 M-BOM 상세 데이터 조회 Map detailParam = new HashMap<>(); detailParam.put("mbomHeaderObjid", existingMbom.get("OBJID")); List> existingDetails = sqlSession.selectList("productionplanning.getMbomDetailList", detailParam); System.out.println("기존 M-BOM 상세 항목 수: " + existingDetails.size()); // 새 데이터 List> mbomData = (List>) paramMap.get("mbomData"); // 변경 사항 비교 (childObjid 기준) Map> beforeMap = new HashMap<>(); Map> afterMap = new HashMap<>(); // 기존 데이터 매핑 System.out.println("========== 기존 데이터 매핑 (beforeMap) =========="); for(Map detail : existingDetails) { String childObjid = CommonUtils.checkNull(detail.get("CHILD_OBJID")); if(!"".equals(childObjid)) { beforeMap.put(childObjid, detail); System.out.println("Before - childObjid: " + childObjid + ", partNo: " + detail.get("PART_NO")); } } // 새 데이터 매핑 System.out.println("========== 새 데이터 매핑 (afterMap) =========="); if(mbomData != null) { for(Map item : mbomData) { String childObjid = CommonUtils.checkNull(item.get("childObjid")); if(!"".equals(childObjid)) { afterMap.put(childObjid, item); System.out.println("After - childObjid: " + childObjid + ", partNo: " + item.get("partNo")); } } } // 변경된 항목만 추출 List> changedItems = new ArrayList<>(); System.out.println("========== 변경 사항 비교 =========="); System.out.println("기존 항목 수 (beforeMap): " + beforeMap.size()); System.out.println("새 항목 수 (afterMap): " + afterMap.size()); // 추가된 항목 for(String childObjid : afterMap.keySet()) { if(!beforeMap.containsKey(childObjid)) { Map change = new HashMap<>(); change.put("changeType", "ADD"); change.put("childObjid", childObjid); change.put("afterData", afterMap.get(childObjid)); changedItems.add(change); System.out.println("추가된 항목: " + childObjid + " - " + afterMap.get(childObjid).get("partNo")); } } // 삭제된 항목 for(String childObjid : beforeMap.keySet()) { if(!afterMap.containsKey(childObjid)) { Map change = new HashMap<>(); change.put("changeType", "DELETE"); change.put("childObjid", childObjid); change.put("beforeData", beforeMap.get(childObjid)); changedItems.add(change); System.out.println("삭제된 항목: " + childObjid + " - " + beforeMap.get(childObjid).get("PART_NO")); } } // 수정된 항목 for(String childObjid : afterMap.keySet()) { if(beforeMap.containsKey(childObjid)) { Map before = beforeMap.get(childObjid); Map after = afterMap.get(childObjid); // 필드별 비교 (실제 편집 가능한 필드만) List> fieldChanges = new ArrayList<>(); // [DB 필드명, JSP 전송 필드명] 매핑 // JSP getMbomTreeData()에서 전송하는 필드명 기준 String[][] fieldMapping = { {"PART_OBJID", "partObjid"}, // 파트 변경 감지 {"PART_NO", "partNo"}, // 파트 변경 감지 {"PART_NAME", "partName"}, // 파트 변경 감지 {"SUPPLY_TYPE", "supplyType"}, {"RAW_MATERIAL", "rawMaterial"}, {"RAW_MATERIAL_SIZE", "rawMaterialSize"}, {"RAW_MATERIAL_PART_NO", "rawMaterialPartNo"}, {"REQUIRED_QTY", "requiredQty"}, {"PRODUCTION_QTY", "productionQty"}, {"PROCESSING_VENDOR", "processingVendor"}, {"PROCESSING_DEADLINE", "processingDeadline"}, {"GRINDING_DEADLINE", "grindingDeadline"} }; for(String[] mapping : fieldMapping) { String dbField = mapping[0]; String jsField = mapping[1]; // before는 DB에서 대문자로, after는 JSP에서 camelCase로 Object beforeObj = before.get(dbField); Object afterObj = after.get(jsField); String beforeValue = (beforeObj == null) ? "" : String.valueOf(beforeObj); String afterValue = (afterObj == null) ? "" : String.valueOf(afterObj); // 숫자 필드는 소수점 정규화 (1.0000 vs 1 비교 문제 해결) if(dbField.contains("QTY") || dbField.equals("QTY")) { try { double beforeNum = Double.parseDouble(beforeValue); double afterNum = Double.parseDouble(afterValue); if(Math.abs(beforeNum - afterNum) < 0.0001) { continue; // 실질적으로 같은 값 } } catch(Exception e) { // 숫자 변환 실패 시 문자열 비교 } } if(!beforeValue.equals(afterValue)) { Map fieldChange = new HashMap<>(); fieldChange.put("field", dbField); fieldChange.put("before", beforeValue); fieldChange.put("after", afterValue); fieldChanges.add(fieldChange); System.out.println("필드 변경 감지: " + dbField + " - Before: [" + beforeValue + "] After: [" + afterValue + "]"); } } if(!fieldChanges.isEmpty()) { Map change = new HashMap<>(); change.put("changeType", "MODIFY"); change.put("childObjid", childObjid); change.put("partNo", after.get("partNo")); change.put("partName", after.get("partName")); change.put("fieldChanges", fieldChanges); changedItems.add(change); System.out.println("변경된 항목 추가: " + after.get("partNo") + " - " + fieldChanges.size() + "개 필드 변경"); } } } // M-BOM 업데이트 paramMap.put("mbomHeaderObjid", existingMbom.get("OBJID")); sqlSession.update("productionplanning.updateMbomHeader", paramMap); sqlSession.delete("productionplanning.deleteMbomDetail", paramMap); // 새 상세 데이터 삽입 if(mbomData != null && !mbomData.isEmpty()) { for(Map item : mbomData) { item.put("mbomHeaderObjid", existingMbom.get("OBJID")); item.put("sessionUserId", userId); // SEQ가 없으면 기존 SEQ 유지 (JSP에서 전송된 seq 사용) // 없는 경우에만 새로 부여 if(item.get("seq") == null || "".equals(item.get("seq"))) { item.put("seq", 999); // 임시값 (나중에 정렬 필요) } // 기존 항목인 경우 objid와 childObjid 유지 // 새 항목인 경우에만 생성 String objid = CommonUtils.checkNull(item.get("objid")); String childObjid = CommonUtils.checkNull(item.get("childObjid")); if("".equals(objid)) { objid = CommonUtils.createObjId(); item.put("objid", objid); } if("".equals(childObjid)) { childObjid = objid; // 새 항목은 objid와 동일 item.put("childObjid", childObjid); } // LEVEL이 없으면 기본값 1 설정 if(item.get("level") == null || "".equals(item.get("level"))) { item.put("level", 1); } System.out.println("UPDATE M-BOM DETAIL: seq=" + item.get("seq") + ", level=" + item.get("level") + ", partNo=" + item.get("partNo") + ", parentObjid=" + item.get("parentObjid") + ", childObjid=" + childObjid); sqlSession.insert("productionplanning.insertMbomDetail", item); } } // 변경 사항이 있을 때만 이력 저장 if(!changedItems.isEmpty()) { String historyObjid = CommonUtils.createObjId(); Map historyParam = new HashMap<>(); historyParam.put("objid", historyObjid); historyParam.put("mbomHeaderObjid", existingMbom.get("OBJID")); historyParam.put("changeType", "UPDATE"); historyParam.put("changeDescription", changedItems.size() + "개 항목 변경"); historyParam.put("beforeData", new com.google.gson.Gson().toJson(changedItems)); historyParam.put("afterData", "{}"); historyParam.put("sessionUserId", userId); sqlSession.insert("productionplanning.insertMbomHistory", historyParam); } result = true; } } else { // 최초 저장: 새 M-BOM 생성 String newObjid = CommonUtils.createObjId(); paramMap.put("objid", newObjid); paramMap.put("mbomNo", mbomNo); // sourceBomType에 따라 sourceEbomObjid 또는 sourceMbomObjid 설정 String sourceBomType = (String) paramMap.get("sourceBomType"); String sourceBomObjId = (String) paramMap.get("sourceBomObjId"); if("EBOM".equals(sourceBomType)) { paramMap.put("sourceEbomObjid", sourceBomObjId); paramMap.put("sourceMbomObjid", null); } else if("MBOM".equals(sourceBomType)) { paramMap.put("sourceEbomObjid", null); paramMap.put("sourceMbomObjid", sourceBomObjId); } else if("TEMPLATE".equals(sourceBomType)) { // 템플릿 기반 저장: 할당 정보 없음 paramMap.put("sourceEbomObjid", null); paramMap.put("sourceMbomObjid", null); } // MBOM_HEADER 삽입 sqlSession.insert("productionplanning.insertMbomHeader", paramMap); // MBOM_DETAIL 삽입 List> mbomData = (List>) paramMap.get("mbomData"); if(mbomData != null && !mbomData.isEmpty()) { // CHILD_OBJID 매핑 (기존 E-BOM의 CHILD_OBJID -> 새 M-BOM의 CHILD_OBJID) Map childObjidMap = new HashMap<>(); // 1단계: 모든 항목에 대해 새 CHILD_OBJID 생성 for(Map item : mbomData) { String oldChildObjid = CommonUtils.checkNull(item.get("childObjid")); if(!"".equals(oldChildObjid) && !childObjidMap.containsKey(oldChildObjid)) { String newChildObjid = CommonUtils.createObjId(); childObjidMap.put(oldChildObjid, newChildObjid); } } // 2단계: PARENT_OBJID와 CHILD_OBJID를 새 ID로 매핑하여 삽입 for(Map item : mbomData) { String oldChildObjid = CommonUtils.checkNull(item.get("childObjid")); String oldParentObjid = CommonUtils.checkNull(item.get("parentObjid")); // 새 CHILD_OBJID 설정 String newChildObjid = childObjidMap.get(oldChildObjid); if(newChildObjid == null) { newChildObjid = CommonUtils.createObjId(); } // 새 PARENT_OBJID 설정 (부모가 있는 경우에만) String newParentObjid = ""; if(!"".equals(oldParentObjid)) { newParentObjid = childObjidMap.get(oldParentObjid); if(newParentObjid == null) { newParentObjid = oldParentObjid; // 매핑 실패 시 원본 유지 } } item.put("mbomHeaderObjid", newObjid); item.put("objid", newChildObjid); // OBJID = CHILD_OBJID item.put("childObjid", newChildObjid); item.put("parentObjid", newParentObjid); item.put("sessionUserId", userId); // SEQ 유지 (JSP에서 전송된 seq 사용) if(item.get("seq") == null || "".equals(item.get("seq"))) { item.put("seq", 999); // 임시값 } // LEVEL이 없으면 기본값 1 설정 if(item.get("level") == null || "".equals(item.get("level"))) { item.put("level", 1); } System.out.println("INSERT M-BOM DETAIL: seq=" + item.get("seq") + ", level=" + item.get("level") + ", partNo=" + item.get("partNo") + ", parentObjid=" + newParentObjid + ", childObjid=" + newChildObjid); sqlSession.insert("productionplanning.insertMbomDetail", item); } } // 이력 저장 (생성) String historyObjid = CommonUtils.createObjId(); paramMap.put("objid", historyObjid); // MBOM_HISTORY의 OBJID paramMap.put("mbomHeaderObjid", newObjid); paramMap.put("changeType", "CREATE"); paramMap.put("afterData", new com.google.gson.Gson().toJson(paramMap)); sqlSession.insert("productionplanning.insertMbomHistory", paramMap); // PROJECT_MGMT 업데이트 (MBOM_STATUS = 'Y') sqlSession.update("productionplanning.updateProjectMbomStatus", paramMap); result = true; } sqlSession.commit(); } catch(Exception e) { if(sqlSession != null) { sqlSession.rollback(); } e.printStackTrace(); } finally { if(sqlSession != null) { sqlSession.close(); } } return result; } }