tj
2025-06-05 2d549a04870d1315868a7cf19952b64e8071e711
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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()+"&nbsp;");
        }
        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();
    }
 
}