Blame view

src/main/java/com/order/erp/job/OrderOverTimeEventJob.java 17.1 KB
谢茂盛 authored
1
package com.order.erp.job;
2
3
import cn.hutool.core.bean.BeanUtil;
4
import com.alibaba.fastjson.*;
谢茂盛 authored
5
6
7
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.order.erp.common.constant.Constant;
8
import com.order.erp.common.utils.*;
9
10
import com.order.erp.domain.EmailTemplateEnum;
import com.order.erp.domain.OrderEventEnum;
谢茂盛 authored
11
12
13
14
import com.order.erp.domain.dto.order.OrderBaseInfoDO;
import com.order.erp.domain.dto.order.OrderInspectionStageDO;
import com.order.erp.domain.dto.order.OrderTrackStageDO;
import com.order.erp.domain.dto.order.ReceiveEmailMappingDO;
15
import com.order.erp.domain.vo.order.*;
谢茂盛 authored
16
import com.order.erp.service.order.*;
17
import freemarker.template.TemplateException;
谢茂盛 authored
18
19
20
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
21
谢茂盛 authored
22
import javax.annotation.Resource;
23
24
25
import javax.mail.MessagingException;
import java.io.IOException;
import java.time.LocalDate;
26
import java.time.LocalDateTime;
27
28
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
谢茂盛 authored
29
import java.util.*;
30
import java.util.concurrent.TimeUnit;
31
import java.util.function.Function;
32
33
import java.util.regex.Matcher;
import java.util.regex.Pattern;
谢茂盛 authored
34
35
import java.util.stream.Collectors;
36
谢茂盛 authored
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
/**
 * @author: xms
 * @description: TODO
 * @date: 2023/6/25 10:35
 * @version: 1.0
 */
@Slf4j
@Component
public class OrderOverTimeEventJob {

    @Resource
    private OrderBaseInfoService orderBaseInfoService;

    @Resource
    private OrderProfitAnalysisService profitAnalysisService;

    @Resource
    private OrderCompletionReportService reportService;

    @Resource
    private OrderTrackStageService trackStageService;

    @Resource
    private OrderInspectionStageService inspectionStageService;

    @Resource
    private TransactionHelper transactionHelper;
65
66
67
68
69
70
    @Resource
    private EmailSendUtils emailSendUtils;

    @Resource
    private ReceiveEmailMappingService receiveEmailMappingService;
71
72
73
    @Resource
    private RedisUtils redisUtils;
谢茂盛 authored
74
75
76
    /**
     * 凌晨1点执行,一天一次
     */
77
78
    @Scheduled(cron = "0 0 1 * * ?")
    //存储的日期都必须为yyyy-MM-dd HH:mm:ss。
79
80
    public void checkOverTimeExecuteV2() throws MessagingException, TemplateException, IOException {
        List<OrderBaseInfoDO> orderBaseInfoDOList = orderBaseInfoService.getEventList();
81
        if (CollectionUtils.isNotEmpty(orderBaseInfoDOList)) {
82
83
84
85
86
87
88
89
90
91
            Set<Long> orderIds = orderBaseInfoDOList.stream().map(OrderBaseInfoDO::getId).collect(Collectors.toSet());
            List<OrderInspectionStageDO> orderInspectionStageDOList = inspectionStageService.list(new LambdaQueryWrapper<OrderInspectionStageDO>()
                    .in(OrderInspectionStageDO::getOrderId, orderIds));
            List<OrderTrackStageDO> orderTrackStageDOList = trackStageService.list(new LambdaQueryWrapper<OrderTrackStageDO>()
                    .in(OrderTrackStageDO::getOrderId, orderIds));
            List<OrderEventJobVO> jobVOList = transfer2OrderEventList(orderBaseInfoDOList, orderInspectionStageDOList, orderTrackStageDOList);
            Map<String, List<OrderEventJobVO>> map = handlerOrderEvent(jobVOList);
            for (Map.Entry<String, List<OrderEventJobVO>> entry : map.entrySet()) {
                sendEmail4OrderEvent(OrderEventEnum.getEvent(entry.getKey()), entry.getValue());
            }
谢茂盛 authored
92
        }
93
谢茂盛 authored
94
95
96
97
98
99
    }

