保誠-保戶業務員媒合平台
wayne
2021-12-29 c1c065fdb4b88062236633004e974f54bf6cd67c
pamapi/src/main/java/com/pollex/pam/service/AppointmentService.java
@@ -3,10 +3,14 @@
import java.time.Instant;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import com.pollex.pam.domain.Satisfaction;
import com.pollex.pam.config.ApplicationProperties;
import com.pollex.pam.service.dto.AppointmentUpdateDTO;
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;
@@ -24,6 +28,9 @@
import com.pollex.pam.service.mapper.AppointmentCustomerViewMapper;
import com.pollex.pam.service.mapper.AppointmentDTOMapper;
import com.pollex.pam.web.rest.errors.AppointmentNotFoundException;
import org.springframework.util.StringUtils;
import org.thymeleaf.context.Context;
import org.thymeleaf.spring5.SpringTemplateEngine;
import static com.pollex.pam.enums.AppointmentStatusEnum.AVAILABLE;
import static com.pollex.pam.enums.AppointmentStatusEnum.DELETED;
@@ -34,7 +41,9 @@
    private static final Logger log = LoggerFactory.getLogger(AppointmentService.class);
   @Autowired
    private static final String NOTIFY_EMAIL_SUBJECT = "保誠媒合平台系統通知:新預約單";
    @Autowired
   AppointmentRepository appointmentRepository;
   @Autowired
@@ -52,12 +61,21 @@
   @Autowired
   SatisfactionService satisfactionService;
   public void customerCreateAppointment(AppointmentCreateDTO appointmentCreateDTO) {
    @Autowired
    SendMsgService sendMsgService;
    @Autowired
    ApplicationProperties applicationProperties;
    @Autowired
    SpringTemplateEngine springTemplateEngine;
   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) {
@@ -72,6 +90,7 @@
        appointment.setRequirement(updateAppointmentDTO.getRequirement());
        appointment.setHopeContactTime(updateAppointmentDTO.getHopeContactTime());
        appointment.setOtherRequirement(updateAppointmentDTO.getOtherRequirement());
        appointment.setLastModifiedDate(Instant.now());
        appointmentRepository.save(appointment);
    }
@@ -79,6 +98,7 @@
    public void markAppointmentDeleted(Long appointmentId) {
        Appointment appointment = appointmentRepository.findById(appointmentId).get();
        appointment.setStatus(DELETED);
        appointment.setLastModifiedDate(Instant.now());
        appointmentRepository.save(appointment);
    }
@@ -87,11 +107,11 @@
   }
   public Appointment markAsContacted(Long appointmentId) {
      Appointment appointment = appointmentRepository.findById(appointmentId).get();
      appointment.setCommunicateStatus(ContactStatusEnum.CONTACTED);
        appointment.setContactTime(Instant.now());
      return appointmentRepository.save(appointment);
        appointment.setLastModifiedDate(Instant.now());
        return appointmentRepository.save(appointment);
   }
   public AppointmentCustomerViewDTO getAppointmentDetail(Long appointmentId) {
@@ -127,6 +147,10 @@
            .collect(Collectors.toList());
    }
    public Optional<Appointment> findLatestAppointmentByAgentNoAndCustomerId(String agentNo, Long customerId) {
        return appointmentRepository.findTopByAgentNoAndCustomerIdOrderByAppointmentDateDesc(agentNo, customerId);
    }
    public void recordConsultantReadTime(Long appointmentId) {
        Appointment appointment = appointmentRepository.findById(appointmentId).get();
@@ -148,4 +172,76 @@
        consultantNotViewAppointments.forEach(appointment -> appointment.setConsultantViewTime(Instant.now()));
        appointmentRepository.saveAll(consultantNotViewAppointments);
    }
    public void sendAppointmentNotify(Appointment appointment) {
        Assert.notNull(appointment, "appointment entity cannot be null");
        log.debug("is need send appointment notify msg? = {}", applicationProperties.isSendNotifyMsg());
        if(applicationProperties.isSendNotifyMsg()) {
            log.debug("sending appointment notify, appointmentId = {}", appointment.getId());
            sendAppointmentNotifyBySMS(appointment);
            sendAppointmentNotifyByHtmlEmail(appointment);
        }
    }
    private void sendAppointmentNotifyBySMS(Appointment appointment) {
        String msg = getAppointmentNotifyWording(appointment);
        String consultantMobile = consultantService.findByAgentNo(appointment.getAgentNo()).getPhoneNumber();
        try {
            if(StringUtils.hasText(consultantMobile)) {
                sendMsgService.sendMsgBySMS(consultantMobile, msg);
            }
            throw new SendSMSFailException("the consultant does not have mobile!");
        } catch (SendSMSFailException e) {
            log.warn("send appointment notify by sms was fail, appointment Id = {}", appointment.getId(), e);
        }
    }
    private String getAppointmentNotifyWording(Appointment appointment) {
        String normalContent;
        if(StringUtils.hasText(appointment.getPhone())) {
            normalContent = "親愛的顧問您好,您有一筆來自保誠人壽媒合平台的預約,預約客戶手機號碼為" + appointment.getPhone() + "\n\n";
        }
        else {
            normalContent = "親愛的顧問您好,您有一筆來自保誠人壽媒合平台的預約\n\n";
        }
        String urlContent = "請點擊網址:" + getAppointmentDetailUrl(appointment.getId()) + " 查看,並安排聯絡訪談,謝謝!";
        return normalContent + urlContent;
    }
    private void sendAppointmentNotifyByHtmlEmail(Appointment appointment) {
        String senderEmail = applicationProperties.getEmail().getSenderEmail();
        String consultantEmail = consultantService.findByAgentNo(appointment.getAgentNo()).getEmail();
        String customerMobile = appointment.getPhone();
        String normalContent;
        if(StringUtils.hasText(customerMobile)) {
            normalContent = "親愛的顧問您好:您有一筆來自保誠人壽媒合平台的預約,預約客戶手機號碼為" + customerMobile + "";
        }
        else {
            normalContent = "親愛的顧問您好:您有一筆來自保誠人壽媒合平台的預約";
        }
        Context context = new Context();
        context.setVariable("content", normalContent);
        context.setVariable("urlHint", getAppointmentDetailUrl(appointment.getId()));
        String content = springTemplateEngine.process("mail/appointmentNotifyEmail", context);
        try {
            if(StringUtils.hasText(consultantEmail)) {
                sendMsgService.sendMsgByEmail(senderEmail, consultantEmail, NOTIFY_EMAIL_SUBJECT, content, true);
            }
            throw new SendEmailFailException("the consultant does not have email!");
        } catch (SendEmailFailException e) {
            log.warn("send appointment notify by email was fail, appointment Id = {}", appointment.getId(), e);
        }
    }
    public String getAppointmentDetailUrl(Long appointmentId) {
        return applicationProperties.getFrontEndDomain() + "/myAppointmentList/contactedList?appointmentId=" + appointmentId;
    }
}