Commit 43458e11aeceaeee29e671c513a8ba1e608fcd0d

Authored by chenhang4442024
1 parent 589b0cdc

定时检测超时任务

src/main/java/com/order/erp/common/utils/EmailSendUtils.java
@@ -2,6 +2,7 @@ package com.order.erp.common.utils; @@ -2,6 +2,7 @@ package com.order.erp.common.utils;
2 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 2 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
3 import com.order.erp.domain.EmailTemplateEnum; 3 import com.order.erp.domain.EmailTemplateEnum;
4 import com.order.erp.domain.email.OrderProductEmailVO; 4 import com.order.erp.domain.email.OrderProductEmailVO;
  5 +import com.order.erp.domain.vo.order.OrderEventJobVO;
5 import freemarker.template.Template; 6 import freemarker.template.Template;
6 import freemarker.template.TemplateException; 7 import freemarker.template.TemplateException;
7 import org.springframework.beans.factory.annotation.Value; 8 import org.springframework.beans.factory.annotation.Value;
@@ -37,12 +38,12 @@ public class EmailSendUtils { @@ -37,12 +38,12 @@ public class EmailSendUtils {
37 * @Description: 发送邮件 38 * @Description: 发送邮件
38 * @param emailTemplateEnum 邮件事件类型 39 * @param emailTemplateEnum 邮件事件类型
39 * @param receiveemailList 收件人邮箱 40 * @param receiveemailList 收件人邮箱
40 - * @param orderProductEmailVO 订单基本信息,订单-质检信息 41 + * @param orderEventJobVO 订单基本信息,订单-质检信息,等
41 * @throws MessagingException 42 * @throws MessagingException
42 * @throws IOException 43 * @throws IOException
43 */ 44 */
44 45
45 - public void sendEmail(EmailTemplateEnum emailTemplateEnum, List<String> receiveemailList, OrderProductEmailVO orderProductEmailVO) throws MessagingException, IOException, TemplateException { 46 + public void sendEmail(EmailTemplateEnum emailTemplateEnum, List<String> receiveemailList, OrderEventJobVO orderEventJobVO) throws MessagingException, IOException, TemplateException {
46 MimeMessage mimeMessage = javaMailSender.createMimeMessage(); 47 MimeMessage mimeMessage = javaMailSender.createMimeMessage();
47 if(CollectionUtils.isNotEmpty(receiveemailList)){ 48 if(CollectionUtils.isNotEmpty(receiveemailList)){
48 MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true); 49 MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);
@@ -57,7 +58,7 @@ public class EmailSendUtils { @@ -57,7 +58,7 @@ public class EmailSendUtils {
57 Map<String, Object> map = new HashMap<>(); 58 Map<String, Object> map = new HashMap<>();
58 map.put("context",emailTemplateEnum.getContent()); 59 map.put("context",emailTemplateEnum.getContent());
59 map.put("title",emailTemplateEnum.getTitle()); 60 map.put("title",emailTemplateEnum.getTitle());
60 - map.put("data",orderProductEmailVO); 61 + map.put("data",orderEventJobVO);
61 Template template = freeMarkerConfigurer.getConfiguration().getTemplate("mail.ftl"); 62 Template template = freeMarkerConfigurer.getConfiguration().getTemplate("mail.ftl");
62 StringWriter stringWriter = new StringWriter(); 63 StringWriter stringWriter = new StringWriter();
63 template.process(map,stringWriter); 64 template.process(map,stringWriter);
src/main/java/com/order/erp/domain/EmailTemplateEnum.java
@@ -43,5 +43,13 @@ public enum EmailTemplateEnum { @@ -43,5 +43,13 @@ public enum EmailTemplateEnum {
43 * 邮件模块id 43 * 邮件模块id
44 */ 44 */
45 private Long templateId; 45 private Long templateId;
  46 + public static EmailTemplateEnum byTemplate(Long templateId) {
  47 + for (EmailTemplateEnum emailTemplateEnum : EmailTemplateEnum.values()) {
  48 + if (emailTemplateEnum.getTemplateId().equals(templateId)) {
  49 + return emailTemplateEnum;
  50 + }
  51 + }
  52 + return null;
  53 + }
46 54
47 } 55 }
src/main/java/com/order/erp/job/OrderOverTimeEventJob.java
1 package com.order.erp.job; 1 package com.order.erp.job;
2 - 2 +import cn.hutool.core.bean.BeanUtil;
3 import com.alibaba.fastjson.JSON; 3 import com.alibaba.fastjson.JSON;
  4 +import com.alibaba.fastjson.TypeReference;
4 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
5 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 6 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
6 import com.order.erp.common.constant.Constant; 7 import com.order.erp.common.constant.Constant;
7 import com.order.erp.common.utils.EmailSendUtils; 8 import com.order.erp.common.utils.EmailSendUtils;
  9 +import com.order.erp.common.utils.RedisUtils;
8 import com.order.erp.common.utils.StringUtils; 10 import com.order.erp.common.utils.StringUtils;
9 import com.order.erp.common.utils.TransactionHelper; 11 import com.order.erp.common.utils.TransactionHelper;
10 import com.order.erp.domain.EmailTemplateEnum; 12 import com.order.erp.domain.EmailTemplateEnum;
11 import com.order.erp.domain.OrderEventEnum; 13 import com.order.erp.domain.OrderEventEnum;
12 -import com.order.erp.domain.OrderStatusEnum;  
13 -import com.order.erp.domain.dto.BaseDO;  
14 import com.order.erp.domain.dto.order.OrderBaseInfoDO; 14 import com.order.erp.domain.dto.order.OrderBaseInfoDO;
15 import com.order.erp.domain.dto.order.OrderInspectionStageDO; 15 import com.order.erp.domain.dto.order.OrderInspectionStageDO;
16 import com.order.erp.domain.dto.order.OrderTrackStageDO; 16 import com.order.erp.domain.dto.order.OrderTrackStageDO;
17 import com.order.erp.domain.dto.order.ReceiveEmailMappingDO; 17 import com.order.erp.domain.dto.order.ReceiveEmailMappingDO;
18 -import com.order.erp.domain.email.OrderProductEmailVO;  
19 -import com.order.erp.domain.vo.order.OrderEventJobVO;  
20 -import com.order.erp.domain.vo.order.ReceiveEmailConfigItemVO; 18 +import com.order.erp.domain.vo.order.*;
21 import com.order.erp.service.order.*; 19 import com.order.erp.service.order.*;
22 import freemarker.template.TemplateException; 20 import freemarker.template.TemplateException;
23 import lombok.extern.slf4j.Slf4j; 21 import lombok.extern.slf4j.Slf4j;
24 import org.springframework.scheduling.annotation.Scheduled; 22 import org.springframework.scheduling.annotation.Scheduled;
25 import org.springframework.stereotype.Component; 23 import org.springframework.stereotype.Component;
26 -  
27 import javax.annotation.Resource; 24 import javax.annotation.Resource;
28 import javax.mail.MessagingException; 25 import javax.mail.MessagingException;
29 -import java.io.File;  
30 import java.io.IOException; 26 import java.io.IOException;
31 import java.time.LocalDate; 27 import java.time.LocalDate;
32 import java.time.format.DateTimeFormatter; 28 import java.time.format.DateTimeFormatter;
@@ -35,7 +31,6 @@ import java.util.*; @@ -35,7 +31,6 @@ import java.util.*;
35 import java.util.function.Function; 31 import java.util.function.Function;
36 import java.util.stream.Collectors; 32 import java.util.stream.Collectors;
37 33
38 -import static com.order.erp.domain.EmailTemplateEnum.BIG_SAMPLE_TEMPLATE;  
39 34
40 35
41 /** 36 /**
@@ -72,291 +67,23 @@ public class OrderOverTimeEventJob { @@ -72,291 +67,23 @@ public class OrderOverTimeEventJob {
72 @Resource 67 @Resource
73 private ReceiveEmailMappingService receiveEmailMappingService; 68 private ReceiveEmailMappingService receiveEmailMappingService;
74 69
  70 + @Resource
  71 + private RedisUtils redisUtils;
  72 +
75 /** 73 /**
76 * 凌晨1点执行,一天一次 74 * 凌晨1点执行,一天一次
77 */ 75 */
78 - @Scheduled(cron = "0 0 1 * * ?")  
79 - public void checkOverTimeExecute() {  
80 - /*首先判断字符串。如果没有ok并且次数达到了三次(统计fail是否存在三次),就提醒。  
81 - * 如果有ok,取出ok前的日期,得到日期,那这个日期与HOD日期进行判断*/  
82 - List<OrderBaseInfoDO> orderBaseInfoList = orderBaseInfoService.list(new LambdaQueryWrapper<OrderBaseInfoDO>()  
83 - .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)  
84 - .ne(OrderBaseInfoDO::getOrderStatus, OrderStatusEnum.ORDER_FINISH.getStatus()));  
85 - Set<Long> orderList = orderBaseInfoList.stream().map(OrderBaseInfoDO::getId).collect(Collectors.toSet());  
86 - Map<Long, OrderBaseInfoDO> baseInfoDOMap = orderBaseInfoList.stream().collect(Collectors.toMap(OrderBaseInfoDO::getId, Function.identity(), (x, y) -> x));  
87 - List<OrderInspectionStageDO> orderInspectionStageList = inspectionStageService.listByIds(orderList);  
88 - Map<Long, OrderInspectionStageDO> inspectionStageDOMap = orderInspectionStageList.stream().collect(Collectors.toMap(OrderInspectionStageDO::getOrderId, Function.identity(), (x, y) -> x));  
89 - List<OrderTrackStageDO> orderTrackStageList = trackStageService.listByIds(orderList);  
90 - OrderProductEmailVO orderProductEmailVO = new OrderProductEmailVO();  
91 - System.out.println("1111111111111111111111111");  
92 - //只有跟单信息不为空时,才会有时间和状态。  
93 - if (CollectionUtils.isNotEmpty(orderTrackStageList)) {  
94 - System.out.println("orderId" + baseInfoDOMap);  
95 - System.out.println("order Base Info" + inspectionStageDOMap);  
96 - orderTrackStageList.stream().forEach(x -> {  
97 - System.out.println("orderId" + x.getOrderId());  
98 - System.out.println("order Base Info" + baseInfoDOMap.get(x.getOrderId()));  
99 - if (StringUtils.isBlank(baseInfoDOMap.get(x.getOrderId()).getOrderHodTime())) {  
100 -// return ServerResult.fail("HODTime不能为空");  
101 - }  
102 - if (baseInfoDOMap.get(x.getOrderId()).getId() == x.getOrderId()) {  
103 - orderProductEmailVO.setBaseInfo(baseInfoDOMap.get(x.getOrderId()));  
104 - try {  
105 - System.out.println("222222222222222222222");  
106 - test(EmailTemplateEnum.AITEX_SGS_TEST_TEMPLATE, x.getPpConfirmResult(), orderProductEmailVO);  
107 - System.out.println("2333333333333333333333");  
108 - } catch (MessagingException e) {  
109 - throw new RuntimeException(e);  
110 - } catch (TemplateException e) {  
111 - throw new RuntimeException(e);  
112 - } catch (IOException e) {  
113 - throw new RuntimeException(e);  
114 - }  
115 - try {  
116 - test(EmailTemplateEnum.CONFIRM_SAMPLE_TEMPLATE, x.getShippmentSampleConfirmResult(), orderProductEmailVO);  
117 - } catch (MessagingException e) {  
118 - throw new RuntimeException(e);  
119 - } catch (TemplateException e) {  
120 - throw new RuntimeException(e);  
121 - } catch (IOException e) {  
122 - throw new RuntimeException(e);  
123 - }  
124 - try {  
125 - test(EmailTemplateEnum.AITEX_SGS_TEST_TEMPLATE, x.getAitexTestFinishResult(), orderProductEmailVO);  
126 - } catch (MessagingException e) {  
127 - throw new RuntimeException(e);  
128 - } catch (TemplateException e) {  
129 - throw new RuntimeException(e);  
130 - } catch (IOException e) {  
131 - throw new RuntimeException(e);  
132 - }  
133 - try {  
134 - test(EmailTemplateEnum.AITEX_SGS_TEST_TEMPLATE, x.getSgsTestFinishResult(), orderProductEmailVO);  
135 - } catch (MessagingException e) {  
136 - throw new RuntimeException(e);  
137 - } catch (TemplateException e) {  
138 - throw new RuntimeException(e);  
139 - } catch (IOException e) {  
140 - throw new RuntimeException(e);  
141 - }  
142 - try {  
143 - test(EmailTemplateEnum.OTHER_SAMPLE_TEMPLATE, x.getEsoSampleSendTime(), orderProductEmailVO);  
144 - } catch (MessagingException e) {  
145 - throw new RuntimeException(e);  
146 - } catch (TemplateException e) {  
147 - throw new RuntimeException(e);  
148 - } catch (IOException e) {  
149 - throw new RuntimeException(e);  
150 - }  
151 - try {  
152 - test(EmailTemplateEnum.BARCODE_ARRIVAL_TEMPLATE, x.getLatestArrivalTime(), orderProductEmailVO);  
153 - } catch (MessagingException e) {  
154 - throw new RuntimeException(e);  
155 - } catch (TemplateException e) {  
156 - throw new RuntimeException(e);  
157 - } catch (IOException e) {  
158 - throw new RuntimeException(e);  
159 - }  
160 - try {  
161 - test(EmailTemplateEnum.LATEST_DC_TEMPLATE, x.getLatestBkTime(), orderProductEmailVO);  
162 - } catch (MessagingException e) {  
163 - throw new RuntimeException(e);  
164 - } catch (TemplateException e) {  
165 - throw new RuntimeException(e);  
166 - } catch (IOException e) {  
167 - throw new RuntimeException(e);  
168 - }  
169 - }  
170 - if (baseInfoDOMap.get(x.getOrderId()).getId() == x.getOrderId() &&  
171 - baseInfoDOMap.get(x.getOrderId()).getId() == inspectionStageDOMap.get(x.getOrderId()).getOrderId()) {  
172 - orderProductEmailVO.setInspectionStageInfo(inspectionStageDOMap.get(x.getOrderId()));  
173 - orderProductEmailVO.setBaseInfo(baseInfoDOMap.get(x.getOrderId()));  
174 - //尾期验货日期。尾期放这里写是因为尾期验货日期需要从inspectionStageDOMap中获取。  
175 - try {  
176 - test(EmailTemplateEnum.END_CHECK_DATE_TEMPLATE, inspectionStageDOMap.get(x.getOrderId()).getEndCheckApplyTime(), orderProductEmailVO);  
177 - } catch (MessagingException e) {  
178 - throw new RuntimeException(e);  
179 - } catch (TemplateException e) {  
180 - throw new RuntimeException(e);  
181 - } catch (IOException e) {  
182 - throw new RuntimeException(e);  
183 - }  
184 - /*加上中期验货报告和尾期验货报告的发送,因为他需要发送inspectionStageDOMap实体类中的数据*/  
185 - //todo  
186 - }  
187 -  
188 - }  
189 - );  
190 - }  
191 -  
192 - }  
193 -  
194 - // 写一下检测方法。  
195 - /*@param event 代表的含义,这个是对应的枚举类型。  
196 - *@param str 代表的含义,这个是状态日期。  
197 - *@param orderProductEmailVO 代表的含义,这个邮件要发送的内容。  
198 - * */  
199 - //todo 还需要判断其他时间,不能单独只判断po时间。  
200 - public void test(EmailTemplateEnum eventEnum, String str, OrderProductEmailVO orderProductEmailVO) throws MessagingException, TemplateException, IOException {  
201 - //获取邮件收件人。  
202 - System.out.println("22222222222222222222--1111111111111");  
203 - List<List<String>> emails = getEmails(eventEnum, orderProductEmailVO);  
204 - if (StringUtils.isNotBlank(str)) {  
205 - //如果为确认样确认,或者AITEX/SGS测试判断是否存在ok。  
206 - if (eventEnum.getTitle().equals(EmailTemplateEnum.CONFIRM_SAMPLE_TEMPLATE.getTitle()) ||  
207 - eventEnum.getTitle().equals(EmailTemplateEnum.AITEX_SGS_TEST_TEMPLATE.getTitle()) ||  
208 - eventEnum.getTitle().equals(BIG_SAMPLE_TEMPLATE.getTitle())) {  
209 - System.out.println("2222222222-22222222222222");  
210 - //不包含ok并且三次输入机会都为fail了  
211 - if (!str.contains("ok") && org.apache.commons.lang3.StringUtils.countMatches(str, "fail") == 3) {  
212 - //直接发邮件。  
213 - for (List email : emails) {  
214 - emailSendUtils.sendEmail(eventEnum, email, orderProductEmailVO);  
215 - }  
216 - //设置状态为1,下次不扫描。  
217 - } else if (str.contains("ok") || org.apache.commons.lang3.StringUtils.countMatches(str, "fail") < 3) {  
218 - //只会有几种种情况,一种是fail,一种是fail+fail。一种是fail+ok,一种是ok,得到最后状态前的值就可以了,前面的不用管。  
219 - String[] parats = str.split("\\+");  
220 - //获取最后状态前的时间。  
221 - String time = parats[str.length() - 3];  
222 - LocalDate parse1 = LocalDate.parse(time, DateTimeFormatter.ofPattern("yyyy-M-d"));  
223 - //得到订单的截止时间。  
224 - String orderHodTime = orderProductEmailVO.getBaseInfo().getOrderHodTime();  
225 - LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));  
226 - //计算两个时间之间的天数间隔。parse2-parse1  
227 - long daysBetween = ChronoUnit.DAYS.between(parse2, parse1);  
228 - if (eventEnum.getTitle().equals(EmailTemplateEnum.CONFIRM_SAMPLE_TEMPLATE.getTitle())) {  
229 - if (daysBetween == 21) {  
230 - //直接发邮件。  
231 - for (List email : emails) {  
232 - emailSendUtils.sendEmail(eventEnum, email, orderProductEmailVO);  
233 - }  
234 - }  
235 - } else if (eventEnum.getTitle().equals(EmailTemplateEnum.AITEX_SGS_TEST_TEMPLATE.getTitle())) {  
236 - if (daysBetween == 3) {  
237 - //直接发邮件。  
238 - for (List email : emails) {  
239 - emailSendUtils.sendEmail(eventEnum, email, orderProductEmailVO);  
240 - }  
241 - }  
242 - } else {  
243 - if (daysBetween == 7) {  
244 - //直接发邮件。  
245 - for (List email : emails) {  
246 - emailSendUtils.sendEmail(eventEnum, email, orderProductEmailVO);  
247 - }  
248 - }  
249 - }  
250 - }  
251 - }  
252 - //没有ok或者fail状态,只通过时间来判断。  
253 - if (eventEnum.getTitle().equals(EmailTemplateEnum.OTHER_SAMPLE_TEMPLATE.getTitle())) {  
254 - String orderHodTime = orderProductEmailVO.getBaseInfo().getOrderHodTime();  
255 - LocalDate parse1 = LocalDate.parse(str, DateTimeFormatter.ofPattern("yyyy-M-d"));  
256 - //订单的HOD截止时间。  
257 - LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));  
258 - long daysBetween = ChronoUnit.DAYS.between(parse2, parse1);  
259 - if (daysBetween == 14) {  
260 - for (List email : emails) {  
261 - emailSendUtils.sendEmail(eventEnum, email, orderProductEmailVO);  
262 - }  
263 - }  
264 -  
265 - } else if (eventEnum.getTitle().equals(EmailTemplateEnum.BARCODE_ARRIVAL_TEMPLATE.getTitle())) {  
266 - String orderHodTime = orderProductEmailVO.getBaseInfo().getOrderHodTime();  
267 - LocalDate parse1 = LocalDate.parse(str, DateTimeFormatter.ofPattern("yyyy-M-d"));  
268 - //订单的HOD截止时间。  
269 - LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));  
270 - long daysBetween = ChronoUnit.DAYS.between(parse2, parse1);  
271 - if (daysBetween == 7) {  
272 - for (List email : emails) {  
273 - emailSendUtils.sendEmail(eventEnum, email, orderProductEmailVO);  
274 - }  
275 - }  
276 -  
277 - } else if (eventEnum.getTitle().equals(EmailTemplateEnum.LATEST_DC_TEMPLATE.getTitle())) {  
278 - String orderHodTime = orderProductEmailVO.getBaseInfo().getOrderHodTime();  
279 - LocalDate parse1 = LocalDate.parse(str, DateTimeFormatter.ofPattern("yyyy-M-d"));  
280 - //订单的HOD截止时间。  
281 - LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));  
282 - long daysBetween = ChronoUnit.DAYS.between(parse2, parse1);  
283 - if (daysBetween == 10) {  
284 - for (List email : emails) {  
285 - emailSendUtils.sendEmail(eventEnum, email, orderProductEmailVO);  
286 - }  
287 - }  
288 -  
289 - } else if (eventEnum.getTitle().equals(EmailTemplateEnum.END_CHECK_DATE_TEMPLATE.getTitle())) {  
290 - String orderHodTime = orderProductEmailVO.getBaseInfo().getOrderHodTime();  
291 - LocalDate parse1 = LocalDate.parse(str, DateTimeFormatter.ofPattern("yyyy-M-d"));  
292 - //订单的HOD截止时间。  
293 - LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));  
294 - long daysBetween = ChronoUnit.DAYS.between(parse2, parse1);  
295 - if (daysBetween == 2) {  
296 - for (List email : emails) {  
297 - emailSendUtils.sendEmail(eventEnum, email, orderProductEmailVO);  
298 - }  
299 - }  
300 - }  
301 - }  
302 - }  
303 -  
304 - /*发送中期验货报告和尾期验货报告,疑问,是什么时候发送,质检信息中有中期验货字段,是否是填写了中期验货字段就发送还是说填写了跟单信息发送*/  
305 - public void send() {  
306 -  
307 - }  
308 -  
309 - /*发送生产指示书*/  
310 - public void sende(File file) {  
311 -  
312 - }  
313 -  
314 - /*返回邮箱  
315 - * 解释:根据订单的客户编码和事件类型,得到这个客户编码配置好的邮箱配置,返回邮箱*/  
316 - public List<List<String>> getEmails(EmailTemplateEnum eventEnum, OrderProductEmailVO orderProductEmailVO) {  
317 - String customerCode = orderProductEmailVO.getBaseInfo().getCustomerCode();  
318 - List<ReceiveEmailMappingDO> receiveEmailMappingDOList = receiveEmailMappingService.list(new LambdaQueryWrapper<ReceiveEmailMappingDO>()  
319 - .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)  
320 - .eq(ReceiveEmailMappingDO::getTypeValue, customerCode));  
321 - Set<List<String>> emailList = receiveEmailMappingDOList.stream().map(x -> {  
322 - ReceiveEmailConfigItemVO receiveEmailConfigItemVO = JSON.parseObject(x.getConfigInfos(), ReceiveEmailConfigItemVO.class);  
323 - if (eventEnum.getTemplateId() == OrderEventEnum.getEvent(receiveEmailConfigItemVO.getEvent()).getTemplateId()) {  
324 - List<String> emailsList = receiveEmailConfigItemVO.getEmails();  
325 - return emailsList;  
326 - }  
327 - return null;  
328 - }).collect(Collectors.toSet());  
329 - return new ArrayList<>(emailList);  
330 - }  
331 -  
332 -  
333 - /* public void a(String str, OrderProductEmailVO orderProductEmailVO) {  
334 - //包含ok。  
335 - String[] parats = str.split("\\+");  
336 - //获取ok前的时间。  
337 - String time = parats[str.length() - 3];  
338 - LocalDate parse1 = LocalDate.parse(time, DateTimeFormatter.ofPattern("yyyy-M-d"));  
339 - //得到订单的截止时间。  
340 - String orderHodTime = orderProductEmailVO.getBaseInfo().getOrderHodTime();  
341 - LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));  
342 - //计算两个时间之间的天数间隔。parse2-parse1  
343 - long daysBetween = ChronoUnit.DAYS.between(parse2, parse1);  
344 - if (daysBetween == 21) {  
345 - //直接发邮件。  
346 - for (List email : emails) {  
347 - emailSendUtils.sendEmail(eventEnum, email, orderProductEmailVO);  
348 - }  
349 - }  
350 - }*/  
351 -  
352 - @Scheduled(cron = "0 0 2 * * ?")  
353 - public void checkOverTimeExecuteV2() {  
354 - List<OrderEventJobVO> jobVOList = transfer2OrderEventList(null, null, null);  
355 - 76 + @Scheduled(cron = "0 0 2 * * ?")
  77 + public void checkOverTimeExecuteV2() throws MessagingException, TemplateException, IOException {
  78 + List<OrderBaseInfoDO> orderBaseInfoDOList = orderBaseInfoService.getEventList();
  79 + Set<Long> orderIds = orderBaseInfoDOList.stream().map(OrderBaseInfoDO::getId).collect(Collectors.toSet());
  80 + List<OrderInspectionStageDO> orderInspectionStageDOList = inspectionStageService.list(new LambdaQueryWrapper<OrderInspectionStageDO>()
  81 + .in(OrderInspectionStageDO::getOrderId, orderIds));
  82 + List<OrderTrackStageDO> orderTrackStageDOList = trackStageService.list(new LambdaQueryWrapper<OrderTrackStageDO>()
  83 + .in(OrderTrackStageDO::getOrderId, orderIds));
  84 + List<OrderEventJobVO> jobVOList = transfer2OrderEventList(orderBaseInfoDOList, orderInspectionStageDOList, orderTrackStageDOList);
356 Map<String, List<OrderEventJobVO>> map = handlerOrderEvent(jobVOList); 85 Map<String, List<OrderEventJobVO>> map = handlerOrderEvent(jobVOList);
357 -  
358 for (Map.Entry<String, List<OrderEventJobVO>> entry : map.entrySet()) { 86 for (Map.Entry<String, List<OrderEventJobVO>> entry : map.entrySet()) {
359 -  
360 sendEmail4OrderEvent(OrderEventEnum.getEvent(entry.getKey()), entry.getValue()); 87 sendEmail4OrderEvent(OrderEventEnum.getEvent(entry.getKey()), entry.getValue());
361 } 88 }
362 } 89 }
@@ -365,20 +92,90 @@ public class OrderOverTimeEventJob { @@ -365,20 +92,90 @@ public class OrderOverTimeEventJob {
365 * @param eventEnum 92 * @param eventEnum
366 * @param eventJobVOS 93 * @param eventJobVOS
367 */ 94 */
368 - private void sendEmail4OrderEvent(OrderEventEnum eventEnum, List<OrderEventJobVO> eventJobVOS) {  
369 - // todo 95 + //发送邮件。
  96 + private void sendEmail4OrderEvent(OrderEventEnum eventEnum, List<OrderEventJobVO> eventJobVOS) throws MessagingException, TemplateException, IOException {
  97 + HashSet<String> strings = new HashSet<>();
  98 + for (OrderEventJobVO orderEventJob : eventJobVOS) {
  99 + if (!redisUtils.hasKey(EmailTemplateEnum.byTemplate(
  100 + eventEnum.getTemplateId()) + Constant.POINT_BAR_CHARACTER + orderEventJob.getBaseInfo().getId())){
  101 + strings.add(orderEventJob.getBaseInfo().getCustomerCode());
  102 + }
  103 + }
  104 + LambdaQueryWrapper<ReceiveEmailMappingDO> queryWrapper = new LambdaQueryWrapper<>();
  105 + queryWrapper.eq(ReceiveEmailMappingDO::getEnableFlag, Constant.ENABLE_TEN);
  106 + if (strings == null || strings.isEmpty()) {
  107 + queryWrapper.eq(ReceiveEmailMappingDO::getTypeValue, " ");
  108 + } else {
  109 + queryWrapper.in(ReceiveEmailMappingDO::getTypeValue, strings);
  110 + }
  111 + queryWrapper.apply("JSON_CONTAINS(JSON_EXTRACT(config_infos, '$[*].event'), JSON_QUOTE({0}), '$')", eventEnum.getEvent());
  112 + List<ReceiveEmailMappingDO> receiveEmailMappingDOList = receiveEmailMappingService.list(queryWrapper);
  113 +
  114 + /* List<ReceiveEmailMappingDO> receiveEmailMappingDOList = receiveEmailMappingService.list(
  115 + new LambdaQueryWrapper<ReceiveEmailMappingDO>()
  116 + .eq(ReceiveEmailMappingDO::getEnableFlag, Constant.ENABLE_TEN)
  117 + .in(CollectionUtils.isNotEmpty(strings),ReceiveEmailMappingDO::getTypeValue, strings)
  118 + .apply("JSON_CONTAINS(JSON_EXTRACT(config_infos, '$[*].event'), JSON_QUOTE({0}), '$')", eventEnum.getEvent()));*/
  119 +
  120 + Set<Map<String, List<String>>> set = receiveEmailMappingDOList.stream().map(x -> {
  121 + Map<String, List<String>> map = new HashMap<>();
  122 + String customerCode = x.getTypeValue();
  123 +// ReceiveEmailConfigItemVO receiveEmailConfigItemVO = JSON.parseObject(x.getConfigInfos(), ReceiveEmailConfigItemVO.class);
  124 + List<ReceiveEmailConfigItemVO> receiveEmailConfigItemVOList = JSON.parseObject(
  125 + x.getConfigInfos(), new TypeReference<List<ReceiveEmailConfigItemVO>>() {
  126 + });
  127 + List<String> strings1 = new ArrayList<>();
  128 + for (ReceiveEmailConfigItemVO item : receiveEmailConfigItemVOList) {
  129 + strings1 = item.getEmails();
  130 + }
  131 + List<String> emails = strings1;
  132 + map.put(customerCode, emails);
  133 + return map;
  134 + }).collect(Collectors.toSet());
  135 + for (OrderEventJobVO orderEventJob : eventJobVOS) {
  136 + for (Map<String, List<String>> map : set) {
  137 + if (orderEventJob.getBaseInfo().getCustomerCode().equals(map.keySet().iterator().next())) {
  138 + emailSendUtils.sendEmail(EmailTemplateEnum.byTemplate(eventEnum.getTemplateId()),
  139 + map.get(map.keySet().iterator().next()), orderEventJob);
  140 + redisUtils.set(EmailTemplateEnum.byTemplate(
  141 + eventEnum.getTemplateId()) + Constant.POINT_BAR_CHARACTER + orderEventJob.getBaseInfo().getId(),
  142 + orderEventJob);
  143 + }
  144 + }
  145 +
  146 + }
370 } 147 }
371 148
372 /** 149 /**
373 - * @param orderBaseInfoList  
374 - * @param orderInspectionStageList  
375 - * @param orderTrackStageList  
376 - * @return 150 + * @param orderBaseInfoList 订单基础信息集合。
  151 + * @param orderInspectionStageList 订单质检信息集合。 (需要尾期验货申请时间,判断尾期验货日期到期时间)/(还需要尾期验货报告和中期验货报告)
  152 + * @param orderTrackStageList 订单跟单信息集合。 (需要各个属性,判断其他各种事件)
  153 + * @return 0rderEventJobVO 订单数据整合集合
377 */ 154 */
  155 + //这个方法的作用应该是筛选出订单数据。
378 private List<OrderEventJobVO> transfer2OrderEventList(List<OrderBaseInfoDO> orderBaseInfoList, List<OrderInspectionStageDO> orderInspectionStageList, List<OrderTrackStageDO> orderTrackStageList) { 156 private List<OrderEventJobVO> transfer2OrderEventList(List<OrderBaseInfoDO> orderBaseInfoList, List<OrderInspectionStageDO> orderInspectionStageList, List<OrderTrackStageDO> orderTrackStageList) {
379 -  
380 // todo 157 // todo
381 - return null; 158 + Map<Long, OrderInspectionStageDO> OrderInspectionStageMap = orderInspectionStageList.stream().collect(Collectors.toMap(OrderInspectionStageDO::getOrderId, Function.identity(), (x, y) -> x));
  159 + Map<Long, OrderTrackStageDO> OrderTrackStageMap = orderTrackStageList.stream().collect(Collectors.toMap(OrderTrackStageDO::getOrderId, Function.identity(), (x, y) -> x));
  160 + List<OrderEventJobVO> orderEventJobVOList = orderBaseInfoList.stream().map(x -> {
  161 + OrderEventJobVO orderEventJobVO = new OrderEventJobVO();
  162 + if (x.getId() == OrderInspectionStageMap.get(x.getId()).getOrderId() &&
  163 + x.getId() == OrderTrackStageMap.get(x.getId()).getOrderId()) {
  164 + OrderBaseInfoVO orderBaseInfoVO = new OrderBaseInfoVO();
  165 + OrderTrackStageVO orderTrackStageVO = new OrderTrackStageVO();
  166 + OrderInspectionStageVO orderInspectionStageVO = new OrderInspectionStageVO();
  167 + BeanUtil.copyProperties(x, orderBaseInfoVO);
  168 + BeanUtil.copyProperties(OrderInspectionStageMap.get(x.getId()), orderInspectionStageVO);
  169 + BeanUtil.copyProperties(OrderTrackStageMap.get(x.getId()), orderTrackStageVO);
  170 + orderEventJobVO.setOrderId(orderBaseInfoVO.getId());
  171 + orderEventJobVO.setInspectionStageInfo(orderInspectionStageVO);
  172 + orderEventJobVO.setBaseInfo(orderBaseInfoVO);
  173 + orderEventJobVO.setTrackStageInfo(orderTrackStageVO);
  174 + }
  175 + return orderEventJobVO;
  176 + }).filter(Objects::nonNull)
  177 + .collect(Collectors.toList());
  178 + return orderEventJobVOList;
382 } 179 }
383 180
384 /** 181 /**
@@ -416,7 +213,25 @@ public class OrderOverTimeEventJob { @@ -416,7 +213,25 @@ public class OrderOverTimeEventJob {
416 if (filterConfirmSampleOrderEvent(eventJobVO)) { 213 if (filterConfirmSampleOrderEvent(eventJobVO)) {
417 map.put(OrderEventEnum.CONFIRM_SAMPLE_EVENT.getEvent(), eventJobVO); 214 map.put(OrderEventEnum.CONFIRM_SAMPLE_EVENT.getEvent(), eventJobVO);
418 } 215 }
419 - // todo 其他订单超期事件判断 216 + if (filterOtherSampleEvent(eventJobVO)) {
  217 + map.put(OrderEventEnum.OTHER_SAMPLE_EVENT.getEvent(), eventJobVO);
  218 + }
  219 + if (filterBigSampleEvent(eventJobVO)) {
  220 + map.put(OrderEventEnum.BIG_SAMPLE_EVENT.getEvent(), eventJobVO);
  221 + }
  222 + if (filterAITEXSGSTestEvent(eventJobVO)) {
  223 + map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO);
  224 + }
  225 + if (filterBarcodeArrivalEvent(eventJobVO)) {
  226 + map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO);
  227 + }
  228 + if (filterLatestDCEvent(eventJobVO)) {
  229 + map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO);
  230 + }
  231 + if (filterEndCheckDateEvent(eventJobVO)) {
  232 + map.put(OrderEventEnum.END_CHECK_DATE_EVENT.getEvent(), eventJobVO);
  233 + }
  234 + // todo 其他订单超期事件判断 中期验货报告和尾期验货报告。
420 return map; 235 return map;
421 } 236 }
422 237
@@ -427,8 +242,124 @@ public class OrderOverTimeEventJob { @@ -427,8 +242,124 @@ public class OrderOverTimeEventJob {
427 private Boolean filterConfirmSampleOrderEvent(OrderEventJobVO eventJobVO) { 242 private Boolean filterConfirmSampleOrderEvent(OrderEventJobVO eventJobVO) {
428 243
429 // todo 判断是否未能在规定的期限内完成以下货号的确认样确认 244 // todo 判断是否未能在规定的期限内完成以下货号的确认样确认
  245 + String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
  246 + String ppConfirmResult = eventJobVO.getTrackStageInfo().getPpConfirmResult();
  247 + if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(ppConfirmResult)) {
  248 + if (!ppConfirmResult.contains("ok") && org.apache.commons.lang3.StringUtils.countMatches(ppConfirmResult, "fail") == 3) {
  249 + return true;
  250 + } else if (ppConfirmResult.contains("ok") || org.apache.commons.lang3.StringUtils.countMatches(ppConfirmResult, "fail") < 3) {
  251 + String[] parats = ppConfirmResult.split("\\+");
  252 + String lastTime = parats[parats.length - 3];
  253 + LocalDate parse1 = LocalDate.parse(lastTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  254 + LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  255 + long daysBetween = ChronoUnit.DAYS.between(parse1, parse2);
  256 + if (daysBetween == 21) {
  257 + return true;
  258 + }
  259 + }
  260 + }
  261 + return false;
  262 + }
  263 +
  264 + private Boolean filterOtherSampleEvent(OrderEventJobVO eventJobVO) {
  265 + String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
  266 + String esoSampleSendTime = eventJobVO.getTrackStageInfo().getEsoSampleSendTime();
  267 + if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(esoSampleSendTime)) {
  268 + LocalDate parse1 = LocalDate.parse(esoSampleSendTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  269 + LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  270 + if (ChronoUnit.DAYS.between(parse1, parse2) == 7) {
  271 + return true;
  272 + }
  273 + }
  274 + return false;
  275 + }
  276 +
  277 + private Boolean filterBigSampleEvent(OrderEventJobVO eventJobVO) {
  278 + String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
  279 + String shippmentSampleConfirmResult = eventJobVO.getTrackStageInfo().getShippmentSampleConfirmResult();
  280 + if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(shippmentSampleConfirmResult)) {
  281 + if (!shippmentSampleConfirmResult.contains("ok") && org.apache.commons.lang3.StringUtils.countMatches(shippmentSampleConfirmResult, "fail") == 3) {
  282 + return true;
  283 + } else if (shippmentSampleConfirmResult.contains("ok") || org.apache.commons.lang3.StringUtils.countMatches(shippmentSampleConfirmResult, "fail") < 3) {
  284 + String[] parats = shippmentSampleConfirmResult.split("\\+");
  285 + String lastTime = parats[parats.length - 3];
  286 + LocalDate parse1 = LocalDate.parse(lastTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  287 + LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  288 + long daysBetween = ChronoUnit.DAYS.between(parse1, parse2);
  289 + if (daysBetween == 7) {
  290 + return true;
  291 + }
  292 + }
  293 + }
  294 + return false;
  295 + }
  296 +
  297 +
  298 + private Boolean filterAITEXSGSTestEvent(OrderEventJobVO eventJobVO) {
  299 + String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
  300 + String shippmentSampleConfirmResult = eventJobVO.getTrackStageInfo().getAitexTestFinishResult();
  301 + String sgsTestFinishResult = eventJobVO.getTrackStageInfo().getSgsTestFinishResult();
  302 + if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(shippmentSampleConfirmResult) ||
  303 + StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(sgsTestFinishResult)) {
  304 + if (!shippmentSampleConfirmResult.contains("ok") && org.apache.commons.lang3.StringUtils.countMatches(shippmentSampleConfirmResult, "fail") == 3 ||
  305 + !shippmentSampleConfirmResult.contains("ok") && org.apache.commons.lang3.StringUtils.countMatches(sgsTestFinishResult, "fail") == 3) {
  306 + return true;
  307 + } else if ((shippmentSampleConfirmResult.contains("ok") || org.apache.commons.lang3.StringUtils.countMatches(shippmentSampleConfirmResult, "fail") < 3) ||
  308 + (sgsTestFinishResult.contains("ok") || org.apache.commons.lang3.StringUtils.countMatches(sgsTestFinishResult, "fail") < 3)) {
  309 + String[] parats = shippmentSampleConfirmResult.split("\\+");
  310 + String lastTime = parats[parats.length - 3];
  311 + String[] parats1 = sgsTestFinishResult.split("\\+");
  312 + String lastTime1 = parats1[parats1.length - 3];
  313 + LocalDate parse1 = LocalDate.parse(lastTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  314 + LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  315 + LocalDate parse3 = LocalDate.parse(lastTime1, DateTimeFormatter.ofPattern("yyyy-M-d"));
  316 + long daysBetween = ChronoUnit.DAYS.between(parse1, parse2);
  317 + long daysBetween1 = ChronoUnit.DAYS.between(parse3, parse2);
  318 + if (daysBetween == 3 || daysBetween1 == 3) {
  319 + return true;
  320 + }
  321 + }
  322 + }
  323 + return false;
  324 + }
  325 +
430 326
431 - return true; 327 + private Boolean filterBarcodeArrivalEvent(OrderEventJobVO eventJobVO) {
  328 + String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
  329 + String lastArrivalTime = eventJobVO.getTrackStageInfo().getLatestArrivalTime();
  330 + if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(lastArrivalTime)) {
  331 + LocalDate parse1 = LocalDate.parse(lastArrivalTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  332 + LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  333 + if (ChronoUnit.DAYS.between(parse1, parse2) == 7) {
  334 + return true;
  335 + }
  336 + }
  337 + return false;
432 } 338 }
433 339
  340 + private Boolean filterLatestDCEvent(OrderEventJobVO eventJobVO) {
  341 + String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
  342 + String latestBkTime = eventJobVO.getTrackStageInfo().getLatestBkTime();
  343 + if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(latestBkTime)) {
  344 + LocalDate parse1 = LocalDate.parse(latestBkTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  345 + LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  346 + if (ChronoUnit.DAYS.between(parse1, parse2) == 10) {
  347 + return true;
  348 + }
  349 + }
  350 + return false;
  351 + }
  352 +
  353 + private Boolean filterEndCheckDateEvent(OrderEventJobVO eventJobVO) {
  354 + String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
  355 + String endCheckApplyTime = eventJobVO.getInspectionStageInfo().getEndCheckApplyTime();
  356 + if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(endCheckApplyTime)) {
  357 + LocalDate parse1 = LocalDate.parse(endCheckApplyTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  358 + LocalDate parse2 = LocalDate.parse(orderHodTime, DateTimeFormatter.ofPattern("yyyy-M-d"));
  359 + if (ChronoUnit.DAYS.between(parse1, parse2) == 2) {
  360 + return true;
  361 + }
  362 + }
  363 + return false;
  364 + }
434 } 365 }
src/main/java/com/order/erp/mapper/order/OrderBaseInfoMapper.java
@@ -31,5 +31,7 @@ public interface OrderBaseInfoMapper extends BaseMapper&lt;OrderBaseInfoDO&gt; { @@ -31,5 +31,7 @@ public interface OrderBaseInfoMapper extends BaseMapper&lt;OrderBaseInfoDO&gt; {
31 31
32 List<QueryProjectNoAndInnerNoDto> queryProjectNoAndInnerNoDto(@Param("flag") Boolean flag, 32 List<QueryProjectNoAndInnerNoDto> queryProjectNoAndInnerNoDto(@Param("flag") Boolean flag,
33 @Param("dto") QueryProjectNoAndInnerNoDto dto); 33 @Param("dto") QueryProjectNoAndInnerNoDto dto);
  34 + @Select("SELECT * FROM order_base_info WHERE order_status!=50 and enable_flag=10 and DATE_SUB(CURDATE(), INTERVAL 3 MONTH) <= date(create_time);")
  35 + List<OrderBaseInfoDO> getEventList();
34 } 36 }
35 37
src/main/java/com/order/erp/service/order/OrderBaseInfoService.java
@@ -111,4 +111,6 @@ public interface OrderBaseInfoService extends IService&lt;OrderBaseInfoDO&gt; { @@ -111,4 +111,6 @@ public interface OrderBaseInfoService extends IService&lt;OrderBaseInfoDO&gt; {
111 long countRecentYear(); 111 long countRecentYear();
112 112
113 ServerResult checkChargeOrderCount(List<Long> orderIds); 113 ServerResult checkChargeOrderCount(List<Long> orderIds);
  114 +
  115 + List<OrderBaseInfoDO> getEventList();
114 } 116 }
src/main/java/com/order/erp/service/order/impl/OrderBaseInfoServiceImpl.java
@@ -1970,4 +1970,10 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl&lt;OrderBaseInfoMapper, O @@ -1970,4 +1970,10 @@ public class OrderBaseInfoServiceImpl extends ServiceImpl&lt;OrderBaseInfoMapper, O
1970 } 1970 }
1971 return ServerResult.success(); 1971 return ServerResult.success();
1972 } 1972 }
  1973 +
  1974 + @Override
  1975 + public List<OrderBaseInfoDO> getEventList() {
  1976 + List<OrderBaseInfoDO> orderBaseInfoDOList= baseMapper.getEventList();
  1977 + return orderBaseInfoDOList;
  1978 + }
1973 } 1979 }