保誠-保戶業務員媒合平台
KillerADO
2021-12-23 07d6fd2c5c6a35a33ad0dd9556b63fd6156d0974
pamapi/src/main/java/com/pollex/pam/service/SendMsgService.java
@@ -1,48 +1,60 @@
package com.pollex.pam.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.pollex.pam.config.ApplicationProperties;
import com.pollex.pam.service.dto.SMSDetail;
import com.pollex.pam.service.dto.SendSMSRequest;
import com.pollex.pam.service.dto.SendSMSResponse;
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.HttpStatus;
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.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
import java.util.Base64.Encoder;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
@Service
public class SendMsgService {
    private final static Logger log = LoggerFactory.getLogger(SendMsgService.class);
    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 SendSMSResponse sendMsgBySMS(String subject, String toMobile, String content) throws Exception{
        final String SMS_URL = applicationProperties.getSms().getUrl();
    @Autowired
    ConsultantRepository consultantRepository;
    @Autowired
    SpringTemplateEngine springTemplateEngine;
    public SendSMSResponse sendMsgBySMS(String toMobile, String content) throws SendSMSFailException {
        SMS smsProperties = applicationProperties.getSms();
        SendSMSRequest sendSMSRequest = new SendSMSRequest();
        sendSMSRequest.setpKey(UUID.randomUUID().toString());
        sendSMSRequest.setSourceCode(applicationProperties.getSms().getSourceCode());
        sendSMSRequest.setSender(applicationProperties.getSms().getSender());
        sendSMSRequest.setMsgTypeSet(applicationProperties.getSms().getSmsType());
        sendSMSRequest.setSourceCode(smsProperties.getSourceCode());
        sendSMSRequest.setSender(smsProperties.getSender());
        sendSMSRequest.setMsgTypeSet(smsProperties.getSmsType());
        sendSMSRequest.setSendTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:00")));
        sendSMSRequest.setSubject(subject);
        sendSMSRequest.setSubject(smsProperties.getSubject());
        sendSMSRequest.setActivityId("");
        SMSDetail smsDetail = new SMSDetail();
@@ -51,9 +63,76 @@
        sendSMSRequest.setDetail(Collections.singletonList(smsDetail));
        ResponseEntity<SendSMSResponse> responseEntity = HttpRequestUtil.postWithJson(SMS_URL, sendSMSRequest, SendSMSResponse.class);
        return responseEntity.getBody();
        try {
            ResponseEntity<SendSMSResponse> responseEntity = HttpRequestUtil.postWithJson(smsProperties.getUrl(), sendSMSRequest, SendSMSResponse.class);
            log.debug("response status code = {}", responseEntity.getStatusCode());
            log.debug("smsResponse = {}", responseEntity.getBody());
            return responseEntity.getBody();
            // todo 可能需要再補上後續錯誤處理,但要先測通
        }
        catch (Exception e) {
            log.debug("send sms failed!", e);
            throw new SendSMSFailException();
        }
    }
    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 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
    {
        SendMailRequest sendMailRequest = new SendMailRequest();
        sendMailRequest.setSendMailAddresses(Collections.singletonList(toAddress));
        sendMailRequest.setFrom(fromAddress);
        sendMailRequest.setContent(content);
        sendMailRequest.setSubject(subject);
        sendMailRequest.setSendCCMailAddresses(toCCAddress);
        sendMailRequest.setAttachments(attachments);
        sendMailRequest.setHtmlFormat(htmlFormat);
        sendMailRequest.setFunctionId(applicationProperties.getEmail().getFunctionId());
        return sendMsgByEmail(sendMailRequest);
    }
    private String sendMsgByEmail(SendMailRequest sendMailRequest) throws SendEmailFailException{
        try {
            ResponseEntity<String> responseEntity =
                HttpRequestUtil.postWithJson( applicationProperties.getEmail().getUrl(), sendMailRequest, String.class);
            log.debug("responseEntity = {}", responseEntity);
            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();
//            }
            return responseEntity.getBody();
        }
        catch (SendEmailFailException e) {
            throw e;
        }
        catch (Exception e) {
            log.debug("send email failed!", e);
            throw new SendEmailFailException();
        }
    }
    private String getAppointmentDetailUrl(Long appointmentId) {
        return applicationProperties.getFrontEndDomain() + "/myAppointmentList/contactedList?appointmentId=" + appointmentId;
    }
}