    /**
     * @param eventEnum
     * @param eventJobVOS
     */
100
101
    //发送邮件。
    private void sendEmail4OrderEvent(OrderEventEnum eventEnum, List<OrderEventJobVO> eventJobVOS) throws MessagingException, TemplateException, IOException {
102
103

        HashSet<String> strings = new HashSet<>();
104
        for (OrderEventJobVO orderEventJob : eventJobVOS) {
105
106
107
            if (!redisUtils.hasKey(EmailTemplateEnum.byTemplate(
                    eventEnum.getTemplateId()) + Constant.CROSS_BAR_CHARACTER + orderEventJob.getBaseInfo().getId())) {
                strings.add(orderEventJob.getBaseInfo().getCustomerCode());
108
109
            }
        }
110
111
112
113
114
115
116
117
118
        LambdaQueryWrapper<ReceiveEmailMappingDO> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ReceiveEmailMappingDO::getEnableFlag, Constant.ENABLE_TEN);
        if (strings == null || strings.isEmpty()) {
            queryWrapper.eq(ReceiveEmailMappingDO::getTypeValue, "");
        } else {
            queryWrapper.in(ReceiveEmailMappingDO::getTypeValue, strings);
        }
        queryWrapper.apply("JSON_CONTAINS(JSON_EXTRACT(config_infos,'$[*].event'),JSON_QUOTE({0}),'$')", eventEnum.getEvent());
        List<ReceiveEmailMappingDO> receiveEmailMappingDOList = receiveEmailMappingService.list(queryWrapper);
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140

        Set<Map<String, List<String>>> set = receiveEmailMappingDOList.stream().map(x -> {
            Map<String, List<String>> map = new HashMap<>();
            String customerCode = x.getTypeValue();
//            ReceiveEmailConfigItemVO receiveEmailConfigItemVO = JSON.parseObject(x.getConfigInfos(), ReceiveEmailConfigItemVO.class);
            List<ReceiveEmailConfigItemVO> receiveEmailConfigItemVOList = JSON.parseObject(
                    x.getConfigInfos(), new TypeReference<List<ReceiveEmailConfigItemVO>>() {
                    });
            List<String> strings1 = new ArrayList<>();
            for (ReceiveEmailConfigItemVO item : receiveEmailConfigItemVOList) {
                strings1 = item.getEmails();
            }
            List<String> emails = strings1;
            map.put(customerCode, emails);
            return map;
        }).collect(Collectors.toSet());
        for (OrderEventJobVO orderEventJob : eventJobVOS) {
            for (Map<String, List<String>> map : set) {
                if (orderEventJob.getBaseInfo().getCustomerCode().equals(map.keySet().iterator().next())) {
                    emailSendUtils.sendEmail(EmailTemplateEnum.byTemplate(eventEnum.getTemplateId()),
                            map.get(map.keySet().iterator().next()), orderEventJob);
                    redisUtils.set(EmailTemplateEnum.byTemplate(
141
                                    eventEnum.getTemplateId()) + Constant.CROSS_BAR_CHARACTER + orderEventJob.getBaseInfo().getId(),
142
                            orderEventJob, 90, TimeUnit.DAYS);
143
144
145
                }
            }
        }
谢茂盛 authored
146
147
148
    }

    /**
149
150
151
152
     * @param orderBaseInfoList        订单基础信息集合。
     * @param orderInspectionStageList 订单质检信息集合。  (需要尾期验货申请时间,判断尾期验货日期到期时间)/(还需要尾期验货报告和中期验货报告)
     * @param orderTrackStageList      订单跟单信息集合。   (需要各个属性,判断其他各种事件)
     * @return 0rderEventJobVO 订单数据整合集合
谢茂盛 authored
153
     */
