package com.pollex.pam.service; import java.time.Instant; import java.util.List; import javax.management.Notification; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import com.pollex.pam.domain.Appointment; import com.pollex.pam.domain.Consultant; import com.pollex.pam.domain.Customer; import com.pollex.pam.domain.PersonalNotification; import com.pollex.pam.domain.Satisfaction; import com.pollex.pam.enums.NotificationTypeEnum; import com.pollex.pam.enums.PersonalNotificationRoleEnum; import com.pollex.pam.repository.CustomerRepository; import com.pollex.pam.repository.PersonalNotificationRepository; import com.pollex.pam.security.SecurityUtils; import com.pollex.pam.service.dto.AppointmentUpdateDTO; @Service @Transactional public class PersonalNotificationService { @Autowired PersonalNotificationRepository personalNotificationRepository; @Autowired ConsultantService consultantService; @Autowired AppointmentService appointmentService; @Autowired CustomerService customerService; @Autowired CustomerRepository customerRepository; @Autowired SatisfactionService satisfactionService; public List getMyPersonalNotification(Long ownerId, PersonalNotificationRoleEnum role) { return personalNotificationRepository.findAllByOwnerRoleAndOwnerId(role, ownerId); } public void createSendSatisfactionToClientToCustomer(Appointment appointment) { PersonalNotification entity = new PersonalNotification(); Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); String content = consultant.getName()+"顧問請您填寫滿意度評比"; entity.setContent(content); entity.setNotificationType(NotificationTypeEnum.ACTIVITY); entity.setOwnerId(appointment.getCustomerId()); entity.setOwnerRole(PersonalNotificationRoleEnum.CUSTOMER); entity.setTitle("填寫滿意度"); personalNotificationRepository.save(entity); } public void createSendNoticeToCustomer(Long appointmentId) { Appointment appointment = appointmentService.findById(appointmentId); PersonalNotification entity = new PersonalNotification(); Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); String content = "您有 "+consultant.getName()+"顧問的約訪通知"; entity.setContent(content); entity.setNotificationType(NotificationTypeEnum.ACTIVITY); entity.setOwnerId(appointment.getCustomerId()); entity.setOwnerRole(PersonalNotificationRoleEnum.CUSTOMER); entity.setTitle("顧問約訪通知"); personalNotificationRepository.save(entity); } public void createNotFillAppointmentSatisfactionNumberToCustomer(Long customerId, int notFillSatisfactionSum) { PersonalNotification entity = new PersonalNotification(); String content = "您有 "+notFillSatisfactionSum+" 筆顧問的滿意度需要填寫"; entity.setContent(content); entity.setNotificationType(NotificationTypeEnum.ACTIVITY); entity.setOwnerId(customerId); entity.setOwnerRole(PersonalNotificationRoleEnum.CUSTOMER); entity.setTitle("客戶滿意度"); personalNotificationRepository.save(entity); } public void createEditConsultantToConsultant(Consultant consultant) { PersonalNotification entity = new PersonalNotification(); String content = "您的個人帳號設定已進行更新"; entity.setContent(content); entity.setNotificationType(NotificationTypeEnum.ACTIVITY); entity.setOwnerId(consultant.getId()); entity.setOwnerRole(PersonalNotificationRoleEnum.CONSULTANT); entity.setTitle("變更帳號資料"); personalNotificationRepository.save(entity); } public void createMarkAppointmentDeletedToConsultant(Appointment appointment) { PersonalNotification entity = new PersonalNotification(); Customer customer = customerRepository.findById(appointment.getCustomerId()).get(); Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); String content = customer.getName()+"客戶已取消您的預約"; entity.setContent(content); entity.setNotificationType(NotificationTypeEnum.ACTIVITY); entity.setOwnerId(consultant.getId()); entity.setOwnerRole(PersonalNotificationRoleEnum.CONSULTANT); entity.setTitle("取消預約提醒"); personalNotificationRepository.save(entity); } public void createUpdateAppointmentToConsultant(Appointment appointment) { PersonalNotification entity = new PersonalNotification(); Customer customer = customerRepository.findById(appointment.getCustomerId()).get(); Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); String content = customer.getName()+"客戶已更新您的預約資訊"; entity.setContent(content); entity.setNotificationType(NotificationTypeEnum.ACTIVITY); entity.setOwnerId(consultant.getId()); entity.setOwnerRole(PersonalNotificationRoleEnum.CONSULTANT); entity.setTitle("更新預約提醒"); personalNotificationRepository.save(entity); } public void createScorefactionToConsultant(Satisfaction satisfaction) { PersonalNotification entity = new PersonalNotification(); Appointment appointment = appointmentService.findById(satisfaction.getAppointmentId()); Customer customer = customerRepository.findById(appointment.getCustomerId()).get(); Consultant consultant = consultantService.findByAgentNo(appointment.getAgentNo()); String content = customer.getName()+"客戶已對您進行滿意度評比"; entity.setContent(content); entity.setNotificationType(NotificationTypeEnum.ACTIVITY); entity.setOwnerId(consultant.getId()); entity.setOwnerRole(PersonalNotificationRoleEnum.CONSULTANT); entity.setTitle("客戶滿意度"); personalNotificationRepository.save(entity); } public void readAllMyNotification() { if(StringUtils.hasText(SecurityUtils.getAgentNo())) { Long consultantId = consultantService.findByAgentNo(SecurityUtils.getAgentNo()).getId(); readAllNotification(PersonalNotificationRoleEnum.CONSULTANT, consultantId); }else if(SecurityUtils.getCustomerDBId()!=null){ readAllNotification(PersonalNotificationRoleEnum.CUSTOMER, SecurityUtils.getCustomerDBId()); } } public void readAllNotification(PersonalNotificationRoleEnum ownerRole , Long ownerId) { List allNotification = personalNotificationRepository.findAllByOwnerRoleAndOwnerId(ownerRole, ownerId); Instant today = Instant.now(); allNotification.stream() .filter(notification -> notification.getReadDate()==null) .forEach(notification ->{ notification.setReadDate(today); personalNotificationRepository.saveAll(allNotification); }); } }