作者 朱兆平

引擎动态验放全流程业务测试通过.

优化关锁通知针对包含综保区的场站业务的自动施封通知
单进单出核销规则完善
... ... @@ -102,7 +102,7 @@ enhance.groovy.engine.polling-cycle=10000
# 开启功能
enhance.groovy.engine.enable=true
# 缓存过期时间(默认600L分钟)
enhance.groovy.engine.cache-expire-after-write=20
enhance.groovy.engine.cache-expire-after-write=600
#缓存初始容量(默认100)
enhance.groovy.engine.cache-initial-capacity=50
# 缓存最大容量(默认500)
... ...
... ... @@ -115,9 +115,9 @@ class LockNoticeCheck extends Script implements ChannelCheckScript {
return true;
}else {
log.error("[LockNoticeCheck-ERR]:流转业务-未申请关锁号");
CommandClient.Client(info,"流转业务-未申请关锁号");
record(info,false,"业务异常:流转业务-未申请关锁号",null);
log.error("[LockNoticeCheck-ERR]:流转业务-未申请关锁号");
//这里需要返回true,是关锁业务,但是中断,不抬杆不放行,给予关锁业务异常通知
return false;
}
... ... @@ -168,6 +168,18 @@ class LockNoticeCheck extends Script implements ChannelCheckScript {
String sfAreaid = "4600541001";
String zbqAreaid = "4600329012";
String zbqN3Areaid = "4612199001";
String xhAreaid = "4604000000";
//北货三号卡口出通道
String bh_3_out = "4604600030";
//北货三号卡口进通道1
String bh_3_in1= "4604601030";
//北货三号卡口进通道2
String bh_3_in2= "4604601031";
// 西货站出通道1
String xh_1_out = "4604333312";
// 西货站出通道2
String xh_2_out = "4604333322";
ApplicationContext context = getContext();
// 获取容器中的bean
... ... @@ -178,7 +190,30 @@ class LockNoticeCheck extends Script implements ChannelCheckScript {
//涉及综保区场站的申请不核验关锁业务.
if (carEndstationList.contains(zbqAreaid)) {
log.info("[LOCK-CHECK]-申报场站列表包含综保区,不处理关锁业务,当前场站:{}",landBusinessTypeList.getEndstation());
if ("分拨业务".equals(landBusinessTypeList.getBusinesstype())){
if (info.getChnlno().equals(bh_3_out)) {
log.info("[LOCK-CHECK-TRUE]-分拨业务-综保区北货流转业务,北货区域关锁通知,当前场站北货站");
return NEED_NOTICE;
}
if (info.getAreaid().equals(xhAreaid)) {
log.info("[LOCK-CHECK-TRUE]-分拨业务-西货综保区流转业务,西货区域关锁通知,当前场站西货站");
return NEED_NOTICE;
}
}
if ("调拨业务".equals(landBusinessTypeList.getBusinesstype())){
//申请设计综保区的流转场站,除了综保区不通知,其他场站正常通知
/**
* 从综保区往北货或者西货调拨时,都不进行关锁通知,因为从综保区出来没有关锁施封记录无法到北货解封.没关锁秘钥,采用人工解封
* 从西货或者北货往综保区调拨的话,进行施封通知,到综保区后不进行解封通知,采用人工解封
*/
if (info.getChnlno().equals(bh_3_out) || info.getChnlno().equals(xh_1_out) || info.getChnlno().equals(xh_2_out)){
log.info("[LOCK-CHECK]-含综保区调拨业务-关锁施封通知,当前通道:{}",info.getChnlno());
return NEED_NOTICE;
}
}
log.info("[LOCK-CHECK-NOTICE]-申报场站列表包含综保区,不处理关锁业务,当前场站:{}",landBusinessTypeList.getEndstation());
return DOT_NOTICE;
}
... ... @@ -191,21 +226,6 @@ class LockNoticeCheck extends Script implements ChannelCheckScript {
return DOT_NOTICE;
}else {
return NEED_NOTICE;
/**
* 单证验证-取消
*/
// List<LAND_BUSINEESTYPE_LIST_INFO> land_busineestype_list_infos = landBusinessTypeList.getLandBusineestypeListInfoList();
// if (!land_busineestype_list_infos.isEmpty()){
// LAND_BUSINEESTYPE_LIST_INFO list_info = land_busineestype_list_infos.stream().parallel()
// .filter(item -> "B".equals(item.getExt4()))
// .findAny().orElse(null);
//
// //包含单证
// if (list_info!=null){
// log.info("[LOCK-CHECK]-包含单证,开始关锁通知");
// return true;
// }
// }
}
}else {
return FAIL_NOTICE;
... ...
... ... @@ -89,9 +89,9 @@ class WeightCheckEmpty extends Script implements ChannelCheckScript {
emptyIN = Double.parseDouble(df.format(Math.abs((wt - grossWt)) / wt));
double range = weightCheckHandleService.valueDob();
logger.info("[WEIGHT-CHECK]-进口提货入口重量验放:入场重量{},车辆备案重量:{},差值:{}",grossWt,wt,emptyIN);
if (emptyIN <= range) {
logger.info("[WEIGHT-CHECK]-进口提货入口重量验放:入场重量{},车辆备案重量:{},差值:{}",grossWt,wt,emptyIN);
return true;
}
}
... ...
package com.sy.groovy
import com.sy.crossDomain.BuildBarCode
import com.sy.mapper.LandListDao
import com.sy.model.GatherInfo
import com.sy.model.LandBusinessTypeList
import com.sy.service.CommandLogService
import com.sy.service.LandBusListService
import com.sy.service.RedisService
import com.sy.service.impl.GatherInfoHandle
import org.basis.enhance.groovy.entity.ExecuteParams
import org.slf4j.Logger
... ... @@ -14,10 +19,11 @@ import java.util.stream.Collectors
* 流转申请-核销
* 1. 单进单出即核销判定
* 2. 根据申请单中的通道类型及通道信息判定没有未走完的通道类型,可以核销.比如 申请单证的通道只有进通道,车可以走进一,进二,进二入场,走完进一,即可核销.(一线进)
* 3. 只要有进记录或者出记录 就核销
*/
class X21FormSingileReleaseCheck extends Script {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final Logger log = LoggerFactory.getLogger(getClass());
/**x21指令判定
... ... @@ -27,59 +33,28 @@ class X21FormSingileReleaseCheck extends Script {
* 进行通道比对
*/
void check(ExecuteParams executeParams) {
try{
try {
int count = 0;
// 获取product对象
GatherInfo gatherInfo = (GatherInfo) executeParams.get("GatherInfo");
List<LandBusinessTypeList> formList = (List<LandBusinessTypeList>) executeParams.get("FormList");
// 调用方法
ApplicationContext context = getContext();
// 获取容器中的bean
GatherInfoHandle gatherInfoHandle = context.getBean(GatherInfoHandle.class);
List<LandBusinessTypeList> temp = new ArrayList<>(formList);
//二维码已出区的记录
List<LandBusinessTypeList> havenCrossList = gatherInfoHandle.listService.selectByBarcodeWithE(gatherInfo.getBarcode());
if (formList == null && formList.isEmpty() ){
logger.error("[FORM-RELEASE-CHECK]-车辆进出场对应申请缓存数据为空:{}",gatherInfo.getBarcode());
return;
if (gatherInfo!=null){
// 调用方法
ApplicationContext context = getContext();
LandBusListService landBusListService = context.getBean(LandBusListService.class)
count = landBusListService.selectHistoryCount(gatherInfo.getBarcode());
if (count>0){
log.info("[Singile-Release-Success]-{}-{}",gatherInfo.getBarcode(),gatherInfo.getVename())
releaseBarCode(gatherInfo,executeParams);
}else {
log.error("[Singile-Release-Faild]-{}-{}",gatherInfo.getBarcode(),gatherInfo.getVename())
}
}else {
log.error("[Singile-Release-Faild]-核销失败,缺少关键过卡信息");
}
if (havenCrossList.isEmpty()){
logger.error("[FORM-RELEASE-CHECK]{}:车辆无离场数据,不核销",gatherInfo.getVename());
return;
}
logger.info("[FORM-RELEASE-CHECK]:已过卡数量:[{}]",havenCrossList.size())
//申请核销判定,已出区的记录与流转申请数据核碰.如果流转申请列表核碰完,还剩下的需要出区的场站则不核销.
for (LandBusinessTypeList businessTypeList : havenCrossList) {
List<LandBusinessTypeList> r = formList.stream().filter({item ->
//判断还有没有没有出区的场站,还有没有出区的场站就不核销
logger.debug("[releaseFormCheck-Stream-loop]-缓存与已出核碰,缓存元素场站:[{}],已出记录场站:[{}]",item.getEndstation(),businessTypeList.getEndstation());
//解决缓存那里存储有不一样的把人错的的有问题的点,二维码不一致也把缓存删除
if (!item.getBarcode().equals(businessTypeList.getBarcode())){
return true;
}
if(item.getEndstation().equals(businessTypeList.getEndstation())) {
logger.info("[releaseFormCheck-Stream-loop]-缓存元素场站:[{}],已出记录场站:[{}]-核销判定对碰成功",item.getEndstation(),businessTypeList.getEndstation());
return true;
}else {
return false;
}
}).collect(Collectors.toList());
temp.removeAll(r);
}
logger.info("[FORM-RELEASE-CHECK]-核销判定结果:{}",temp.size());
if (temp.isEmpty()){
//todo:流转申请状态核销
logger.info("[进出场申请]-流转申请开始核销:"+gatherInfo.getVename());
//二维码核销
// gatherInfoHandle.releaseBarCode();
logger.info("[进出场申请]-流转申请已核销:"+gatherInfo.getVename());
}
}catch (Exception e){
} catch (Exception e){
e.printStackTrace();
logger.error("[FORM-RELEASE-ERROR]:",e);
log.error("[LockNoticeCheck-ERR]:",e);
}
}
... ... @@ -95,4 +70,53 @@ class X21FormSingileReleaseCheck extends Script {
return context;
}
void releaseBarCode(GatherInfo info,ExecuteParams executeParams){
ApplicationContext context = getContext();
// 获取容器中的bean
LandListDao landListDao = context.getBean(LandListDao.class);
Boolean devdebug = (Boolean)context.getBean("devdebug");
if (!devdebug){
BuildBarCode.cancleBarCode(info.getVename());
log.info("[流转申请]-二维码已释放:"+info.getVename());
}
int rc = landListDao.releaseBarcode(info.getBarcode());
if (rc>0) {
log.info("[进出场核销]-{}流转已核销:{}",info.getVename(),info.getBarcode());
}else{
log.error("[进出场核销-ERROR]-{}流转未核销成功:{}",info.getVename(),info.getBarcode());
}
//车辆流转申请缓存删除
releaseCache(info,executeParams);
}
void releaseCache(GatherInfo info,ExecuteParams executeParams){
ApplicationContext context = getContext();
// 获取容器中的bean
RedisService redisService = context.getBean(RedisService.class);
//车辆流转申请缓存删除
redisService.del(info.getVename());
//流转申请时生成的临时核碰场站代码列表
redisService.del(info.getVename()+"_endstationList");
//车辆过卡信息缓存删除-X22金二判定时候生成的这个缓存
redisService.del(info.getSeqno());
log.info("[流转缓存]-{}缓存已核销",info.getVename());
//核销记录
releaseRecord(info,executeParams);
}
/**
* 核销记录
*/
void releaseRecord(GatherInfo info,ExecuteParams executeParams){
LandBusinessTypeList chanelFormInfo = (LandBusinessTypeList) executeParams.get("ChanelFormInfo");
ApplicationContext context = getContext();
CommandLogService commandLogService = context.getBean(CommandLogService.class);
commandLogService.commandlog(info,true,"流转核销",chanelFormInfo,null,0.0,0.0,0.0,0.0);
}
}
... ...
... ... @@ -77,4 +77,11 @@ public interface LandBusinessTypeListMapper {
*/
List<LandBusinessTypeList> selectHistory (@Param("trailerFrameNo") String trailerFrameNo, @Param("barcode") String barcode);
/**
* 车辆已进出区的记录数
* @param barcode 二维码
* @return 进出区记录数
*/
int selectHistoryCount(@Param("barcode")String barcode);
}
... ...
... ... @@ -56,4 +56,11 @@ public interface LandBusListService {
*/
int selectFirstLeave(String trailerFrameNo, String barcode, String turnoverflag);
/**
* 根据二维码查询车辆所有进出总记录
* @param barcode 二维码
* @return 进出记录总数量
*/
int selectHistoryCount(String barcode);
}
... ...
... ... @@ -230,7 +230,7 @@ public class GatherInfoHandle implements GatherInfoService {
inStationInfo(); //入场信息获取
setListinfos(); //流转申请表体获取
if (goodsWhiteListCheck()){ //货物类型白名单
if (goodsWhiteListCheck() && !"调拨业务".equals(landBusinessTypeList.getBusinesstype()) && !"分拨业务".equals(landBusinessTypeList.getBusinesstype())){ //货物类型白名单
pass();
log.info("[SPECIAL]-特殊业务出区验放通过:{}",landBusinessTypeList.getCocode());
releaseFormCheck(); //流转申请单核销
... ... @@ -306,15 +306,20 @@ public class GatherInfoHandle implements GatherInfoService {
}
case "调拨业务":
//检查运单放行,拉板可出
if (gatherInfoHandle.resMessageService.checkManifestRelease(info,listinfos)){
if (goodsWhiteListCheck()){
return true;
}else {
//有运单未放行
log.error("[调拨业务]-出场未通过校验:"+FANGXING+landBusinessTypeList.getMasterList());
sendBw(info,false,FANGXING,landBusinessTypeList,listinfos);
return false;
//检查运单放行,拉板可出
if (gatherInfoHandle.resMessageService.checkManifestRelease(info,listinfos)){
return true;
}else {
//有运单未放行
log.error("[调拨业务]-出场未通过校验:"+FANGXING+landBusinessTypeList.getMasterList());
sendBw(info,false,FANGXING,landBusinessTypeList,listinfos);
return false;
}
}
default:
return true;
}
... ... @@ -606,22 +611,29 @@ public class GatherInfoHandle implements GatherInfoService {
case "调拨业务":
if (gatherInfoHandle.weightCheckHandleService.checkAllocateOrDispatch(growssWt, selfWt, goodsWt,inWt)){
/**
* 调拨业务如果空车出,可出.(就是申请不带运单的,比如综保区的车辆)
* 调拨业务如果空车出,可出.(就是申请不带运单的)
*/
if (listinfos!=null && listinfos.isEmpty()){
log.info("[调拨-空车]-{}空车离场",info.getVename());
return true;
}
//检查运单放行,拉板可出
if (gatherInfoHandle.resMessageService.checkManifestRelease(info,listinfos)){
//白名单货物不检查放行
if (goodsWhiteListCheck()) {
return true;
}else {
//有运单未放行
log.error("[调拨业务]-出场未通过校验:"+FANGXING+landBusinessTypeList.getMasterList());
sendBw(info,false,FANGXING,landBusinessTypeList,listinfos);
return false;
}else{
//检查运单放行,拉板可出
if (gatherInfoHandle.resMessageService.checkManifestRelease(info,listinfos)){
return true;
}else {
//有运单未放行
log.error("[调拨业务]-出场未通过校验:"+FANGXING+landBusinessTypeList.getMasterList());
sendBw(info,false,FANGXING,landBusinessTypeList,listinfos);
return false;
}
//todo:检查ULD放行.
}
//todo:检查ULD放行.
}else{
log.error("[调拨业务]-出场未通过校验:"+GROWSSEXCETION);
sendBw(info,false,GROWSSEXCETION,landBusinessTypeList,listinfos);
... ... @@ -871,6 +883,9 @@ public class GatherInfoHandle implements GatherInfoService {
if (waybill.length() < 1) {
return false;
}
if (gatherInfoHandle.debug){
return true;
}
waybill = waybill.replace("-", "");
//中文逗号替换
waybill = waybill.replace(",", ",");
... ...
... ... @@ -192,4 +192,9 @@ public class LandBusListServiceImpl implements LandBusListService {
return listMapper.selectFirstLeave(trailerFrameNo, barcode, turnoverflag);
}
@Override
public int selectHistoryCount(String barcode){
return listMapper.selectHistoryCount(barcode);
}
}
... ...
... ... @@ -96,14 +96,48 @@ public class CustomsLockServiceImpl implements CustomsLockService {
String sfAreaid = "4600541001";
String zbqAreaid = "4600329012";
String zbqN3Areaid = "4612199001";
String xhAreaid = "4604000000";
String bhAreaid = "4604600000";
//北货三号卡口出通道
String bh_3_out = "4604600030";
//北货三号卡口进通道1
String bh_3_in1= "4604601030";
//北货三号卡口进通道2
String bh_3_in2= "4604601031";
// 西货站出通道1
String xh_1_out = "4604333312";
// 西货站出通道2
String xh_2_out = "4604333322";
String carEndstationList = redisService.get(info.getVename() + "_endstationList");
if (StringUtils.isNotEmpty(info.getVename()) && StringUtils.isNotEmpty(carEndstationList)){
//涉及综保区场站的申请不核验关锁业务.
if (carEndstationList.contains(zbqAreaid)) {
log.info("[LOCK-CHECK]-申报场站列表包含综保区,不处理关锁业务,当前场站:{}",landBusinessTypeList.getEndstation());
if ("分拨业务".equals(landBusinessTypeList.getBusinesstype())){
if (info.getChnlno().equals(bh_3_out)) {
log.info("[LOCK-CHECK-TRUE]-分拨业务-综保区北货流转业务,北货区域关锁通知,当前场站北货站");
return true;
}
if (info.getAreaid().equals(xhAreaid)) {
log.info("[LOCK-CHECK-TRUE]-分拨业务-西货综保区流转业务,西货区域关锁通知,当前场站西货站");
return true;
}
}
if ("调拨业务".equals(landBusinessTypeList.getBusinesstype())){
//申请设计综保区的流转场站,除了综保区不通知,其他场站正常通知
/**
* 从综保区往北货或者西货调拨时,都不进行关锁通知,因为从综保区出来没有关锁施封记录无法到北货解封.没关锁秘钥,采用人工解封
* 从西货或者北货往综保区调拨的话,进行施封通知,到综保区后不进行解封通知,采用人工解封
*/
if (info.getChnlno().equals(bh_3_out) || info.getChnlno().equals(xh_1_out) || info.getChnlno().equals(xh_2_out)){
log.info("[LOCK-CHECK]-含综保区调拨业务-关锁施封通知,当前通道:{}",info.getChnlno());
return true;
}
}
log.info("[LOCK-CHECK-NOTICE]-申报场站列表包含综保区,不处理关锁业务,当前场站:{}",landBusinessTypeList.getEndstation());
return false;
}
... ...
... ... @@ -6,15 +6,13 @@ import com.sy.bwAssist.Message;
import com.sy.mapper.LandListDao;
import com.sy.mapper.LandRouterConfigDao;
import com.sy.model.*;
import com.sy.service.CommandLogService;
import com.sy.service.CustomsLockService;
import com.sy.service.LandBusListService;
import com.sy.service.RedisService;
import com.sy.service.*;
import com.sy.service.feigin.LockFeignService;
import com.sy.service.impl.GatherInfoHandle;
import com.sy.socket.CommandClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.basis.enhance.groovy.entity.ExecuteParams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ... @@ -56,6 +54,9 @@ public class MessageRouterX21 implements MessageRouter {
@Autowired
private LockFeignService lockFeignService;
@Autowired
private EnginCheckService enginCheckService;
@Resource
private LandListDao landListDao;
... ... @@ -77,7 +78,12 @@ public class MessageRouterX21 implements MessageRouter {
//金二判断,业务类型,通道,路由目的地
routerCheckG2(info);
}else {
X21Local(info);
/**
* 取消原来验放模式,改为动态规则引擎验放
*/
// X21Local(info);
enginCheck(info);
}
}
... ... @@ -191,12 +197,14 @@ public class MessageRouterX21 implements MessageRouter {
*/
else{
//没有金二配置,走本地
X21Local(info);
// X21Local(info);
enginCheck(info);
}
}else {
//没有金二配置,走本地
X21Local(info);
// X21Local(info);
enginCheck(info);
}
}
... ... @@ -231,6 +239,19 @@ public class MessageRouterX21 implements MessageRouter {
}
private void enginCheck(GatherInfo gatherInfo){
ExecuteParams executeParams = enginCheckService.makeParaByGagherInfo(gatherInfo);
Boolean check = enginCheckService.enginCheckByGatherInfo(gatherInfo,executeParams);
if (check){
enginCheckService.pass(gatherInfo,executeParams);
enginCheckService.formRelease(gatherInfo,executeParams);
}else {
log.error("脚本验放测试失败或等待关锁施解封");
}
log.info("引擎验放完结");
}
/**
* 车辆过卡指令日志记录
*/
... ... @@ -282,8 +303,9 @@ public class MessageRouterX21 implements MessageRouter {
}
}
}else {
CommandClient.Client(info,"流转业务-未申请关锁号");
log.error("[LOCK-ERROR]-流转业务未申请关锁号");
record(info,false,"业务异常:流转业务-未申请关锁号",null);
CommandClient.Client(info,"流转业务-未申请关锁号");
//这里需要返回true,是关锁业务,但是中断,不抬杆不放行,给予关锁业务异常通知
return true;
}
... ...
... ... @@ -103,6 +103,15 @@
and TRAILER_FRAME_NO = #{trailerFrameNo,jdbcType=VARCHAR}
and ISVALID = '1'
</select>
<select id="selectHistoryCount" parameterType="java.lang.String" resultType="java.lang.Integer">
select
count(BARCODE)
from land_businesstype_list
where
BARCODE = #{barcode,jdbcType=VARCHAR}
and ISVALID = '1'
</select>
<update id="updateisvalid" parameterType="java.lang.String">
update land_businesstype_list set ISVALID = '1' where
TRAILER_FRAME_NO = #{trailerFrameNo,jdbcType=VARCHAR}
... ...