EnginCheckServiceImpl.java
20.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
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
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
package com.sy.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.sy.mapper.RuleChannelConfigDao;
import com.sy.model.*;
import com.sy.service.*;
import com.sy.socket.CommandClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.basis.enhance.groovy.constants.ExecutionStatus;
import org.basis.enhance.groovy.entity.EngineExecutorResult;
import org.basis.enhance.groovy.entity.ExecuteParams;
import org.basis.enhance.groovy.entity.ScriptQuery;
import org.basis.enhance.groovy.executor.EngineExecutor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import static com.sy.service.impl.ResMessageServiceImpl.toStrArry;
/**
* 车辆过卡脚本引擎处理
*/
@Service
@Slf4j
public class EnginCheckServiceImpl implements EnginCheckService {
private static String PERMITTHOUGH = "直接放行";
@Autowired
private EngineExecutor engineExecutor;
@Autowired
private BusnesslistinfoService busnesslistinfoService;
@Autowired
private LandBusListService landBusListService;
/**
* 指令日志表
*/
@Autowired
private CommandLogService commandLogService;
@Autowired
private RedisService redisService;
@Autowired
private LandBusListService listService;
@Autowired
LandRoadVeService veService;
@Resource
RuleChannelConfigDao ruleChannelConfigDao;
@Value("${devdebug}")
private Boolean debug;
@Override
public Boolean enginCheckByGatherInfo(GatherInfo gatherInfo,ExecuteParams executeParams) {
try {
//获取申请信息
LandBusinessTypeList chanelFormInfo = (LandBusinessTypeList) executeParams.get("ChanelFormInfo");
if (chanelFormInfo!=null){
//查询验放配置参数生成
RuleChannelConfig ruleChannelConfig = new RuleChannelConfig();
ruleChannelConfig.setBusinessType(chanelFormInfo.getBusinesstype());
ruleChannelConfig.setGoodsType(chanelFormInfo.getCocode());
ruleChannelConfig.setChannelNum(gatherInfo.getChnlno());
List<RuleChannelConfig> ruleChannelConfigs = ruleChannelConfigDao.selectByChannelAndBusiTypeAndGoodsType(ruleChannelConfig);
if (ruleChannelConfigs!=null && !ruleChannelConfigs.isEmpty()){
for (int i = 0; i < ruleChannelConfigs.size(); i++) {
/**
* 核销判定需要另外执行.这里需要跳过.
*/
if (ruleChannelConfigs.get(i).ruleConfig != null && "核销判定".equals(ruleChannelConfigs.get(i).ruleConfig.getRuleType())){
continue;
}
// 执行脚本中指定的方法 changeProduct
EngineExecutorResult executorResult = engineExecutor.execute(
ruleChannelConfigs.get(i).ruleConfig.getScriptMethodName(), new ScriptQuery(ruleChannelConfigs.get(i).ruleConfig.getScriptKey()), executeParams);
log.info("验证脚本名称:{},验证KEY-NAME:{},执行结果:{}", ruleChannelConfigs.get(i).ruleConfig.getRuleName(),ruleChannelConfigs.get(i).ruleConfig.getScriptKey(),executorResult);
if (executorResult.getExecutionStatus().equals(ExecutionStatus.SUCCESS)){
if (executorResult.getContext() instanceof Boolean){
Boolean execResult = (Boolean) executorResult.getContext();
if (execResult) {
log.info("[ENGIN-CHECK-SUCCESS] - 验证脚本名称:{},验证KEY-NAME:{}-[验放成功]",ruleChannelConfigs.get(i).ruleConfig.getRuleName(),ruleChannelConfigs.get(i).ruleConfig.getScriptKey());
}else {
log.info("[ENGIN-CHECK-FAILD]验放失败");
return false;
}
}
}else {
log.error("[ENGIN-CHECK-FAILD]-验证脚本名称:{},验证KEY-NAME:{}-[验放失败]",ruleChannelConfigs.get(i).ruleConfig.getRuleName(),ruleChannelConfigs.get(i).ruleConfig.getScriptKey());
return false;
}
}
return true;
}else {
log.error("[ENGIN-CHECK-FAILD]-[{}]-通道未配置规则,不支持此业务",gatherInfo.getChnlno());
sendBw(gatherInfo,false,"通道未配置规则,不支持此业务",executeParams);
return false;
}
}
sendBw(gatherInfo,false,"未找到流转申请信息",executeParams);
log.error("[ENGIN-CHECK-FAILD]-未找到流转申请信息");
return false;
}catch (Exception e){
log.error("[ENGIN-CHECK-ERR]",e);
return false;
}
}
@Override
public ExecuteParams makeParaByGagherInfo(GatherInfo gatherInfo){
ExecuteParams executeParams = new ExecuteParams();
//初始化
executeParams.put("GatherInfo", gatherInfo);
executeParams.put("FormList", null);
executeParams.put("ChanelFormInfo", null);
executeParams.put("ChanelFormBillLists", null);
executeParams.put("LandRoadVe", null);
executeParams.put("inAisleWT", 0.0);
executeParams.put("diffVal", 0.0);
executeParams.put("selfWt", 0.0);
executeParams.put("goodsWt", 0.0);
//适应高清车牌采集,反向填充二维码 gatherInfo中没有二维码信息的情况
if (StringUtils.isEmpty(gatherInfo.getBarcode())) {
//从申请缓存获取二维码信息
String landBusnessInfoJsonStr = redisService.get(gatherInfo.getVename());
JSONArray array = JSONArray.parseArray(landBusnessInfoJsonStr);
String carBarcode = array.getJSONObject(0).getString("barcode");
if (StringUtils.isEmpty(carBarcode)){
log.error("[BARCODE-RESET-ERR]-从流转申请信息反向填充车辆{}二维码失败",gatherInfo.getVename());
}else {
gatherInfo.setBarcode(carBarcode);
log.info("[BARCODE-RESET]-车牌{}流转申请二维码重置为{}",gatherInfo.getVename(),carBarcode);
}
}
//车辆备案信息
LandRoadVe ve = veService.selectByFrameNo(gatherInfo.getVename());
if (ve != null) {
//车辆备案重量
Double selfWt=Double.parseDouble(ve.getSelfWt());
executeParams.put("LandRoadVe", ve);
executeParams.put("selfWt", selfWt);
}
//获取申请单表体
String landBusinessJson = "";
if (StringUtils.isNotEmpty(gatherInfo.getVename())) {
log.info("[FORM-CACHE-GET]:车辆-{}核碰缓存",gatherInfo.getVename());
landBusinessJson = redisService.get(gatherInfo.getVename());
}else {
log.info("[FORM-CACHE-GET]:车辆未获取到车牌号,seqno:{}",gatherInfo.getSeqno());
}
if (StringUtils.isNotEmpty(landBusinessJson)) {
//这个是申请单表体
List<LandBusinessTypeList> list = JSONArray.parseArray(landBusinessJson, LandBusinessTypeList.class);
executeParams.put("FormList", list);
//通道对应申请信息
LandBusinessTypeList chanelFormInfo = landBusListService.getLandBusinessTypeListByGather(gatherInfo);
executeParams.put("ChanelFormInfo", chanelFormInfo);
if (chanelFormInfo!= null){
executeParams.put("goodsWt", Double.parseDouble(chanelFormInfo.getRemark()));
}
//查询申请单运单列表
List<LAND_BUSINEESTYPE_LIST_INFO> chanelFormBillLists= busnesslistinfoService.selectmanilist(gatherInfo.getBarcode());
executeParams.put("ChanelFormBillLists", chanelFormBillLists);
}
//对应场站入场信息重量
if ("E".equals(gatherInfo.getIetype())){
List<LandBusinessTypeList> stationInChanleInfo= listService.selectwt(gatherInfo.getVename(),gatherInfo.getBarcode(),gatherInfo.getAreaid(),"I");
if (stationInChanleInfo.isEmpty()){
log.info("未查询到车辆:{}的入场信息",gatherInfo.getVename());
}else {
for(LandBusinessTypeList typeList:stationInChanleInfo){
if(typeList.getAislewt()!=null){
//对应场站进场过磅重量
Double inAisleWT = typeList.getAislewt();
executeParams.put("inAisleWT", inAisleWT);
//离场与入场重量差值
Double diffVal = inAisleWT- gatherInfo.getGrosswt().doubleValue();
executeParams.put("diffVal", diffVal);
}
}
//TODO:进场校验 增加 车辆备案重量要 <= 进场过磅重量 ,要有误差判定
}
}
return executeParams;
}
/**
* 发送X22指令
* @param info 过卡信息
* @param check true 抬杆,false 不抬杆
* @param reason 原因
* 调试模式 直接返回true,生产模式按业务走
*/
@Override
public void sendBw(GatherInfo info, boolean check, String reason,ExecuteParams executeParams) {
//调试模式 直接返回true
if (debug){
if (check) {
record(info,executeParams);
//总进出车次计数
redisService.incr("kako-total",1);
}
commandlog(info,check,reason,executeParams);
return;
}
log.info(String.format("开始发送指令:车牌%s,场站%s,通道%s,重量%s",info.getVename(),info.getAreaid(),info.getChnlno(),info.getGrosswt()));
if (check) {
CommandClient.Client(info, PERMITTHOUGH);
log.info("=============>>>>>>>>放行报文发送成功<<<<<<<<<==============");
record(info,executeParams);
//总进出车次计数
redisService.incr("kako-total",1);
} else {
CommandClient.Client(info, reason);
log.info("=============>>>>>>>>重量异常报文发送成功<<<<<<<<<==============");
}
commandlog(info,check,reason,executeParams);
}
/**
* 直接放行
*/
@Override
public void pass(GatherInfo info, ExecuteParams executeParams){
sendBw(info,true,PERMITTHOUGH,executeParams);
}
@Override
public void passFaild(GatherInfo info,String reason,ExecuteParams executeParams) {
sendBw(info,false,reason,executeParams);
}
/**
* 记录进出区信息
*/
@Override
public void record(GatherInfo info, ExecuteParams executeParams){
LandBusinessTypeList landBusinessTypeList = executeParams.getValue("ChanelFormInfo");
Double goodsWt = executeParams.getValue("goodsWt");
Double selfWt = executeParams.getValue("selfWt");
Double diffVal = executeParams.getValue("diffVal");
if ("I".equals(info.getIetype())){
landBusinessTypeList.setAislewt(info.getGrosswt().doubleValue());
landBusinessTypeList.setUpdateDate(new Date());
landBusinessTypeList.setRemark(String.format("%.1f", goodsWt));
//车辆备案重量
landBusinessTypeList.setRemark2(String.valueOf(selfWt));
landBusinessTypeList.setContrastflag("已进站");
}else {
landBusinessTypeList.setAislewt(info.getGrosswt().doubleValue());
landBusinessTypeList.setUpdateDate(new Date());
//装载货物总重量
landBusinessTypeList.setRemark(String.format("%.1f", goodsWt));
//进出差值
landBusinessTypeList.setRemark1(String.format("%.1f", diffVal));
landBusinessTypeList.setRemark2(String.valueOf(selfWt));
landBusinessTypeList.setContrastflag("已出站");
}
//todo:判定放行后,插入数据库,出入区记录
landBusinessTypeList.setId(UUID.randomUUID().toString());
landBusinessTypeList.setIsvalid("1");
//todo:这里SEQN也要入库
listService.saveList(landBusinessTypeList);
}
/**
* 放行日志记录
* @param info
* @param check
* @param reason
*/
@Override
public void commandlog(GatherInfo info, boolean check, String reason,ExecuteParams executeParams){
LandBusinessTypeList land = executeParams.getValue("ChanelFormInfo");
Double selfWt = executeParams.getValue("selfWt");
Double inWt = executeParams.getValue("inWt");
Double goodsWt = executeParams.getValue("goodsWt");
Double diffVal = executeParams.getValue("diffVal");
List<LAND_BUSINEESTYPE_LIST_INFO> listInfos = executeParams.getValue("ChanelFormBillLists");
String flag="",type="";
commandLog command=new commandLog();
command.setId(UUID.randomUUID().toString());
command.setBarcode(info.getBarcode());
if(land!=null){
command.setBarcode(land.getBarcode());
command.setBusnessType(land.getBusinesstype());
}
command.setAreaId(info.getAreaid());
command.setChnlNo(info.getChnlno());
if (check){
flag = "00";
} else{
flag = "11";
}
if("I".equals(info.getIetype())){
type="000000200000000000";
}else{
type="000000100000000000";
}
command.setReasonCode(flag+type);
command.setReasonText(reason);
command.setVeName(info.getVename());
command.setVeWeight(selfWt);
command.setIeType(info.getIetype());
if(info.getGrosswt()!=null){
command.setExitGrossWeight(info.getGrosswt().doubleValue());
}else {
command.setExitGrossWeight(0.0);
}
command.setInGrossWeight(inWt);
command.setGoodsWeight(goodsWt);
command.setActualGoodsWeight(diffVal);
if(listInfos !=null && listInfos.size()>0){
command.setMasterList(Arrays.toString(toStrArry(listInfos)));
}
commandLogService.insert(command);
}
@Override
public void formRelease(GatherInfo gatherInfo, ExecuteParams executeParams) {
//获取申请信息
LandBusinessTypeList chanelFormInfo = (LandBusinessTypeList) executeParams.get("ChanelFormInfo");
if (chanelFormInfo!=null) {
//查询验放配置参数生成
RuleChannelConfig ruleChannelConfig = new RuleChannelConfig();
ruleChannelConfig.setBusinessType(chanelFormInfo.getBusinesstype());
ruleChannelConfig.setGoodsType(chanelFormInfo.getCocode());
ruleChannelConfig.setChannelNum(gatherInfo.getChnlno());
List<RuleChannelConfig> ruleChannelConfigs = ruleChannelConfigDao.selectByChannelAndBusiTypeAndGoodsType(ruleChannelConfig);
if (ruleChannelConfigs!=null && !ruleChannelConfigs.isEmpty()){
for (int i = 0; i < ruleChannelConfigs.size(); i++) {
//核销判定
if (ruleChannelConfigs.get(i).ruleConfig != null && "核销判定".equals(ruleChannelConfigs.get(i).ruleConfig.getRuleType())){
// 执行脚本中指定的方法 changeProduct
EngineExecutorResult executorResult = engineExecutor.execute(
ruleChannelConfigs.get(i).ruleConfig.getScriptMethodName(), new ScriptQuery(ruleChannelConfigs.get(i).ruleConfig.getScriptKey()), executeParams);
log.info("核销判定验证脚本名称:{},验证KEY-NAME:{}", ruleChannelConfigs.get(i).ruleConfig.getRuleName(),ruleChannelConfigs.get(i).ruleConfig.getScriptKey());
log.info("核销判定判定放行结果=========>>>>>>>>>>>{}", executorResult);
}
}
}
}else {
log.error("核销判定通道申请信息无效");
}
}
@Override
public void lockNoticeContinueCheck(GatherInfo gatherInfo) {
ExecuteParams executeParams = makeParaByGagherInfo(gatherInfo);
Boolean check = enginCheckByLockNotice(gatherInfo,executeParams);
if (check){
log.info("脚本验放通过");
//放行
pass(gatherInfo,executeParams);
formRelease(gatherInfo,executeParams);
}else {
log.error("验放失败");
}
}
private Boolean enginCheckByLockNotice(GatherInfo gatherInfo,ExecuteParams executeParams) {
//获取申请信息
LandBusinessTypeList chanelFormInfo = (LandBusinessTypeList) executeParams.get("ChanelFormInfo");
if (chanelFormInfo!=null){
//查询验放配置参数生成
RuleChannelConfig ruleChannelConfig = new RuleChannelConfig();
ruleChannelConfig.setBusinessType(chanelFormInfo.getBusinesstype());
ruleChannelConfig.setGoodsType(chanelFormInfo.getCocode());
ruleChannelConfig.setChannelNum(gatherInfo.getChnlno());
List<RuleChannelConfig> ruleChannelConfigs = ruleChannelConfigDao.selectByChannelAndBusiTypeAndGoodsType(ruleChannelConfig);
if (ruleChannelConfigs!=null && !ruleChannelConfigs.isEmpty()){
for (int i = 0; i < ruleChannelConfigs.size(); i++) {
/**
* 核销判定需要另外执行.这里需要跳过.
*/
if (ruleChannelConfigs.get(i).ruleConfig != null && "核销判定".equals(ruleChannelConfigs.get(i).ruleConfig.getRuleType())){
continue;
}
if (ruleChannelConfigs.get(i).ruleConfig != null && ruleChannelConfigs.get(i).ruleConfig.getRuleType().contains("关锁")){
continue;
}
// 执行脚本中指定的方法 changeProduct
EngineExecutorResult executorResult = engineExecutor.execute(
ruleChannelConfigs.get(i).ruleConfig.getScriptMethodName(), new ScriptQuery(ruleChannelConfigs.get(i).ruleConfig.getScriptKey()), executeParams);
log.info("验证脚本名称:{},验证KEY-NAME:{}", ruleChannelConfigs.get(i).ruleConfig.getRuleName(),ruleChannelConfigs.get(i).ruleConfig.getScriptKey());
log.info("使用groovy脚本来验证过卡判定放行结果=========>>>>>>>>>>>执行结果:{}", executorResult);
if (executorResult.getExecutionStatus().equals(ExecutionStatus.SUCCESS)){
if (executorResult.getContext() instanceof Boolean){
Boolean execResult = (Boolean) executorResult.getContext();
if (execResult) {
log.info("验证脚本名称:{},验证KEY-NAME:{}-[验放成功]",ruleChannelConfigs.get(i).ruleConfig.getRuleName(),ruleChannelConfigs.get(i).ruleConfig.getScriptKey());
}else {
log.info("验放失败");
return false;
}
}
}else {
log.error("验证脚本名称:{},验证KEY-NAME:{}-[验放失败]",ruleChannelConfigs.get(i).ruleConfig.getRuleName(),ruleChannelConfigs.get(i).ruleConfig.getScriptKey());
return false;
}
}
return true;
}else {
log.error("[{}]-通道未配置规则,不支持此业务",gatherInfo.getChnlno());
sendBw(gatherInfo,false,"通道未配置规则,不支持此业务",executeParams);
return false;
}
}
sendBw(gatherInfo,false,"未找到流转申请信息",executeParams);
log.error("未找到流转申请信息");
return false;
}
}