Blame view

src/main/java/com/order/erp/job/OrderOverTimeEventJob.java 17.1 KB
谢茂盛 authored
1
package com.order.erp.job;
chenhang4442024 authored
2
chenhang4442024 authored
3
import cn.hutool.core.bean.BeanUtil;
chenhang4442024 authored
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;
chenhang4442024 authored
8
import com.order.erp.common.utils.*;
chenhang4442024 authored
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;
chenhang4442024 authored
15
import com.order.erp.domain.vo.order.*;
谢茂盛 authored
16
import com.order.erp.service.order.*;
chenhang4442024 authored
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;
chenhang4442024 authored
21
谢茂盛 authored
22
import javax.annotation.Resource;
chenhang4442024 authored
23
24
25
import javax.mail.MessagingException;
import java.io.IOException;
import java.time.LocalDate;
chenhang4442024 authored
26
import java.time.LocalDateTime;
chenhang4442024 authored
27
28
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
谢茂盛 authored
29
import java.util.*;
chenhang4442024 authored
30
import java.util.concurrent.TimeUnit;
chenhang4442024 authored
31
import java.util.function.Function;
chenhang4442024 authored
32
33
import java.util.regex.Matcher;
import java.util.regex.Pattern;
谢茂盛 authored
34
35
import java.util.stream.Collectors;
chenhang4442024 authored
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;
chenhang4442024 authored
65
66
67
68
69
70
    @Resource
    private EmailSendUtils emailSendUtils;

    @Resource
    private ReceiveEmailMappingService receiveEmailMappingService;
chenhang4442024 authored
71
72
73
    @Resource
    private RedisUtils redisUtils;
谢茂盛 authored
74
75
76
    /**
     * 凌晨1点执行,一天一次
     */
chenhang4442024 authored
77
78
    @Scheduled(cron = "0 0 1 * * ?")
    //存储的日期都必须为yyyy-MM-dd HH:mm:ss。
chenhang4442024 authored
79
80
    public void checkOverTimeExecuteV2() throws MessagingException, TemplateException, IOException {
        List<OrderBaseInfoDO> orderBaseInfoDOList = orderBaseInfoService.getEventList();
chenhang4442024 authored
81
        if (CollectionUtils.isNotEmpty(orderBaseInfoDOList)) {
chenhang4442024 authored
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
        }
chenhang4442024 authored
93
谢茂盛 authored
94
95
96
97
98
99
    }

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

        HashSet<String> strings = new HashSet<>();
chenhang4442024 authored
104
        for (OrderEventJobVO orderEventJob : eventJobVOS) {
chenhang4442024 authored
105
106
107
            if (!redisUtils.hasKey(EmailTemplateEnum.byTemplate(
                    eventEnum.getTemplateId()) + Constant.CROSS_BAR_CHARACTER + orderEventJob.getBaseInfo().getId())) {
                strings.add(orderEventJob.getBaseInfo().getCustomerCode());
chenhang4442024 authored
108
109
            }
        }
chenhang4442024 authored
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);
chenhang4442024 authored
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(
chenhang4442024 authored
141
                                    eventEnum.getTemplateId()) + Constant.CROSS_BAR_CHARACTER + orderEventJob.getBaseInfo().getId(),
chenhang4442024 authored
142
                            orderEventJob, 90, TimeUnit.DAYS);
chenhang4442024 authored
143
144
145
                }
            }
        }
谢茂盛 authored
146
147
148
    }

    /**
chenhang4442024 authored
149
150
151
152
     * @param orderBaseInfoList        订单基础信息集合。
     * @param orderInspectionStageList 订单质检信息集合。  (需要尾期验货申请时间,判断尾期验货日期到期时间)/(还需要尾期验货报告和中期验货报告)
     * @param orderTrackStageList      订单跟单信息集合。   (需要各个属性,判断其他各种事件)
     * @return 0rderEventJobVO 订单数据整合集合
谢茂盛 authored
153
     */
chenhang4442024 authored
154
    //这个方法的作用应该是筛选出订单数据。