154
    //这个方法的作用应该是筛选出订单数据。
谢茂盛 authored
155
156
    private List<OrderEventJobVO> transfer2OrderEventList(List<OrderBaseInfoDO> orderBaseInfoList, List<OrderInspectionStageDO> orderInspectionStageList, List<OrderTrackStageDO> orderTrackStageList) {
        // todo
157
158
159
160
        Map<Long, OrderInspectionStageDO> OrderInspectionStageMap = orderInspectionStageList.stream().collect(Collectors.toMap(OrderInspectionStageDO::getOrderId, Function.identity(), (x, y) -> x));
        Map<Long, OrderTrackStageDO> OrderTrackStageMap = orderTrackStageList.stream().collect(Collectors.toMap(OrderTrackStageDO::getOrderId, Function.identity(), (x, y) -> x));
        List<OrderEventJobVO> orderEventJobVOList = orderBaseInfoList.stream().map(x -> {
                    OrderEventJobVO orderEventJobVO = new OrderEventJobVO();
161
                    if (OrderInspectionStageMap.containsKey(x.getId()) && OrderTrackStageMap.containsKey(x.getId())) {
162
163
164
165
166
167
168
169
170
171
                        OrderBaseInfoVO orderBaseInfoVO = new OrderBaseInfoVO();
                        OrderTrackStageVO orderTrackStageVO = new OrderTrackStageVO();
                        OrderInspectionStageVO orderInspectionStageVO = new OrderInspectionStageVO();
                        BeanUtil.copyProperties(x, orderBaseInfoVO);
                        BeanUtil.copyProperties(OrderInspectionStageMap.get(x.getId()), orderInspectionStageVO);
                        BeanUtil.copyProperties(OrderTrackStageMap.get(x.getId()), orderTrackStageVO);
                        orderEventJobVO.setOrderId(orderBaseInfoVO.getId());
                        orderEventJobVO.setInspectionStageInfo(orderInspectionStageVO);
                        orderEventJobVO.setBaseInfo(orderBaseInfoVO);
                        orderEventJobVO.setTrackStageInfo(orderTrackStageVO);
172
                        return orderEventJobVO;
173
                    } else {
174
                        return null;
175
176
177
178
                    }
                }).filter(Objects::nonNull)
                .collect(Collectors.toList());
        return orderEventJobVOList;
谢茂盛 authored
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
    }

    /**
     * @param orderEventJobVOList
     * @return
     */
    private Map<String, List<OrderEventJobVO>> handlerOrderEvent(List<OrderEventJobVO> orderEventJobVOList) {
        Map<String, List<OrderEventJobVO>> map = new HashMap<>();
        for (OrderEventJobVO eventJobVO : orderEventJobVOList) {
            Map<String, OrderEventJobVO> eventJobVOMap = groupByOrderEvent(eventJobVO);
            if (CollectionUtils.isNotEmpty(eventJobVOMap)) {
                for (Map.Entry<String, OrderEventJobVO> entry : eventJobVOMap.entrySet()) {
                    String key = entry.getKey();
                    if (map.containsKey(key)) {
                        List<OrderEventJobVO> list = map.get(key);
                        list.add(entry.getValue());
                        map.put(key, list);
                    } else {
                        List<OrderEventJobVO> list = new ArrayList<>();
                        list.add(entry.getValue());
                        map.put(key, list);
                    }
                }
            }
        }
        return map;
    }

    /**
     * @param eventJobVO
     * @return
     */
    private Map<String, OrderEventJobVO> groupByOrderEvent(OrderEventJobVO eventJobVO) {
        Map<String, OrderEventJobVO> map = new HashMap<>();
        if (filterConfirmSampleOrderEvent(eventJobVO)) {
            map.put(OrderEventEnum.CONFIRM_SAMPLE_EVENT.getEvent(), eventJobVO);
        }
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
        if (filterOtherSampleEvent(eventJobVO)) {
            map.put(OrderEventEnum.OTHER_SAMPLE_EVENT.getEvent(), eventJobVO);
        }
        if (filterBigSampleEvent(eventJobVO)) {
            map.put(OrderEventEnum.BIG_SAMPLE_EVENT.getEvent(), eventJobVO);
        }
        if (filterAITEXSGSTestEvent(eventJobVO)) {
            map.put(OrderEventEnum.AITEX_SGS_TEST_EVENT.getEvent(), eventJobVO);
        }
        if (filterBarcodeArrivalEvent(eventJobVO)) {
            map.put(OrderEventEnum.BARCODE_ARRIVAL_EVENT.getEvent(), eventJobVO);
        }
        if (filterLatestDCEvent(eventJobVO)) {
            map.put(OrderEventEnum.LATEST_DC_EVENT.getEvent(), eventJobVO);
        }
        if (filterEndCheckDateEvent(eventJobVO)) {
            map.put(OrderEventEnum.END_CHECK_DATE_EVENT.getEvent(), eventJobVO);
        }
谢茂盛 authored
234
235
236
237
238
239
240
241
        return map;
    }

    /**
     * @param eventJobVO
     * @return
     */
    private Boolean filterConfirmSampleOrderEvent(OrderEventJobVO eventJobVO) {
242
        String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
243
        String ppConfirmTime = eventJobVO.getTrackStageInfo().getPpConfirmTime();
244
        String ppConfirmResult = eventJobVO.getTrackStageInfo().getPpConfirmResult();
245
246
247
        if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(ppConfirmResult) && StringUtils.isNotBlank(ppConfirmTime)) {
            int daysBetween = getDaysBetween(ppConfirmResult, ppConfirmTime, orderHodTime);
            if (daysBetween == Constant.TWENTY_FIRST || daysBetween == Constant.NEGATIVE_ONE) {
248
249
250
251
252
253
254
255
256
257
                return true;
            }
        }
        return false;
    }

    private Boolean filterOtherSampleEvent(OrderEventJobVO eventJobVO) {
        String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
        String esoSampleSendTime = eventJobVO.getTrackStageInfo().getEsoSampleSendTime();
        if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(esoSampleSendTime)) {
258
259
260
            LocalDate orderHodTimelocalDate = DateUtils.parseDate(orderHodTime);
            LocalDate esoSampleSendTimelocalDate = DateUtils.parseDate(esoSampleSendTime);
            if (ChronoUnit.DAYS.between(esoSampleSendTimelocalDate, orderHodTimelocalDate) == Constant.SEVEN) {
261
262
                return true;
            }
263
264
265
266
267
268
269
270
        }
        return false;
    }

    private Boolean filterBigSampleEvent(OrderEventJobVO eventJobVO) {
        String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
        String shippmentSampleConfirmResult = eventJobVO.getTrackStageInfo().getShippmentSampleConfirmResult();
271
272
273
274
        String shippmentSampleConfirmTime = eventJobVO.getTrackStageInfo().getShippmentSampleSendTime();
        if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(shippmentSampleConfirmResult) && StringUtils.isNotBlank(shippmentSampleConfirmTime)) {
            int daysBetween = getDaysBetween(shippmentSampleConfirmResult, shippmentSampleConfirmTime, orderHodTime);
            if (daysBetween == Constant.SEVEN || daysBetween == Constant.NEGATIVE_ONE) {
275
276
277
278
279
280
281
282
283
                return true;
            }
        }
        return false;
    }


    private Boolean filterAITEXSGSTestEvent(OrderEventJobVO eventJobVO) {
        String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
284
        String aitexTestFinishResult = eventJobVO.getTrackStageInfo().getAitexTestFinishResult();
285
        String sgsTestFinishResult = eventJobVO.getTrackStageInfo().getSgsTestFinishResult();
286
287
288
289
290
291
292
        String sgsTestFinishTime = eventJobVO.getTrackStageInfo().getSgsTestFinishTime();
        String aitexTestFinishTime = eventJobVO.getTrackStageInfo().getAitexTestFinishTime();
        if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(aitexTestFinishResult) && StringUtils.isNotBlank(aitexTestFinishTime) ||
                StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(sgsTestFinishResult) && StringUtils.isNotBlank(sgsTestFinishTime)) {
            int aitextestDaysBetween = getDaysBetween(aitexTestFinishResult, aitexTestFinishTime, orderHodTime);
            int sgstestDaysBetween = getDaysBetween(sgsTestFinishResult, sgsTestFinishTime, orderHodTime);
            if (aitextestDaysBetween == Constant.THREE || sgstestDaysBetween == Constant.LOCK_ERROR_TIMES || aitextestDaysBetween == Constant.NEGATIVE_ONE || sgstestDaysBetween == Constant.NEGATIVE_ONE) {
293
294
295
296
                return true;
            }
        }
        return false;
