From bd94a3d7572bcb3d87e3a0c89cb764e873e8b4a8 Mon Sep 17 00:00:00 2001
From: wayne <wayne8692wayne8692@gmail.com>
Date: 星期一, 24 一月 2022 12:05:50 +0800
Subject: [PATCH] [update] 批次中若顧問沒有手機或email就不要發

---
 pamapi/src/main/java/com/pollex/pam/service/ScheduleTaskService.java |  102 ++++++++++++++++++++++++---------------------------
 1 files changed, 48 insertions(+), 54 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
index 9a682e4..57324b5 100644
--- a/pamapi/src/main/java/com/pollex/pam/service/ScheduleTaskService.java
+++ b/pamapi/src/main/java/com/pollex/pam/service/ScheduleTaskService.java
@@ -1,51 +1,32 @@
 package com.pollex.pam.service;
 
 import com.pollex.pam.config.ApplicationProperties;
-import com.pollex.pam.domain.Appointment;
-import com.pollex.pam.domain.AppointmentExpiringNotifyRecord;
-import com.pollex.pam.domain.Consultant;
+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.repository.AppointmentCustomerViewRepository;
 import com.pollex.pam.repository.AppointmentExpiringNotifyRecordRepository;
-import com.pollex.pam.repository.AppointmentRepository;
 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.time.LocalDate;
-import java.time.ZoneId;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
 @Service
+@Transactional
 public class ScheduleTaskService {
-
-    /**
-     * �閰勗�mail�撱箇���(T)敺�憭抵�������
-     * �����摰2
-     */
-    private static final int APPOINTMENT_PENDING_PHONE_INTERVAL = 2;
-    private static final int APPOINTMENT_PENDING_EMAIL_INTERVAL = 2;
-
-    /**
-     * �閰勗�mail�撱箇���(T)敺�憭拇�◤閬������嚗憭拇甈⊥����策憿批��
-     * �敺�憭�(T+N+1)嚗停���甈∠策摰X�� 閰脤“���敹�瘜������閬���
-     */
-    private static final int APPOINTMENT_EXPIRING_PHONE_INTERVAL = APPOINTMENT_PENDING_PHONE_INTERVAL + 1;
-    private static final int APPOINTMENT_EXPIRING_EMAIL_INTERVAL = APPOINTMENT_PENDING_EMAIL_INTERVAL + 1;
-
-    /**
-     * �摰X��活���
-     */
-    private static final int SEND_EXPIRING_NOTIFY_LIMIT = 1;
 
     private static final String NOT_CONTACTED_NOTIFY_SUBJECT = "�����脰�蝜恍�";
     private static final Logger log = LoggerFactory.getLogger(ScheduleTaskService.class);
@@ -57,7 +38,7 @@
     AppointmentService appointmentService;
 
     @Autowired
-    AppointmentRepository appointmentRepository;
+    AppointmentCustomerViewRepository appointmentCustomerViewRepository;
 
     @Autowired
     SendMsgService sendMsgService;
@@ -71,25 +52,38 @@
     @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<Appointment>> consultantWithPendingAppointments =
-            appointmentRepository.findAllByCommunicateStatusAndStatus(ContactStatusEnum.RESERVED, AppointmentStatusEnum.AVAILABLE)
+        Map<String, List<AppointmentCustomerView>> consultantWithPendingAppointments =
+            appointmentCustomerViewRepository.findAllByCommunicateStatusAndStatus(ContactStatusEnum.RESERVED, AppointmentStatusEnum.AVAILABLE)
                 .stream()
-                .filter(appointment -> isAppointmentInInterval(appointment, APPOINTMENT_PENDING_PHONE_INTERVAL, APPOINTMENT_PENDING_EMAIL_INTERVAL))
-                .collect(Collectors.groupingBy(Appointment::getAgentNo));
+                .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);
-            String consultantPhoneNumber = consultant.getPhoneNumber();
-            String consultantEmail = consultant.getEmail();
+            Optional<String> optionalPhone = Optional.ofNullable(consultant.getPhoneNumber()).filter(StringUtils::hasText);
+            Optional<String> optionalEmail = Optional.ofNullable(consultant.getEmail()).filter(StringUtils::hasText);
+
             String emailContent = getAppointmentPendingNotifyEmailContent(pendingAppointmentsSum);
 