谢茂盛 authored
155
156
    private List<OrderEventJobVO> transfer2OrderEventList(List<OrderBaseInfoDO> orderBaseInfoList, List<OrderInspectionStageDO> orderInspectionStageList, List<OrderTrackStageDO> orderTrackStageList) {
        // todo
chenhang4442024 authored
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();
chenhang4442024 authored
161
                    if (OrderInspectionStageMap.containsKey(x.getId()) && OrderTrackStageMap.containsKey(x.getId())) {
chenhang4442024 authored
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);
chenhang4442024 authored
172
                        return orderEventJobVO;
chenhang4442024 authored
173
                    } else {
chenhang4442024 authored
174
                        return null;
chenhang4442024 authored
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);
        }
chenhang4442024 authored
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) {
chenhang4442024 authored
242
        String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
chenhang4442024 authored
243
        String ppConfirmTime = eventJobVO.getTrackStageInfo().getPpConfirmTime();
chenhang4442024 authored
244
        String ppConfirmResult = eventJobVO.getTrackStageInfo().getPpConfirmResult();
chenhang4442024 authored
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) {
chenhang4442024 authored
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)) {
chenhang4442024 authored
258
259
260
            LocalDate orderHodTimelocalDate = DateUtils.parseDate(orderHodTime);
            LocalDate esoSampleSendTimelocalDate = DateUtils.parseDate(esoSampleSendTime);
            if (ChronoUnit.DAYS.between(esoSampleSendTimelocalDate, orderHodTimelocalDate) == Constant.SEVEN) {
chenhang4442024 authored
261
262
                return true;
            }
chenhang4442024 authored
263
chenhang4442024 authored
264
265
266
267
268
269
270
        }
        return false;
    }

    private Boolean filterBigSampleEvent(OrderEventJobVO eventJobVO) {
        String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
        String shippmentSampleConfirmResult = eventJobVO.getTrackStageInfo().getShippmentSampleConfirmResult();
chenhang4442024 authored
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) {
chenhang4442024 authored
275
276
277
278
279
280
281
282
283
                return true;
            }
        }
        return false;
    }


    private Boolean filterAITEXSGSTestEvent(OrderEventJobVO eventJobVO) {
        String orderHodTime = eventJobVO.getBaseInfo().getOrderHodTime();
chenhang4442024 authored
284
        String aitexTestFinishResult = eventJobVO.getTrackStageInfo().getAitexTestFinishResult();
chenhang4442024 authored
285
        String sgsTestFinishResult = eventJobVO.getTrackStageInfo().getSgsTestFinishResult();
chenhang4442024 authored
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) {
chenhang4442024 authored
293
294
295
296
                return true;
            }
        }
        return false;
chenhang4442024 authored
297
chenhang4442024 authored
298
299
    }
谢茂盛 authored
300
chenhang4442024 authored
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)) {
chenhang4442024 authored
305
306
307
            LocalDate orderHodTimelocalDate = DateUtils.parseDate(orderHodTime);
            LocalDate lastArrivalTimelocalDate = DateUtils.parseDate(lastArrivalTime);
            if (ChronoUnit.DAYS.between(lastArrivalTimelocalDate, orderHodTimelocalDate) == Constant.SEVEN) {
chenhang4442024 authored
308
309
310
311
                return true;
            }
        }
        return false;
谢茂盛 authored
312
313
    }
chenhang4442024 authored
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)) {
chenhang4442024 authored
318
319
320
            LocalDate latestBkTimelocalDate = DateUtils.parseDate(latestBkTime);
            LocalDate orderHodTimelocalDate = DateUtils.parseDate(orderHodTime);
            if (ChronoUnit.DAYS.between(latestBkTimelocalDate, orderHodTimelocalDate) == Constant.ENABLE_TEN) {
chenhang4442024 authored
321
322
323
324
                return true;
            }
        }
        return false;
chenhang4442024 authored
325
chenhang4442024 authored
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)) {
chenhang4442024 authored
332
333
334
            LocalDate endCheckApplyTimelocalDate = DateUtils.parseDate(endCheckApplyTime);
            LocalDate orderHodTimelocalDate = DateUtils.parseDate(orderHodTime);
            if (ChronoUnit.DAYS.between(endCheckApplyTimelocalDate, orderHodTimelocalDate) == Constant.TWO) {
chenhang4442024 authored
335
336
337
338
339
                return true;
            }
        }
        return false;
    }
chenhang4442024 authored
340
chenhang4442024 authored
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);
chenhang4442024 authored
349
        }
chenhang4442024 authored
350
        return Constant.ZERO;
chenhang4442024 authored
351
    }
谢茂盛 authored
352
}