From a3716f72066d25d745f4d5103ff23a553c3e102b Mon Sep 17 00:00:00 2001
From: wayne <wayne8692wayne8692@gmail.com>
Date: 星期四, 17 二月 2022 11:41:19 +0800
Subject: [PATCH] Merge branch 'sit' into uat

---
 pamapi/src/main/java/com/pollex/pam/service/ScheduleTaskService.java |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 0 deletions(-)

diff --git a/pamapi/src/main/java/com/pollex/pam/service/ScheduleTaskService.java b/pamapi/src/main/java/com/pollex/pam/service/ScheduleTaskService.java
new file mode 100644
index 0000000..627aeb4
--- /dev/null
+++ b/pamapi/src/main/java/com/pollex/pam/service/ScheduleTaskService.java
@@ -0,0 +1,165 @@
+package com.pollex.pam.service;
+
+import com.pollex.pam.config.ApplicationProperties;
+import com.pollex.pam.config.Constants;
+import com.pollex.pam.domain.*;
+import com.pollex.pam.enums.AppointmentStatusEnum;
+import com.pollex.pam.enums.ContactStatusEnum;
+import com.pollex.pam.enums.SatisfactionStatusEnum;
+import com.pollex.pam.enums.SatisfactionTypeEnum;
+import com.pollex.pam.repository.AppointmentCustomerViewRepository;
+import com.pollex.pam.repository.AppointmentExpiringNotifyRecordRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+import org.thymeleaf.context.Context;
+import org.thymeleaf.spring5.SpringTemplateEngine;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@Service
+@Transactional
+public class ScheduleTaskService {
+
+    private static final String NOT_CONTACTED_NOTIFY_SUBJECT = "�����脰�蝜恍�";
+    private static final Logger log = LoggerFactory.getLogger(ScheduleTaskService.class);
+
+    @Autowired
+    ConsultantService consultantService;
+
+    @Autowired
+    AppointmentService appointmentService;
+
+    @Autowired
+    AppointmentCustomerViewRepository appointmentCustomerViewRepository;
+
+    @Autowired
+    SendMsgService sendMsgService;
+
+    @Autowired
+    SpringTemplateEngine springTemplateEngine;
+
+    @Autowired
+    ApplicationProperties applicationProperties;
+
+    @Autowired
+    AppointmentExpiringNotifyRecordRepository appointmentExpiringNotifyRecordRepository;
+
+    @Autowired
+    SatisfactionService satisfactionService;
+
+    @Autowired
+    PersonalNotificationService personalNotificationService;
+
+    @Scheduled(cron = "0 30 8 * * *")
+    public void sendAppointmentPendingNotifyToConsultant() {
+        log.info("Starting send appointment pending notify to consultant");
+
+        Map<String, List<AppointmentCustomerView>> consultantWithPendingAppointments =
+            appointmentCustomerViewRepository.findAllByCommunicateStatusAndStatus(ContactStatusEnum.RESERVED, AppointmentStatusEnum.AVAILABLE)
+                .stream()
+                .filter(appointment ->
+                    appointmentService.isAppointmentDateNotInIntervalFromNow(appointment, Constants.APPOINTMENT_PENDING_PHONE_INTERVAL, Constants.APPOINTMENT_PENDING_EMAIL_INTERVAL)
+                )
+                .collect(Collectors.groupingBy(AppointmentCustomerView::getAgentNo));
+
+        consultantWithPendingAppointments.forEach((agentNo, pendingAppointments) -> {
+            int pendingAppointmentsSum = pendingAppointments.size();
+            Consultant consultant = consultantService.findByAgentNo(agentNo);
+            Optional<String> optionalPhone = Optional.ofNullable(consultant.getPhoneNumber()).filter(StringUtils::hasText);
+            Optional<String> optionalEmail = Optional.ofNullable(consultant.getEmail()).filter(StringUtils::hasText);
+
+            String emailContent = getAppointmentPendingNotifyEmailContent(pendingAppointmentsSum);
+
+            optionalPhone.ifPresent(phone -> {
+                sendMsgService.sendMsgBySMS(phone, String.format("����%s������脰�蝜恬������", pendingAppointmentsSum));
+            });
+            optionalEmail.ifPresent(email -> {
+                sendMsgService.sendMsgByEmail(email, NOT_CONTACTED_NOTIFY_SUBJECT, emailContent, true);
+            });
+        });
+
+        log.info("Sending appointment pending notify to consultant finish");
+    }
+
+    @Scheduled(cron = "0 30 8 * * *")
+    public void sendAppointmentExpiringNotifyToCustomer() {
+        log.info("Starting send appointment expiring notify to customer");
+
+        List<AppointmentCustomerView> allByCommunicateStatus =
+            appointmentCustomerViewRepository.findAllByCommunicateStatusAndStatus(ContactStatusEnum.RESERVED, AppointmentStatusEnum.AVAILABLE)
+                .stream()
+                .filter(appointment ->
+                    appointmentService.isAppointmentDateNotInIntervalFromNow(appointment, Constants.APPOINTMENT_EXPIRING_PHONE_INTERVAL, Constants.APPOINTMENT_EXPIRING_EMAIL_INTERVAL)
+                )
+                .filter(this::isAppointmentExpiringNotifyNotOnLimit)
+                .collect(Collectors.toList());
+
+        allByCommunicateStatus.forEach(appointment -> {
+            Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo());
+            Optional<String> optionalPhone = Optional.ofNullable(appointment.getPhone()).filter(StringUtils::hasText);
+            Optional<String> optionalEmail = Optional.ofNullable(appointment.getEmail()).filter(StringUtils::hasText);
+
+            optionalPhone.ifPresent(phone ->
+                sendMsgService.sendMsgBySMS(phone, String.format("敺甇�����%s憿批�迤敹�葉嚗������蒂���隞“������雯��嚗�%s"
+                    , consultant.getName(), getAppointmentExpiringNotifyUrl(appointment.getId())))
+            );
+            optionalEmail.ifPresent(email ->
+                sendMsgService.sendMsgByEmail(email, NOT_CONTACTED_NOTIFY_SUBJECT, getAppointmentExpiringNotifyEmail(consultant.getName(), getAppointmentExpiringNotifyUrl(appointment.getId())), true)
+            );
+
+            AppointmentExpiringNotifyRecord record = new AppointmentExpiringNotifyRecord();
+            record.setAppointmentId(appointment.getId());
+            record.setSendTime(Instant.now());
+
+            appointmentExpiringNotifyRecordRepository.save(record);
+        });
+
+        log.info("Sending appointment expiring notify to customer finish");
+    }
+
+    // todo ��蝣箄�府����, otis todo=134497
+    @Scheduled(cron = "0 30 8 * * *")
+    public void sendNotFillAppointmentSatisfactionToPersonalNotification() {
+        Map<Long, List<Satisfaction>> customerNotFillSatisfactions =
+            satisfactionService.getByStatusAndType(SatisfactionStatusEnum.UNFILLED, SatisfactionTypeEnum.APPOINTMENT)
+                .stream()
+                .collect(Collectors.groupingBy(Satisfaction::getCustomerId));
+
+        customerNotFillSatisfactions.forEach((customerId, notFillSatisfactions) ->
+            personalNotificationService.createNotFillAppointmentSatisfactionNumberToCustomer(customerId, notFillSatisfactions.size())
+        );
+    }
+
+    private boolean isAppointmentExpiringNotifyNotOnLimit(AppointmentCustomerView appointment) {
+        int sendNotifyToCustomerRecordSum =
+            appointmentExpiringNotifyRecordRepository.findAllByAppointmentId(appointment.getId()).size();
+
+        return sendNotifyToCustomerRecordSum < Constants.SEND_EXPIRING_NOTIFY_LIMIT;
+    }
+
+    private String getAppointmentExpiringNotifyUrl(Long appointmentId) {
+        return applicationProperties.getFrontEndDomain() + "?notContactAppointmentId=" + appointmentId;
+    }
+
+    private String getAppointmentPendingNotifyEmailContent(int sum) {
+        Context context = new Context();
+        context.setVariable("pendingAppointmentSum", sum);
+        return springTemplateEngine.process("mail/appointmentPendingNotifyEmail", context);
+    }
+
+    private String getAppointmentExpiringNotifyEmail(String consultantName, String notifyUrl) {
+        Context context = new Context();
+        context.setVariable("consultantName", consultantName);
+        context.setVariable("notifyUrl", notifyUrl);
+        return springTemplateEngine.process("mail/appointmentExpiringNotifyEmail", context);
+    }
+}

--
Gitblit v1.8.0