-            sendMsgService.sendMsgBySMS(consultantPhoneNumber, String.format("����%s������脰�蝜恬������", pendingAppointmentsSum));
-            sendMsgService.sendMsgByEmail(consultantEmail, NOT_CONTACTED_NOTIFY_SUBJECT, emailContent, true);
+            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");
@@ -99,11 +93,13 @@
     public void sendAppointmentExpiringNotifyToCustomer() {
         log.info("Starting send appointment expiring notify to customer");
 
-        List<Appointment> allByCommunicateStatus =
-            appointmentRepository.findAllByCommunicateStatusAndStatus(ContactStatusEnum.RESERVED, AppointmentStatusEnum.AVAILABLE)
+        List<AppointmentCustomerView> allByCommunicateStatus =
+            appointmentCustomerViewRepository.findAllByCommunicateStatusAndStatus(ContactStatusEnum.RESERVED, AppointmentStatusEnum.AVAILABLE)
                 .stream()
-                .filter(appointment -> isAppointmentInInterval(appointment, APPOINTMENT_EXPIRING_PHONE_INTERVAL, APPOINTMENT_EXPIRING_EMAIL_INTERVAL))
-                .filter(this::isAppointmentNotifyNotOnLimit)
+                .filter(appointment ->
+                    appointmentService.isAppointmentDateNotInIntervalFromNow(appointment, Constants.APPOINTMENT_EXPIRING_PHONE_INTERVAL, Constants.APPOINTMENT_EXPIRING_EMAIL_INTERVAL)
+                )
+                .filter(this::isAppointmentExpiringNotifyNotOnLimit)
                 .collect(Collectors.toList());
 
         allByCommunicateStatus.forEach(appointment -> {
@@ -113,10 +109,10 @@
 
             optionalPhone.ifPresent(phone ->
                 sendMsgService.sendMsgBySMS(phone, String.format("敺甇�����%s憿批�迤敹�葉嚗������蒂���隞“������雯��嚗�%s"
-                    , consultant.getName(), getAppointmentUrl(appointment.getId())))
+                    , consultant.getName(), getAppointmentExpiringNotifyUrl(appointment.getId())))
             );
             optionalEmail.ifPresent(email ->
-                sendMsgService.sendMsgByEmail(email, NOT_CONTACTED_NOTIFY_SUBJECT, getAppointmentExpiringNotifyEmail(consultant.getName(), getAppointmentUrl(appointment.getId())), true)
+                sendMsgService.sendMsgByEmail(email, NOT_CONTACTED_NOTIFY_SUBJECT, getAppointmentExpiringNotifyEmail(consultant.getName(), getAppointmentExpiringNotifyUrl(appointment.getId())), true)
             );
 
             AppointmentExpiringNotifyRecord record = new AppointmentExpiringNotifyRecord();
@@ -129,28 +125,26 @@
         log.info("Sending appointment expiring notify to customer finish");
     }
 
-    private boolean isAppointmentInInterval(Appointment appointment, int phoneInterval, int emailInterval) {
-        final boolean isHavePhone = StringUtils.hasText(appointment.getPhone());
-        final boolean isHaveEmail = StringUtils.hasText(appointment.getEmail());
+    // todo ��蝣箄�府����, otis todo=134497
+    @Scheduled(cron = "0 30 8 * * *")
+    public void sendNotFillSatisfactionToPersonalNotification() {
+        Map<Long, List<Satisfaction>> customerNotFillSatisfactions = satisfactionService.getByStatus(SatisfactionStatusEnum.UNFILLED)
+                .stream()
+                .collect(Collectors.groupingBy(Satisfaction::getCustomerId));
 
-        LocalDate appointmentDate = appointment.getAppointmentDate().atZone(ZoneId.systemDefault()).toLocalDate();
-        LocalDate nowDate = Instant.now().atZone(ZoneId.systemDefault()).toLocalDate();
-        long intervalDays = nowDate.toEpochDay() - appointmentDate.toEpochDay();
-
-        final boolean isAppointmentExpiringByPhone = isHavePhone && intervalDays >= phoneInterval;
-        final boolean isAppointmentExpiringByEmail = isHaveEmail && intervalDays >= emailInterval;
-
-        return isAppointmentExpiringByPhone || isAppointmentExpiringByEmail;
+        customerNotFillSatisfactions.forEach((customerId, notFillSatisfactions) ->
+            personalNotificationService.createNotFillSatisfactionSumToCustomer(customerId, notFillSatisfactions.size())
+        );
     }
 
-    private boolean isAppointmentNotifyNotOnLimit(Appointment appointment) {
+    private boolean isAppointmentExpiringNotifyNotOnLimit(AppointmentCustomerView appointment) {
         int sendNotifyToCustomerRecordSum =
             appointmentExpiringNotifyRecordRepository.findAllByAppointmentId(appointment.getId()).size();
 
-        return sendNotifyToCustomerRecordSum < SEND_EXPIRING_NOTIFY_LIMIT;
+        return sendNotifyToCustomerRecordSum < Constants.SEND_EXPIRING_NOTIFY_LIMIT;
     }
 
-    private String getAppointmentUrl(Long appointmentId) {
+    private String getAppointmentExpiringNotifyUrl(Long appointmentId) {
         return applicationProperties.getFrontEndDomain() + "?notContactAppointmentId=" + appointmentId;
     }
 

--
Gitblit v1.8.0