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.bo.ProjectDailyBO;
|
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 PmsUncomfirmTaskExecutors {
|
|
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 uncomfirmTaskSetting = emailTaskSettingService.getEmailTaskSettingByTag(EmailTaskTagEnum.YESTERDAY_UNCOMFIRM);
|
if(null== uncomfirmTaskSetting){
|
log.warn("未确认日志定时任务时间未配置!");
|
return ;
|
}
|
Integer taskHour = uncomfirmTaskSetting.getTaskHour();
|
LocalDateTime todayPointHourTime = DateUtils.getTodayPointHourTime(taskHour);
|
LocalDateTime now = LocalDateTime.now();
|
|
//还需要记录当天邮件是否已经发送过
|
String emailSendDate = uncomfirmTaskSetting.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> uncomfirmtedPeoples = projectDailyService.getYesterdayUncomfirmedProjectDailysPeoples();
|
|
List<Map<String,String>> dailyMapList=new ArrayList<>();
|
|
for(UserDO userDO:uncomfirmtedPeoples){
|
|
List<ProjectDailyBO> projectDailys = projectDailyService.getYesterdayUnconfirmedProjectDailys(String.valueOf(userDO.getId()));
|
|
// 格式化邮件内容
|
String content = formatDateDaily(projectDailys,1);
|
|
String subject="("+DateUtils.formattedYesterdayDate()+")未确认的日志提醒";
|
|
if(null!=userDO.getEmail()){
|
if(StrUtil.isNotBlank(userDO.getEmail())){
|
//发送个人邮件
|
MailUtils.sendEmailHtml(emailSmtpSettingDO.getSmtpHost(),emailSmtpSettingDO.getSmtpPort(),emailSmtpSettingDO.getSmtpFrom(),emailSmtpSettingDO.getSmtpUsername(),emailSmtpSettingDO.getSmtpPassword(),
|
userDO.getEmail(), subject,content);
|
}
|
|
}
|
|
|
Map<String,String> dailyMap=new HashMap<>();
|
dailyMap.put("username",userDO. getNickname());
|
dailyMap.put("content",formatDateDaily(projectDailys,0));
|
dailyMapList.add(dailyMap);
|
|
}
|
|
// 构造经理邮件提醒
|
String subject="("+DateUtils.formattedYesterdayDate()+")汇总未确认的日志提醒";
|
|
String content=formatDateDailyToManager(dailyMapList);
|
|
// 获取项目经理的邮箱,并发送邮件
|
|
// 获取项目经理角色的用户
|
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(uncomfirmTaskSetting.getId());
|
sendedEmailTaskSetting.setEmailSendDate(DateUtils.formattedTodayDate());
|
sendedEmailTaskSetting.setEmailSendTime(new Date());
|
|
emailTaskSettingService.updateById(sendedEmailTaskSetting);
|
|
}
|
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}, 0, 1, TimeUnit.MINUTES); // 每隔一分钟检查一次数据库
|
}
|
|
private String formatDateDailyToManager(List<Map<String, String>> dailyMapList) {
|
|
String yesterdayDate = DateUtils.formattedYesterdayDate();
|
StringBuilder sb=new StringBuilder();
|
sb.append("<div>("+yesterdayDate+") 昨日未确认日志汇总内容如下:</div>");
|
sb.append("<table>");
|
|
sb.append("<tr>");
|
sb.append("<th>序号</th>");
|
sb.append("<th>用户名</th>");
|
sb.append("<th>日志内容</th>");
|
sb.append("<th></th>");
|
sb.append("</tr>");
|
|
for(int i=0;i<dailyMapList.size();i++){
|
Map<String,String> daily=dailyMapList.get(i);
|
String username=daily.get("username");
|
String content=daily.get("content");
|
|
sb.append("<tr>");
|
sb.append("<td>"+(i+1)+"</td>");
|
sb.append("<td>"+username+" </td>");
|
sb.append("<td>"+content+" </td>");
|
sb.append("<td></td>");
|
sb.append("</tr>");
|
|
}
|
|
sb.append("</table>");
|
return sb.toString();
|
}
|
|
|
private String formatDateDaily(List<ProjectDailyBO> list,int titleFlag){
|
|
String dailyTemplate="%d、【%s】 %s ( 计划:%.2f H , 实际:%.2f H , 状态:%s ,备注:%s )";
|
StringBuilder sb=new StringBuilder();
|
Date dailyDate=list.get(0).getDailyDate();
|
String dailyDateStr = DateUtil.format(dailyDate, "yyyy-MM-dd");
|
if(titleFlag==1){
|
sb.append("<div>("+dailyDateStr+")昨日未确认的日志如下:</div>");
|
}
|
|
for(int i=0;i<list.size();i++){
|
ProjectDailyBO daily=list.get(i);
|
String singleDailyStr = String.format(dailyTemplate,(i+1), daily.getProjectName2(),daily.getDailyContent(), daily.getEstimatedHours(), daily.getActualHours(), daily.getDailyStatusName(), daily.getRemark());
|
sb.append("<div>"+singleDailyStr+"<div />");
|
}
|
return sb.toString();
|
}
|
|
}
|