package com.cloudroam.task; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.cloudroam.common.enumeration.EmailTaskTagEnum; import com.cloudroam.common.enumeration.GroupLevel2Enum; import com.cloudroam.model.EmailSmtpSettingDO; import com.cloudroam.model.EmailTaskSettingDO; import com.cloudroam.model.UserDO; import com.cloudroam.service.*; import com.cloudroam.util.DateUtils; import com.cloudroam.util.MailUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.PostConstruct; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * @author taojie * * 1.根据数据库配置的邮箱地址来发送邮件 * 2.根据数据库任务配置时间来发送邮件 * 当天未填写计划,就发邮件通知个人和项目经理; */ //@Component @Slf4j public class PmsNoDailyTaskExecutors { private final static ScheduledExecutorService scheduler= Executors.newScheduledThreadPool(5); @Autowired private ProjectDailyService projectDailyService; @Autowired private EmailSmtpSettingService emailSmtpSettingService; @Autowired private EmailTaskSettingService emailTaskSettingService; @Autowired private UserService userService; @Autowired private AdminService adminService; private static final int INITIAL_TIME=1*60*1000; @PostConstruct public void init() { scheduler.scheduleAtFixedRate(() -> { try { EmailTaskSettingDO setting = emailTaskSettingService.getEmailTaskSettingByTag(EmailTaskTagEnum.TODAY_NO_DAILY); if(null==setting){ log.warn("未填写日志定时任务时间未配置!"); return; } Integer taskHour = setting.getTaskHour(); LocalDateTime todayPointHourTime = DateUtils.getTodayPointHourTime(taskHour); LocalDateTime now = LocalDateTime.now(); //还需要记录当天邮件是否已经发送过 String emailSendDate = setting.getEmailSendDate(); String today= DateUtil.today(); if(now.isAfter(todayPointHourTime) && !today.equals(emailSendDate) && !DateUtils.isWeekend(LocalDate.now())){ // 获取邮件服务器配置 List settingDOList=emailSmtpSettingService.getEmailSmtpSettingList(); EmailSmtpSettingDO emailSmtpSettingDO = settingDOList.get(0); List noDailyPeoples = projectDailyService.getTodayNoDailyPeoples(); for(UserDO userDO:noDailyPeoples){ String subject="("+DateUtils.formattedTodayDate()+")日志未填写提醒"; // 格式化邮件内容 String content = formatDateDaily(subject); if(StrUtil.isNotBlank(userDO.getEmail())){ //发送个人邮件 MailUtils.sendEmailHtml(emailSmtpSettingDO.getSmtpHost(),emailSmtpSettingDO.getSmtpPort(),emailSmtpSettingDO.getSmtpFrom(),emailSmtpSettingDO.getSmtpUsername(),emailSmtpSettingDO.getSmtpPassword(), userDO.getEmail(), subject,content); } } // 构造经理邮件提醒 String subject="("+DateUtils.formattedTodayDate()+")汇总日志未填写提醒"; String content=formatDateDailyToManager(subject,noDailyPeoples); // 获取项目经理的邮箱,并发送邮件 // 获取项目经理角色的用户 IPage managerUserPage = adminService.getUserPageByGroupId(GroupLevel2Enum.MANAGER.getValue(), 1000, 0); List managers = managerUserPage.getRecords() ; for(UserDO manager:managers){ if(StrUtil.isNotBlank(manager.getEmail())){ MailUtils.sendEmailHtml(emailSmtpSettingDO.getSmtpHost(),emailSmtpSettingDO.getSmtpPort(),emailSmtpSettingDO.getSmtpFrom(),emailSmtpSettingDO.getSmtpUsername(),emailSmtpSettingDO.getSmtpPassword(), manager.getEmail(), subject,content); } } // 将今日邮件发送的标志标为已经发送 EmailTaskSettingDO sendedEmailTaskSetting=new EmailTaskSettingDO(); sendedEmailTaskSetting.setId(setting.getId()); sendedEmailTaskSetting.setEmailSendDate(DateUtils.formattedTodayDate()); sendedEmailTaskSetting.setEmailSendTime(new Date()); emailTaskSettingService.updateById(sendedEmailTaskSetting); } } catch (Exception e) { e.printStackTrace(); } }, 0, 1, TimeUnit.MINUTES); // 每隔一分钟检查一次数据库 } private String formatDateDailyToManager(String subject,List userDOList) { StringBuilder sb=new StringBuilder(); sb.append("
"+subject+"
"); sb.append("("); for(UserDO userDO:userDOList){ sb.append(userDO.getNickname()+" "); } sb.append(")"); sb.append("还未填写今日计划!"); return sb.toString(); } private String formatDateDaily(String title){ StringBuilder sb=new StringBuilder(); sb.append("
"+title+"
"); sb.append("请尽快填写今日计划!"); return sb.toString(); } }