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<EmailSmtpSettingDO> settingDOList=emailSmtpSettingService.getEmailSmtpSettingList();
|
|
EmailSmtpSettingDO emailSmtpSettingDO = settingDOList.get(0);
|
|
List<UserDO> 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<UserDO> managerUserPage = adminService.getUserPageByGroupId(GroupLevel2Enum.MANAGER.getValue(), 1000, 0);
|
List<UserDO> 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<UserDO> userDOList) {
|
|
|
StringBuilder sb=new StringBuilder();
|
sb.append("<div>"+subject+"</div>");
|
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("<div>"+title+"</div>");
|
sb.append("请尽快填写今日计划!");
|
return sb.toString();
|
}
|
|
}
|