From 630741324be02b0dfbe9ec53e10c149aff86de54 Mon Sep 17 00:00:00 2001 From: wayne <wayne8692wayne8692@gmail.com> Date: 星期三, 22 十二月 2021 12:35:37 +0800 Subject: [PATCH] [update] [todo 132008] 新增當客戶預約時,會通知顧問的手機及信箱 --- pamapi/src/main/resources/config/application-dev.yml | 3 pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentResource.java | 10 + pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java | 28 ++++- pamapi/src/main/java/com/pollex/pam/domain/Consultant.java | 16 ++ pamapi/src/doc/sql/20211222_w.sql | 1 pamapi/src/main/resources/config/application-pollex.yml | 11 ++ pamapi/src/main/resources/config/application-sit.yml | 3 pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java | 4 pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java | 136 ++++++++++++++++++++++++-- pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendSMSFailException.java | 2 pamapi/src/main/resources/config/application-uat.yml | 3 pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java | 27 +++++ pamapi/src/main/java/com/pollex/pam/service/dto/SendMailResponse.java | 4 pamapi/src/main/resources/templates/mail/appointmentNotifyEmail.html | 15 +++ 14 files changed, 236 insertions(+), 27 deletions(-) diff --git a/pamapi/src/doc/sql/20211222_w.sql b/pamapi/src/doc/sql/20211222_w.sql new file mode 100644 index 0000000..a6bdd67 --- /dev/null +++ b/pamapi/src/doc/sql/20211222_w.sql @@ -0,0 +1 @@ +ALTER TABLE omo.consultant ADD email varchar NULL; diff --git a/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java b/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java index 3841d13..fc204ce 100644 --- a/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java +++ b/pamapi/src/main/java/com/pollex/pam/config/ApplicationProperties.java @@ -18,6 +18,8 @@ private String eServiceLoginUrl; private String eServiceLoginFunc; private String eServiceLoginSys; + private String frontEndDomain; + private boolean sendNotifyMsg; private SMS sms; private Email email; @@ -75,6 +77,22 @@ public void seteServiceLoginSys(String eServiceLoginSys) { this.eServiceLoginSys = eServiceLoginSys; + } + + public String getFrontEndDomain() { + return frontEndDomain; + } + + public void setFrontEndDomain(String frontEndDomain) { + this.frontEndDomain = frontEndDomain; + } + + public boolean isSendNotifyMsg() { + return sendNotifyMsg; + } + + public void setSendNotifyMsg(boolean sendNotifyMsg) { + this.sendNotifyMsg = sendNotifyMsg; } public SMS getSms() { @@ -135,6 +153,7 @@ public static class Email { private String url; private String functionId; + private String senderEmail; public String getUrl() { return url; @@ -151,5 +170,13 @@ public void setFunctionId(String functionId) { this.functionId = functionId; } + + public String getSenderEmail() { + return senderEmail; + } + + public void setSenderEmail(String senderEmail) { + this.senderEmail = senderEmail; + } } } diff --git a/pamapi/src/main/java/com/pollex/pam/domain/Consultant.java b/pamapi/src/main/java/com/pollex/pam/domain/Consultant.java index 60fcbf9..5071ff6 100644 --- a/pamapi/src/main/java/com/pollex/pam/domain/Consultant.java +++ b/pamapi/src/main/java/com/pollex/pam/domain/Consultant.java @@ -71,6 +71,9 @@ @Column(name = "communication_style") private String communicationStyle; + @Column(name = "email") + private String email; + public Long getId() { return id; } @@ -230,6 +233,14 @@ this.communicationStyle = communicationStyle; } + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + @Override public String toString() { return "Consultant{" + @@ -245,13 +256,14 @@ ", gender=" + gender + ", phoneNumber='" + phoneNumber + '\'' + ", companyAddress='" + companyAddress + '\'' + - ", seniorityYear='" + seniorityYear + '\'' + - ", seniorityMonth='" + seniorityMonth + '\'' + + ", seniorityYear=" + seniorityYear + + ", seniorityMonth=" + seniorityMonth + ", concept='" + concept + '\'' + ", experience='" + experience + '\'' + ", award='" + award + '\'' + ", recommend=" + recommend + ", communicationStyle='" + communicationStyle + '\'' + + ", email='" + email + '\'' + '}'; } } diff --git a/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java b/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java index 5b5cb33..ec045e3 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java +++ b/pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java @@ -53,12 +53,12 @@ @Autowired SatisfactionService satisfactionService; - public void customerCreateAppointment(AppointmentCreateDTO appointmentCreateDTO) { + public Appointment customerCreateAppointment(AppointmentCreateDTO appointmentCreateDTO) { Appointment appointment = appointmentDTOMapper.toAppointment(appointmentCreateDTO); appointment.setStatus(AVAILABLE); appointment.setCustomerId(SecurityUtils.getCustomerDBId()); appointment.setCommunicateStatus(ContactStatusEnum.RESERVED); - appointmentRepository.save(appointment); + return appointmentRepository.save(appointment); } public void updateAppointment(AppointmentUpdateDTO updateAppointmentDTO) { diff --git a/pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java b/pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java index 650fbac..eb758f6 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java +++ b/pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java @@ -1,16 +1,23 @@ package com.pollex.pam.service; +import com.fasterxml.jackson.databind.ObjectMapper; import com.pollex.pam.config.ApplicationProperties; import com.pollex.pam.config.ApplicationProperties.SMS; +import com.pollex.pam.domain.Appointment; +import com.pollex.pam.repository.ConsultantRepository; import com.pollex.pam.service.dto.*; import com.pollex.pam.service.util.HttpRequestUtil; import com.pollex.pam.web.rest.errors.SendEmailFailException; import com.pollex.pam.web.rest.errors.SendSMSFailException; +import io.jsonwebtoken.lang.Assert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.thymeleaf.context.Context; +import org.thymeleaf.spring5.SpringTemplateEngine; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; @@ -27,10 +34,95 @@ private static final Logger log = LoggerFactory.getLogger(SendMsgService.class); private final Encoder encoder = Base64.getEncoder(); + private static final String EMAIL_SUBJECT = "靽���像�蝟餌絞�嚗���"; + @Autowired ApplicationProperties applicationProperties; - public void sendMsgBySMS(String toMobile, String content) throws SendSMSFailException{ + @Autowired + ConsultantRepository consultantRepository; + + @Autowired + SpringTemplateEngine springTemplateEngine; + + public void sendAppointmentNotify(Appointment appointment) { + Assert.notNull(appointment); + + log.debug("is need sending notify msg = {}", applicationProperties.isSendNotifyMsg()); + if(applicationProperties.isSendNotifyMsg()) { + log.debug("sending appointment notify, appointmentId = {}", appointment.getId()); + sendAppointmentNotifyBySMS(appointment); + sendAppointmentNotifyByEmail(appointment); + + // todo ��蝣箄�������瘙蝙�html mail + // sendAppointmentNotifyByHtmlEmail(appointment); + } + } + + private void sendAppointmentNotifyBySMS(Appointment appointment) throws SendSMSFailException { + String msg = getAppointmentNotifyWording(appointment); + String consultantMobile = consultantRepository.findOneByAgentNo(appointment.getAgentNo()).get().getPhoneNumber(); + + try { + sendMsgBySMS(consultantMobile, msg); + } catch (SendSMSFailException e) { + log.debug("send sms failed, appointment Id = {}", appointment.getId(), e); + } + } + + private void sendAppointmentNotifyByEmail(Appointment appointment) { + // todo ��敺靽�頂蝯勗�辣靽∠拳 (銝行�閮剖��葉) + String senderEmail = applicationProperties.getEmail().getSenderEmail(); + String consultantEmail = consultantRepository.findOneByAgentNo(appointment.getAgentNo()).get().getEmail(); + String content = getAppointmentNotifyWording(appointment); + + try { + sendMsgByEmail(senderEmail, consultantEmail, EMAIL_SUBJECT, content, false); + } catch (SendEmailFailException e) { + log.debug("send email failed, appointment Id = {}", appointment.getId(), e); + } + } + + private void sendAppointmentNotifyByHtmlEmail(Appointment appointment) { + // todo ��敺靽�頂蝯勗�辣靽∠拳 (銝行�閮剖��葉) + String senderEmail = applicationProperties.getEmail().getSenderEmail(); + String consultantEmail = consultantRepository.findOneByAgentNo(appointment.getAgentNo()).get().getEmail(); + String customerMobile = appointment.getPhone(); + String normalContent; + + if(StringUtils.hasText(customerMobile)) { + normalContent = "閬芣��“��憟踝����蝑�靽���像������嚗府摰X����Ⅳ�" + customerMobile + "\n"; + } + else { + normalContent = "閬芣��“��憟踝����蝑�靽���像������\n"; + } + + Context context = new Context(); + context.setVariable("content", normalContent); + context.setVariable("urlHint", getAppointmentDetailUrl(appointment.getId())); + String content = springTemplateEngine.process("mail/appointmentNotifyEmail", context); + + try { + sendMsgByEmail(senderEmail, consultantEmail, EMAIL_SUBJECT, content, true); + } catch (SendEmailFailException e) { + log.debug("send email failed, appointment Id = {}", appointment.getId(), e); + } + } + + private String getAppointmentNotifyWording(Appointment appointment) { + String normalContent; + if(StringUtils.hasText(appointment.getPhone())) { + normalContent = "閬芣��“��憟踝����蝑�靽���像������嚗府摰X����Ⅳ�" + appointment.getPhone() + "\n"; + } + else { + normalContent = "閬芣��“��憟踝����蝑�靽���像������\n"; + } + + String urlContent = "暺�雯��嚗�" + getAppointmentDetailUrl(appointment.getId()) + " �����像������"; + return normalContent + urlContent; + } + + public SendSMSResponse sendMsgBySMS(String toMobile, String content) throws SendSMSFailException { SMS smsProperties = applicationProperties.getSms(); SendSMSRequest sendSMSRequest = new SendSMSRequest(); @@ -54,6 +146,7 @@ log.debug("response status code = {}", responseEntity.getStatusCode()); log.debug("smsResponse = {}", responseEntity.getBody()); + return responseEntity.getBody(); // todo ����閬�����隤方������葫�� } catch (Exception e) { @@ -62,11 +155,20 @@ } } - public void sendMsgByEmail(String from, String to, String subject, String content, boolean htmlFormat) throws SendEmailFailException{ - sendMsgByEmail(from, to, subject, content, htmlFormat, Collections.emptyList(), Collections.emptyList()); + public String sendMsgByHtmlTestTemplateEmail(String from, String to) { + Context context = new Context(); + context.setVariable("content", "閬芣��“��憟踝����蝑�靽���像������\n"); + context.setVariable("urlHint", getAppointmentDetailUrl(0L)); + + String content = springTemplateEngine.process("mail/appointmentNotifyEmail", context); + return sendMsgByEmail(from, to, EMAIL_SUBJECT, content, true); } - public void sendMsgByEmail( + public String sendMsgByEmail(String from, String to, String subject, String content, boolean htmlFormat) throws SendEmailFailException{ + return sendMsgByEmail(from, to, subject, content, htmlFormat, Collections.emptyList(), Collections.emptyList()); + } + + public String sendMsgByEmail( String fromAddress, String toAddress, String subject, String content, boolean htmlFormat, List<String> toCCAddress, List<String> attachments) throws SendEmailFailException { @@ -80,21 +182,23 @@ sendMailRequest.setHtmlFormat(htmlFormat); sendMailRequest.setFunctionId(applicationProperties.getEmail().getFunctionId()); - sendMsgByEmail(sendMailRequest); + return sendMsgByEmail(sendMailRequest); } - public void sendMsgByEmail(SendMailRequest sendMailRequest) throws SendEmailFailException{ + private String sendMsgByEmail(SendMailRequest sendMailRequest) throws SendEmailFailException{ try { - ResponseEntity<SendMailResponse> responseEntity = - HttpRequestUtil.postWithJson( applicationProperties.getEmail().getUrl(), sendMailRequest, SendMailResponse.class); + ResponseEntity<String> responseEntity = + HttpRequestUtil.postWithJson( applicationProperties.getEmail().getUrl(), sendMailRequest, String.class); + log.debug("responseEntity = {}", responseEntity); - SendMailResponse sendMailResponse = responseEntity.getBody(); - log.debug("response status code = {}", responseEntity.getStatusCode()); - log.debug("emailResponse = {}", responseEntity.getBody()); + SendMailResponse sendMailResponse = new ObjectMapper().readValue(responseEntity.getBody(), SendMailResponse.class); + log.debug("sendMailResponse = {}", sendMailResponse); - if(sendMailResponse == null || sendMailResponse.getData() == null || "ADDED".equalsIgnoreCase(sendMailResponse.getData().getMessageStatus())) { - throw new SendEmailFailException(); - } +// if(sendMailResponse == null || sendMailResponse.getData() == null || "ADDED".equalsIgnoreCase(sendMailResponse.getData().getMessageStatus())) { +// throw new SendEmailFailException(); +// } + + return responseEntity.getBody(); } catch (SendEmailFailException e) { throw e; @@ -104,4 +208,8 @@ throw new SendEmailFailException(); } } + + private String getAppointmentDetailUrl(Long appointmentId) { + return applicationProperties.getFrontEndDomain() + "/myAppointmentList/contactedList?appointmentId=" + appointmentId; + } } diff --git a/pamapi/src/main/java/com/pollex/pam/service/dto/SendMailResponse.java b/pamapi/src/main/java/com/pollex/pam/service/dto/SendMailResponse.java index 808dcf6..aee72f7 100644 --- a/pamapi/src/main/java/com/pollex/pam/service/dto/SendMailResponse.java +++ b/pamapi/src/main/java/com/pollex/pam/service/dto/SendMailResponse.java @@ -1,5 +1,8 @@ package com.pollex.pam.service.dto; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +@JsonIgnoreProperties(ignoreUnknown = true) public class SendMailResponse { private Data data; @@ -11,6 +14,7 @@ this.data = data; } + @JsonIgnoreProperties(ignoreUnknown = true) public static class Data { private String messageStatus; diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentResource.java index 1704d11..38592f3 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/AppointmentResource.java @@ -1,5 +1,7 @@ package com.pollex.pam.web.rest; +import com.pollex.pam.domain.Appointment; +import com.pollex.pam.service.SendMsgService; import com.pollex.pam.service.dto.AppointmentUpdateDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -20,6 +22,9 @@ @Autowired SatisfactionService satisfactionService; + @Autowired + SendMsgService sendMsgService; + @PutMapping("") public ResponseEntity<Void> updateAppointment(@RequestBody AppointmentUpdateDTO appointment) { appointmentService.updateAppointment(appointment); @@ -34,8 +39,9 @@ @PostMapping("/customer/create") public void clientCreateAppointment(@RequestBody AppointmentCreateDTO appointmentCreateDTO) { - appointmentService.customerCreateAppointment(appointmentCreateDTO); - } + Appointment appointment = appointmentService.customerCreateAppointment(appointmentCreateDTO); + sendMsgService.sendAppointmentNotify(appointment); + } @PostMapping("/markAsContacted/{appointmentId}") public void markAsContacted(@PathVariable Long appointmentId) { diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java b/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java index c9ff370..461ea06 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/TestSendMsgResource.java @@ -1,6 +1,8 @@ package com.pollex.pam.web.rest; +import com.pollex.pam.repository.AppointmentRepository; import com.pollex.pam.service.SendMsgService; +import com.pollex.pam.service.dto.SendSMSResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -13,21 +15,35 @@ @Autowired SendMsgService sendMsgService; + @Autowired + AppointmentRepository appointmentRepository; + @GetMapping("/bySMS") - public ResponseEntity<Void> bySMS(@RequestParam String toMobile, @RequestParam String content) { - sendMsgService.sendMsgBySMS(toMobile, content); - return ResponseEntity.noContent().build(); + public ResponseEntity<SendSMSResponse> bySMS(@RequestParam String toMobile, @RequestParam String content) { + return ResponseEntity.ok(sendMsgService.sendMsgBySMS(toMobile, content)); } @GetMapping("/byEmail") - public ResponseEntity<Void> byEmail( + public ResponseEntity<String> byEmail( @RequestParam String from, @RequestParam String to, @RequestParam String subject, @RequestParam String content, @RequestParam boolean htmlFormat ) { - sendMsgService.sendMsgByEmail(from, to, subject, content, htmlFormat); - return ResponseEntity.noContent().build(); + return ResponseEntity.ok(sendMsgService.sendMsgByEmail(from, to, subject, content, htmlFormat)); + } + + @GetMapping("/byHtmlEmail") + public ResponseEntity<String> byHtmlEmail( + @RequestParam String from, + @RequestParam String to + ) { + return ResponseEntity.ok(sendMsgService.sendMsgByHtmlTestTemplateEmail(from, to)); + } + + @GetMapping("/appointment/{appointmentId}") + public void sendAppointmentNotify(@PathVariable Long appointmentId) { + sendMsgService.sendAppointmentNotify(appointmentRepository.findById(appointmentId).get()); } } diff --git a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendSMSFailException.java b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendSMSFailException.java index acfeda4..0b721ab 100644 --- a/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendSMSFailException.java +++ b/pamapi/src/main/java/com/pollex/pam/web/rest/errors/SendSMSFailException.java @@ -3,7 +3,7 @@ import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR, reason = "send email failed") +@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR, reason = "send sms failed") public class SendSMSFailException extends RuntimeException{ public SendSMSFailException(){} public SendSMSFailException(String message) { diff --git a/pamapi/src/main/resources/config/application-dev.yml b/pamapi/src/main/resources/config/application-dev.yml index ddf5c77..66b939b 100644 --- a/pamapi/src/main/resources/config/application-dev.yml +++ b/pamapi/src/main/resources/config/application-dev.yml @@ -119,6 +119,8 @@ e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate e-service-login-func: ValidateUsrLogin e-service-login-sys: epos + front-end-domain: http://localhost:3000 + send-notify-msg: false sms: url: https://localhost:8081/testSMS source-code: ePos @@ -127,3 +129,4 @@ email: url: https://localhost:8081/testEmail function-id: epos + sender-email: test@pollex.com.tw diff --git a/pamapi/src/main/resources/config/application-pollex.yml b/pamapi/src/main/resources/config/application-pollex.yml index 005cba7..800d738 100644 --- a/pamapi/src/main/resources/config/application-pollex.yml +++ b/pamapi/src/main/resources/config/application-pollex.yml @@ -117,3 +117,14 @@ e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate e-service-login-func: ValidateUsrLogin e-service-login-sys: epos + front-end-domain: http://dev.pollex.com.tw:5566/pam + send-notify-msg: false + sms: + url: https://localhost:8081/testSMS + source-code: ePos + sender: POS + sms-type: '0017' + email: + url: https://localhost:8081/testEmail + function-id: epos + sender-email: test@pollex.com.tw diff --git a/pamapi/src/main/resources/config/application-sit.yml b/pamapi/src/main/resources/config/application-sit.yml index 26a2198..908d753 100644 --- a/pamapi/src/main/resources/config/application-sit.yml +++ b/pamapi/src/main/resources/config/application-sit.yml @@ -117,6 +117,8 @@ e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate e-service-login-func: ValidateUsrLogin e-service-login-sys: epos + front-end-domain: https://vtwlifeopensyssit.pru.intranet.asia/pam + send-notify-msg: true sms: url: https://vtwlifewinbo66.pru.intranet.asia/MesgQueueMgmnt/rest/smsSendMsgResource source-code: ePos @@ -125,3 +127,4 @@ email: url: https://vtwlifeopensysuat.pru.intranet.asia/tsgw/mq/mqSendMail function-id: epos + sender-email: test@pollex.com.tw diff --git a/pamapi/src/main/resources/config/application-uat.yml b/pamapi/src/main/resources/config/application-uat.yml index e23f9ac..a6b85d7 100644 --- a/pamapi/src/main/resources/config/application-uat.yml +++ b/pamapi/src/main/resources/config/application-uat.yml @@ -117,6 +117,8 @@ e-service-login-url: https://eserviceuat.pcalife.com.tw/sso/chatbotValidate e-service-login-func: ValidateUsrLogin e-service-login-sys: epos + front-end-domain: https://vtwlifeopensysuat.pru.intranet.asia/pam + send-notify-msg: true sms: url: https://vtwlifewinbo66.pru.intranet.asia/MesgQueueMgmnt/rest/smsSendMsgResource source-code: ePos @@ -125,3 +127,4 @@ email: url: https://vtwlifeopensysuat.pru.intranet.asia/tsgw/mq/mqSendMail function-id: epos + sender-email: test@pollex.com.tw diff --git a/pamapi/src/main/resources/templates/mail/appointmentNotifyEmail.html b/pamapi/src/main/resources/templates/mail/appointmentNotifyEmail.html new file mode 100644 index 0000000..644a43a --- /dev/null +++ b/pamapi/src/main/resources/templates/mail/appointmentNotifyEmail.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org" lang="zh"> + <head> + <title>������</title> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> + </head> + <body> + <p th:text="${content}">閬芣��“��憟踝����蝑�靽���像������</p> + <p> + 暺�雯��嚗� + <a th:href="${urlHint}" th:text="${urlHint}">Url Position</a> + �����像����� + </p> + </body> +</html> -- Gitblit v1.8.0