diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new.jsp index 40479e6..5df81f7 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_new.jsp @@ -123,14 +123,14 @@ $(document).ready(function(){ ,edittype:"select", formatter:"select" ,editoptions:{ value: unit_cd } } - ,{name:"ORDER_QTY" , width:90, align:"right", sortable:false, editable:<%=isModify%> + ,{name:"ORDER_QTY" , width:90, align:"right", sortable:false, editable:false ,formatter:"integer", formatoptions:{thousandsSeparator:","} ,editoptions:{ dataInit: function(e){ e.style.textAlign = "right"; } ,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}] } } - ,{name:"PARTNER_PRICE" , width:110, align:"right", sortable:false, editable:true + ,{name:"PARTNER_PRICE" , width:110, align:"right", sortable:false, editable:false ,formatter:"integer", formatoptions:{thousandsSeparator:","} ,editoptions:{ dataInit: function(e){ e.style.textAlign = "right"; } @@ -1833,7 +1833,7 @@ function fn_price_save(){ -
+ +
+
+ 발주번호: + - +
+
+ 공급업체: + - +
+
+ 프로젝트: + - +
+
+ +
+ + 첨부파일: 발주서 및 도면 파일이 자동으로 첨부됩니다. +
+ +
+ + + +
+ +
+
담당자 정보를 불러오는 중...
+
+
+ + +
+ + +
예: email1@example.com, email2@example.com
+
+ + +
+ + +
발주 담당자 이메일이 자동으로 참조에 추가됩니다.
+
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+
+
+ + + + + diff --git a/src/com/pms/controller/PurchaseOrderController.java b/src/com/pms/controller/PurchaseOrderController.java index 111114c..e18f312 100644 --- a/src/com/pms/controller/PurchaseOrderController.java +++ b/src/com/pms/controller/PurchaseOrderController.java @@ -1644,4 +1644,135 @@ public class PurchaseOrderController { } return result; } + + /** + * 발주서 메일 발송 팝업 + * @param request + * @param paramMap - purchaseOrderObjId + * @return + */ + @RequestMapping("/purchaseOrder/purchaseOrderMailFormPopup.do") + public String purchaseOrderMailFormPopup(HttpServletRequest request, @RequestParam Map paramMap){ + return "/purchaseOrder/purchaseOrderMailFormPopup"; + } + + /** + * 발주서 정보 조회 (메일 발송용) (AJAX) + * @param request + * @param paramMap - objId (PURCHASE_ORDER_MASTER_OBJID) + * @return + */ + @ResponseBody + @RequestMapping("/purchaseOrder/getPurchaseOrderInfoForMail.do") + public Map getPurchaseOrderInfoForMail(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + + try { + String objId = CommonUtils.checkNull(paramMap.get("objId")); + + if("".equals(objId)){ + resultMap.put("result", "error"); + resultMap.put("message", "잘못된 요청입니다."); + return resultMap; + } + + paramMap.put("PURCHASE_ORDER_MASTER_OBJID", objId); + Map purchaseOrderInfo = purchaseOrderService.getPurchaseOrderMasterInfo(request, paramMap); + + if(purchaseOrderInfo != null){ + // 키를 대문자로 변환 + purchaseOrderInfo = CommonUtils.toUpperCaseMapKey(purchaseOrderInfo); + resultMap.put("result", "success"); + resultMap.put("purchaseOrderInfo", purchaseOrderInfo); + } else { + resultMap.put("result", "error"); + resultMap.put("message", "발주서 정보를 찾을 수 없습니다."); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("result", "error"); + resultMap.put("message", "발주서 정보 조회 중 오류가 발생했습니다."); + } + + return resultMap; + } + + /** + * 공급업체 담당자 목록 조회 (AJAX) + * @param request + * @param paramMap - partnerObjId + * @return + */ + @ResponseBody + @RequestMapping("/purchaseOrder/getPartnerManagerList.do") + public Map getPartnerManagerList(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + + try { + String partnerObjId = CommonUtils.checkNull(paramMap.get("partnerObjId")); + + if("".equals(partnerObjId)){ + resultMap.put("result", "error"); + resultMap.put("message", "공급업체 정보가 없습니다."); + return resultMap; + } + + // 공급업체 담당자 목록 조회 + paramMap.put("SUPPLY_OBJID", partnerObjId); + List managerList = commonService.selectList("admin.getSupplyManagerList", request, paramMap); + + if(managerList != null && managerList.size() > 0){ + // 키를 대문자로 변환 + managerList = CommonUtils.keyChangeUpperList(managerList); + resultMap.put("result", "success"); + resultMap.put("managers", managerList); + } else { + resultMap.put("result", "success"); + resultMap.put("managers", new ArrayList()); + } + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("result", "error"); + resultMap.put("message", "담당자 목록 조회 중 오류가 발생했습니다."); + } + + return resultMap; + } + + /** + * 발주서 메일 발송 (AJAX) + * @param session + * @param request + * @param paramMap - objId, toEmails, ccEmails, subject, contents + * @return + */ + @ResponseBody + @RequestMapping("/purchaseOrder/sendPurchaseOrderMail.do") + public Map sendPurchaseOrderMail(HttpSession session, HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + + try { + PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); + paramMap.put("WRITER", CommonUtils.checkNull(person.getUserId())); + paramMap.put("WRITER_EMAIL", CommonUtils.checkNull(person.getEmail())); + + String objId = CommonUtils.checkNull(paramMap.get("objId")); + + if("".equals(objId)){ + resultMap.put("result", "error"); + resultMap.put("message", "잘못된 요청입니다."); + return resultMap; + } + + // 메일 발송 서비스 호출 + resultMap = purchaseOrderService.sendPurchaseOrderMailManual(request, paramMap); + + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("result", "error"); + resultMap.put("message", "메일 발송 중 오류가 발생했습니다: " + e.getMessage()); + } + + return resultMap; + } } diff --git a/src/com/pms/mapper/admin.xml b/src/com/pms/mapper/admin.xml index 5d2fbe0..02d18a9 100644 --- a/src/com/pms/mapper/admin.xml +++ b/src/com/pms/mapper/admin.xml @@ -9366,4 +9366,17 @@ SELECT LIMIT 1 + + + \ No newline at end of file diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index f999a60..8ca58b5 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -3078,6 +3078,8 @@ SELECT POM.OBJID ,POM.MULTI_MASTER_OBJID ,CASE WHEN POM.MULTI_MASTER_YN = 'Y' THEN '' ELSE POM.MULTI_YN END MULTI_YN_MAKED + ,POM.MAIL_SEND_YN + ,POM.MAIL_SEND_DATE ,POM.STATUS ,A.APPR_STATUS ,CASE WHEN POM.STATUS = 'cancel' then '취소' @@ -5862,4 +5864,13 @@ FROM( AND P.PART_OBJID = #{objId} + + + UPDATE PURCHASE_ORDER_MASTER + SET + MAIL_SEND_YN = #{MAIL_SEND_YN} + ,MAIL_SEND_DATE = #{MAIL_SEND_DATE} + WHERE OBJID = #{OBJID} + + \ No newline at end of file diff --git a/src/com/pms/service/PurchaseOrderService.java b/src/com/pms/service/PurchaseOrderService.java index 1e12eae..179c978 100644 --- a/src/com/pms/service/PurchaseOrderService.java +++ b/src/com/pms/service/PurchaseOrderService.java @@ -2279,6 +2279,7 @@ public class PurchaseOrderService { /** * 발주서 결재완료 후처리 + * - 자동 메일 발송 기능 비활성화 (2024.12 - 발주서 송부 버튼으로 수동 발송으로 변경) */ public void afterApprovalCompleteRouteInfo(SqlSession sqlSession, Map routeMap, Map targetMap, Map sqlParamMap) { String targetObjId = CommonUtils.checkNull(sqlParamMap.get("targetObjId")); @@ -2305,6 +2306,10 @@ public class PurchaseOrderService { sqlParamMap.put("act_status", "0001065"); //발주완료 sqlSession.update("purchaseOrder.salesPartChgActStatusByPurchaseOrderId", sqlParamMap); + // 2024.12 - 자동 메일 발송 비활성화 + // 발주서 메일 발송은 목록 화면의 "발주서 송부" 버튼을 통해 수동으로 발송합니다. + // 수동 발송 메서드: sendPurchaseOrderMailManual() + /* //2. 발주서 메일발송 try{ @@ -2332,13 +2337,6 @@ public class PurchaseOrderService { String subject = poNo + poTitle; //내용 - /*Map param = new HashMap(); - param.put("SUBJECT" , subject); - param.put("CAR_CODE" , "CAR-BENZ0001"); - param.put("CAR_NAME" , "G63 AMG 6x6"); - param.put("PRODUCT_GROUP_NAME", "메르세데스벤츠"); - param.put("PRODUCT_NAME" , "지바겐"); - String contents = MailUtil.getHTMLContents("mailTemplate2", param);*/ String contents_table = this.makePoContentsTable(masterInfo, detailList, apprList, multiMasterList); String contents = this.makeMailContents(contents_table); @@ -2370,6 +2368,7 @@ public class PurchaseOrderService { }catch(Exception e){ e.printStackTrace(); } + */ } /** @@ -2914,4 +2913,194 @@ public class PurchaseOrderService { sqlSession.close(); } } + + /** + * 발주서 메일 수동 발송 (버튼 클릭 시) + * @param request + * @param paramMap - objId, toEmails, ccEmails, subject, contents + * @return 발송 결과 + */ + public Map sendPurchaseOrderMailManual(HttpServletRequest request, Map paramMap) { + Map resultMap = new HashMap(); + + try { + String targetObjId = CommonUtils.checkNull(paramMap.get("objId")); + String toEmails = CommonUtils.checkNull(paramMap.get("toEmails")); + String ccEmails = CommonUtils.checkNull(paramMap.get("ccEmails")); + String subject = CommonUtils.checkNull(paramMap.get("subject")); + String contents = CommonUtils.checkNull(paramMap.get("contents")); + String writerEmail = CommonUtils.checkNull(paramMap.get("WRITER_EMAIL")); + String writer = CommonUtils.checkNull(paramMap.get("WRITER")); + + // 발주서 정보 조회 + Map infoParam = new HashMap(); + infoParam.put("objId", targetObjId); + infoParam.put("PURCHASE_ORDER_MASTER_OBJID", targetObjId); + + Map masterInfo = commonService.selectOne("purchaseOrder.getPurchaseOrderMasterInfo", null, infoParam); + + if(masterInfo == null) { + resultMap.put("result", "error"); + resultMap.put("message", "발주서 정보를 찾을 수 없습니다."); + return resultMap; + } + + // 발주부품목록, 결재정보, 동시발주목록, 도면목록 조회 + infoParam.put("MULTI_MASTER_OBJID", targetObjId); + List detailList = commonService.selectList("purchaseOrder.getPURCHASE_ORDER_PART", null, infoParam); + List apprList = commonService.getApprovalLine(infoParam); + List multiMasterList = commonService.selectList("purchaseOrder.selectPurchaseOrderMasterList", null, infoParam); + ArrayList partFileList = commonService.selectList("purchaseOrder.purchaseOrderPartFileListForMail", null, infoParam); + + SimpleDateFormat frm = new SimpleDateFormat("yyyyMMddHHmm"); + SimpleDateFormat frm2 = new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + String todayKor = frm.format(cal.getTime()); + String poNo = CommonUtils.checkNull((String)masterInfo.get("PURCHASE_ORDER_NO")); + String excelName = "발주서_" + poNo + "_" + todayKor + ".xls"; + String zipName = "도면_" + poNo + "_" + todayKor + ".zip"; + masterInfo.put("EXCELFILE_NAME", excelName); + masterInfo.put("APPR_COMPLETE_DATE", frm2.format(cal.getTime())); + + // 발주서 테이블 내용 생성 + String contents_table = this.makePoContentsTable(masterInfo, detailList, apprList, multiMasterList); + + // 메일 본문 생성 (사용자 입력 내용 + 발주서 테이블) + String mailContents = this.makeMailContentsWithUserInput(contents, contents_table); + + // 수신인 이메일 목록 생성 + ArrayList toUserIdList = new ArrayList(); + ArrayList toEmailList = new ArrayList(); + String[] toEmailArr = toEmails.split(","); + for(String email : toEmailArr) { + email = email.trim(); + if(!"".equals(email)) { + toEmailList.add(email); + toUserIdList.add(""); // 이름은 비워둠 + } + } + + // 참조 이메일 목록 생성 + ArrayList ccEmailList = new ArrayList(); + if(!"".equals(ccEmails)) { + String[] ccEmailArr = ccEmails.split(","); + for(String email : ccEmailArr) { + email = email.trim(); + if(!"".equals(email)) { + ccEmailList.add(email); + } + } + } + // 작성자 이메일을 참조에 추가 (중복 방지) + if(!"".equals(writerEmail) && !ccEmailList.contains(writerEmail)) { + ccEmailList.add(writerEmail); + } + + // 첨부파일 목록 생성 + ArrayList attachFileList = new ArrayList(); + + // 1. 발주서 엑셀 파일 첨부 + HashMap excelFile = this.makeMailAttachFileOrderSheet(masterInfo, contents_table); + if(excelFile != null) { + attachFileList.add(excelFile); + } + + // 2. 도면 파일 압축 첨부 + if(partFileList != null && partFileList.size() > 0) { + File zf = MailUtil.zipFileListMail(zipName, partFileList); + if(zf != null && zf.exists()) { + HashMap hm = new HashMap(); + hm.put(Constants.Db.COL_FILE_REAL_NAME, zf.getName()); + hm.put(Constants.Db.COL_FILE_SAVED_NAME, zf.getName()); + hm.put(Constants.Db.COL_FILE_PATH, zf.getPath().replace("\\" + zf.getName(), "")); + attachFileList.add(hm); + } + } + + // 메일 발송 + String fromUser = writer; + String fromEmail = writerEmail; + if("".equals(fromEmail)) { + fromEmail = CommonUtils.checkNull((String)masterInfo.get("WRITER_EMAIL")); + } + if("".equals(fromUser)) { + fromUser = CommonUtils.checkNull((String)masterInfo.get("WRITER")); + } + + boolean sendResult = MailUtil.sendMailWithAttachFile(fromUser, fromEmail, toUserIdList, toEmailList, ccEmailList, null, null, subject, mailContents, attachFileList, "PURCHASE_ORDER"); + + if(sendResult) { + // 메일 발송 성공 시 DB 업데이트 + SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); + try { + Map updateParam = new HashMap(); + updateParam.put("OBJID", targetObjId); + updateParam.put("MAIL_SEND_YN", "Y"); + updateParam.put("MAIL_SEND_DATE", frm2.format(cal.getTime())); + sqlSession.update("purchaseOrder.updateMailSendStatus", updateParam); + sqlSession.commit(); + } catch(Exception e) { + sqlSession.rollback(); + e.printStackTrace(); + } finally { + sqlSession.close(); + } + + resultMap.put("result", "success"); + resultMap.put("message", "메일이 성공적으로 발송되었습니다."); + } else { + resultMap.put("result", "error"); + resultMap.put("message", "메일 발송에 실패했습니다."); + } + + } catch(Exception e) { + e.printStackTrace(); + resultMap.put("result", "error"); + resultMap.put("message", "메일 발송 중 오류가 발생했습니다: " + e.getMessage()); + } + + return resultMap; + } + + /** + * 사용자 입력 내용과 발주서 테이블을 합친 메일 본문 생성 + * @param userContents 사용자가 입력한 메일 내용 + * @param poContentsTable 발주서 테이블 HTML + * @return 완성된 메일 본문 + */ + private String makeMailContentsWithUserInput(String userContents, String poContentsTable) { + StringBuffer sb = new StringBuffer(); + sb.append(""); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(""); + sb.append(""); + + // 사용자 입력 내용 (줄바꿈을
로 변환) + sb.append("
"); + sb.append(userContents.replace("\n", "
")); + sb.append("
"); + + // 구분선 + sb.append("
"); + + // 발주서 테이블 + sb.append("
"); + sb.append("

[ 발주서 상세 ]

"); + sb.append(poContentsTable); + sb.append("
"); + + sb.append("
※발신전용 메일입니다.
"); + sb.append(""); + sb.append(""); + + return sb.toString(); + } }