谢茂盛
authored
about a year ago
1
package com . order . erp . job ;
2
3
import cn.hutool.core.bean.BeanUtil ;
4
import com.alibaba.fastjson.* ;
谢茂盛
authored
about a year ago
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 ;
11
12
import com.order.erp.domain.dto.BaseDO ;
import com.order.erp.domain.dto.admin.AdminUserDO ;
谢茂盛
authored
12 months ago
13
14
15
16
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 ;
17
import com.order.erp.domain.vo.order.* ;
18
import com.order.erp.service.admin.AdminUserService ;
谢茂盛
authored
about a year ago
19
20
21
22
23
import com.order.erp.service.order.* ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.scheduling.annotation.Scheduled ;
import org.springframework.stereotype.Component ;
import javax.annotation.Resource ;
24
25
import java.time.LocalDate ;
import java.time.temporal.ChronoUnit ;
谢茂盛
authored
12 months ago
26
import java.util.* ;
27
import java.util.concurrent.TimeUnit ;
28
import java.util.function.Function ;
谢茂盛
authored
about a year ago
29
30
import java.util.stream.Collectors ;
31
谢茂盛
authored
about a year ago
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* @author : xms
* @description : TODO
* @date : 2023 / 6 / 25 10 : 35
* @version : 1.0
*/
@Slf4j
@Component
public class OrderOverTimeEventJob {
@Resource
private OrderBaseInfoService orderBaseInfoService ;
@Resource
private OrderTrackStageService trackStageService ;
@Resource
private OrderInspectionStageService inspectionStageService ;
@Resource
51
52
53
54
55
private EmailSendUtils emailSendUtils ;
@Resource
private ReceiveEmailMappingService receiveEmailMappingService ;
56
57
58
@Resource
private RedisUtils redisUtils ;
59
60
61
@Resource
private AdminUserService adminUserService ;
谢茂盛
authored
about a year ago
62
63
64
/**
* 凌晨 1 点执行,一天一次
*/
65
66
@Scheduled ( cron = "0 0 1 * * ?" )
//存储的日期都必须为yyyy-MM-dd HH:mm:ss。
67
public void checkOverTimeExecuteV2 ( ) {
68
List < OrderBaseInfoDO > orderBaseInfoDOList = orderBaseInfoService . getEventList ();
69
if ( CollectionUtils . isNotEmpty ( orderBaseInfoDOList )) {
70
71
72
73
74
75
76
77
78
79
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
12 months ago
80
}
81
谢茂盛
authored
12 months ago
82
83
84
85
86
87
}
/**
* @param eventEnum
* @param eventJobVOS
*/
88
//发送邮件。
89
private void sendEmail4OrderEvent ( OrderEventEnum eventEnum , List < OrderEventJobVO > eventJobVOS ) {
90
91
HashSet < String > customerCodeList = new HashSet <>();
92
for ( OrderEventJobVO orderEventJob : eventJobVOS ) {
93
94
if (! redisUtils . hasKey ( EmailTemplateEnum . byTemplate (
eventEnum . getTemplateId ()) + Constant . CROSS_BAR_CHARACTER + orderEventJob . getBaseInfo (). getId ())) {
95
customerCodeList . add ( orderEventJob . getBaseInfo (). getCustomerCode ());
96
97
}
}
98
99
LambdaQueryWrapper < ReceiveEmailMappingDO > queryWrapper = new LambdaQueryWrapper <>();
queryWrapper . eq ( ReceiveEmailMappingDO: : getEnableFlag , Constant . ENABLE_TEN );
100
if ( CollectionUtils . isEmpty ( customerCodeList )) {
101
102
queryWrapper . eq ( ReceiveEmailMappingDO: : getTypeValue , "" );
} else {
103
queryWrapper . in ( ReceiveEmailMappingDO: : getTypeValue , customerCodeList );
104
}
105
// queryWrapper.apply("JSON_CONTAINS(JSON_EXTRACT(config_infos,'$[*].event'),JSON_QUOTE({0}),'$')", eventEnum.getEvent());
106
107
108
109
List < ReceiveEmailMappingDO > receiveEmailMappingDOList = receiveEmailMappingService . list ( queryWrapper );
List < ReceiveEmailMappingDO > receiveEmailMappingDOS = receiveEmailMappingDOList . stream (). map ( x -> {
List < ReceiveEmailConfigItemVO > receiveEmailConfigItemVOList = JSON . parseObject ( x . getConfigInfos (), new TypeReference < List < ReceiveEmailConfigItemVO >>() {
110
});
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
for ( ReceiveEmailConfigItemVO receiveEmailConfigItemVO : receiveEmailConfigItemVOList ) {
if ( eventEnum . getEvent (). equals ( receiveEmailConfigItemVO . getEvent ())) {
return x ;
}
}
return null ;
}). filter ( Objects: : nonNull )
. collect ( Collectors . toList ());
//如果为尾期验货事件的话,需要从订单中的生产科角色中得到邮箱。而不是从邮件配置中得到邮箱。
if ( OrderEventEnum . END_CHECK_DATE_EVENT . equals ( eventEnum )) {
for ( OrderEventJobVO orderEventJob : eventJobVOS ) {
String productionDepartment = orderEventJob . getBaseInfo (). getProductionDepartment ();
//根据订单的生产科得到生产科用户信息。
AdminUserDO productionDepartmentUser = adminUserService . getOne ( new LambdaQueryWrapper < AdminUserDO >()
. eq ( BaseDO: : getEnableFlag , Constant . ENABLE_TEN )
. eq ( AdminUserDO: : getUserName , productionDepartment ));
List < String > productionEmail = Arrays . asList ( productionDepartmentUser . getEmail (). split ( "[,,]+" ))
128
129
. stream (). map ( String: : trim )
. collect ( Collectors . toList ());
130
131
132
133
134
emailSendUtils . sendEmail ( EmailTemplateEnum . byTemplate ( eventEnum . getTemplateId ()),
productionEmail , orderEventJob );
redisUtils . set ( EmailTemplateEnum . byTemplate (
eventEnum . getTemplateId ()) + Constant . CROSS_BAR_CHARACTER + orderEventJob . getBaseInfo (). getId (),
orderEventJob , 90 , TimeUnit . DAYS );
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
} else {
Set < Map < String , List < String >>> set = receiveEmailMappingDOS . 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 > emailList = new ArrayList <>();
for ( ReceiveEmailConfigItemVO item : receiveEmailConfigItemVOList ) {
if ( eventEnum . getEvent (). equals ( item . getEvent ())) {
emailList = item . getEmails ();
}
}
List < String > emails = emailList ;
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 (
eventEnum . getTemplateId ()) + Constant . CROSS_BAR_CHARACTER + orderEventJob . getBaseInfo (). getId (),
orderEventJob , Constant . REDIS_EMAIL_TIME , TimeUnit . DAYS );
}
163
164
165
}
}
}
谢茂盛
authored
12 months ago
166
167
168
}
/**
169
170
171
172
* @param orderBaseInfoList 订单基础信息集合。
* @param orderInspectionStageList 订单质检信息集合。 ( 需要尾期验货申请时间 , 判断尾期验货日期到期时间 )/( 还需要尾期验货报告和中期验货报告 )
* @param orderTrackStageList 订单跟单信息集合。 ( 需要各个属性 , 判断其他各种事件 )
* @return 0 rderEventJobVO 订单数据整合集合
谢茂盛
authored
12 months ago
173
*/
174
//这个方法的作用应该是筛选出订单数据。
谢茂盛
authored
12 months ago
175
176
private List < OrderEventJobVO > transfer2OrderEventList ( List < OrderBaseInfoDO > orderBaseInfoList , List < OrderInspectionStageDO > orderInspectionStageList , List < OrderTrackStageDO > orderTrackStageList ) {
// todo
177
178
179
180
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 ();
181
if ( OrderInspectionStageMap . containsKey ( x . getId ()) && OrderTrackStageMap . containsKey ( x . getId ())) {
182
183
184
185
186
187
188
189
190
191
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 );
192
return orderEventJobVO ;
193
} else {
194
return null ;
195
196
197
198
}
}). filter ( Objects: : nonNull )
. collect ( Collectors . toList ());
return orderEventJobVOList ;
谢茂盛
authored
12 months ago
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
}
/**
* @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 );
}
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
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
12 months ago
254
255
256
257
258
259
260
261
return map ;
}
/**
* @param eventJobVO
* @return
*/
private Boolean filterConfirmSampleOrderEvent ( OrderEventJobVO eventJobVO ) {
262
String orderHodTime = eventJobVO . getBaseInfo (). getOrderHodTime ();
263
String ppConfirmTime = eventJobVO . getTrackStageInfo (). getPpConfirmTime ();
264
String ppConfirmResult = eventJobVO . getTrackStageInfo (). getPpConfirmResult ();
265
266
267
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 ) {
268
269
270
271
272
273
274
275
276
277
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 )) {
278
279
280
LocalDate orderHodTimelocalDate = DateUtils . parseDate ( orderHodTime );
LocalDate esoSampleSendTimelocalDate = DateUtils . parseDate ( esoSampleSendTime );
if ( ChronoUnit . DAYS . between ( esoSampleSendTimelocalDate , orderHodTimelocalDate ) == Constant . SEVEN ) {
281
282
return true ;
}
283
284
285
286
287
288
289
290
}
return false ;
}
private Boolean filterBigSampleEvent ( OrderEventJobVO eventJobVO ) {
String orderHodTime = eventJobVO . getBaseInfo (). getOrderHodTime ();
String shippmentSampleConfirmResult = eventJobVO . getTrackStageInfo (). getShippmentSampleConfirmResult ();
291
292
293
294
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 ) {
295
296
297
298
299
300
301
302
303
return true ;
}
}
return false ;
}
private Boolean filterAITEXSGSTestEvent ( OrderEventJobVO eventJobVO ) {
String orderHodTime = eventJobVO . getBaseInfo (). getOrderHodTime ();
304
String aitexTestFinishResult = eventJobVO . getTrackStageInfo (). getAitexTestFinishResult ();
305
String sgsTestFinishResult = eventJobVO . getTrackStageInfo (). getSgsTestFinishResult ();
306
307
308
309
310
311
312
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 ) {
313
314
315
316
return true ;
}
}
return false ;
317
318
319
}
谢茂盛
authored
12 months ago
320
321
322
323
324
private Boolean filterBarcodeArrivalEvent ( OrderEventJobVO eventJobVO ) {
String orderHodTime = eventJobVO . getBaseInfo (). getOrderHodTime ();
String lastArrivalTime = eventJobVO . getTrackStageInfo (). getLatestArrivalTime ();
if ( StringUtils . isNotBlank ( orderHodTime ) && StringUtils . isNotBlank ( lastArrivalTime )) {
325
326
327
LocalDate orderHodTimelocalDate = DateUtils . parseDate ( orderHodTime );
LocalDate lastArrivalTimelocalDate = DateUtils . parseDate ( lastArrivalTime );
if ( ChronoUnit . DAYS . between ( lastArrivalTimelocalDate , orderHodTimelocalDate ) == Constant . SEVEN ) {
328
329
330
331
return true ;
}
}
return false ;
谢茂盛
authored
12 months ago
332
333
}
334
335
336
337
private Boolean filterLatestDCEvent ( OrderEventJobVO eventJobVO ) {
String orderHodTime = eventJobVO . getBaseInfo (). getOrderHodTime ();
String latestBkTime = eventJobVO . getTrackStageInfo (). getLatestBkTime ();
if ( StringUtils . isNotBlank ( orderHodTime ) && StringUtils . isNotBlank ( latestBkTime )) {
338
339
340
LocalDate latestBkTimelocalDate = DateUtils . parseDate ( latestBkTime );
LocalDate orderHodTimelocalDate = DateUtils . parseDate ( orderHodTime );
if ( ChronoUnit . DAYS . between ( latestBkTimelocalDate , orderHodTimelocalDate ) == Constant . ENABLE_TEN ) {
341
342
343
344
return true ;
}
}
return false ;
345
346
347
348
349
350
351
}
private Boolean filterEndCheckDateEvent ( OrderEventJobVO eventJobVO ) {
String orderHodTime = eventJobVO . getBaseInfo (). getOrderHodTime ();
String endCheckApplyTime = eventJobVO . getInspectionStageInfo (). getEndCheckApplyTime ();
if ( StringUtils . isNotBlank ( orderHodTime ) && StringUtils . isNotBlank ( endCheckApplyTime )) {
352
353
354
LocalDate endCheckApplyTimelocalDate = DateUtils . parseDate ( endCheckApplyTime );
LocalDate orderHodTimelocalDate = DateUtils . parseDate ( orderHodTime );
if ( ChronoUnit . DAYS . between ( endCheckApplyTimelocalDate , orderHodTimelocalDate ) == Constant . TWO ) {
355
356
357
358
359
return true ;
}
}
return false ;
}
360
361
362
363
364
365
366
367
368
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 );
369
}
370
return Constant . ZERO ;
371
}
谢茂盛
authored
about a year ago
372
}