/* * ContractMgmtService * * 1.0 * * 2021.10.01 * * Copyright ions */ package com.pms.salesmgmt.service; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.SqlSession; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.google.gson.Gson; 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; import com.pms.common.utils.MailUtil; import com.pms.service.CommonService; /** *
 * 계약관리 Service
 * 
* @since 2021.10.01 * @author kim * @version 1.0 * *
 * << 개정 이력 >>
 * 
 * 수정일 					수정자							 수정내용
 * ----------------		---------------------			--------------------------------------------------------
 * 2021.10.01			김효일							최초작성
 * 
 * 
* */ @Service public class ContractMgmtService { @Autowired CommonService commonService; /** *
	 * 계약관리 목록 조회
	 * 
* @param request * @param paramMap - 계약관리 검색 정보 * @return List> * *
	 * << 개정 이력 >>
	 * 
	 * 수정일					수정자							수정내용
	 * ----------------		---------------------			----------------------------------------------------------
	 * 2021.10.01			김효일							최초작성
	 * 
	 * 
*/ @SuppressWarnings({ "rawtypes", "unchecked" }) public List> getContractMgmtAll(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("contractMgmt.getContractMgmtListCnt", 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("contractMgmt.getContractMgmtList", paramMap); } catch(Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(resultList); } /** *
	 * 고객, 딜러, 제품를 선택한 계약관리 목록 조회
	 * 
* @param request * @param paramMap - 계약관리 검색 정보 * @return List> * *
	 * << 개정 이력 >>
	 * 
	 * 수정일					수정자							수정내용
	 * ----------------		---------------------			----------------------------------------------------------
	 * 2021.10.01			김효일							최초작성
	 * 
	 * 
*/ @SuppressWarnings({ "rawtypes", "unchecked" }) public List> getContractMgmtListRelation(HttpServletRequest request , Map paramMap) { List> resultList = new ArrayList>(); SqlSession sqlSession = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultList = (ArrayList) sqlSession.selectList("contractMgmt.getContractMgmtListRelation", paramMap); } catch(Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(resultList); } /** *
	 * 계약관리 조회
	 * 
* @param paramMap - 계약관리 검색 정보 * @return Map * *
	 * << 개정 이력 >>
	 * 
	 * 수정일					수정자							수정내용
	 * ----------------		---------------------			----------------------------------------------------------
	 * 2021.10.01			김효일							최초작성
	 * 
	 * 
*/ public Map getContractMgmt(Map paramMap) { Map resultMap = new HashMap(); SqlSession sqlSession = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultMap = sqlSession.selectOne("contractMgmt.getContractMgmt", paramMap); } catch(Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(resultMap); } /** *
	 * 계약관리 등록
	 * 
* @param paramMap - 계약관리 정보 * *
	 * << 개정 이력 >>
	 * 
	 * 수정일					수정자							수정내용
	 * ----------------		---------------------			----------------------------------------------------------
	 * 2021.10.01			김효일							최초작성
	 * 
	 * 
*/ public Map saveContractMgmt(HttpServletRequest request , Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(false); String orderDate = (String) paramMap.get("orderDate"); // 계약일자 orderDate = orderDate.replaceAll("[^0-9]", ""); paramMap.put("orderDate", orderDate); String finishDate = (String) paramMap.get("finishDate"); // 최종납기일 finishDate = finishDate.replaceAll("[^0-9]", ""); paramMap.put("finishDate", finishDate); String orderYm = orderDate.substring(0, 6); // 계약년월 paramMap.put("orderYm", orderYm); if (paramMap.containsKey("goodsGuarantee") && StringUtils.isBlank((String) paramMap.get("goodsGuarantee"))) { paramMap.put("goodsGuarantee", null); } if (paramMap.containsKey("goodsQty") && StringUtils.isBlank((String) paramMap.get("goodsQty"))) { paramMap.put("goodsQty", null); } if (paramMap.containsKey("saleQty") && StringUtils.isBlank((String) paramMap.get("saleQty"))) { paramMap.put("saleQty", null); } if (paramMap.containsKey("saleQty1") && StringUtils.isBlank((String) paramMap.get("saleQty1"))) { paramMap.put("saleQty1", null); } if (paramMap.containsKey("supplyQty") && StringUtils.isBlank((String) paramMap.get("supplyQty"))) { paramMap.put("supplyQty", null); } if (paramMap.containsKey("salePrice") && StringUtils.isBlank((String) paramMap.get("salePrice"))) { paramMap.put("salePrice", null); } if (paramMap.containsKey("saleAmt") && StringUtils.isBlank((String) paramMap.get("saleAmt"))) { paramMap.put("saleAmt", null); } if (paramMap.containsKey("vatAmt") && StringUtils.isBlank((String) paramMap.get("vatAmt"))) { paramMap.put("vatAmt", null); } if (paramMap.containsKey("supplyAmt") && StringUtils.isBlank((String) paramMap.get("supplyAmt"))) { paramMap.put("supplyAmt", null); } if (paramMap.containsKey("rcptAmt") && StringUtils.isBlank((String) paramMap.get("rcptAmt"))) { paramMap.put("rcptAmt", null); } if (StringUtils.isBlank((String) paramMap.get("orderNo"))) { String acntUnit = (String) paramMap.get("acntUnit"); // 사업부 int orderSer = sqlSession.selectOne("contractMgmt.getContractMgmtOrderSer", paramMap); // 일련번호 paramMap.put("orderSer", orderSer); // 계약번호 생성 String orderNo = acntUnit + orderYm + StringUtils.leftPad(String.valueOf(orderSer), 3, "0"); paramMap.put("orderNo", orderNo); } // 작성자 PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN); paramMap.put("cretEmpNo", person.getUserId()); String cancelFlag = request.getParameter("cancelFlag"); if (StringUtils.isBlank(cancelFlag) || !"Y".equals(cancelFlag)) { cancelFlag = "N"; paramMap.put("cancelFlag", cancelFlag); } else { // 취소자 paramMap.put("cancelWorkMan", person.getUserId()); } int cnt = sqlSession.update("contractMgmt.insertContractMgmt", 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 paramMap - 계약관리 정보 * *
	 * << 개정 이력 >>
	 * 
	 * 수정일					수정자							수정내용
	 * ----------------		---------------------			----------------------------------------------------------
	 * 2021.10.01			김효일							최초작성
	 * 
	 * 
*/ public Map deleteContractMgmt(HttpServletRequest request , Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(false); // 취소자 PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN); paramMap.put("cancelWorkMan", person.getUserId()); int cnt = sqlSession.delete("contractMgmt.deleteContractMgmt", paramMap); if(cnt > 0){ resultMap.put("result", true); resultMap.put("msg", Message.DELETE_SUCCESS); } sqlSession.commit(); } catch(Exception e) { sqlSession.rollback(); resultMap.put("result", false); resultMap.put("msg", Message.DELETE_FAILED); e.printStackTrace(); } finally { sqlSession.close(); } return resultMap; } /** * 계약관리 목록조회 * @param paramMap * @return */ public List getcontractList(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("contractMgmt.contractListCnt", paramMap); pageMap = (HashMap)CommonUtils.setPagingInfo(request, pageMap); paramMap.put("PAGE_END", pageMap.get("PAGE_END")); paramMap.put("PAGE_START", pageMap.get("PAGE_START")); resultList = CommonUtils.keyChangeUpperList((ArrayList)sqlSession.selectList("contractMgmt.contractList", paramMap)); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return resultList; } /** * 계약관리 목록조회 CNT * @param paramMap * @return */ public Map getContractListCnt(HttpServletRequest request,Map paramMap){ Map pagingMap = new HashMap(); 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("contractMgmt.contractListCnt", paramMap); pageMap = (HashMap)CommonUtils.setPagingInfo(request, pageMap); paramMap.put("PAGE_END", pageMap.get("PAGE_END")); paramMap.put("PAGE_START", pageMap.get("PAGE_START"));*/ pagingMap = sqlSession.selectOne("contractMgmt.contractListCnt", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return pagingMap; } /** * 견적관리 목록조회 * @param paramMap * @return */ public List getestimateList(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("contractMgmt.estimateListCnt", paramMap); pageMap = (HashMap)CommonUtils.setPagingInfo(request, pageMap); paramMap.put("PAGE_END", pageMap.get("PAGE_END")); paramMap.put("PAGE_START", pageMap.get("PAGE_START")); resultList = CommonUtils.keyChangeUpperList((ArrayList)sqlSession.selectList("contractMgmt.estimateList", paramMap)); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return resultList; } /** * 계약 등록 * @param paramMap * @return */ public Map getContractInfo(Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultMap = sqlSession.selectOne("contractMgmt.getOrderMgmtInfo", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } public Map getContractMgmtInfo(Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultMap = sqlSession.selectOne("contractMgmt.getContractMgmtInfo", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } public List overlapOrder(HttpServletRequest request,Map paramMap){ List> resultList = new ArrayList(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); //차수 중복확인 resultList = sqlSession.selectList("contractMgmt.overlapOrder", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return resultList; } /** 견적등록 저장. 프로젝트 생성은 주문서 등록에서 처리 */ @SuppressWarnings({ "rawtypes", "unchecked" }) public Map saveContractMgmtInfo(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; Map resultList = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); paramMap.put("writer", person.getUserId()); int cnt = sqlSession.update("contractMgmt.saveContractMgmtInfo", 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; } @SuppressWarnings({ "rawtypes", "unchecked" }) public Map saveContractMgmtInfo_old(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; Map resultList = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); paramMap.put("writer", person.getUserId()); int cnt = sqlSession.update("contractMgmt.saveContractMgmtInfo", paramMap); //영업 수주 완료시 자동 프로젝트 등록 로직 String result_cd= CommonUtils.checkNull(paramMap.get("contract_result")); String contract_objid= CommonUtils.checkNull(paramMap.get("objId")); String category_cd= CommonUtils.checkNull(paramMap.get("category_cd")); String target_project_no= CommonUtils.checkNull(paramMap.get("target_project_no_direct")); int overhaul_order = Integer.parseInt(CommonUtils.checkNull(paramMap.get("overhaul_order"),"1")); int project_cnt= Integer.parseInt(CommonUtils.checkNull(paramMap.get("facility_qty"), "1")); long contract_price_currency= Long.parseLong(CommonUtils.checkNull(paramMap.get("contract_price_currency"), "0")); long contract_price= Long.parseLong(CommonUtils.checkNull(paramMap.get("contract_price"), "0")); //수주가와 금액은 대수로 나누어서 등록 paramMap.put("contract_price_currency", contract_price_currency/project_cnt + ""); paramMap.put("contract_price", contract_price/project_cnt + ""); if("0000964".equals(result_cd)){ resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); System.out.println("resultList:::"+resultList); //resultList = sqlSession.selectOne("contractMgmt.getProjectCnt", paramMap); if(null==resultList){ for (int i=0; i projectInfo = (Map)sqlSession.selectOne("project.getProjectMngInfo", paramMap); paramMap.put("contract_objid", paramMap.get("objId")); paramMap.put("customer_product", paramMap.get("mechanical_type")); List> taskUnitList = (ArrayList)sqlSession.selectList("project.getWbsTaskListByProject", paramMap); if(CommonUtils.isNotEmpty(taskUnitList) && !taskUnitList.isEmpty()){ String projectNo = (String)projectInfo.get("project_no"); String filepath = Constants.FILE_STORAGE+"\\PART_DATA\\"; for (Map map : taskUnitList) { File file = new File(filepath+File.separator+projectNo+File.separator+CommonUtils.checkNull((String)map.get("unit_no"))+"-"+CommonUtils.checkNull((String)map.get("task_name"))); if(!file.exists()){ file.mkdirs(); } } } } }else{ sqlSession.update("project.ModifyProjectByContract", paramMap); } } if(cnt > 0){ //계약완료 일시 메일 if("0000964".equals(CommonUtils.checkNull(paramMap.get("contract_result")))){ commonService.SendMail(paramMap,"CONTRACT_COMP",CommonUtils.checkNull(paramMap.get("pm_user_id"))); //그냥 등록일때 메일 }else{ if("regist".equals(CommonUtils.checkNull(paramMap.get("actionType")))){ commonService.SendMail(paramMap,"CONTRACT_REG",CommonUtils.checkNull(paramMap.get(""))); } } } 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; } @SuppressWarnings({ "rawtypes", "unchecked" }) public Map saveContractMgmtReviewInfo(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()); int cnt = sqlSession.update("contractMgmt.saveContractMgmtReviewInfo", 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 */ public void setMonthColumn(HttpServletRequest request, Map paramMap){ ArrayList> monthList = new ArrayList(); try{ for(int i=0;i<12;i++){ HashMap monthMap = new HashMap(); String month = String.valueOf(i+1); String monthTitle = month+"월"; monthMap.put("MONTH_TITLE", monthTitle); if(i+1 < 10){ month = "0"+month; } monthMap.put("MONTH", month); monthMap.put("CONTRACT_MONTH_COL_NAME", "CONTRACT_CNT_MONTH_"+month); monthMap.put("CONTRACT_COST_MONTH_COL_NAME", "CONTRACT_COST_MONTH_"+month); monthMap.put("RELEASE_MONTH_COL_NAME", "RELEASE_CNT_MONTH_"+month); monthMap.put("MONTH_FIRST_DAY_COL_NAME", "MONTH_FIRST_DAY_"+month); monthMap.put("MONTH_LAST_DAY_COL_NAME", "MONTH_LAST_DAY_"+month); monthList.add(monthMap); } }catch(Exception e){ e.printStackTrace(); } paramMap.put("monthList", monthList); request.setAttribute("monthList", monthList); } /** * 고객사의 목록을 가져온다.(페이징 처리된 목록) * @param request * @param paramMap * @return */ public ArrayList> getSUPPLYInfoListPaging(HttpServletRequest request,Map paramMap){ ArrayList> oemInfoList = new ArrayList(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); try{ 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("contractMgmt.getSUPPLYInfoListCnt", paramMap); pageMap = (HashMap)CommonUtils.setPagingInfo(request, pageMap); paramMap.put("PAGE_END", pageMap.get("PAGE_END")); paramMap.put("PAGE_START", pageMap.get("PAGE_START")); oemInfoList = (ArrayList)sqlSession.selectList("contractMgmt.getSUPPLYInfoList", paramMap); }catch(Exception e){ throw e; }finally{ sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(oemInfoList); } /** * 고객사의 정보를 가져온다. * @param request * @param paramMap * @return */ public HashMap getSupMngInfo(HttpServletRequest request,Map paramMap){ HashMap oemInfo = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); try{ String objid = CommonUtils.checkNull(request.getParameter("objid")); if(!"".equals(objid)){ HashMap sqlParamMap = new HashMap(); sqlParamMap.put("objid", objid); oemInfo = (HashMap)sqlSession.selectOne("contractMgmt.getSupMngInfo", sqlParamMap); } }catch(Exception e){ throw e; }finally{ sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(oemInfo); } //황의돈================================================================================================= /** * 계약현황 * @param paramMap * @return */ public List getContractDashBoard(HttpServletRequest request,Map paramMap){ List> resultList = new ArrayList(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultList = (ArrayList)sqlSession.selectList("contractMgmt.getContractDashBoard", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(resultList); } @SuppressWarnings({ "rawtypes", "unchecked" }) public Map deleteContractMngInfo(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); System.out.println("paramMap : "+paramMap); String[] objIds = request.getParameterValues("objId"); int cnt = 0; for(int i=0; i 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; } @SuppressWarnings({ "rawtypes", "unchecked" }) public Map deletesupplyMngInfo(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); System.out.println("paramMap : "+paramMap); String[] objIds = request.getParameterValues("objId"); int cnt = 0; for(int i=0; i 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; } /** * 계약 옵션 리스트 * @param paramMap * @return */ public List getContractOptionList(HttpServletRequest request, Map paramMap){ List resultList = new ArrayList(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultList = sqlSession.selectList("contractMgmt.getContractOptionList", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(resultList); } /** 공급업체 등록 * @param request * @param paramMap * @return */ public Map saveSupMgmtInfo(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("userId", writer);*/ int cnt = sqlSession.update("contractMgmt.mergeSupMgmtInfo", paramMap); String objid = CommonUtils.checkNull(paramMap.get("objid")); //paramMap.put("objid", CommonUtils.createObjId()); //paramMap.put("targetObjid", objid); //paramMap.put("writer", writer); //sqlSession.update("admin.insertSupplyMngHistory", 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 paramMap * @return */ public List counselingList(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("contractMgmt.counselingListCnt", paramMap); pageMap = (HashMap)CommonUtils.setPagingInfo(request, pageMap); paramMap.put("PAGE_END", pageMap.get("PAGE_END")); paramMap.put("PAGE_START", pageMap.get("PAGE_START")); resultList = CommonUtils.keyChangeUpperList((ArrayList)sqlSession.selectList("contractMgmt.counselingList", paramMap)); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return resultList; } public Map getcounselingMgmtInfo(Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultMap = sqlSession.selectOne("contractMgmt.getcounselingMgmtInfo", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } /** 공급업체 등록 * @param request * @param paramMap * @return */ public Map savecounselingInfo(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("userId", writer); int cnt = sqlSession.update("contractMgmt.savecounselingInfo", 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; } public Map getEstimateMgmtInfo(Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultMap = sqlSession.selectOne("contractMgmt.getEstimateMgmtInfo", paramMap); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } @SuppressWarnings({ "rawtypes", "unchecked" }) public Map saveEstimateMgmtInfo(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("userId", person.getUserId()); int cnt = sqlSession.update("contractMgmt.saveEstimateMgmtInfo", paramMap); if(cnt > 0){ resultMap.put("result", true); resultMap.put("msg", Message.SAVE_SUCCESS); } }catch(Exception e){ resultMap.put("result", false); resultMap.put("msg", Message.SAVE_FAILED); e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } @SuppressWarnings({ "rawtypes", "unchecked" }) public Map deleteEstimateMgmtInfo(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); System.out.println("paramMap : "+paramMap); String[] objIds = request.getParameterValues("chk_objId"); int cnt = 0; for(int i=0; i 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; } //계약등록 @SuppressWarnings({ "rawtypes", "unchecked" }) public Map createEstimateMgmtInfo(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); System.out.println("paramMap : "+paramMap); String[] objIds = request.getParameterValues("chk_objId"); int cnt = 0; for(int i=0; i 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(); sqlSession.rollback(); }finally{ sqlSession.close(); } return resultMap; } /** * 영업목표 Form PopUp * @param paramMap * @return */ public Map getYearGoalInfo(HttpServletRequest request,Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); resultMap = (HashMap)sqlSession.selectOne("contractMgmt.getYearGoalInfo", paramMap); String yearGoalObjId = ""; if(CommonUtils.isNotEmpty(resultMap)){ yearGoalObjId = CommonUtils.checkNull(resultMap.get("year_goal_objid")); }else{ resultMap = new HashMap(); } if("".equals(yearGoalObjId)){ yearGoalObjId = CommonUtils.createObjId(); } resultMap.put("YEAR_GOAL_OBJID", yearGoalObjId); }catch(Exception e){ e.printStackTrace(); }finally{ sqlSession.close(); } return CommonUtils.toUpperCaseMapKey(resultMap); } /** * 영업목표 저장 * @param paramMap * @return */ public Map saveYearGoalInfo(HttpServletRequest request,Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); String writer = CommonUtils.checkNull(person.getUserId()); paramMap.put("WRITER", writer); sqlSession.insert("contractMgmt.saveYearGoalInfo", 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; } /** * 영업목표 삭제 * @param paramMap * @return */ public Map deleteYearGoalInfo(HttpServletRequest request,Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); String targetObjId = CommonUtils.checkNull(paramMap.get("checkArr")); System.out.println("paramMap:"+paramMap); if(!"".equals(targetObjId)){ sqlSession.delete("contractMgmt.deleteYearGoalInfo", paramMap); sqlSession.commit(); } resultMap.put("result", true); resultMap.put("msg", Message.DELETE_SUCCESS); }catch(Exception e){ sqlSession.rollback(); resultMap.put("result", false); resultMap.put("msg", Message.DELETE_FAILED); e.printStackTrace(); }finally{ sqlSession.close(); } return resultMap; } /** * 고객사 담당자 정보 조회 * @param paramMap * @return */ public Map getCustomerContactInfo(Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); resultMap = (Map) sqlSession.selectOne("contractMgmt.getCustomerContactInfo", paramMap); } catch(Exception e){ e.printStackTrace(); } finally { if(sqlSession != null) sqlSession.close(); } return resultMap; } /** * 견적서 템플릿 기본 정보 조회 * @param paramMap * @return */ public Map getEstimateTemplateInfo(Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); String objId = CommonUtils.checkNull(paramMap.get("objId")); String templateObjId = CommonUtils.checkNull(paramMap.get("templateObjId")); String templateType = CommonUtils.checkNull(paramMap.get("template_type")); System.out.println("=== getEstimateTemplateInfo 파라미터 ==="); System.out.println("objId: " + objId); System.out.println("templateObjId: " + templateObjId); System.out.println("templateType: " + templateType); // templateObjId가 있으면 직접 조회 if(!"".equals(templateObjId) && !"-1".equals(templateObjId)){ paramMap.put("templateObjId", templateObjId); } // objId 또는 templateObjId 중 하나라도 있으면 조회 if((!"".equals(objId) && !"-1".equals(objId)) || (!"".equals(templateObjId) && !"-1".equals(templateObjId))){ // 견적서 기본 정보 조회 (CONTRACT_MGMT 테이블에서) Map baseInfo = (Map) sqlSession.selectOne("contractMgmt.getEstimateTemplateInfo", paramMap); System.out.println("baseInfo: " + baseInfo); if(baseInfo != null){ resultMap = CommonUtils.toUpperCaseMapKey(baseInfo); System.out.println("baseInfo (변환 후): " + resultMap); } // 견적서 템플릿 정보 조회 (ESTIMATE_TEMPLATE 테이블에서, 있는 경우) Map templateInfo = (Map) sqlSession.selectOne("contractMgmt.getEstimateTemplateData", paramMap); System.out.println("templateInfo: " + templateInfo); if(templateInfo != null && !templateInfo.isEmpty()){ templateInfo = CommonUtils.toUpperCaseMapKey(templateInfo); System.out.println("templateInfo (변환 후): " + templateInfo); resultMap.putAll(templateInfo); } System.out.println("최종 resultMap 크기: " + resultMap.size()); } }catch(Exception e){ e.printStackTrace(); }finally{ if(sqlSession != null) sqlSession.close(); } return resultMap; } /** * 견적서 템플릿 품목 정보 조회 * @param paramMap * @return */ public List getEstimateTemplateItems(Map paramMap){ List resultList = new ArrayList(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); String objId = CommonUtils.checkNull(paramMap.get("objId")); String templateObjId = CommonUtils.checkNull(paramMap.get("templateObjId")); String templateType = CommonUtils.checkNull(paramMap.get("template_type")); System.out.println("=== getEstimateTemplateItems 파라미터 ==="); System.out.println("objId: " + objId); System.out.println("templateObjId: " + templateObjId); System.out.println("templateType: " + templateType); // templateObjId가 있으면 우선 사용, 없으면 objId 사용 String targetId = !"".equals(templateObjId) && !"-1".equals(templateObjId) ? templateObjId : objId; if(!"".equals(targetId) && !"-1".equals(targetId)){ // 장비 견적서(Template 2)인 경우 categories_json에서 데이터 가져오기 if("2".equals(templateType)){ // templateObjId가 있으면 직접 조회, 없으면 contract_objid로 조회 if(!"".equals(templateObjId) && !"-1".equals(templateObjId)){ paramMap.put("templateObjId", templateObjId); } // ESTIMATE_TEMPLATE에서 categories_json 조회 Map templateData = (Map) sqlSession.selectOne("contractMgmt.getEstimateTemplateData", paramMap); System.out.println("=== getEstimateTemplateItems 디버깅 ==="); System.out.println("templateData (변환 전): " + templateData); if(templateData != null){ // 대문자로 변환 templateData = CommonUtils.toUpperCaseMapKey(templateData); System.out.println("templateData (변환 후): " + templateData); // 대소문자 모두 체크 (안전장치) String categoriesJson = CommonUtils.checkNull(templateData.get("CATEGORIES_JSON")); if("".equals(categoriesJson)) categoriesJson = CommonUtils.checkNull(templateData.get("categories_json")); System.out.println("categoriesJson: " + categoriesJson); if(categoriesJson != null && !categoriesJson.isEmpty()){ // JSON 파싱 (Gson 사용) com.google.gson.Gson gson = new com.google.gson.Gson(); java.lang.reflect.Type listType = new com.google.gson.reflect.TypeToken>(){}.getType(); resultList = gson.fromJson(categoriesJson, listType); System.out.println("파싱된 resultList 크기: " + resultList.size()); } } } // 일반 견적서(Template 1)인 경우 기존 방식대로 ESTIMATE_TEMPLATE_ITEM에서 조회 else { resultList = sqlSession.selectList("contractMgmt.getEstimateTemplateItems", paramMap); } } }catch(Exception e){ e.printStackTrace(); }finally{ if(sqlSession != null) sqlSession.close(); } return resultList; } /** * 견적서 템플릿 목록 조회 * @param request * @param paramMap * @return */ public Map getEstimateTemplateList(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); List list = sqlSession.selectList("contractMgmt.getEstimateTemplateList", paramMap); resultMap.put("result", "success"); resultMap.put("list", list); }catch(Exception e){ resultMap.put("result", "error"); resultMap.put("msg", "목록 조회 중 오류가 발생했습니다."); e.printStackTrace(); }finally{ if(sqlSession != null) sqlSession.close(); } return resultMap; } /** * 견적서 템플릿 OBJID로 조회 (견적현황 클릭 시) * @param paramMap * @return */ public Map getEstimateTemplateByObjId(Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); String templateObjId = CommonUtils.checkNull(paramMap.get("templateObjId")); if(!"".equals(templateObjId) && !"-1".equals(templateObjId)){ // ESTIMATE_TEMPLATE 테이블에서 직접 조회 resultMap = (Map) sqlSession.selectOne("contractMgmt.getEstimateTemplateByObjId", paramMap); // CONTRACT_MGMT 정보도 함께 조회 if(resultMap != null && !resultMap.isEmpty()){ String contractObjId = CommonUtils.checkNull(resultMap.get("CONTRACT_OBJID")); if(!"".equals(contractObjId)){ Map contractInfo = new HashMap(); contractInfo.put("objId", contractObjId); Map contractData = (Map) sqlSession.selectOne("contractMgmt.getEstimateTemplateInfo", contractInfo); if(contractData != null && !contractData.isEmpty()){ // CONTRACT 정보를 resultMap에 추가 (템플릿 정보가 우선) contractData.putAll(resultMap); resultMap = contractData; } } } } }catch(Exception e){ e.printStackTrace(); }finally{ if(sqlSession != null) sqlSession.close(); } return resultMap; } /** * 견적서 템플릿 품목 조회 (템플릿 OBJID로) * @param paramMap * @return */ public List getEstimateTemplateItemsByTemplateObjId(Map paramMap){ List resultList = new ArrayList(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); String templateObjId = CommonUtils.checkNull(paramMap.get("templateObjId")); if(!"".equals(templateObjId) && !"-1".equals(templateObjId)){ resultList = sqlSession.selectList("contractMgmt.getEstimateTemplateItemsByTemplateObjId", paramMap); } }catch(Exception e){ e.printStackTrace(); }finally{ if(sqlSession != null) sqlSession.close(); } return resultList; } /** * 견적서 템플릿 저장 * @param request * @param paramMap * @return */ public Map saveEstimateTemplate(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); String userId = person.getUserId(); String objId = CommonUtils.checkNull(paramMap.get("objId")); // CONTRACT_OBJID String templateObjId = CommonUtils.checkNull(paramMap.get("templateObjId")); // 기존 템플릿 수정 시 String templateType = CommonUtils.checkNull(paramMap.get("template_type")); String itemsJson = CommonUtils.checkNull(paramMap.get("items")); String categoriesJson = CommonUtils.checkNull(paramMap.get("categories")); // 합계 정보 (일반 견적서용) String totalAmount = CommonUtils.checkNull(paramMap.get("total_amount")); String totalAmountKrw = CommonUtils.checkNull(paramMap.get("total_amount_krw")); paramMap.put("writer", userId); paramMap.put("chg_user_id", userId); paramMap.put("total_amount", totalAmount); paramMap.put("total_amount_krw", totalAmountKrw); // 기존 템플릿 수정인지 신규 작성인지 확인 // 중요: templateObjId가 명시적으로 있을 때만 수정, 없으면 항상 신규 작성 boolean isUpdate = false; if(!"".equals(templateObjId) && !"-1".equals(templateObjId)){ // templateObjId가 명시적으로 있으면 해당 템플릿 수정 (견적현황에서 기존 견적서 열어서 수정한 경우) Map existingTemplate = (Map) sqlSession.selectOne("contractMgmt.getEstimateTemplateByObjId", paramMap); if(existingTemplate != null && !existingTemplate.isEmpty()){ isUpdate = true; paramMap.put("template_objid", templateObjId); } } // else: templateObjId가 없으면 항상 신규 견적서 작성 (같은 영업번호에 여러 견적서 가능) if(isUpdate){ // 기존 견적서 수정 sqlSession.update("contractMgmt.updateEstimateTemplate", paramMap); } else { // 신규 견적서 작성 - 새로운 OBJID 생성 templateObjId = CommonUtils.createObjId(); paramMap.put("template_objid", templateObjId); paramMap.put("contract_objid", objId); sqlSession.insert("contractMgmt.insertEstimateTemplate", paramMap); } // 기존 품목 삭제 sqlSession.delete("contractMgmt.deleteEstimateTemplateItems", paramMap); // 품목 정보 저장 if(!"".equals(itemsJson)){ // JSON 파싱 및 저장 로직 (실제 구현 시 JSON 라이브러리 사용) // 여기서는 간단히 파라미터로 받은 데이터를 저장 paramMap.put("items_json", itemsJson); sqlSession.insert("contractMgmt.insertEstimateTemplateItems", paramMap); } // 카테고리 정보 저장 (장비 견적서용) if(!"".equals(categoriesJson)){ paramMap.put("categories_json", categoriesJson); sqlSession.update("contractMgmt.updateEstimateTemplateCategories", paramMap); } sqlSession.commit(); resultMap.put("result", "success"); resultMap.put("msg", Message.SAVE_SUCCESS); }catch(Exception e){ if(sqlSession != null) sqlSession.rollback(); resultMap.put("result", "error"); resultMap.put("msg", Message.SAVE_FAILED); e.printStackTrace(); }finally{ if(sqlSession != null) sqlSession.close(); } return resultMap; } /** * 장비 견적서 저장 (Template 2) * @param request * @param paramMap * @return */ public Map saveEstimateTemplate2(HttpServletRequest request, Map paramMap) throws Exception { Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); String userId = CommonUtils.checkNull(paramMap.get("userId")); String objId = CommonUtils.checkNull(paramMap.get("objId")); String templateObjId = CommonUtils.checkNull(paramMap.get("templateObjId")); String categoriesJson = CommonUtils.checkNull(paramMap.get("categories")); paramMap.put("writer", userId); paramMap.put("chg_user_id", userId); paramMap.put("template_type", "2"); // 장비 견적서 // 기존 템플릿 수정인지 신규 작성인지 확인 boolean isUpdate = false; if(!"".equals(templateObjId) && !"-1".equals(templateObjId)){ Map existingTemplate = (Map) sqlSession.selectOne("contractMgmt.getEstimateTemplateByObjId", paramMap); if(existingTemplate != null && !existingTemplate.isEmpty()){ isUpdate = true; paramMap.put("template_objid", templateObjId); // objId가 없으면 기존 템플릿에서 가져오기 if("".equals(objId) || "-1".equals(objId)){ existingTemplate = CommonUtils.toUpperCaseMapKey(existingTemplate); objId = CommonUtils.checkNull(existingTemplate.get("CONTRACT_OBJID")); paramMap.put("contract_objid", objId); } } } if(isUpdate){ // 기존 견적서 수정 sqlSession.update("contractMgmt.updateEstimateTemplate2", paramMap); } else { // 신규 견적서 작성 templateObjId = CommonUtils.createObjId(); paramMap.put("template_objid", templateObjId); paramMap.put("contract_objid", objId); sqlSession.insert("contractMgmt.insertEstimateTemplate2", paramMap); } // 카테고리 정보 저장 (categories_json 필드에 저장) if(!"".equals(categoriesJson)){ paramMap.put("categories_json", categoriesJson); sqlSession.update("contractMgmt.updateEstimateTemplateCategories", paramMap); } // 장비 견적서도 ESTIMATE_TEMPLATE_ITEM에 저장 (일관성을 위해) // 기존 품목 삭제 sqlSession.delete("contractMgmt.deleteEstimateTemplateItems", paramMap); // 품목 정보 생성 및 저장 String partName = CommonUtils.checkNull(paramMap.get("part_name")); String partObjId = CommonUtils.checkNull(paramMap.get("part_objid")); Object totalAmount = paramMap.get("total_amount"); if(!"".equals(partName) && totalAmount != null) { try { long amount = Long.parseLong(totalAmount.toString().replaceAll("[^0-9]", "")); // 수량은 categories JSON에서 CNC Machine의 quantity를 가져옴 int quantity = 1; // 기본값 System.out.println("=== 장비 견적서 수량 추출 시작 ==="); System.out.println("categoriesJson: " + categoriesJson); if(!"".equals(categoriesJson)) { try { // JSON 파싱 org.json.simple.parser.JSONParser parser = new org.json.simple.parser.JSONParser(); org.json.simple.JSONArray categoriesArray = (org.json.simple.JSONArray) parser.parse(categoriesJson); System.out.println("categories 배열 크기: " + categoriesArray.size()); // CNC Machine 카테고리 찾기 for(int i = 0; i < categoriesArray.size(); i++) { org.json.simple.JSONObject category = (org.json.simple.JSONObject) categoriesArray.get(i); String categoryId = (String) category.get("category"); System.out.println("카테고리 " + i + ": " + categoryId); if("cnc_machine".equals(categoryId)) { System.out.println("CNC Machine 카테고리 찾음!"); // cnc_machine의 quantity는 items 배열 안에 있음 org.json.simple.JSONArray items = (org.json.simple.JSONArray) category.get("items"); System.out.println("items 배열: " + items); if(items != null && items.size() > 0) { org.json.simple.JSONObject firstItem = (org.json.simple.JSONObject) items.get(0); Object qtyObj = firstItem.get("quantity"); System.out.println("quantity 객체: " + qtyObj); System.out.println("quantity 타입: " + (qtyObj != null ? qtyObj.getClass().getName() : "null")); if(qtyObj != null && !"".equals(qtyObj.toString().trim())) { // quantity는 텍스트 형식일 수 있으므로 첫 줄만 추출 String qtyStr = qtyObj.toString().split("\n")[0].trim(); System.out.println("추출된 수량 문자열: '" + qtyStr + "'"); if(!qtyStr.isEmpty()) { String numOnly = qtyStr.replaceAll("[^0-9]", ""); System.out.println("숫자만 추출: '" + numOnly + "'"); if(!numOnly.isEmpty()) { quantity = Integer.parseInt(numOnly); System.out.println("최종 수량: " + quantity); } } } else { System.out.println("quantity가 null이거나 비어있음"); } } else { System.out.println("items 배열이 비어있음"); } break; } } System.out.println("최종 결정된 수량: " + quantity); } catch(Exception e) { System.out.println("수량 추출 실패, 기본값 1 사용"); e.printStackTrace(); } } else { System.out.println("categoriesJson이 비어있음"); } // 단가 계산 (총액 / 수량) long unitPrice = quantity > 0 ? amount / quantity : amount; // JSON 형식으로 품목 데이터 생성 String itemJson = "[{" + "\"seq\": 1," + "\"category\": \"\"," + "\"part_objid\": \"" + partObjId + "\"," + "\"description\": \"" + partName + "\"," + "\"specification\": \"\"," + "\"quantity\": " + quantity + "," + "\"unit\": \"EA\"," + "\"unit_price\": " + unitPrice + "," + "\"amount\": " + amount + "," + "\"note\": \"\"," + "\"remark\": \"\"" + "}]"; paramMap.put("items_json", itemJson); sqlSession.insert("contractMgmt.insertEstimateTemplateItems", paramMap); System.out.println("장비 견적서 품목 저장 완료 - 품명: " + partName + ", 수량: " + quantity + ", 단가: " + unitPrice); } catch(Exception e) { System.out.println("장비 견적서 품목 저장 실패: " + e.getMessage()); e.printStackTrace(); // 품목 저장 실패해도 견적서는 저장되도록 예외를 던지지 않음 } } sqlSession.commit(); resultMap.put("result", "success"); resultMap.put("msg", Message.SAVE_SUCCESS); }catch(Exception e){ if(sqlSession != null) sqlSession.rollback(); e.printStackTrace(); throw e; // 예외를 컨트롤러로 전달 }finally{ if(sqlSession != null) sqlSession.close(); } return resultMap; } /** * 견적서 메일 발송 * @param request * @param paramMap - objId (CONTRACT_OBJID) * @return */ public Map sendEstimateMail(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(false); String objId = CommonUtils.checkNull(paramMap.get("objId")); // 1. 계약 정보 조회 Map contractInfo = (Map) sqlSession.selectOne("contractMgmt.getContractInfoForMail", paramMap); if(contractInfo == null || contractInfo.isEmpty()){ resultMap.put("result", "error"); resultMap.put("message", "계약 정보를 찾을 수 없습니다."); return resultMap; } // 2. 최종 차수 견적서 조회 Map estimateTemplate = (Map) sqlSession.selectOne("contractMgmt.getLatestEstimateTemplate", paramMap); if(estimateTemplate == null || estimateTemplate.isEmpty()){ resultMap.put("result", "error"); resultMap.put("message", "견적서를 찾을 수 없습니다."); return resultMap; } // 디버깅: estimateTemplate 출력 System.out.println("===== Estimate Template Debug ====="); for(Object key : estimateTemplate.keySet()){ System.out.println(key + " = " + estimateTemplate.get(key)); } System.out.println("==================================="); String templateObjId = CommonUtils.checkNull(estimateTemplate.get("objid")); if("".equals(templateObjId)) templateObjId = CommonUtils.checkNull(estimateTemplate.get("OBJID")); String templateType = CommonUtils.checkNull(estimateTemplate.get("template_type")); if("".equals(templateType)) templateType = CommonUtils.checkNull(estimateTemplate.get("TEMPLATE_TYPE")); // 3. 견적서 품목 조회 List estimateItems = new ArrayList(); if("2".equals(templateType)) { // 장비 견적서 (Template 2): CATEGORIES_JSON 파싱 String categoriesJson = CommonUtils.checkNull(estimateTemplate.get("categories_json")); if("".equals(categoriesJson)) categoriesJson = CommonUtils.checkNull(estimateTemplate.get("CATEGORIES_JSON")); if(!"".equals(categoriesJson)) { try { Gson gson = new Gson(); List categories = gson.fromJson(categoriesJson, List.class); // CNC Machine 카테고리의 items 추출 for(Map category : categories) { String categoryName = CommonUtils.checkNull(category.get("category")); if("cnc_machine".equals(categoryName)) { List items = (List) category.get("items"); if(items != null && !items.isEmpty()) { estimateItems.addAll(items); } break; } } } catch(Exception e) { System.out.println("CATEGORIES_JSON 파싱 오류: " + e.getMessage()); e.printStackTrace(); } } } else { // 일반 견적서 (Template 1): ESTIMATE_TEMPLATE_ITEM 테이블 조회 Map itemParam = new HashMap(); itemParam.put("templateObjId", templateObjId); estimateItems = sqlSession.selectList("contractMgmt.getEstimateTemplateItemsByTemplateObjId", itemParam); } System.out.println("===== Estimate Items Debug ====="); System.out.println("Template Type: " + templateType); System.out.println("Items count: " + (estimateItems != null ? estimateItems.size() : 0)); if(estimateItems != null && !estimateItems.isEmpty()){ for(int i = 0; i < Math.min(3, estimateItems.size()); i++){ Map item = estimateItems.get(i); System.out.println("Item " + (i+1) + " keys: " + item.keySet()); } } System.out.println("================================"); // 4. 메일 제목 생성 String contractNo = CommonUtils.checkNull(contractInfo.get("contract_no")); String customerName = CommonUtils.checkNull(contractInfo.get("customer_name")); String subject = "[" + customerName + "] " + contractNo + " 견적서"; // mail_log 조회용 제목 (OBJID 포함) String subjectForLog = subject + " [OBJID:" + objId + "]"; // 5. 메일 내용 생성 (간단한 텍스트 버전) String contents = makeEstimateMailContents(contractInfo, estimateTemplate, estimateItems); // 6. 수신자 정보 설정 ArrayList toEmailList = new ArrayList(); String customerEmail = CommonUtils.checkNull(contractInfo.get("customer_email")); if(!"".equals(customerEmail)){ toEmailList.add(customerEmail); } else { resultMap.put("result", "error"); resultMap.put("message", "고객사 이메일 정보가 없습니다."); return resultMap; } // 7. 참조: 작성자 이메일 ArrayList ccEmailList = new ArrayList(); String writerEmail = CommonUtils.checkNull(contractInfo.get("writer_email")); if(!"".equals(writerEmail)){ ccEmailList.add(writerEmail); } // 7-1. PDF 파일 처리 (세션 ID로 업로드된 경우) ArrayList attachFileList = new ArrayList(); String pdfSessionId = CommonUtils.checkNull(paramMap.get("pdfSessionId")); if(!"".equals(pdfSessionId)) { // 세션 ID로 저장된 PDF 파일 가져오기 File pdfFile = getPdfFromSession(pdfSessionId, estimateTemplate); if(pdfFile != null && pdfFile.exists()) { HashMap fileMap = new HashMap(); fileMap.put(Constants.Db.COL_FILE_REAL_NAME, pdfFile.getName()); fileMap.put(Constants.Db.COL_FILE_SAVED_NAME, pdfFile.getName()); fileMap.put(Constants.Db.COL_FILE_PATH, pdfFile.getParent()); attachFileList.add(fileMap); System.out.println("PDF 파일 첨부 완료: " + pdfFile.getAbsolutePath()); } else { System.out.println("PDF 파일을 찾을 수 없습니다: " + pdfSessionId); } } // 8. 메일 발송 PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); String fromUserId = person.getUserId(); System.out.println("===== 메일 발송 시도 ====="); System.out.println("From UserId: " + fromUserId); System.out.println("To Email: " + toEmailList); System.out.println("CC Email: " + ccEmailList); System.out.println("Subject (실제 메일): " + subject); System.out.println("Subject (mail_log): " + subjectForLog); System.out.println("첨부파일 개수: " + attachFileList.size()); System.out.println("========================"); boolean mailSent = false; try { // UTF-8 인코딩 메서드 사용 (견적서는 한글 내용이 많음) mailSent = MailUtil.sendMailWithAttachFileUTF8( fromUserId, null, // fromEmail (자동으로 SMTP 설정 사용) new ArrayList(), // toUserIdList (빈 리스트) toEmailList, ccEmailList, new ArrayList(), // bccEmailList (빈 리스트) null, // important subject, // 실제 메일 제목 (OBJID 없음) contents, attachFileList.size() > 0 ? attachFileList : null, // PDF 첨부 "CONTRACT_ESTIMATE", subjectForLog // mail_log용 제목 (OBJID 포함) ); System.out.println("메일 발송 결과: " + mailSent); } catch(Exception mailEx) { System.out.println("메일 발송 중 예외 발생: " + mailEx.getMessage()); mailEx.printStackTrace(); resultMap.put("result", "error"); resultMap.put("message", "메일 발송 중 예외가 발생했습니다: " + mailEx.getMessage()); return resultMap; } if(mailSent){ resultMap.put("result", "success"); resultMap.put("message", "견적서가 성공적으로 발송되었습니다."); } else { resultMap.put("result", "error"); resultMap.put("message", "메일 발송에 실패했습니다."); } }catch(Exception e){ resultMap.put("result", "error"); resultMap.put("message", "메일 발송 중 오류가 발생했습니다: " + e.getMessage()); e.printStackTrace(); }finally{ if(sqlSession != null) sqlSession.close(); } return resultMap; } /** * 견적서 메일 내용 생성 * @param contractInfo * @param estimateTemplate * @param estimateItems * @return */ private String makeEstimateMailContents(Map contractInfo, Map estimateTemplate, List estimateItems){ StringBuilder contents = new StringBuilder(); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append("
"); // 제목 contents.append("
견 적 서
"); // estimateTemplate 키는 대문자/소문자 모두 체크 // 수신처는 contractInfo에서 고객사명 가져오기 String recipient = CommonUtils.checkNull(contractInfo.get("customer_name")); if("".equals(recipient)) recipient = CommonUtils.checkNull(contractInfo.get("CUSTOMER_NAME")); // 없으면 estimateTemplate에서 가져오기 if("".equals(recipient)) recipient = CommonUtils.checkNull(estimateTemplate.get("recipient")); if("".equals(recipient)) recipient = CommonUtils.checkNull(estimateTemplate.get("RECIPIENT")); String contactPerson = CommonUtils.checkNull(estimateTemplate.get("contact_person")); if("".equals(contactPerson)) contactPerson = CommonUtils.checkNull(estimateTemplate.get("CONTACT_PERSON")); String estimateNo = CommonUtils.checkNull(estimateTemplate.get("estimate_no")); if("".equals(estimateNo)) estimateNo = CommonUtils.checkNull(estimateTemplate.get("ESTIMATE_NO")); String executorDate = CommonUtils.checkNull(estimateTemplate.get("executor")); if("".equals(executorDate)) executorDate = CommonUtils.checkNull(estimateTemplate.get("EXECUTOR")); if("".equals(executorDate)) executorDate = CommonUtils.checkNull(estimateTemplate.get("executor_date")); if("".equals(executorDate)) executorDate = CommonUtils.checkNull(estimateTemplate.get("EXECUTOR_DATE")); // 담당자 정보 String managerName = CommonUtils.checkNull(estimateTemplate.get("manager_name")); if("".equals(managerName)) managerName = CommonUtils.checkNull(estimateTemplate.get("MANAGER_NAME")); if("".equals(managerName)) managerName = "영업부"; String managerContact = CommonUtils.checkNull(estimateTemplate.get("manager_contact")); if("".equals(managerContact)) managerContact = CommonUtils.checkNull(estimateTemplate.get("MANAGER_CONTACT")); // 헤더 섹션 (왼쪽: 기본정보, 오른쪽: 회사정보) contents.append("
"); // 왼쪽: 기본 정보 테이블 contents.append("
"); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append("
시행일자" + executorDate + "
수신처" + recipient + "
수신인" + contactPerson + "
견적번호" + estimateNo + "
"); contents.append("
"); // 오른쪽: 회사 정보 contents.append("
"); contents.append("
"); // 회사 도장 이미지 경로 String projectRoot = System.getProperty("user.dir"); String companyStampPath = projectRoot + "/WebContent/images/company_stamp.png"; // Docker 환경인 경우 다른 경로 시도 File stampFile = new File(companyStampPath); if(!stampFile.exists()) { companyStampPath = "/usr/local/tomcat/webapps/ROOT/images/company_stamp.png"; stampFile = new File(companyStampPath); if(!stampFile.exists()) { companyStampPath = ""; } } String stampBase64 = !"".equals(companyStampPath) ? encodeImageToBase64(companyStampPath) : ""; if(!"".equals(stampBase64)) { // 이미지가 있으면 Base64로 인코딩된 이미지 표시 contents.append("회사 도장"); } else { // 이미지가 없으면 텍스트로 표시 contents.append("
"); contents.append("
(주)알피에스
대표이사
이 종 현
"); contents.append("
"); } // 회사 주소 및 연락처 contents.append("
"); contents.append("대전광역시 유성구 국제과학10로 8
"); contents.append("TEL:(042)602-3300 FAX:(042)672-3399"); contents.append("
"); contents.append("
"); // company-info 닫기 contents.append("
"); // header-right 닫기 contents.append("
"); // header-section 닫기 // 인사말 및 담당자 정보 contents.append("
"); contents.append("
"); contents.append("견적을 요청해 주셔서 대단히 감사합니다.
"); contents.append("하기와 같이 견적서를 제출합니다."); contents.append("
"); contents.append("
"); contents.append("담당자 : " + managerName + "
"); if(!"".equals(managerContact)) { contents.append("연락처 : " + managerContact + "
"); } contents.append("부가세 별도"); contents.append("
"); contents.append("
"); // 견적 품목 if(estimateItems != null && !estimateItems.isEmpty()){ contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); long totalAmount = 0; for(int i = 0; i < estimateItems.size(); i++){ Map item = estimateItems.get(i); String amount = CommonUtils.checkNull(item.get("amount")); if(!"".equals(amount)){ try { totalAmount += Long.parseLong(amount.replace(",", "")); } catch(Exception e){} } contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); } // 계 (총 합계) - 통화 기호 포함 String totalAmountStr = CommonUtils.checkNull(estimateTemplate.get("total_amount")); if("".equals(totalAmountStr)) totalAmountStr = CommonUtils.checkNull(estimateTemplate.get("TOTAL_AMOUNT")); // DB에 저장된 합계가 없으면 계산한 값 사용 if("".equals(totalAmountStr)){ totalAmountStr = String.format("%,d", totalAmount); } // 통화 기호 가져오기 String currencyName = CommonUtils.checkNull(estimateTemplate.get("contract_currency_name")); if("".equals(currencyName)) currencyName = CommonUtils.checkNull(estimateTemplate.get("CONTRACT_CURRENCY_NAME")); String currencySymbol = "₩"; // 기본값 if(currencyName.indexOf("달러") >= 0 || "USD".equals(currencyName)) { currencySymbol = "$"; } else if(currencyName.indexOf("유로") >= 0 || "EUR".equals(currencyName)) { currencySymbol = "€"; } else if(currencyName.indexOf("엔") >= 0 || "JPY".equals(currencyName)) { currencySymbol = "¥"; } else if(currencyName.indexOf("위안") >= 0 || "CNY".equals(currencyName)) { currencySymbol = "¥"; } contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append(""); // 원화환산 공급가액 - 제거 (화면에서도 숨김 처리) // 테이블 내 비고 (항상 표시) String noteRemarks = CommonUtils.checkNull(estimateTemplate.get("note_remarks")); if("".equals(noteRemarks)) noteRemarks = CommonUtils.checkNull(estimateTemplate.get("NOTE_REMARKS")); System.out.println("===== 비고 내용 확인 ====="); System.out.println("noteRemarks: [" + noteRemarks + "]"); System.out.println("========================"); contents.append(""); contents.append(""); contents.append(""); // 참조사항 (NOTE1~4) String note1 = CommonUtils.checkNull(estimateTemplate.get("note1")); if("".equals(note1)) note1 = CommonUtils.checkNull(estimateTemplate.get("NOTE1")); if("".equals(note1)) note1 = "1. 견적유효기간: 일"; String note2 = CommonUtils.checkNull(estimateTemplate.get("note2")); if("".equals(note2)) note2 = CommonUtils.checkNull(estimateTemplate.get("NOTE2")); if("".equals(note2)) note2 = "2. 납품기간: 발주 후 1주 이내"; String note3 = CommonUtils.checkNull(estimateTemplate.get("note3")); if("".equals(note3)) note3 = CommonUtils.checkNull(estimateTemplate.get("NOTE3")); if("".equals(note3)) note3 = "3. VAT 별도"; String note4 = CommonUtils.checkNull(estimateTemplate.get("note4")); if("".equals(note4)) note4 = CommonUtils.checkNull(estimateTemplate.get("NOTE4")); if("".equals(note4)) note4 = "4. 결제 조건 : 기존 결제조건에 따름."; // 참조사항 행 추가 contents.append(""); contents.append(""); contents.append(""); // 하단 회사명 행 추가 contents.append(""); contents.append(""); contents.append(""); contents.append(""); contents.append("
번호
NO.
품 명
DESCRIPTION
규 격
SPECIFICATION
수량
Q'TY
단위
UNIT
단 가
UNIT
PRICE
금 액
AMOUNT
비고
" + (i + 1) + "" + CommonUtils.checkNull(item.get("description")) + "" + CommonUtils.checkNull(item.get("specification")) + "" + CommonUtils.checkNull(item.get("quantity")) + "" + CommonUtils.checkNull(item.get("unit")) + "" + CommonUtils.checkNull(item.get("unit_price")) + "" + CommonUtils.checkNull(item.get("amount")) + "" + CommonUtils.checkNull(item.get("note")) + "
" + currencySymbol + totalAmountStr + "
"); contents.append("
<비고>
"); contents.append("
" + noteRemarks + "
"); contents.append("
"); contents.append("
<참조사항>
"); contents.append("
" + note1 + "
"); contents.append("
" + note2 + "
"); contents.append("
" + note3 + "
"); contents.append("
" + note4 + "
"); contents.append("
"); contents.append("㈜알피에스"); contents.append("
"); } contents.append("
"); // estimate-container 닫기 contents.append(""); contents.append(""); return contents.toString(); } /** * 이미지 파일을 Base64로 인코딩 * @param imagePath 이미지 파일 경로 * @return Base64 인코딩된 문자열 (data:image/png;base64,...) */ private String encodeImageToBase64(String imagePath) { try { File imageFile = new File(imagePath); if(!imageFile.exists()) { return ""; } java.io.FileInputStream fis = new java.io.FileInputStream(imageFile); byte[] imageBytes = new byte[(int) imageFile.length()]; fis.read(imageBytes); fis.close(); // Apache Commons Codec 사용 (Java 7 호환) String base64 = org.apache.commons.codec.binary.Base64.encodeBase64String(imageBytes); // 파일 확장자로 MIME 타입 결정 String mimeType = "image/png"; if(imagePath.toLowerCase().endsWith(".jpg") || imagePath.toLowerCase().endsWith(".jpeg")) { mimeType = "image/jpeg"; } else if(imagePath.toLowerCase().endsWith(".gif")) { mimeType = "image/gif"; } return "data:" + mimeType + ";base64," + base64; } catch(Exception e) { System.out.println("이미지 Base64 인코딩 실패: " + e.getMessage()); e.printStackTrace(); return ""; } } /** * 영업정보 조회 (수주등록용) * @param contractObjId * @return */ public Map getContractInfo(String contractObjId) { Map resultMap = new HashMap(); SqlSession sqlSession = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(); Map paramMap = new HashMap(); paramMap.put("objId", contractObjId); resultMap = (Map) sqlSession.selectOne("contractMgmt.getContractInfo", paramMap); } catch(Exception e) { e.printStackTrace(); } finally { if(sqlSession != null) { sqlSession.close(); } } return resultMap != null ? resultMap : new HashMap(); } /** * 고객사 정보 조회 */ public Map getCustomerInfo(String customerObjId) { Map resultMap = new HashMap(); SqlSession sqlSession = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(); Map paramMap = new HashMap(); paramMap.put("objId", customerObjId); resultMap = (Map) sqlSession.selectOne("common.getSupplyInfo", paramMap); } catch(Exception e) { e.printStackTrace(); } finally { if(sqlSession != null) { sqlSession.close(); } } return resultMap != null ? resultMap : new HashMap(); } /** * 수주정보 조회 (영업정보와 동일) * @param objId * @return */ public Map getOrderInfo(String objId) { Map resultMap = new HashMap(); SqlSession sqlSession = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(); Map paramMap = new HashMap(); paramMap.put("objId", objId); // TB_CONTRACT_MGMT 테이블에서 조회 resultMap = (Map) sqlSession.selectOne("contractMgmt.getOrderInfo", paramMap); } catch(Exception e) { e.printStackTrace(); } finally { if(sqlSession != null) { sqlSession.close(); } } return resultMap != null ? resultMap : new HashMap(); } /** * 계약 품목 조회 * @param paramMap - contractObjId * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) public List getContractItems(Map paramMap){ SqlSession sqlSession = null; List items = new ArrayList(); try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); items = sqlSession.selectList("contractMgmt.getContractItems", paramMap); System.out.println("=== getContractItems 디버깅 시작 ==="); System.out.println("조회된 품목 수: " + (items != null ? items.size() : 0)); // ORDER_* 정보가 없으면 견적서에서 가져오기 if(items != null && !items.isEmpty()) { for(Map item : items) { // ORDER_QUANTITY가 없거나 0이면 견적서에서 가져오기 Object orderQty = item.get("order_quantity"); System.out.println("품목 PART_NO: " + item.get("part_no") + ", ORDER_QUANTITY: " + orderQty); if(orderQty == null || "".equals(orderQty.toString().trim()) || "0".equals(orderQty.toString().trim())) { System.out.println("ORDER_QUANTITY가 비어있음 - 견적서에서 조회 시작"); // 최종 견적서 조회 Map estimateParam = new HashMap(); estimateParam.put("objId", paramMap.get("contractObjId")); Map latestEstimate = sqlSession.selectOne("contractMgmt.getLatestEstimateTemplate", estimateParam); System.out.println("최종 견적서 조회 결과: " + (latestEstimate != null ? "있음" : "없음")); if(latestEstimate != null) { // 일반 견적서와 장비 견적서 모두 ESTIMATE_TEMPLATE_ITEM에서 조회 Map itemParam = new HashMap(); itemParam.put("templateObjId", latestEstimate.get("OBJID")); itemParam.put("partObjId", item.get("part_objid")); System.out.println("견적서 품목 조회 - templateObjId: " + latestEstimate.get("OBJID") + ", partObjId: " + item.get("part_objid")); Map estimateItem = sqlSession.selectOne("contractMgmt.getEstimateTemplateItemByPartObjId", itemParam); System.out.println("견적서 품목 조회 결과: " + (estimateItem != null ? "있음" : "없음")); if(estimateItem != null) { System.out.println("견적서 품목 - quantity: " + estimateItem.get("quantity") + ", unit_price: " + estimateItem.get("unit_price")); // 견적서의 수량, 단가 정보를 ORDER_* 필드에 매핑 item.put("order_quantity", estimateItem.get("quantity")); item.put("order_unit_price", estimateItem.get("unit_price")); // 공급가액 계산 Object quantity = estimateItem.get("quantity"); Object unitPrice = estimateItem.get("unit_price"); long supplyPrice = 0; if(quantity != null && unitPrice != null) { try { long qty = Long.parseLong(quantity.toString().replaceAll("[^0-9]", "")); long price = Long.parseLong(unitPrice.toString().replaceAll("[^0-9]", "")); supplyPrice = qty * price; } catch(Exception e) { System.out.println("금액 계산 실패: " + e.getMessage()); } } item.put("order_supply_price", supplyPrice); item.put("order_vat", Math.round(supplyPrice * 0.1)); item.put("order_total_amount", supplyPrice + Math.round(supplyPrice * 0.1)); System.out.println("계산 완료 - 공급가액: " + supplyPrice + ", 부가세: " + Math.round(supplyPrice * 0.1)); } } } } } // 대문자 변환 items = CommonUtils.keyChangeUpperList(items); System.out.println("=== getContractItems 디버깅 종료 ==="); }catch(Exception e){ e.printStackTrace(); }finally{ if(sqlSession != null) sqlSession.close(); } return items; } /** * 견적서 템플릿 품목 조회 (수주등록용) * 최종 견적서의 품목 정보를 수주등록 형식으로 변환하여 반환 * * 참고: 이 메서드는 사용되지 않음. getContractItems()를 사용하세요. * 일반 견적서와 장비 견적서 모두 ESTIMATE_TEMPLATE_ITEM에 저장되므로 * 동일한 방식으로 처리 가능 * * @param paramMap - contractObjId * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) public List getEstimateTemplateItemsForOrder(Map paramMap){ SqlSession sqlSession = null; List items = new ArrayList(); try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); // 1. 최종 견적서 템플릿 조회 Map templateParam = new HashMap(); templateParam.put("objId", paramMap.get("contractObjId")); Map template = sqlSession.selectOne("contractMgmt.getLatestEstimateTemplate", templateParam); if(template != null) { template = CommonUtils.toUpperCaseMapKey(template); // 일반 견적서와 장비 견적서 모두 ESTIMATE_TEMPLATE_ITEM에서 조회 Map itemParam = new HashMap(); itemParam.put("templateObjId", template.get("OBJID")); List templateItems = sqlSession.selectList("contractMgmt.getEstimateTemplateItemsByTemplateObjId", itemParam); // 수주등록 형식으로 변환 for(Map templateItem : templateItems) { Map orderItem = new HashMap(); // ESTIMATE_TEMPLATE_ITEM -> CONTRACT_ITEM 형식으로 매핑 orderItem.put("OBJID", templateItem.get("objid")); // 템플릿 품목 OBJID (참고용) orderItem.put("CONTRACT_OBJID", paramMap.get("contractObjId")); orderItem.put("PART_OBJID", templateItem.get("part_objid")); orderItem.put("PART_NO", templateItem.get("description")); // 품명 orderItem.put("PART_NAME", templateItem.get("description")); // 품명 orderItem.put("SERIAL_NO", ""); // S/N은 비워둠 orderItem.put("QUANTITY", templateItem.get("quantity")); // 수량 orderItem.put("DUE_DATE", ""); orderItem.put("CUSTOMER_REQUEST", ""); orderItem.put("RETURN_REASON", ""); // 수주 정보는 견적서 값으로 초기화 orderItem.put("ORDER_QUANTITY", templateItem.get("quantity")); orderItem.put("ORDER_UNIT_PRICE", templateItem.get("unit_price")); // 공급가액 계산 (수량 * 단가) Object quantity = templateItem.get("quantity"); Object unitPrice = templateItem.get("unit_price"); long supplyPrice = 0; if(quantity != null && unitPrice != null) { try { long qty = Long.parseLong(quantity.toString().replaceAll("[^0-9]", "")); long price = Long.parseLong(unitPrice.toString().replaceAll("[^0-9]", "")); supplyPrice = qty * price; } catch(Exception e) { // 계산 실패 시 0 } } orderItem.put("ORDER_SUPPLY_PRICE", supplyPrice); orderItem.put("ORDER_VAT", Math.round(supplyPrice * 0.1)); // 부가세 10% orderItem.put("ORDER_TOTAL_AMOUNT", supplyPrice + Math.round(supplyPrice * 0.1)); items.add(orderItem); } // 대문자 변환 items = CommonUtils.keyChangeUpperList(items); } }catch(Exception e){ e.printStackTrace(); }finally{ if(sqlSession != null) sqlSession.close(); } return items; } @SuppressWarnings({ "rawtypes", "unchecked" }) public Map saveOrderInfo(HttpServletRequest request, Map paramMap){ Map resultMap = new HashMap(); SqlSession sqlSession = null; Map resultList = null; try{ sqlSession = SqlMapConfig.getInstance().getSqlSession(); PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); paramMap.put("writer", person.getUserId()); String contract_objid= CommonUtils.checkNull(paramMap.get("contractObjId")); paramMap.put("objId", contract_objid); // 품목별 수주 정보 업데이트 및 합계 계산 String itemsJson = CommonUtils.checkNull(paramMap.get("items_json")); long totalSupplyPrice = 0; long totalVat = 0; long totalAmount = 0; if(!"".equals(itemsJson)){ try { // JSON 파싱 JSONParser parser = new JSONParser(); JSONArray jsonArray = (JSONArray) parser.parse(itemsJson); // 각 품목별로 업데이트 및 합계 계산 for(int i = 0; i < jsonArray.size(); i++) { JSONObject item = (JSONObject) jsonArray.get(i); Map itemMap = new HashMap(); String orderSupplyPrice = item.get("orderSupplyPrice") != null ? item.get("orderSupplyPrice").toString().replace(",", "") : "0"; String orderVat = item.get("orderVat") != null ? item.get("orderVat").toString().replace(",", "") : "0"; String orderTotalAmount = item.get("orderTotalAmount") != null ? item.get("orderTotalAmount").toString().replace(",", "") : "0"; itemMap.put("contractItemObjId", item.get("contractItemObjId") != null ? item.get("contractItemObjId").toString() : ""); itemMap.put("orderQuantity", item.get("orderQuantity") != null ? item.get("orderQuantity").toString() : ""); itemMap.put("orderUnitPrice", item.get("orderUnitPrice") != null ? item.get("orderUnitPrice").toString() : ""); itemMap.put("orderSupplyPrice", orderSupplyPrice); itemMap.put("orderVat", orderVat); itemMap.put("orderTotalAmount", orderTotalAmount); sqlSession.update("contractMgmt.updateContractItemOrderInfo", itemMap); // 합계 계산 try { totalSupplyPrice += Long.parseLong(orderSupplyPrice); totalVat += Long.parseLong(orderVat); totalAmount += Long.parseLong(orderTotalAmount); } catch (NumberFormatException e) { // 숫자 변환 실패 시 무시 } } } catch (Exception e) { e.printStackTrace(); throw new Exception("품목 정보 저장 중 오류가 발생했습니다."); } } // 합계를 paramMap에 추가 paramMap.put("order_supply_price", String.valueOf(totalSupplyPrice)); paramMap.put("order_vat", String.valueOf(totalVat)); paramMap.put("order_total_amount", String.valueOf(totalAmount)); // 기본 수주 정보 및 합계 업데이트 int cnt = sqlSession.update("contractMgmt.updateOrderInfo", paramMap); //영업 수주 완료시 자동 프로젝트 등록 로직 String result_cd= CommonUtils.checkNull(paramMap.get("contract_result")); String category_cd= CommonUtils.checkNull(paramMap.get("category_cd")); String target_project_no= CommonUtils.checkNull(paramMap.get("target_project_no_direct")); //int overhaul_order = Integer.parseInt(CommonUtils.checkNull(paramMap.get("overhaul_order"),"1")); //int project_cnt= Integer.parseInt(CommonUtils.checkNull(paramMap.get("facility_qty"), "1")); //long contract_price_currency= Long.parseLong(CommonUtils.checkNull(paramMap.get("contract_price_currency"), "0")); //long contract_price= Long.parseLong(CommonUtils.checkNull(paramMap.get("contract_price"), "0")); //수주가와 금액은 대수로 나누어서 등록 //paramMap.put("contract_price_currency", contract_price_currency/project_cnt + ""); //paramMap.put("contract_price", contract_price/project_cnt + ""); if("0000964".equals(result_cd) || "0000968".equals(result_cd)){ // 품목별로 프로젝트 생성 List contractItems = getContractItems(paramMap); if(contractItems != null && !contractItems.isEmpty()) { System.out.println("품목 개수: " + contractItems.size() + "개 - 품목별 프로젝트 생성 시작"); for(Map item : contractItems) { // 품목별 프로젝트 존재 여부 확인 Map projectCheckParam = new HashMap(); projectCheckParam.put("contractObjId", contract_objid); projectCheckParam.put("part_objid", item.get("PART_OBJID")); resultList = sqlSession.selectOne("contractMgmt.getProjectListByContractAndPartObjid", projectCheckParam); if(null == resultList) { // 새 프로젝트 생성 Map projectParam = new HashMap(); projectParam.putAll(paramMap); // 기본 정보 복사 // 품목별 정보 설정 projectParam.put("OBJID", CommonUtils.createObjId()); projectParam.put("is_temp", '1'); projectParam.put("part_objid", item.get("PART_OBJID")); projectParam.put("part_no", item.get("PART_NO")); projectParam.put("part_name", item.get("PART_NAME")); projectParam.put("quantity", item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY")); projectParam.put("due_date", item.get("DUE_DATE")); if("0000170".equals(category_cd) || "0000171".equals(category_cd)){ projectParam.put("overhaul_project_no", target_project_no); } System.out.println("프로젝트 생성 - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME")); // 프로젝트 등록 cnt = sqlSession.update("project.createProject", projectParam); // 프로젝트 TASK 등록 cnt = sqlSession.insert("contractMgmt.insertProjectTask", projectParam); // 프로젝트 SETUP_TASK 등록 cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", projectParam); // project_no - unit 폴더 생성 Map projectInfo = (Map)sqlSession.selectOne("project.getProjectMngInfo", projectParam); projectParam.put("contract_objid", contract_objid); projectParam.put("customer_product", projectParam.get("mechanical_type")); List> taskUnitList = (ArrayList)sqlSession.selectList("project.getWbsTaskListByProject", projectParam); if(CommonUtils.isNotEmpty(taskUnitList) && !taskUnitList.isEmpty()){ String projectNo = (String)projectInfo.get("project_no"); String filepath = Constants.FILE_STORAGE+"\\PART_DATA\\"; for (Map map : taskUnitList) { File file = new File(filepath+File.separator+projectNo+File.separator+CommonUtils.checkNull((String)map.get("unit_no"))+"-"+CommonUtils.checkNull((String)map.get("task_name"))); if(!file.exists()){ file.mkdirs(); } } } } else { // 기존 프로젝트 업데이트 Map updateParam = new HashMap(); updateParam.putAll(paramMap); updateParam.put("part_objid", item.get("PART_OBJID")); updateParam.put("part_no", item.get("PART_NO")); updateParam.put("part_name", item.get("PART_NAME")); updateParam.put("quantity", item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY")); updateParam.put("due_date", item.get("DUE_DATE")); System.out.println("프로젝트 업데이트 - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO")); sqlSession.update("project.ModifyProjectByContract", updateParam); } } } else { System.out.println("품목이 없습니다 - 기존 방식으로 프로젝트 생성"); // 품목이 없는 경우 기존 방식대로 처리 resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); if(null==resultList){ paramMap.put("OBJID", CommonUtils.createObjId()); paramMap.put("is_temp", '1'); if("0000170".equals(category_cd) || "0000171".equals(category_cd)){ paramMap.put("overhaul_project_no", target_project_no); } cnt = sqlSession.update("project.createProject", paramMap); cnt = sqlSession.insert("contractMgmt.insertProjectTask", paramMap); cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", paramMap); }else{ sqlSession.update("project.ModifyProjectByContract", paramMap); } } } // if(cnt > 0){ //계약완료 일시 메일 // if("0000964".equals(CommonUtils.checkNull(paramMap.get("contract_result")))){ // commonService.SendMail(paramMap,"CONTRACT_COMP",CommonUtils.checkNull(paramMap.get("pm_user_id"))); //그냥 등록일때 메일 // }else{ // if("regist".equals(CommonUtils.checkNull(paramMap.get("actionType")))){ // commonService.SendMail(paramMap,"CONTRACT_REG",CommonUtils.checkNull(paramMap.get(""))); // } // } // } 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; } /** * 품목 저장 (여러 건) - UPSERT 방식 * @param contractObjId 견적 OBJID * @param itemList 품목 목록 * @param userId 사용자 ID * @return 성공 여부 */ public Map saveContractItems(String contractObjId, List> itemList, String userId) { SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); Map resultMap = new HashMap(); try { System.out.println("=== saveContractItems 시작 (UPSERT 방식) ==="); System.out.println("contractObjId: " + contractObjId); System.out.println("itemList size: " + (itemList != null ? itemList.size() : 0)); System.out.println("userId: " + userId); // 프론트에서 전달된 품목 OBJID 목록 수집 Set currentItemObjIds = new HashSet(); // 품목 UPSERT if (itemList != null && !itemList.isEmpty()) { for (int i = 0; i < itemList.size(); i++) { Map item = itemList.get(i); System.out.println("품목 " + (i+1) + " 처리 중: " + item); // 기존 품목 OBJID가 있으면 사용, 없으면 새로 생성 String itemObjId = CommonUtils.checkNull(item.get("objId")); if (itemObjId.isEmpty()) { itemObjId = CommonUtils.createObjId(); System.out.println("새 품목 OBJID 생성: " + itemObjId); } else { System.out.println("기존 품목 OBJID 사용: " + itemObjId); } currentItemObjIds.add(itemObjId); // 품목 저장 Map itemParam = new HashMap(); itemParam.put("objId", itemObjId); itemParam.put("contractObjId", contractObjId); itemParam.put("seq", i + 1); itemParam.put("partObjId", item.get("partObjId")); itemParam.put("partNo", item.get("partNo")); itemParam.put("partName", item.get("partName")); // quantity를 Integer로 변환 Object quantityObj = item.get("quantity"); Integer quantity = null; if(quantityObj != null) { if(quantityObj instanceof Integer) { quantity = (Integer) quantityObj; } else if(quantityObj instanceof Double) { quantity = ((Double) quantityObj).intValue(); } else { // String인 경우 콤마 제거 후 변환 String quantityStr = quantityObj.toString().replace(",", "").trim(); if(!quantityStr.isEmpty()) { quantity = Integer.parseInt(quantityStr); } } } itemParam.put("quantity", quantity); itemParam.put("dueDate", item.get("dueDate")); itemParam.put("customerRequest", item.get("customerRequest")); itemParam.put("returnReason", item.get("returnReason")); itemParam.put("writer", userId); System.out.println("품목 UPSERT 시도 - OBJID: " + itemObjId); int result = sqlSession.insert("contractMgmt.upsertContractItem", itemParam); System.out.println("품목 UPSERT 결과: " + result); // 기존 S/N 전체 비활성화 (새로 저장할 것이므로) Map deleteSnParam = new HashMap(); deleteSnParam.put("itemObjId", itemObjId); sqlSession.update("contractMgmt.deleteItemSerials", deleteSnParam); // S/N 저장 @SuppressWarnings("unchecked") List> snList = (List>) item.get("snList"); if (snList != null && !snList.isEmpty()) { for (int j = 0; j < snList.size(); j++) { Map sn = snList.get(j); String serialNo = (String) sn.get("value"); // S/N 값이 비어있으면 건너뛰기 if (serialNo == null || serialNo.trim().isEmpty()) { System.out.println("S/N 값이 비어있어서 건너뜀"); continue; } // S/N OBJID는 항상 새로 생성 (기존 것을 비활성화했으므로) String snObjId = CommonUtils.createObjId(); Map snParam = new HashMap(); snParam.put("objId", snObjId); snParam.put("itemObjId", itemObjId); snParam.put("seq", j + 1); snParam.put("serialNo", serialNo); snParam.put("writer", userId); sqlSession.insert("contractMgmt.upsertContractItemSerial", snParam); } } } } // 프론트에서 전달되지 않은 기존 품목들은 INACTIVE 처리 if (!currentItemObjIds.isEmpty()) { Map inactiveParam = new HashMap(); inactiveParam.put("contractObjId", contractObjId); inactiveParam.put("currentItemObjIds", new ArrayList(currentItemObjIds)); inactiveParam.put("userId", userId); sqlSession.update("contractMgmt.inactivateRemovedItems", inactiveParam); } sqlSession.commit(); resultMap.put("result", true); resultMap.put("msg", "품목이 저장되었습니다."); } catch (Exception e) { sqlSession.rollback(); resultMap.put("result", false); resultMap.put("msg", "품목 저장 중 오류가 발생했습니다."); e.printStackTrace(); } finally { sqlSession.close(); } return resultMap; } /** * 품번 목록 조회 (is_last = 1) * @return 품번 목록 */ public List> getPartList() { SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); List> partList = new ArrayList>(); try { partList = sqlSession.selectList("contractMgmt.getPartList"); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } return partList; } /** * 품번 검색 (검색어 기반) */ public List> searchPartList(Map paramMap) { SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); List> partList = new ArrayList>(); try { partList = sqlSession.selectList("contractMgmt.searchPartList", paramMap); } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } return partList; } /** * 품목 목록 조회 * @param contractObjId 견적 OBJID * @return 품목 목록 */ public List> getContractItemList(String contractObjId) { SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(); List> itemList = new ArrayList>(); try { Map param = new HashMap(); param.put("contractObjId", contractObjId); itemList = sqlSession.selectList("contractMgmt.getContractItemList", param); // 각 품목의 S/N 목록 조회 for (Map item : itemList) { String itemObjId = (String) item.get("OBJID"); if(itemObjId == null) { itemObjId = (String) item.get("objid"); } System.out.println("품목 OBJID: " + itemObjId); Map snParam = new HashMap(); snParam.put("itemObjId", itemObjId); List> snList = sqlSession.selectList("contractMgmt.getContractItemSerialList", snParam); System.out.println("조회된 S/N 개수: " + (snList != null ? snList.size() : 0)); item.put("SN_LIST", snList); } } catch (Exception e) { e.printStackTrace(); } finally { sqlSession.close(); } return itemList; } /** * PDF 청크 업로드 처리 * @param request * @param paramMap - sessionId, chunkIndex, totalChunks, chunk * @return */ public Map uploadPdfChunk(HttpServletRequest request, Map paramMap) { Map resultMap = new HashMap(); try { System.out.println("===== uploadPdfChunk 호출 ====="); System.out.println("전달된 파라미터: " + paramMap); System.out.println("=============================="); String sessionId = CommonUtils.checkNull(paramMap.get("sessionId")); String chunkIndexStr = CommonUtils.checkNull(paramMap.get("chunkIndex")); String totalChunksStr = CommonUtils.checkNull(paramMap.get("totalChunks")); String chunk = CommonUtils.checkNull(paramMap.get("chunk")); if("".equals(sessionId) || "".equals(chunkIndexStr) || "".equals(totalChunksStr) || "".equals(chunk)) { System.out.println("필수 파라미터 누락"); resultMap.put("result", "error"); resultMap.put("message", "필수 파라미터가 누락되었습니다."); return resultMap; } int chunkIndex = Integer.parseInt(chunkIndexStr); int totalChunks = Integer.parseInt(totalChunksStr); System.out.println("청크 업로드: " + sessionId + " [" + (chunkIndex + 1) + "/" + totalChunks + "]"); System.out.println("청크 크기: " + chunk.length() + " bytes"); // 임시 디렉토리에 청크 저장 String tempDir = System.getProperty("java.io.tmpdir"); String chunkDir = tempDir + File.separator + "pdf_chunks" + File.separator + sessionId; File chunkDirFile = new File(chunkDir); if(!chunkDirFile.exists()) { chunkDirFile.mkdirs(); } // 청크 파일 저장 String chunkFileName = "chunk_" + chunkIndex + ".txt"; File chunkFile = new File(chunkDir + File.separator + chunkFileName); java.io.FileWriter fw = new java.io.FileWriter(chunkFile); fw.write(chunk); fw.close(); // 마지막 청크인 경우 모든 청크를 합쳐서 PDF 파일 생성 if(chunkIndex == totalChunks - 1) { System.out.println("모든 청크 수신 완료, PDF 파일 생성 시작"); // 모든 청크 읽어서 합치기 StringBuilder fullBase64 = new StringBuilder(); for(int i = 0; i < totalChunks; i++) { File cf = new File(chunkDir + File.separator + "chunk_" + i + ".txt"); java.io.BufferedReader br = new java.io.BufferedReader(new java.io.FileReader(cf)); String line; while((line = br.readLine()) != null) { fullBase64.append(line); } br.close(); } // Base64 디코딩하여 PDF 파일 생성 (Apache Commons Codec 사용) byte[] pdfBytes = org.apache.commons.codec.binary.Base64.decodeBase64(fullBase64.toString()); String pdfFileName = sessionId + ".pdf"; File pdfFile = new File(tempDir + File.separator + pdfFileName); java.io.FileOutputStream fos = new java.io.FileOutputStream(pdfFile); fos.write(pdfBytes); fos.close(); pdfFile.deleteOnExit(); System.out.println("PDF 파일 생성 완료: " + pdfFile.getAbsolutePath()); // 청크 파일들 삭제 for(int i = 0; i < totalChunks; i++) { File cf = new File(chunkDir + File.separator + "chunk_" + i + ".txt"); cf.delete(); } chunkDirFile.delete(); } resultMap.put("result", "success"); } catch(Exception e) { System.out.println("청크 업로드 중 오류: " + e.getMessage()); e.printStackTrace(); resultMap.put("result", "error"); resultMap.put("message", e.getMessage()); } return resultMap; } /** * 세션 ID로 저장된 PDF 파일 가져오기 * @param sessionId * @param estimateTemplate * @return */ private File getPdfFromSession(String sessionId, Map estimateTemplate) { try { String tempDir = System.getProperty("java.io.tmpdir"); File pdfFile = new File(tempDir + File.separator + sessionId + ".pdf"); if(pdfFile.exists()) { // 견적번호로 파일명 변경 String estimateNo = CommonUtils.checkNull(estimateTemplate.get("estimate_no")); if("".equals(estimateNo)) estimateNo = CommonUtils.checkNull(estimateTemplate.get("ESTIMATE_NO")); if("".equals(estimateNo)) estimateNo = "견적서"; java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss"); String timestamp = sdf.format(new java.util.Date()); String newFileName = estimateNo + "_" + timestamp + ".pdf"; File renamedFile = new File(tempDir + File.separator + newFileName); // 파일 복사 java.nio.file.Files.copy(pdfFile.toPath(), renamedFile.toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING); renamedFile.deleteOnExit(); // 원본 파일 삭제 pdfFile.delete(); return renamedFile; } return null; } catch(Exception e) { System.out.println("PDF 파일 가져오기 중 오류: " + e.getMessage()); e.printStackTrace(); return null; } } /** * 계약 정보 조회 (메일 발송용) * @param paramMap - objId (CONTRACT_OBJID) * @return */ public Map getContractInfoForMail(Map paramMap) { SqlSession sqlSession = null; Map contractInfo = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(); contractInfo = (Map) sqlSession.selectOne("contractMgmt.getContractInfoForMail", paramMap); } catch(Exception e) { e.printStackTrace(); } finally { if(sqlSession != null) sqlSession.close(); } return contractInfo; } /** * 견적서 메일 발송 (커스텀) * @param request * @param paramMap - objId, pdfSessionId, toEmails, ccEmails, subject, contents * @return */ public Map sendEstimateMailCustom(HttpServletRequest request, Map paramMap) { Map resultMap = new HashMap(); SqlSession sqlSession = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(false); String objId = CommonUtils.checkNull(paramMap.get("objId")); String toEmailsStr = CommonUtils.checkNull(paramMap.get("toEmails")); String ccEmailsStr = CommonUtils.checkNull(paramMap.get("ccEmails")); String subject = CommonUtils.checkNull(paramMap.get("subject")); String contents = CommonUtils.checkNull(paramMap.get("contents")); String pdfSessionId = CommonUtils.checkNull(paramMap.get("pdfSessionId")); // 1. 계약 정보 조회 Map contractInfo = (Map) sqlSession.selectOne("contractMgmt.getContractInfoForMail", paramMap); if(contractInfo == null || contractInfo.isEmpty()) { resultMap.put("result", "error"); resultMap.put("message", "계약 정보를 찾을 수 없습니다."); return resultMap; } // 2. 최종 차수 견적서 조회 Map estimateTemplate = (Map) sqlSession.selectOne("contractMgmt.getLatestEstimateTemplate", paramMap); if(estimateTemplate == null || estimateTemplate.isEmpty()) { resultMap.put("result", "error"); resultMap.put("message", "견적서를 찾을 수 없습니다."); return resultMap; } // 3. 수신인 이메일 리스트 생성 ArrayList toEmailList = new ArrayList(); if(!"".equals(toEmailsStr)) { String[] toEmails = toEmailsStr.split(","); for(String email : toEmails) { String trimmedEmail = email.trim(); if(!"".equals(trimmedEmail)) { toEmailList.add(trimmedEmail); } } } if(toEmailList.isEmpty()) { resultMap.put("result", "error"); resultMap.put("message", "수신인 이메일이 없습니다."); return resultMap; } // 4. 참조 이메일 리스트 생성 ArrayList ccEmailList = new ArrayList(); // 작성자 이메일 자동 추가 String writerEmail = CommonUtils.checkNull(contractInfo.get("writer_email")); if("".equals(writerEmail)) writerEmail = CommonUtils.checkNull(contractInfo.get("WRITER_EMAIL")); if(!"".equals(writerEmail)) { ccEmailList.add(writerEmail); } // 사용자가 입력한 참조 이메일 추가 if(!"".equals(ccEmailsStr)) { String[] ccEmails = ccEmailsStr.split(","); for(String email : ccEmails) { String trimmedEmail = email.trim(); if(!"".equals(trimmedEmail) && !ccEmailList.contains(trimmedEmail)) { ccEmailList.add(trimmedEmail); } } } // 5. PDF 파일 처리 ArrayList attachFileList = new ArrayList(); if(!"".equals(pdfSessionId)) { File pdfFile = getPdfFromSession(pdfSessionId, estimateTemplate); if(pdfFile != null && pdfFile.exists()) { HashMap fileMap = new HashMap(); fileMap.put(Constants.Db.COL_FILE_REAL_NAME, pdfFile.getName()); fileMap.put(Constants.Db.COL_FILE_SAVED_NAME, pdfFile.getName()); fileMap.put(Constants.Db.COL_FILE_PATH, pdfFile.getParent()); attachFileList.add(fileMap); System.out.println("PDF 파일 첨부 완료: " + pdfFile.getAbsolutePath()); } else { System.out.println("PDF 파일을 찾을 수 없습니다: " + pdfSessionId); } } // 6. 메일 발송 PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); String fromUserId = person.getUserId(); // mail_log 조회용 제목 (OBJID 포함) String subjectForLog = subject + " [OBJID:" + objId + "]"; System.out.println("===== 커스텀 메일 발송 시도 ====="); System.out.println("From UserId: " + fromUserId); System.out.println("To Email: " + toEmailList); System.out.println("CC Email: " + ccEmailList); System.out.println("Subject (실제 메일): " + subject); System.out.println("Subject (mail_log): " + subjectForLog); System.out.println("첨부파일 개수: " + attachFileList.size()); System.out.println("================================"); // HTML 형식으로 내용 변환 (줄바꿈 처리) String htmlContents = contents.replace("\n", "
"); boolean mailSent = false; try { mailSent = MailUtil.sendMailWithAttachFileUTF8( fromUserId, null, // fromEmail (자동으로 SMTP 설정 사용) new ArrayList(), // toUserIdList (빈 리스트) toEmailList, ccEmailList, new ArrayList(), // bccEmailList (빈 리스트) null, // important subject, // 실제 메일 제목 (OBJID 없음) htmlContents, attachFileList.size() > 0 ? attachFileList : null, "CONTRACT_ESTIMATE", subjectForLog // mail_log용 제목 (OBJID 포함) ); System.out.println("메일 발송 결과: " + mailSent); } catch(Exception mailEx) { System.out.println("메일 발송 중 예외 발생: " + mailEx.getMessage()); mailEx.printStackTrace(); resultMap.put("result", "error"); resultMap.put("message", "메일 발송 중 예외가 발생했습니다: " + mailEx.getMessage()); return resultMap; } if(mailSent) { resultMap.put("result", "success"); resultMap.put("message", "견적서가 성공적으로 발송되었습니다."); } else { resultMap.put("result", "error"); resultMap.put("message", "메일 발송에 실패했습니다."); } } catch(Exception e) { resultMap.put("result", "error"); resultMap.put("message", "메일 발송 중 오류가 발생했습니다: " + e.getMessage()); e.printStackTrace(); } finally { if(sqlSession != null) sqlSession.close(); } return resultMap; } }