|
|
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) {
|
|
|
|
|
|
//获取申请信息
|
|
|
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);
|
|
|
|
|
|
for (int i = 0; i < ruleChannelConfigs.size(); i++) {
|
|
|
// 执行脚本中指定的方法 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;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//核销判定
|
|
|
if (executorResult.getContext()==null && "void".equals(ruleChannelConfigs.get(i).ruleConfig.getScriptMethodReturn())){
|
|
|
log.info("核销判定");
|
|
|
}
|
|
|
}else {
|
|
|
log.error("验证脚本名称:{},验证KEY-NAME:{}-[验放失败]",ruleChannelConfigs.get(i).ruleConfig.getRuleName(),ruleChannelConfigs.get(i).ruleConfig.getScriptKey());
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
log.error("未找到流转申请信息");
|
|
|
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);
|
|
|
|
|
|
//车辆备案信息
|
|
|
LandRoadVe ve = veService.selectByFrameNo(gatherInfo.getVename());
|
|
|
if (ve != null) {
|
|
|
//车辆备案重量
|
|
|
Double selfWt=Double.parseDouble(ve.getSelfWt());
|
|
|
executeParams.put("LandRoadVe", ve);
|
|
|
executeParams.put("selfWt", selfWt);
|
|
|
}
|
|
|
|
|
|
//获取申请单表体
|
|
|
log.info("[FORM-CACHE-GET]:车辆-{}核碰缓存",gatherInfo.getVename());
|
|
|
String landBusinessJson = redisService.get(gatherInfo.getVename());
|
|
|
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);
|
|
|
}
|
|
|
|
|
|
log.info(String.format("开始发送指令:车牌%s,场站%s,通道%s,重量%s",info.getVename(),info.getAreaid(),info.getChnlno(),info.getGrosswt()));
|
|
|
boolean flag = false;
|
|
|
if (check) {
|
|
|
CommandClient.Client(info, PERMITTHOUGH);
|
|
|
log.info("=============>>>>>>>>放行报文发送成功<<<<<<<<<==============");
|
|
|
flag = true;
|
|
|
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 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());
|
|
|
command.setExitGrossWeight(info.getGrosswt().doubleValue());
|
|
|
command.setInGrossWeight(inWt);
|
|
|
command.setGoodsWeight(goodsWt);
|
|
|
command.setActualGoodsWeight(diffVal);
|
|
|
if(listInfos !=null && listInfos.size()>0){
|
|
|
command.setMasterList(Arrays.toString(toStrArry(listInfos)));
|
|
|
}
|
|
|
commandLogService.insert(command);
|
|
|
}
|
|
|
} |
...
|
...
|
|