297
298
299
    }
谢茂盛 authored
300
301
302
303
304
    private Boolean filterBarcodeArrivalEvent(OrderEventJobVO eventJobVO) {
        String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
        String lastArrivalTime = eventJobVO.getTrackStageInfo().getLatestArrivalTime();
        if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(lastArrivalTime)) {
305
306
307
            LocalDate orderHodTimelocalDate = DateUtils.parseDate(orderHodTime);
            LocalDate lastArrivalTimelocalDate = DateUtils.parseDate(lastArrivalTime);
            if (ChronoUnit.DAYS.between(lastArrivalTimelocalDate, orderHodTimelocalDate) == Constant.SEVEN) {
308
309
310
311
                return true;
            }
        }
        return false;
谢茂盛 authored
312
313
    }
314
315
316
317
    private Boolean filterLatestDCEvent(OrderEventJobVO eventJobVO) {
        String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
        String latestBkTime = eventJobVO.getTrackStageInfo().getLatestBkTime();
        if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(latestBkTime)) {
318
319
320
            LocalDate latestBkTimelocalDate = DateUtils.parseDate(latestBkTime);
            LocalDate orderHodTimelocalDate = DateUtils.parseDate(orderHodTime);
            if (ChronoUnit.DAYS.between(latestBkTimelocalDate, orderHodTimelocalDate) == Constant.ENABLE_TEN) {
321
322
323
324
                return true;
            }
        }
        return false;
