package com.cloudroam.task; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.cloudroam.bo.ProjectDailyBO; import com.cloudroam.common.enumeration.EmailTaskTagEnum; 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 org.springframework.stereotype.Component; 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 PmsUncommitTaskExecutors { 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 uncommitTaskSetting = emailTaskSettingService.getEmailTaskSettingByTag(EmailTaskTagEnum.YESTERDAY_UNCOMMIT); if(null==uncommitTaskSetting){ log.warn("未提交日志定时任务时间未配置!"); return ; } Integer taskHour = uncommitTaskSetting.getTaskHour(); LocalDateTime todayPointHourTime = DateUtils.getTodayPointHourTime(taskHour); LocalDateTime now = LocalDateTime.now(); //还需要记录当天邮件是否已经发送过 String emailSendDate = uncommitTaskSetting.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 uncommittedPeoples = projectDailyService.getYesterdayUncommittedProjectDailysPeoples(); List> dailyMapList=new ArrayList<>(); for(UserDO userDO:uncommittedPeoples){ if(userDO.getId().equals("1")||userDO.getId().equals("17")||userDO.getId().equals("21")){ continue; } List projectDailys = projectDailyService.getYesterdayUncommittedProjectDailys(String.valueOf(userDO.getId())); // 格式化邮件内容 String content = formatDateDaily(projectDailys,1); String subject="("+DateUtils.formattedYesterdayDate()+")未提交的日志提醒"; //发送个人邮件 if(StrUtil.isNotBlank(userDO.getEmail())){ MailUtils.sendEmailHtml(emailSmtpSettingDO.getSmtpHost(),emailSmtpSettingDO.getSmtpPort(),emailSmtpSettingDO.getSmtpFrom(),emailSmtpSettingDO.getSmtpUsername(),emailSmtpSettingDO.getSmtpPassword(), userDO.getEmail(), subject,content); } Map 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 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(uncommitTaskSetting.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> dailyMapList) { String yesterdayDate = DateUtils.formattedYesterdayDate(); StringBuilder sb=new StringBuilder(); sb.append("
("+yesterdayDate+") 昨日未提交日志汇总内容如下:
"); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); for(int i=0;i daily=dailyMapList.get(i); String username=daily.get("username"); String content=daily.get("content"); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); } sb.append("
序号用户名日志内容
"+(i+1)+""+username+" "+content+"
"); return sb.toString(); } private String formatDateDaily(List 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("
("+dailyDateStr+")昨日未提交的日志如下:
"); } for(int i=0;i"+singleDailyStr+"
"); } return sb.toString(); } }