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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
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<EmailSmtpSettingDO> settingDOList=emailSmtpSettingService.getEmailSmtpSettingList();
 
                    EmailSmtpSettingDO emailSmtpSettingDO = settingDOList.get(0);
 
                    List<UserDO> uncommittedPeoples = projectDailyService.getYesterdayUncommittedProjectDailysPeoples();
 
                    List<Map<String,String>> dailyMapList=new ArrayList<>();
 
                    for(UserDO userDO:uncommittedPeoples){
                        if(userDO.getId().equals("1")||userDO.getId().equals("17")||userDO.getId().equals("21")){
                            continue;
                        }
 
                        List<ProjectDailyBO> 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<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(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<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();
    }
 
}