메일작성 변경

This commit is contained in:
2025-11-10 12:21:30 +09:00
parent 9aafeb3def
commit a9836b599b
4 changed files with 954 additions and 298 deletions

View File

@@ -2125,6 +2125,115 @@ public class ContractMgmtController {
return resultMap;
}
/**
* 견적서 메일 작성 팝업
* @param request
* @param paramMap - contractObjId
* @return
*/
@RequestMapping("/contractMgmt/estimateMailFormPopup.do")
public String estimateMailFormPopup(HttpServletRequest request, @RequestParam Map paramMap){
return "/contractMgmt/estimateMailFormPopup";
}
/**
* 계약 정보 조회 (메일 발송용) (AJAX)
* @param request
* @param paramMap - objId (CONTRACT_OBJID)
* @return
*/
@ResponseBody
@RequestMapping(value="/contractMgmt/getContractInfoForMail.do", method=RequestMethod.POST)
public Map getContractInfoForMail(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
Map resultMap = new HashMap();
try {
String objId = CommonUtils.checkNull(paramMap.get("objId"));
if("".equals(objId)){
resultMap.put("result", "error");
resultMap.put("message", "계약 OBJID가 없습니다.");
return resultMap;
}
// 계약 정보 조회
Map contractInfo = contractMgmtService.getContractInfoForMail(paramMap);
if(contractInfo != null && !contractInfo.isEmpty()){
// Map 키를 대문자로 변환
contractInfo = CommonUtils.toUpperCaseMapKey(contractInfo);
resultMap.put("result", "success");
resultMap.put("contractInfo", contractInfo);
} else {
resultMap.put("result", "error");
resultMap.put("message", "계약 정보를 찾을 수 없습니다.");
}
} catch (Exception e) {
e.printStackTrace();
resultMap.put("result", "error");
resultMap.put("message", "계약 정보 조회 중 오류가 발생했습니다: " + e.getMessage());
}
return resultMap;
}
/**
* 견적서 메일 발송 (커스텀) (AJAX)
* @param request
* @param paramMap - objId, pdfSessionId, toEmails, ccEmails, subject, contents
* @return
*/
@ResponseBody
@RequestMapping(value="/contractMgmt/sendEstimateMailCustom.do", method=RequestMethod.POST)
public Map sendEstimateMailCustom(HttpServletRequest request,
@RequestParam Map<String, Object> paramMap){
Map resultMap = new HashMap();
try {
String objId = CommonUtils.checkNull(paramMap.get("objId"));
String toEmails = CommonUtils.checkNull(paramMap.get("toEmails"));
String subject = CommonUtils.checkNull(paramMap.get("subject"));
String contents = CommonUtils.checkNull(paramMap.get("contents"));
// 필수 파라미터 검증
if("".equals(objId)){
resultMap.put("result", "error");
resultMap.put("message", "계약 OBJID가 없습니다.");
return resultMap;
}
if("".equals(toEmails)){
resultMap.put("result", "error");
resultMap.put("message", "수신인이 없습니다.");
return resultMap;
}
if("".equals(subject)){
resultMap.put("result", "error");
resultMap.put("message", "제목이 없습니다.");
return resultMap;
}
if("".equals(contents)){
resultMap.put("result", "error");
resultMap.put("message", "내용이 없습니다.");
return resultMap;
}
// 메일 발송 서비스 호출
resultMap = contractMgmtService.sendEstimateMailCustom(request, paramMap);
} catch (Exception e) {
e.printStackTrace();
resultMap.put("result", "error");
resultMap.put("message", "메일 발송 중 오류가 발생했습니다: " + e.getMessage());
}
return resultMap;
}
/**
* 주문서관리 리스트

View File

@@ -2694,4 +2694,177 @@ private String encodeImageToBase64(String imagePath) {
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<String> toEmailList = new ArrayList<String>();
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<String> ccEmailList = new ArrayList<String>();
// 작성자 이메일 자동 추가
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<HashMap> attachFileList = new ArrayList<HashMap>();
if(!"".equals(pdfSessionId)) {
File pdfFile = getPdfFromSession(pdfSessionId, estimateTemplate);
if(pdfFile != null && pdfFile.exists()) {
HashMap<String, String> fileMap = new HashMap<String, String>();
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();
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("첨부파일 개수: " + attachFileList.size());
System.out.println("================================");
// HTML 형식으로 내용 변환 (줄바꿈 처리)
String htmlContents = contents.replace("\n", "<br/>");
boolean mailSent = false;
try {
mailSent = MailUtil.sendMailWithAttachFileUTF8(
fromUserId,
null, // fromEmail (자동으로 SMTP 설정 사용)
new ArrayList<String>(), // toUserIdList (빈 리스트)
toEmailList,
ccEmailList,
new ArrayList<String>(), // bccEmailList (빈 리스트)
null, // important
subject,
htmlContents,
attachFileList.size() > 0 ? attachFileList : null,
"CONTRACT_ESTIMATE"
);
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;
}
}