325
326
327
328
329
330
331
    }

    private Boolean filterEndCheckDateEvent(OrderEventJobVO eventJobVO) {
        String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
        String endCheckApplyTime = eventJobVO.getInspectionStageInfo().getEndCheckApplyTime();
        if (StringUtils.isNotBlank(orderHodTime) && StringUtils.isNotBlank(endCheckApplyTime)) {
332
333
334
            LocalDate endCheckApplyTimelocalDate = DateUtils.parseDate(endCheckApplyTime);
            LocalDate orderHodTimelocalDate = DateUtils.parseDate(orderHodTime);
            if (ChronoUnit.DAYS.between(endCheckApplyTimelocalDate, orderHodTimelocalDate) == Constant.TWO) {
335
336
337
338
339
                return true;
            }
        }
        return false;
    }
340
341
342
343
344
345
346
347
348

    public int getDaysBetween(String resultStatus, String startDateStr, String orderHodTime) {
        if (!resultStatus.contains("ok") && resultStatus.startsWith("3")) {
            return Constant.NEGATIVE_ONE;
        } else if (!resultStatus.contains("ok") && (resultStatus.startsWith("2") || resultStatus.startsWith("1"))) {
            LocalDate ppConfirmTimeDate = DateUtils.parseDate(startDateStr);
            LocalDate orderHodTimeDate = DateUtils.parseDate(orderHodTime);
            return (int) ChronoUnit.DAYS.between(ppConfirmTimeDate, orderHodTimeDate);
349
        }
350
        return Constant.ZERO;
351
    }
谢茂盛 authored
352
}