正在显示
21 个修改的文件
包含
1600 行增加
和
81 行删除
| 1 | +package com.sy.controller; | ||
| 2 | + | ||
| 3 | +import com.sy.handle.G2FeedBackHandel; | ||
| 4 | +import com.sy.response.ResultJson; | ||
| 5 | +import com.sy.service.X82Service; | ||
| 6 | +import com.sy.service.router.MessageRouterG2; | ||
| 7 | +import com.sy.utils.G2ThreadPoolFactory; | ||
| 8 | +import lombok.extern.slf4j.Slf4j; | ||
| 9 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 10 | +import org.springframework.web.bind.annotation.*; | ||
| 11 | + | ||
| 12 | +import java.util.concurrent.ThreadPoolExecutor; | ||
| 13 | + | ||
| 14 | +@RestController | ||
| 15 | +@RequestMapping("/g2") | ||
| 16 | +@Slf4j | ||
| 17 | +public class G2ResponseController { | ||
| 18 | + | ||
| 19 | + @Autowired | ||
| 20 | + X82Service x82Service; | ||
| 21 | + | ||
| 22 | + @Autowired | ||
| 23 | + MessageRouterG2 messageRouterG2; | ||
| 24 | + | ||
| 25 | + | ||
| 26 | + @PostMapping("/response") | ||
| 27 | + public ResultJson response(@RequestParam("response") String response){ | ||
| 28 | + try { | ||
| 29 | + //初始化线程池 | ||
| 30 | + ThreadPoolExecutor threadPool = G2ThreadPoolFactory.instance("G2FeedBack"); | ||
| 31 | + log.info("接收到金二验放回执报文,{},开始解密", response); | ||
| 32 | + G2FeedBackHandel g2FeedBackHandel = new G2FeedBackHandel(); | ||
| 33 | + g2FeedBackHandel.setFeedBack(response); | ||
| 34 | + g2FeedBackHandel.setX82Service(x82Service); | ||
| 35 | + g2FeedBackHandel.setMessageRouterG2(messageRouterG2); | ||
| 36 | + | ||
| 37 | + threadPool.execute(g2FeedBackHandel); | ||
| 38 | + }catch (Exception e){ | ||
| 39 | + return new ResultJson("200","接收回执成功",e.getMessage()); | ||
| 40 | + } | ||
| 41 | + return new ResultJson("200","接收回执成功"); | ||
| 42 | + } | ||
| 43 | +} |
| @@ -17,7 +17,7 @@ import org.springframework.context.ApplicationContext | @@ -17,7 +17,7 @@ import org.springframework.context.ApplicationContext | ||
| 17 | * 金二通知验放规则 | 17 | * 金二通知验放规则 |
| 18 | * todo:需要改造成验放型.返回true false,某些业务类型需要强制走金二验放,海关智能卡口配置端也是根据通道进行配置的 | 18 | * todo:需要改造成验放型.返回true false,某些业务类型需要强制走金二验放,海关智能卡口配置端也是根据通道进行配置的 |
| 19 | */ | 19 | */ |
| 20 | -class G2Notice extends Script implements ChannelCheckScript { | 20 | +class G2Notice extends Script { |
| 21 | private final Logger log = LoggerFactory.getLogger(getClass()); | 21 | private final Logger log = LoggerFactory.getLogger(getClass()); |
| 22 | @Override | 22 | @Override |
| 23 | Object run() { | 23 | Object run() { |
| @@ -25,7 +25,7 @@ class G2Notice extends Script implements ChannelCheckScript { | @@ -25,7 +25,7 @@ class G2Notice extends Script implements ChannelCheckScript { | ||
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | 27 | ||
| 28 | - Boolean check(ExecuteParams executeParams) { | 28 | + void check(ExecuteParams executeParams) { |
| 29 | try{ | 29 | try{ |
| 30 | /** | 30 | /** |
| 31 | * X21通道信息与流转信息比对 | 31 | * X21通道信息与流转信息比对 |
| @@ -35,19 +35,19 @@ class G2Notice extends Script implements ChannelCheckScript { | @@ -35,19 +35,19 @@ class G2Notice extends Script implements ChannelCheckScript { | ||
| 35 | GatherInfo info = (GatherInfo) executeParams.get("GatherInfo"); | 35 | GatherInfo info = (GatherInfo) executeParams.get("GatherInfo"); |
| 36 | LandBusinessTypeList landBusinessTypeList = (LandBusinessTypeList) executeParams.get("ChanelFormInfo"); | 36 | LandBusinessTypeList landBusinessTypeList = (LandBusinessTypeList) executeParams.get("ChanelFormInfo"); |
| 37 | if (landBusinessTypeList!=null){ | 37 | if (landBusinessTypeList!=null){ |
| 38 | - rightChnelCheck(landBusinessTypeList.getBusinesstype(),info); | 38 | + cacheWithSeqno(info); |
| 39 | + log.info("[G2-ROUTER-CACHE]-车辆[{}]流转已缓存[SEQNO]:{}",info.getVename(),info.getSeqno()); | ||
| 40 | + //将X21报文发给三宝,让三宝发给金二 | ||
| 41 | + sendToSample(info); | ||
| 42 | + record(info,true,"已转金二验放-[SEQN]:"+info.getSeqno(),null); | ||
| 39 | }else { | 43 | }else { |
| 40 | - /** | ||
| 41 | - * 对应进出场申请数据 | ||
| 42 | - */ | ||
| 43 | - log.error("[G2]-X21与流转信息核碰失败,未有流转缓存或者二维码对碰不成功"); | ||
| 44 | - CommandClient.Client(info,"未找到通道对应申报信息,或二维码信息不一致"); | ||
| 45 | - record(info,false,"[FormCheck]-未找到通道对应申报信息",null); | 44 | + record(info,true,"金二验放失败,未有相关通道流转申请信息",null); |
| 45 | + CommandClient.Client(info,"金二验放失败,未有相关通道流转申请信息"); | ||
| 46 | } | 46 | } |
| 47 | + | ||
| 47 | }catch (Exception e){ | 48 | }catch (Exception e){ |
| 48 | e.printStackTrace(); | 49 | e.printStackTrace(); |
| 49 | log.error("[LockNoticeCheck-ERR]:",e); | 50 | log.error("[LockNoticeCheck-ERR]:",e); |
| 50 | - return false; | ||
| 51 | } | 51 | } |
| 52 | } | 52 | } |
| 53 | 53 | ||
| @@ -58,76 +58,7 @@ class G2Notice extends Script implements ChannelCheckScript { | @@ -58,76 +58,7 @@ class G2Notice extends Script implements ChannelCheckScript { | ||
| 58 | return context; | 58 | return context; |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | - void rightChnelCheck(String businessType,GatherInfo info){ | ||
| 62 | - LandRouterConfig landRouterConfig = new LandRouterConfig(); | ||
| 63 | - landRouterConfig.setBusinessType(businessType); | ||
| 64 | - landRouterConfig.setAreaId(info.getAreaid()); | ||
| 65 | - | ||
| 66 | - ApplicationContext context = getContext(); | ||
| 67 | - LandRouterConfigDao landRouterConfigDao = context.getBean(LandRouterConfigDao.class); | ||
| 68 | - //查询此场站此业务类型有无金二业务配置 | ||
| 69 | - List<LandRouterConfig> routerConfigs = landRouterConfigDao.selectByBussType(landRouterConfig); | ||
| 70 | - //有金二与业务类型绑定 | ||
| 71 | - if (!routerConfigs.isEmpty()){ | ||
| 72 | - /** | ||
| 73 | - * 路由配置的卡口 是进出卡口都有 还是只有进或者出 | ||
| 74 | - * 根据X21过的通道类型(进卡口/出卡口)来判定,对应流转申报业务类型 的 进出卡口业务是否有金二通道配置 | ||
| 75 | - */ | ||
| 76 | - boolean anyMatch = routerConfigs.stream().anyMatch({router-> router.getChanelType().equals(info.getIetype())}); | ||
| 77 | - | ||
| 78 | - /** | ||
| 79 | - * 有对应卡口进出类型的配置 | ||
| 80 | - * 继续判定 | ||
| 81 | - * 1 通道是否走对. 走对 将X21报文给金二,由三宝转成X81 | ||
| 82 | - * 2 没走对 返回 走错通道.业务结束. | ||
| 83 | - */ | ||
| 84 | - if (anyMatch){ | ||
| 85 | - //是否走对通道的判定 | ||
| 86 | - for (LandRouterConfig routerConfig : routerConfigs) { | ||
| 87 | - | ||
| 88 | - if (routerConfig.getChanelId().equals(info.getChnlno())){ | ||
| 89 | - /** | ||
| 90 | - * 查找到金二与通道的验放配置 | ||
| 91 | - */ | ||
| 92 | - log.info("[G2-ROUTER]-车辆[{}]流转为金二业务,转金二处理",info.getVename()); | ||
| 93 | - //缓存X21,用来接收海关的x82指令核对.收到X22指令后进行核销此缓存.走金二验放的才缓存 | ||
| 94 | - cacheWithSeqno(info); | ||
| 95 | - log.debug("[G2-ROUTER-CACHE]-车辆[{}]流转已缓存[SEQNO]:{}",info.getVename(),info.getSeqno()); | ||
| 96 | - //将X21报文发给三宝,让三宝发给金二 | ||
| 97 | - sendToSample(info); | ||
| 98 | - record(info,true,"已转金二验放-[SEQN]:"+info.getSeqno(),null); | ||
| 99 | - log.info("[G2]>>为[金二业务],已将[{}]过卡信息发送与金二",info.getVename()); | ||
| 100 | - return; | ||
| 101 | - } | ||
| 102 | - } | ||
| 103 | 61 | ||
| 104 | - /** | ||
| 105 | - * 没适配上 为走错通道,走错通道直接给指令,不走本地验放. | ||
| 106 | - * 为提高抬杆效率 | ||
| 107 | - */ | ||
| 108 | - //todo:走错通道的回执指令处理 | ||
| 109 | - log.info("[rightChnelCheck]-走错通道"); | ||
| 110 | - CommandClient.Client(info,"G2-走错通道,未找到通道对应申报信息,或二维码信息不一致"); | ||
| 111 | - record(info,false,"走错通道-[SEQN]:"+info.getSeqno(),null); | ||
| 112 | - } | ||
| 113 | - /** | ||
| 114 | - * 有对应卡口进出类型的配置. | ||
| 115 | - * 说明没有金二配置 | ||
| 116 | - * 走本地 | ||
| 117 | - */ | ||
| 118 | - else{ | ||
| 119 | - //没有金二配置,走本地 | ||
| 120 | -// X21Local(info); | ||
| 121 | - log.info("[G2Notice-CHECK]-通道[{}]没有G2配置",info.getChnlno()) | ||
| 122 | - } | ||
| 123 | - }else { | ||
| 124 | - | ||
| 125 | - //没有金二配置,走本地 | ||
| 126 | -// X21Local(info); | ||
| 127 | - log.info("[G2Notice-CHECK]-通道[{}]没有G2配置",info.getChnlno()) | ||
| 128 | - } | ||
| 129 | - | ||
| 130 | - } | ||
| 131 | 62 | ||
| 132 | void record(GatherInfo info, boolean result, String reason, LandBusinessTypeList landBusinessTypeList){ | 63 | void record(GatherInfo info, boolean result, String reason, LandBusinessTypeList landBusinessTypeList){ |
| 133 | ApplicationContext context = getContext(); | 64 | ApplicationContext context = getContext(); |
| 1 | +package com.sy.groovy | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSON | ||
| 4 | +import com.alibaba.fastjson.JSONArray | ||
| 5 | +import com.alibaba.fastjson.JSONObject | ||
| 6 | +import com.sy.model.G2X81Template | ||
| 7 | +import com.sy.model.GatherInfo | ||
| 8 | +import com.sy.model.LandBusinessTypeList | ||
| 9 | +import com.sy.model.LandRoadVe | ||
| 10 | +import com.sy.response.ResultJson | ||
| 11 | +import com.sy.service.CommandLogService | ||
| 12 | +import com.sy.service.RedisService | ||
| 13 | +import com.sy.service.feigin.G2X81FeignService | ||
| 14 | +import com.sy.service.feigin.StationManageFeignService | ||
| 15 | +import com.sy.socket.CommandClient | ||
| 16 | +import org.apache.commons.lang.StringUtils | ||
| 17 | +import org.basis.enhance.groovy.entity.ExecuteParams | ||
| 18 | +import org.slf4j.Logger | ||
| 19 | +import org.slf4j.LoggerFactory | ||
| 20 | +import org.springframework.context.ApplicationContext | ||
| 21 | + | ||
| 22 | +import java.nio.charset.Charset | ||
| 23 | +import java.text.SimpleDateFormat | ||
| 24 | + | ||
| 25 | +/** | ||
| 26 | + * 金二特殊区域验放 | ||
| 27 | + * 必须返回false 为异步验放 由X82判定抬杆 ,验放排序放最后 | ||
| 28 | + * todo:需要改造成验放型.返回true false,某些业务类型需要强制走金二验放,海关智能卡口配置端也是根据通道进行配置的 | ||
| 29 | + */ | ||
| 30 | +class G2X81Notice extends Script implements ChannelCheckScript{ | ||
| 31 | + private final Logger log = LoggerFactory.getLogger(getClass()); | ||
| 32 | + @Override | ||
| 33 | + Object run() { | ||
| 34 | + return null | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + | ||
| 38 | + /** | ||
| 39 | + * 此接口不做抬杆判定,只做报文通知,返回只有false | ||
| 40 | + */ | ||
| 41 | + Boolean check(ExecuteParams executeParams) { | ||
| 42 | + try{ | ||
| 43 | + /** | ||
| 44 | + * X21通道信息与流转信息比对 | ||
| 45 | + * 1. 从缓存获取车辆进出场申请信息,有流转信息再进行通道对碰. | ||
| 46 | + * 无流转信息则说明缓存失效或者二维码不对. | ||
| 47 | + */ | ||
| 48 | + GatherInfo info = (GatherInfo) executeParams.get("GatherInfo"); | ||
| 49 | + LandRoadVe ve = (LandRoadVe) executeParams.get("LandRoadVe"); | ||
| 50 | + ApplicationContext context = getContext(); | ||
| 51 | + G2X81FeignService g2X81FeignService = context.getBean(G2X81FeignService.class); | ||
| 52 | + | ||
| 53 | + if (info!=null){ | ||
| 54 | + //缓存X21 的 seqn 需要作为异步X82回执验放时用到的信息 | ||
| 55 | + cacheWithSeqno(info); | ||
| 56 | + log.info("[G2-X81-CACHE]-车辆[{}]特殊区域流转已缓存[SEQNO]:{}",info.getVename(),info.getSeqno()); | ||
| 57 | + //将X21报文转换成X81格式 | ||
| 58 | + String xmlStr = x22TransToX81(info,ve); | ||
| 59 | + //调用本地X81申报接口 | ||
| 60 | + ResultJson g2ResultJson = g2X81FeignService.send(xmlStr); | ||
| 61 | + log.info("[G2-X81-API-RSP]-金二通知接口返回,code:{},message:{},err:{}",g2ResultJson.getCode(),g2ResultJson.getMsg(),g2ResultJson.getError()); | ||
| 62 | + if ("200".equals(g2ResultJson.getCode())){ | ||
| 63 | + record(info,true,"已转金二验放-[SEQN]:"+info.getSeqno(),null); | ||
| 64 | + log.info("[G2-ROUTER-SUCCESS]-已转金二验放路由成功-规则验放成功-需要忽略下方报错,SEQNO:{}",info.getSeqno()); | ||
| 65 | + }else{ | ||
| 66 | + log.error("[G2-X81-API-ERR]-金二路由接口访问出错") | ||
| 67 | + } | ||
| 68 | + }else { | ||
| 69 | + record(info,true,"金二验放失败,未有相关通道流转申请信息",null); | ||
| 70 | + CommandClient.Client(info,"金二验放失败,未有相关通道流转申请信息"); | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + }catch (Exception e){ | ||
| 74 | + e.printStackTrace(); | ||
| 75 | + log.error("[G2-ROUTER-ERR]:",e); | ||
| 76 | + } | ||
| 77 | + return false; | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + // 获取spring容器 | ||
| 81 | + ApplicationContext getContext() { | ||
| 82 | + // 获取spring IOC容器 | ||
| 83 | + ApplicationContext context = applicationContext; | ||
| 84 | + return context; | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + | ||
| 88 | + | ||
| 89 | + void record(GatherInfo info, boolean result, String reason, LandBusinessTypeList landBusinessTypeList){ | ||
| 90 | + ApplicationContext context = getContext(); | ||
| 91 | + CommandLogService commandLogService = context.getBean(CommandLogService.class); | ||
| 92 | + commandLogService.commandlog(info,result,reason,landBusinessTypeList,null,0.0,0.0,0.0,0.0); | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + String x22TransToX81(GatherInfo gatherInfo,LandRoadVe ve){ | ||
| 96 | + log.info("[SEQN]-处理X21报文:{}",gatherInfo.getSeqno()); | ||
| 97 | + //当前时间作为X81申报时间 | ||
| 98 | + final SimpleDateFormat sdf = new SimpleDateFormat( | ||
| 99 | + "yyyy-MM-dd HH:mm:ss"); | ||
| 100 | + final String startTime = sdf.format(new Date()); | ||
| 101 | + | ||
| 102 | + //金二场站ID与通道ID替换 | ||
| 103 | + ApplicationContext context = getContext(); | ||
| 104 | + StationManageFeignService stationManageFeignService = context.getBean(StationManageFeignService.class); | ||
| 105 | + ResultJson resultJson = stationManageFeignService.getChanels(gatherInfo.getChnlno(),1,1); | ||
| 106 | + | ||
| 107 | + if ("200".equals(resultJson.getCode())){ | ||
| 108 | + JSONObject jsonObject = resultJson.getData(); | ||
| 109 | + int total = jsonObject.getInteger("total"); | ||
| 110 | + if (total>0){ | ||
| 111 | + JSONArray jsonArray = jsonObject.getJSONArray("list"); | ||
| 112 | + JSONObject chanel = jsonArray.getJSONObject(0); | ||
| 113 | + String channelG2 = chanel.getString("channelG2"); | ||
| 114 | + log.info("[G2-CHANNEL]-{}",channelG2); | ||
| 115 | + JSONObject yard = chanel.getJSONObject("yard"); | ||
| 116 | + String stationG2 = yard.getString("stationIdG2"); | ||
| 117 | + log.info("[G2-YARD]-{}",stationG2); | ||
| 118 | + | ||
| 119 | + log.info("[G2-TEMPLATE]-{}",G2X81Template.template) | ||
| 120 | + String x81XML= G2X81Template.template.replace("#{ie_flag}",gatherInfo.getIetype()) | ||
| 121 | + .replace("#{area_id}",stationG2) | ||
| 122 | + .replace("#{chnl_no}",channelG2) | ||
| 123 | + .replace("#{session_id}",gatherInfo.getSeqno()) | ||
| 124 | + .replace("#{ve_license_no}",gatherInfo.getVename()) | ||
| 125 | + .replace("#{gross_wt}",gatherInfo.getGrosswt().toString()) | ||
| 126 | + .replace("#{rfid_id}",gatherInfo.getCarecno()) | ||
| 127 | + .replace("#{ve_wt}",ve.getSelfWt()) | ||
| 128 | + .replace("#{operate_time}",startTime); | ||
| 129 | + log.info("[X21-TO-X81]-{}",x81XML); | ||
| 130 | + String mqXMLStr = mqXMLMake(x81XML,gatherInfo.getSeqno(),startTime); | ||
| 131 | + log.info("[X21-TO-X81]-加密后的报文为:{}",mqXMLStr) | ||
| 132 | + return mqXMLStr; | ||
| 133 | + | ||
| 134 | + }else { | ||
| 135 | + throw new Exception("未获取到通道金二配置信息") | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + }else { | ||
| 139 | + log.error("场站管理服务接口访问失败") | ||
| 140 | + } | ||
| 141 | + | ||
| 142 | + return ""; | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + String mqXMLMake(String xmlStr,String copMsgId,String creatTime){ | ||
| 146 | + String base64EncodeToString = Base64.getEncoder().encodeToString(xmlStr.getBytes(Charset.forName("utf-8"))); | ||
| 147 | + log.info("[SEND-BASE64-ENCODE]-{}",base64EncodeToString) | ||
| 148 | + | ||
| 149 | + return G2X81Template.mq_template.replace("#{CopMsgId}",copMsgId) | ||
| 150 | + .replace("#{CreatTime}",creatTime) | ||
| 151 | + .replace("#{Data}",base64EncodeToString); | ||
| 152 | + } | ||
| 153 | + | ||
| 154 | + void cacheWithSeqno(GatherInfo info){ | ||
| 155 | + ApplicationContext context = getContext(); | ||
| 156 | + RedisService redisService = context.getBean(RedisService.class); | ||
| 157 | + if (info!=null && StringUtils.isNotEmpty(info.getSeqno())) { | ||
| 158 | + redisService.set(info.getSeqno(), JSON.toJSONString(info),60*60*24*3); | ||
| 159 | + } | ||
| 160 | + } | ||
| 161 | +} |
| 1 | +package com.sy.handle; | ||
| 2 | + | ||
| 3 | +import com.sy.model.DxpMsg; | ||
| 4 | +import com.sy.model.GatherInfo; | ||
| 5 | +import com.sy.model.X82Feedback; | ||
| 6 | +import com.sy.service.X82Service; | ||
| 7 | +import com.sy.service.router.MessageRouterG2; | ||
| 8 | +import com.sy.socket.CommandClient; | ||
| 9 | +import com.sy.utils.Base64Tool; | ||
| 10 | +import lombok.extern.slf4j.Slf4j; | ||
| 11 | +import org.apache.commons.lang.StringUtils; | ||
| 12 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 13 | +import org.springframework.stereotype.Component; | ||
| 14 | + | ||
| 15 | +@Component | ||
| 16 | +@Slf4j | ||
| 17 | +public class G2FeedBackHandel extends Thread { | ||
| 18 | + | ||
| 19 | + private String feedBack; | ||
| 20 | + | ||
| 21 | + private X82Service x82Service; | ||
| 22 | + | ||
| 23 | + private MessageRouterG2 messageRouterG2; | ||
| 24 | + | ||
| 25 | + public X82Service getX82Service() { | ||
| 26 | + return x82Service; | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + public void setX82Service(X82Service x82Service) { | ||
| 30 | + this.x82Service = x82Service; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + public MessageRouterG2 getMessageRouterG2() { | ||
| 34 | + return messageRouterG2; | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + public void setMessageRouterG2(MessageRouterG2 messageRouterG2) { | ||
| 38 | + this.messageRouterG2 = messageRouterG2; | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + public String getFeedBack() { | ||
| 42 | + return feedBack; | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + public void setFeedBack(String feedBack) { | ||
| 46 | + this.feedBack = feedBack; | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + @Override | ||
| 50 | + public void run() { | ||
| 51 | + try { | ||
| 52 | + DxpMsg dxpMsg = x82Service.analysis(feedBack); | ||
| 53 | + String data = dxpMsg.getData(); | ||
| 54 | + //解密BASE64 得到X82报文 | ||
| 55 | + String x82Str = Base64Tool.decodeUtf8ToUtf8(data); | ||
| 56 | + //解析报文 | ||
| 57 | + X82Feedback x82Feedback = x82Service.x82Analysis(x82Str); | ||
| 58 | + String seqno = x82Feedback.getSessionId(); | ||
| 59 | + GatherInfo gatherInfo = x82Service.readCacheWithSeqno(seqno); | ||
| 60 | + | ||
| 61 | + //todo: X82Feedback 与 X21 实体类转换 | ||
| 62 | + if (StringUtils.isNotEmpty(x82Feedback.getChannelNo())){ | ||
| 63 | + if (gatherInfo!=null){ | ||
| 64 | + //得到sessionid ,申报出去的X81sessionId=seqno ,一去一回sessionId一样 | ||
| 65 | + if (x82Service.X82ReleaseCheck(x82Feedback)){ | ||
| 66 | + //放行及核销 | ||
| 67 | + messageRouterG2.route(gatherInfo,x82Feedback.getOpHint()); | ||
| 68 | + }else{ | ||
| 69 | + log.info("[G2-CHECK-FAILD]-金二验放失败,不予放行"); | ||
| 70 | + messageRouterG2.faild(gatherInfo,x82Feedback.getOpHint()); | ||
| 71 | + } | ||
| 72 | + }else { | ||
| 73 | + GatherInfo gatherInfo1 = x82Service.X82FeedBackToX21GatherInfo(x82Feedback); | ||
| 74 | + messageRouterG2.faild(gatherInfo1,x82Feedback.getOpHint()); | ||
| 75 | + } | ||
| 76 | + }else { | ||
| 77 | + log.error("[G2-FEEDBACK-XML-ERR]-金二验放未知错误,源报文:{},解密报文:{}",feedBack,x82Str); | ||
| 78 | + } | ||
| 79 | + }catch (Exception e){ | ||
| 80 | + log.error("金二回执处理线程出错",e); | ||
| 81 | + } | ||
| 82 | + } | ||
| 83 | +} |
src/main/java/com/sy/model/DxpMsg.java
0 → 100644
| 1 | +package com.sy.model; | ||
| 2 | + | ||
| 3 | +import com.thoughtworks.xstream.annotations.XStreamAlias; | ||
| 4 | +import com.thoughtworks.xstream.annotations.XStreamImplicit; | ||
| 5 | + | ||
| 6 | +import java.util.List; | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +@XStreamAlias("DxpMsg") | ||
| 10 | +public class DxpMsg { | ||
| 11 | + | ||
| 12 | + @XStreamAlias("TransInfo") | ||
| 13 | + private TransInfo transInfo; | ||
| 14 | + | ||
| 15 | + @XStreamAlias("Data") | ||
| 16 | + private String data; | ||
| 17 | + | ||
| 18 | + @XStreamAlias("AddInfo") | ||
| 19 | + private AddInfo addInfo; | ||
| 20 | + | ||
| 21 | + public TransInfo getTransInfo() { | ||
| 22 | + return transInfo; | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + public void setTransInfo(TransInfo transInfo) { | ||
| 26 | + this.transInfo = transInfo; | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + public String getData() { | ||
| 30 | + return data; | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + public void setData(String data) { | ||
| 34 | + this.data = data; | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + public AddInfo getAddInfo() { | ||
| 38 | + return addInfo; | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + public void setAddInfo(AddInfo addInfo) { | ||
| 42 | + this.addInfo = addInfo; | ||
| 43 | + } | ||
| 44 | +} | ||
| 45 | + | ||
| 46 | +class TransInfo{ | ||
| 47 | + | ||
| 48 | + @XStreamAlias("CopMsgId") | ||
| 49 | + private String copMsgId; | ||
| 50 | + | ||
| 51 | + @XStreamAlias("SenderId") | ||
| 52 | + private String senderId; | ||
| 53 | + | ||
| 54 | + @XStreamAlias("ReceiverIds") | ||
| 55 | + private ReceiverIds receiverIds; | ||
| 56 | + | ||
| 57 | + @XStreamAlias("CreatTime") | ||
| 58 | + private String creatTime; | ||
| 59 | + | ||
| 60 | + @XStreamAlias("MsgType") | ||
| 61 | + private String msgType; | ||
| 62 | + | ||
| 63 | + public String getCopMsgId() { | ||
| 64 | + return copMsgId; | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + public void setCopMsgId(String copMsgId) { | ||
| 68 | + this.copMsgId = copMsgId; | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + public String getSenderId() { | ||
| 72 | + return senderId; | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + public void setSenderId(String senderId) { | ||
| 76 | + this.senderId = senderId; | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + public ReceiverIds getReceiverIds() { | ||
| 80 | + return receiverIds; | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + public void setReceiverIds(ReceiverIds receiverIds) { | ||
| 84 | + this.receiverIds = receiverIds; | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + public String getCreatTime() { | ||
| 88 | + return creatTime; | ||
| 89 | + } | ||
| 90 | + | ||
| 91 | + public void setCreatTime(String creatTime) { | ||
| 92 | + this.creatTime = creatTime; | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + public String getMsgType() { | ||
| 96 | + return msgType; | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + public void setMsgType(String msgType) { | ||
| 100 | + this.msgType = msgType; | ||
| 101 | + } | ||
| 102 | +} | ||
| 103 | + | ||
| 104 | +class ReceiverIds{ | ||
| 105 | + | ||
| 106 | + @XStreamImplicit(itemFieldName = "ReceiverId") | ||
| 107 | + private List<String> receiverId; | ||
| 108 | + | ||
| 109 | + public List<String> getReceiverId() { | ||
| 110 | + return receiverId; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + public void setReceiverId(List<String> receiverId) { | ||
| 114 | + this.receiverId = receiverId; | ||
| 115 | + } | ||
| 116 | +} | ||
| 117 | + | ||
| 118 | +class AddInfo{ | ||
| 119 | + @XStreamAlias("FileName") | ||
| 120 | + private String fileName; | ||
| 121 | + | ||
| 122 | + public String getFileName() { | ||
| 123 | + return fileName; | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + public void setFileName(String fileName) { | ||
| 127 | + this.fileName = fileName; | ||
| 128 | + } | ||
| 129 | +} |
| 1 | +package com.sy.model; | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * 金二X81报文xml模板 | ||
| 5 | + */ | ||
| 6 | +public class G2X81Template { | ||
| 7 | + /** | ||
| 8 | + * 金二X81报文封装模板 | ||
| 9 | + */ | ||
| 10 | + public static final String template= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + | ||
| 11 | + "<GATHER_INFO xmlns=\"http://rpb.customs.gov.cn/common/FrontEndSchemas/\"\n" + | ||
| 12 | + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" + | ||
| 13 | + " xsi:schemaLocation=\"http://rpb.customs.gov.cn/common/FrontEndSchemas/\">\n" + | ||
| 14 | + " <I_E_FLAG>#{ie_flag}</I_E_FLAG>\n" + | ||
| 15 | + " <AREA_ID>#{area_id}</AREA_ID>\n" + | ||
| 16 | + " <CHNL_NO>#{chnl_no}</CHNL_NO>\n" + | ||
| 17 | + " <GETHER_MODE>A</GETHER_MODE>\n" + | ||
| 18 | + " <SESSION_ID>#{session_id}</SESSION_ID>\n" + | ||
| 19 | + " <IC_INFO>\n" + | ||
| 20 | + " <IC_ID></IC_ID>\n" + | ||
| 21 | + " <IC_NO></IC_NO>\n" + | ||
| 22 | + " <IC_TYPE></IC_TYPE>\n" + | ||
| 23 | + " <IC_EXTENDED_CONTENT></IC_EXTENDED_CONTENT>\n" + | ||
| 24 | + " </IC_INFO>\n" + | ||
| 25 | + " <FORM_INFO>\n" + | ||
| 26 | + " <FORM_TYPE></FORM_TYPE>\n" + | ||
| 27 | + " <FORM_ID></FORM_ID>\n" + | ||
| 28 | + " </FORM_INFO>\n" + | ||
| 29 | + " <VE_LICENSE_NO>#{ve_license_no}</VE_LICENSE_NO>\n" + | ||
| 30 | + " <GROSS_WT>#{gross_wt}</GROSS_WT>\n" + | ||
| 31 | + " <VE_RFID>\n" + | ||
| 32 | + " <RFID_ID>#{rfid_id}</RFID_ID>\n" + | ||
| 33 | + " <VE_LICENSE_NO>#{ve_license_no}</VE_LICENSE_NO>\n" + | ||
| 34 | + " <VE_CUSTOMS_NO></VE_CUSTOMS_NO>\n" + | ||
| 35 | + " <VE_WT>#{ve_wt}</VE_WT>\n" + | ||
| 36 | + " <VE_COMPANY></VE_COMPANY>\n" + | ||
| 37 | + " <VE_PERFORMANCE>1</VE_PERFORMANCE>\n" + | ||
| 38 | + " </VE_RFID>\n" + | ||
| 39 | + " <OPERATE_TIME>#{operate_time}</OPERATE_TIME>\n" + | ||
| 40 | + "</GATHER_INFO>\n"; | ||
| 41 | + private static final String demo="<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + | ||
| 42 | + "<GATHER_INFO xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" + | ||
| 43 | + "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://rpb.customs.gov.cn/common/FrontEndSchemas/\">\n" + | ||
| 44 | + "<I_E_FLAG>I</I_E_FLAG>\n" + | ||
| 45 | + "<AREA_ID>5301HG</AREA_ID>\n" + | ||
| 46 | + "<CHNL_NO>53010HITest101</CHNL_NO>\n" + | ||
| 47 | + "<GETHER_MODE>B</GETHER_MODE>\n" + | ||
| 48 | + "<SESSION_ID>20180130173410733</SESSION_ID>\n" + | ||
| 49 | + " <VE_RFID>\n" + | ||
| 50 | + "<RFID_ID>E0040000BA0EE801</RFID_ID>\n" + | ||
| 51 | + "</VE_RFID>\n" + | ||
| 52 | + "<OPERATOR_ID>5399990</OPERATOR_ID>\n" + | ||
| 53 | + "<OPERATE_TIME>2016-11-24 11:31:52</OPERATE_TIME>\n" + | ||
| 54 | + "</GATHER_INFO>"; | ||
| 55 | + | ||
| 56 | + /** | ||
| 57 | + * 发送报文封装模板 | ||
| 58 | + */ | ||
| 59 | + public static final String mq_template = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + | ||
| 60 | + "<DxpMsg xmlns=\"http://www.chinaport.gov.cn/dxp\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ver=\"1.0\">\n" + | ||
| 61 | + " <TransInfo>\n" + | ||
| 62 | + " <CopMsgId>#{CopMsgId}</CopMsgId>\n" + | ||
| 63 | + " <SenderId>GDXPKK0000000002</SenderId>\n" + | ||
| 64 | + " <MsgType>JCKK</MsgType>\n" + | ||
| 65 | + " <CreatTime>#{CreatTime}</CreatTime>\n" + | ||
| 66 | + " <ReceiverIds>\n" + | ||
| 67 | + " <ReceiverId>GJCKK00000000001</ReceiverId>\n" + | ||
| 68 | + " </ReceiverIds>\n" + | ||
| 69 | + " </TransInfo>\n" + | ||
| 70 | + " <Data>#{Data}</Data>\n" + | ||
| 71 | + "</DxpMsg>"; | ||
| 72 | +} |
src/main/java/com/sy/model/X82Feedback.java
0 → 100644
| 1 | +package com.sy.model; | ||
| 2 | + | ||
| 3 | + | ||
| 4 | +import com.thoughtworks.xstream.annotations.XStreamAlias; | ||
| 5 | + | ||
| 6 | +@XStreamAlias("GATHER_FEEDBACK") | ||
| 7 | +public class X82Feedback { | ||
| 8 | + | ||
| 9 | + @XStreamAlias("AREA_ID") | ||
| 10 | + // 区域ID | ||
| 11 | + private String areaId; | ||
| 12 | + | ||
| 13 | + @XStreamAlias("CHNL_NO") | ||
| 14 | + // 渠道号 | ||
| 15 | + private String channelNo; | ||
| 16 | + | ||
| 17 | + @XStreamAlias("SESSION_ID") | ||
| 18 | + // 会话ID | ||
| 19 | + private String sessionId; | ||
| 20 | + | ||
| 21 | + @XStreamAlias("RELLIST_TYPE") | ||
| 22 | + // 关联列表类型 | ||
| 23 | + private String relListType; | ||
| 24 | + | ||
| 25 | + @XStreamAlias("RELLIST_ID_TYPE") | ||
| 26 | + // 关联列表ID类型 | ||
| 27 | + private String relListIdType; | ||
| 28 | + | ||
| 29 | + @XStreamAlias("RELLIST_ID") | ||
| 30 | + // 关联列表ID | ||
| 31 | + private String relListId; | ||
| 32 | + | ||
| 33 | + @XStreamAlias("FEEDBACK_TIME") | ||
| 34 | + // 反馈时间 | ||
| 35 | + private String feedbackTime; | ||
| 36 | + | ||
| 37 | + @XStreamAlias("CHECK_RESULT") | ||
| 38 | + // 检查结果 | ||
| 39 | + private String checkResult; | ||
| 40 | + | ||
| 41 | + @XStreamAlias("INSTRUCTION") | ||
| 42 | + // 指令 | ||
| 43 | + private String instruction; | ||
| 44 | + | ||
| 45 | + @XStreamAlias("PROC_ERROR_CODE") | ||
| 46 | + // 处理错误代码 | ||
| 47 | + private int procErrorCode; | ||
| 48 | + | ||
| 49 | + @XStreamAlias("PROC_ERROR_DESCRIPTION") | ||
| 50 | + // 处理错误描述 | ||
| 51 | + private String procErrorDescription; | ||
| 52 | + | ||
| 53 | + @XStreamAlias("TECH_ERROR_CODE") | ||
| 54 | + // 技术错误代码 | ||
| 55 | + private int techErrorCode; | ||
| 56 | + | ||
| 57 | + @XStreamAlias("TECH_ERROR_DESCRIPTION") | ||
| 58 | + // 技术错误描述 | ||
| 59 | + private String techErrorDescription; | ||
| 60 | + | ||
| 61 | + @XStreamAlias("IC_INFO") | ||
| 62 | + // IC信息 | ||
| 63 | + private ICInfo icInfo; | ||
| 64 | + | ||
| 65 | + @XStreamAlias("VE_INFO") | ||
| 66 | + // 车辆信息 | ||
| 67 | + private VEInfo veInfo; | ||
| 68 | + | ||
| 69 | + @XStreamAlias("CONTA_ID") | ||
| 70 | + // 货柜ID | ||
| 71 | + private String contaId; | ||
| 72 | + | ||
| 73 | + @XStreamAlias("ESEAL_ID") | ||
| 74 | + // 电子封条ID | ||
| 75 | + private String eSealId; | ||
| 76 | + | ||
| 77 | + @XStreamAlias("SEAL_ID") | ||
| 78 | + // 封条ID | ||
| 79 | + private String sealId; | ||
| 80 | + | ||
| 81 | + @XStreamAlias("FORM_INFO") | ||
| 82 | + // 表单信息 | ||
| 83 | + private FormInfo formInfo; | ||
| 84 | + | ||
| 85 | + @XStreamAlias("PACK_NO") | ||
| 86 | + // 包裹数量 | ||
| 87 | + private int packNo; | ||
| 88 | + | ||
| 89 | + @XStreamAlias("DECL_PACK") | ||
| 90 | + // 申报包裹数量 | ||
| 91 | + private int declPack; | ||
| 92 | + | ||
| 93 | + @XStreamAlias("DECL_GOODS_WEIGHT") | ||
| 94 | + // 申报货物重量 | ||
| 95 | + private double declGoodsWeight; | ||
| 96 | + | ||
| 97 | + @XStreamAlias("OP_HINT") | ||
| 98 | + // 操作提示 | ||
| 99 | + private String opHint; | ||
| 100 | + | ||
| 101 | + @XStreamAlias("LED_HINT") | ||
| 102 | + // LED提示 | ||
| 103 | + private String ledHint; | ||
| 104 | + | ||
| 105 | + @XStreamAlias("EXTENDED_CONTENT") | ||
| 106 | + // 扩展内容 | ||
| 107 | + private String extendedContent; | ||
| 108 | + | ||
| 109 | + public String getAreaId() { | ||
| 110 | + return areaId; | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + public void setAreaId(String areaId) { | ||
| 114 | + this.areaId = areaId; | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + public String getChannelNo() { | ||
| 118 | + return channelNo; | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + public void setChannelNo(String channelNo) { | ||
| 122 | + this.channelNo = channelNo; | ||
| 123 | + } | ||
| 124 | + | ||
| 125 | + public String getSessionId() { | ||
| 126 | + return sessionId; | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + public void setSessionId(String sessionId) { | ||
| 130 | + this.sessionId = sessionId; | ||
| 131 | + } | ||
| 132 | + | ||
| 133 | + public String getRelListType() { | ||
| 134 | + return relListType; | ||
| 135 | + } | ||
| 136 | + | ||
| 137 | + public void setRelListType(String relListType) { | ||
| 138 | + this.relListType = relListType; | ||
| 139 | + } | ||
| 140 | + | ||
| 141 | + public String getRelListIdType() { | ||
| 142 | + return relListIdType; | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + public void setRelListIdType(String relListIdType) { | ||
| 146 | + this.relListIdType = relListIdType; | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + public String getRelListId() { | ||
| 150 | + return relListId; | ||
| 151 | + } | ||
| 152 | + | ||
| 153 | + public void setRelListId(String relListId) { | ||
| 154 | + this.relListId = relListId; | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + public String getFeedbackTime() { | ||
| 158 | + return feedbackTime; | ||
| 159 | + } | ||
| 160 | + | ||
| 161 | + public void setFeedbackTime(String feedbackTime) { | ||
| 162 | + this.feedbackTime = feedbackTime; | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + public String getCheckResult() { | ||
| 166 | + return checkResult; | ||
| 167 | + } | ||
| 168 | + | ||
| 169 | + public void setCheckResult(String checkResult) { | ||
| 170 | + this.checkResult = checkResult; | ||
| 171 | + } | ||
| 172 | + | ||
| 173 | + public String getInstruction() { | ||
| 174 | + return instruction; | ||
| 175 | + } | ||
| 176 | + | ||
| 177 | + public void setInstruction(String instruction) { | ||
| 178 | + this.instruction = instruction; | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + public int getProcErrorCode() { | ||
| 182 | + return procErrorCode; | ||
| 183 | + } | ||
| 184 | + | ||
| 185 | + public void setProcErrorCode(int procErrorCode) { | ||
| 186 | + this.procErrorCode = procErrorCode; | ||
| 187 | + } | ||
| 188 | + | ||
| 189 | + public String getProcErrorDescription() { | ||
| 190 | + return procErrorDescription; | ||
| 191 | + } | ||
| 192 | + | ||
| 193 | + public void setProcErrorDescription(String procErrorDescription) { | ||
| 194 | + this.procErrorDescription = procErrorDescription; | ||
| 195 | + } | ||
| 196 | + | ||
| 197 | + public int getTechErrorCode() { | ||
| 198 | + return techErrorCode; | ||
| 199 | + } | ||
| 200 | + | ||
| 201 | + public void setTechErrorCode(int techErrorCode) { | ||
| 202 | + this.techErrorCode = techErrorCode; | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + public String getTechErrorDescription() { | ||
| 206 | + return techErrorDescription; | ||
| 207 | + } | ||
| 208 | + | ||
| 209 | + public void setTechErrorDescription(String techErrorDescription) { | ||
| 210 | + this.techErrorDescription = techErrorDescription; | ||
| 211 | + } | ||
| 212 | + | ||
| 213 | + public ICInfo getIcInfo() { | ||
| 214 | + return icInfo; | ||
| 215 | + } | ||
| 216 | + | ||
| 217 | + public void setIcInfo(ICInfo icInfo) { | ||
| 218 | + this.icInfo = icInfo; | ||
| 219 | + } | ||
| 220 | + | ||
| 221 | + public VEInfo getVeInfo() { | ||
| 222 | + return veInfo; | ||
| 223 | + } | ||
| 224 | + | ||
| 225 | + public void setVeInfo(VEInfo veInfo) { | ||
| 226 | + this.veInfo = veInfo; | ||
| 227 | + } | ||
| 228 | + | ||
| 229 | + public String getContaId() { | ||
| 230 | + return contaId; | ||
| 231 | + } | ||
| 232 | + | ||
| 233 | + public void setContaId(String contaId) { | ||
| 234 | + this.contaId = contaId; | ||
| 235 | + } | ||
| 236 | + | ||
| 237 | + public String geteSealId() { | ||
| 238 | + return eSealId; | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | + public void seteSealId(String eSealId) { | ||
| 242 | + this.eSealId = eSealId; | ||
| 243 | + } | ||
| 244 | + | ||
| 245 | + public String getSealId() { | ||
| 246 | + return sealId; | ||
| 247 | + } | ||
| 248 | + | ||
| 249 | + public void setSealId(String sealId) { | ||
| 250 | + this.sealId = sealId; | ||
| 251 | + } | ||
| 252 | + | ||
| 253 | + public FormInfo getFormInfo() { | ||
| 254 | + return formInfo; | ||
| 255 | + } | ||
| 256 | + | ||
| 257 | + public void setFormInfo(FormInfo formInfo) { | ||
| 258 | + this.formInfo = formInfo; | ||
| 259 | + } | ||
| 260 | + | ||
| 261 | + public int getPackNo() { | ||
| 262 | + return packNo; | ||
| 263 | + } | ||
| 264 | + | ||
| 265 | + public void setPackNo(int packNo) { | ||
| 266 | + this.packNo = packNo; | ||
| 267 | + } | ||
| 268 | + | ||
| 269 | + public int getDeclPack() { | ||
| 270 | + return declPack; | ||
| 271 | + } | ||
| 272 | + | ||
| 273 | + public void setDeclPack(int declPack) { | ||
| 274 | + this.declPack = declPack; | ||
| 275 | + } | ||
| 276 | + | ||
| 277 | + public double getDeclGoodsWeight() { | ||
| 278 | + return declGoodsWeight; | ||
| 279 | + } | ||
| 280 | + | ||
| 281 | + public void setDeclGoodsWeight(double declGoodsWeight) { | ||
| 282 | + this.declGoodsWeight = declGoodsWeight; | ||
| 283 | + } | ||
| 284 | + | ||
| 285 | + public String getOpHint() { | ||
| 286 | + return opHint; | ||
| 287 | + } | ||
| 288 | + | ||
| 289 | + public void setOpHint(String opHint) { | ||
| 290 | + this.opHint = opHint; | ||
| 291 | + } | ||
| 292 | + | ||
| 293 | + public String getLedHint() { | ||
| 294 | + return ledHint; | ||
| 295 | + } | ||
| 296 | + | ||
| 297 | + public void setLedHint(String ledHint) { | ||
| 298 | + this.ledHint = ledHint; | ||
| 299 | + } | ||
| 300 | + | ||
| 301 | + public String getExtendedContent() { | ||
| 302 | + return extendedContent; | ||
| 303 | + } | ||
| 304 | + | ||
| 305 | + public void setExtendedContent(String extendedContent) { | ||
| 306 | + this.extendedContent = extendedContent; | ||
| 307 | + } | ||
| 308 | +} | ||
| 309 | + | ||
| 310 | +@XStreamAlias("IC_INFO") | ||
| 311 | +class ICInfo { | ||
| 312 | + @XStreamAlias("IC_ID") | ||
| 313 | + // IC ID | ||
| 314 | + private String icId; | ||
| 315 | + | ||
| 316 | + @XStreamAlias("IC_NO") | ||
| 317 | + // IC编号 | ||
| 318 | + private String icNo; | ||
| 319 | + | ||
| 320 | + @XStreamAlias("IC_TYPE") | ||
| 321 | + // IC类型 | ||
| 322 | + private String icType; | ||
| 323 | + | ||
| 324 | + @XStreamAlias("IC_EXTENDED_CONTENT") | ||
| 325 | + // IC扩展内容 | ||
| 326 | + private String icExtendedContent; | ||
| 327 | + | ||
| 328 | + public String getIcId() { | ||
| 329 | + return icId; | ||
| 330 | + } | ||
| 331 | + | ||
| 332 | + public void setIcId(String icId) { | ||
| 333 | + this.icId = icId; | ||
| 334 | + } | ||
| 335 | + | ||
| 336 | + public String getIcNo() { | ||
| 337 | + return icNo; | ||
| 338 | + } | ||
| 339 | + | ||
| 340 | + public void setIcNo(String icNo) { | ||
| 341 | + this.icNo = icNo; | ||
| 342 | + } | ||
| 343 | + | ||
| 344 | + public String getIcType() { | ||
| 345 | + return icType; | ||
| 346 | + } | ||
| 347 | + | ||
| 348 | + public void setIcType(String icType) { | ||
| 349 | + this.icType = icType; | ||
| 350 | + } | ||
| 351 | + | ||
| 352 | + public String getIcExtendedContent() { | ||
| 353 | + return icExtendedContent; | ||
| 354 | + } | ||
| 355 | + | ||
| 356 | + public void setIcExtendedContent(String icExtendedContent) { | ||
| 357 | + this.icExtendedContent = icExtendedContent; | ||
| 358 | + } | ||
| 359 | +} | ||
| 360 | + | ||
| 361 | +@XStreamAlias("VE_INFO") | ||
| 362 | +class VEInfo { | ||
| 363 | + @XStreamAlias("VE_CUSTOMS_NO") | ||
| 364 | + // 车辆海关编号 | ||
| 365 | + private String veCustomsNo; | ||
| 366 | + | ||
| 367 | + @XStreamAlias("VE_LICENSE_NO") | ||
| 368 | + // 车辆牌照号码 | ||
| 369 | + private String veLicenseNo; | ||
| 370 | + | ||
| 371 | + @XStreamAlias("VE_LICENSE_NO2") | ||
| 372 | + // 车辆牌照号码2 | ||
| 373 | + private String veLicenseNo2; | ||
| 374 | + | ||
| 375 | + @XStreamAlias("DR_CUSTOMS_NO") | ||
| 376 | + // 驾驶员海关编号 | ||
| 377 | + private String drCustomsNo; | ||
| 378 | + | ||
| 379 | + @XStreamAlias("DR_NAME") | ||
| 380 | + // 驾驶员姓名 | ||
| 381 | + private String drName; | ||
| 382 | + | ||
| 383 | + @XStreamAlias("TRAILER_ID") | ||
| 384 | + // 拖车ID | ||
| 385 | + private String trailerId; | ||
| 386 | + | ||
| 387 | + @XStreamAlias("WEIGHT_DIFF") | ||
| 388 | + // 重量差异 | ||
| 389 | + private double weightDiff; | ||
| 390 | + | ||
| 391 | + @XStreamAlias("CHANNEL_WEIGHT") | ||
| 392 | + // 渠道重量 | ||
| 393 | + private double channelWeight; | ||
| 394 | + | ||
| 395 | + @XStreamAlias("GROSS_WEIGHT") | ||
| 396 | + // 毛重 | ||
| 397 | + private double grossWeight; | ||
| 398 | + | ||
| 399 | + @XStreamAlias("VEHICLE_WEIGHT") | ||
| 400 | + // 车辆重量 | ||
| 401 | + private double vehicleWeight; | ||
| 402 | + | ||
| 403 | + public String getVeCustomsNo() { | ||
| 404 | + return veCustomsNo; | ||
| 405 | + } | ||
| 406 | + | ||
| 407 | + public void setVeCustomsNo(String veCustomsNo) { | ||
| 408 | + this.veCustomsNo = veCustomsNo; | ||
| 409 | + } | ||
| 410 | + | ||
| 411 | + public String getVeLicenseNo() { | ||
| 412 | + return veLicenseNo; | ||
| 413 | + } | ||
| 414 | + | ||
| 415 | + public void setVeLicenseNo(String veLicenseNo) { | ||
| 416 | + this.veLicenseNo = veLicenseNo; | ||
| 417 | + } | ||
| 418 | + | ||
| 419 | + public String getVeLicenseNo2() { | ||
| 420 | + return veLicenseNo2; | ||
| 421 | + } | ||
| 422 | + | ||
| 423 | + public void setVeLicenseNo2(String veLicenseNo2) { | ||
| 424 | + this.veLicenseNo2 = veLicenseNo2; | ||
| 425 | + } | ||
| 426 | + | ||
| 427 | + public String getDrCustomsNo() { | ||
| 428 | + return drCustomsNo; | ||
| 429 | + } | ||
| 430 | + | ||
| 431 | + public void setDrCustomsNo(String drCustomsNo) { | ||
| 432 | + this.drCustomsNo = drCustomsNo; | ||
| 433 | + } | ||
| 434 | + | ||
| 435 | + public String getDrName() { | ||
| 436 | + return drName; | ||
| 437 | + } | ||
| 438 | + | ||
| 439 | + public void setDrName(String drName) { | ||
| 440 | + this.drName = drName; | ||
| 441 | + } | ||
| 442 | + | ||
| 443 | + public String getTrailerId() { | ||
| 444 | + return trailerId; | ||
| 445 | + } | ||
| 446 | + | ||
| 447 | + public void setTrailerId(String trailerId) { | ||
| 448 | + this.trailerId = trailerId; | ||
| 449 | + } | ||
| 450 | + | ||
| 451 | + public double getWeightDiff() { | ||
| 452 | + return weightDiff; | ||
| 453 | + } | ||
| 454 | + | ||
| 455 | + public void setWeightDiff(double weightDiff) { | ||
| 456 | + this.weightDiff = weightDiff; | ||
| 457 | + } | ||
| 458 | + | ||
| 459 | + public double getChannelWeight() { | ||
| 460 | + return channelWeight; | ||
| 461 | + } | ||
| 462 | + | ||
| 463 | + public void setChannelWeight(double channelWeight) { | ||
| 464 | + this.channelWeight = channelWeight; | ||
| 465 | + } | ||
| 466 | + | ||
| 467 | + public double getGrossWeight() { | ||
| 468 | + return grossWeight; | ||
| 469 | + } | ||
| 470 | + | ||
| 471 | + public void setGrossWeight(double grossWeight) { | ||
| 472 | + this.grossWeight = grossWeight; | ||
| 473 | + } | ||
| 474 | + | ||
| 475 | + public double getVehicleWeight() { | ||
| 476 | + return vehicleWeight; | ||
| 477 | + } | ||
| 478 | + | ||
| 479 | + public void setVehicleWeight(double vehicleWeight) { | ||
| 480 | + this.vehicleWeight = vehicleWeight; | ||
| 481 | + } | ||
| 482 | + | ||
| 483 | + | ||
| 484 | +} | ||
| 485 | + | ||
| 486 | +@XStreamAlias("FORM_INFO") | ||
| 487 | +class FormInfo { | ||
| 488 | + @XStreamAlias("FORM_TYPE") | ||
| 489 | + // 表单类型 | ||
| 490 | + private String formType; | ||
| 491 | + | ||
| 492 | + @XStreamAlias("FORM_ID") | ||
| 493 | + // 表单ID | ||
| 494 | + private String formId; | ||
| 495 | + | ||
| 496 | + @XStreamAlias("MASTER_CUSTOMS_CODE") | ||
| 497 | + // 主管海关代码 | ||
| 498 | + private String masterCustomsCode; | ||
| 499 | + | ||
| 500 | + public String getFormType() { | ||
| 501 | + return formType; | ||
| 502 | + } | ||
| 503 | + | ||
| 504 | + public void setFormType(String formType) { | ||
| 505 | + this.formType = formType; | ||
| 506 | + } | ||
| 507 | + | ||
| 508 | + public String getFormId() { | ||
| 509 | + return formId; | ||
| 510 | + } | ||
| 511 | + | ||
| 512 | + public void setFormId(String formId) { | ||
| 513 | + this.formId = formId; | ||
| 514 | + } | ||
| 515 | + | ||
| 516 | + public String getMasterCustomsCode() { | ||
| 517 | + return masterCustomsCode; | ||
| 518 | + } | ||
| 519 | + | ||
| 520 | + public void setMasterCustomsCode(String masterCustomsCode) { | ||
| 521 | + this.masterCustomsCode = masterCustomsCode; | ||
| 522 | + } | ||
| 523 | + | ||
| 524 | +} |
| @@ -44,6 +44,12 @@ public interface EnginCheckService { | @@ -44,6 +44,12 @@ public interface EnginCheckService { | ||
| 44 | void pass(GatherInfo info,ExecuteParams executeParams); | 44 | void pass(GatherInfo info,ExecuteParams executeParams); |
| 45 | 45 | ||
| 46 | /** | 46 | /** |
| 47 | + * 不放行 | ||
| 48 | + * @param info | ||
| 49 | + */ | ||
| 50 | + void passFaild(GatherInfo info,String reason,ExecuteParams executeParams); | ||
| 51 | + | ||
| 52 | + /** | ||
| 47 | * 记录已进出区信息 | 53 | * 记录已进出区信息 |
| 48 | */ | 54 | */ |
| 49 | void record(GatherInfo info,ExecuteParams executeParams); | 55 | void record(GatherInfo info,ExecuteParams executeParams); |
src/main/java/com/sy/service/X82Service.java
0 → 100644
| 1 | +package com.sy.service; | ||
| 2 | + | ||
| 3 | +import com.sy.model.DxpMsg; | ||
| 4 | +import com.sy.model.GatherInfo; | ||
| 5 | +import com.sy.model.X82Feedback; | ||
| 6 | + | ||
| 7 | +public interface X82Service { | ||
| 8 | + /** | ||
| 9 | + * 解析被封装的X82金二验放回执报文,并获取到DATA base64加密后的报体内容. | ||
| 10 | + * @param response | ||
| 11 | + */ | ||
| 12 | + DxpMsg analysis(String response); | ||
| 13 | + | ||
| 14 | + X82Feedback x82Analysis(String xml); | ||
| 15 | + | ||
| 16 | + Boolean X82ReleaseCheck(X82Feedback var); | ||
| 17 | + | ||
| 18 | + GatherInfo readCacheWithSeqno(String seqno); | ||
| 19 | + | ||
| 20 | + /** | ||
| 21 | + * 将X82的报文实体类转换成X21GatherInfo 实体,用来做最终验放参数用 | ||
| 22 | + * @param var X82Feedback实体类 | ||
| 23 | + * @return X21 GatherInfo 实体类 | ||
| 24 | + */ | ||
| 25 | + GatherInfo X82FeedBackToX21GatherInfo(X82Feedback var); | ||
| 26 | +} |
| 1 | +package com.sy.service.feigin; | ||
| 2 | + | ||
| 3 | +import com.sy.model.LockFeignResponse; | ||
| 4 | +import com.sy.model.NoticeLock; | ||
| 5 | +import com.sy.response.ResultJson; | ||
| 6 | +import feign.hystrix.FallbackFactory; | ||
| 7 | +import lombok.extern.slf4j.Slf4j; | ||
| 8 | +import org.springframework.stereotype.Component; | ||
| 9 | +import org.springframework.web.bind.annotation.RequestBody; | ||
| 10 | + | ||
| 11 | +/** | ||
| 12 | + * @author mrz | ||
| 13 | + */ | ||
| 14 | +@Component | ||
| 15 | +@Slf4j | ||
| 16 | +public class G2X81FeignFallBackFactory implements FallbackFactory<G2X81FeignService> { | ||
| 17 | + | ||
| 18 | + @Override | ||
| 19 | + public G2X81FeignService create(Throwable throwable) { | ||
| 20 | + log.error("调用金二X81通知接口异常",throwable); | ||
| 21 | + return new G2X81FeignService() { | ||
| 22 | + @Override | ||
| 23 | + public ResultJson send(String message) { | ||
| 24 | + return new ResultJson("400","金二X81申报接口访问失败"); | ||
| 25 | + } | ||
| 26 | + }; | ||
| 27 | + } | ||
| 28 | +} |
| 1 | +package com.sy.service.feigin; | ||
| 2 | + | ||
| 3 | + | ||
| 4 | +import com.sy.model.LockFeignResponse; | ||
| 5 | +import com.sy.model.NoticeLock; | ||
| 6 | +import com.sy.response.ResultJson; | ||
| 7 | +import org.springframework.cloud.openfeign.FeignClient; | ||
| 8 | +import org.springframework.web.bind.annotation.PostMapping; | ||
| 9 | +import org.springframework.web.bind.annotation.RequestBody; | ||
| 10 | +import org.springframework.web.bind.annotation.RequestParam; | ||
| 11 | + | ||
| 12 | +/** | ||
| 13 | + * 金二报文发送接口 | ||
| 14 | + * @author mrz | ||
| 15 | + */ | ||
| 16 | +@FeignClient(name = "SEND-IBMMQ-SERVIER",fallbackFactory = G2X81FeignFallBackFactory.class) | ||
| 17 | +public interface G2X81FeignService { | ||
| 18 | + | ||
| 19 | + @PostMapping("/ibm/mq/sendMsg") | ||
| 20 | + ResultJson send(@RequestParam("message") String message); | ||
| 21 | +} | ||
| 22 | + |
| 1 | +package com.sy.service.feigin; | ||
| 2 | + | ||
| 3 | +import com.sy.response.ResultJson; | ||
| 4 | +import feign.hystrix.FallbackFactory; | ||
| 5 | +import lombok.extern.slf4j.Slf4j; | ||
| 6 | +import org.springframework.stereotype.Component; | ||
| 7 | +import org.springframework.web.bind.annotation.RequestParam; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * @author mrz | ||
| 11 | + */ | ||
| 12 | +@Component | ||
| 13 | +@Slf4j | ||
| 14 | +public class StationManageFallBackFactory implements FallbackFactory<StationManageFeignService> { | ||
| 15 | + | ||
| 16 | + @Override | ||
| 17 | + public StationManageFeignService create(Throwable throwable) { | ||
| 18 | + log.error("调用场站管理接口异常",throwable); | ||
| 19 | + return new StationManageFeignService() { | ||
| 20 | + @Override | ||
| 21 | + public ResultJson getChanels(String channel, int pageNum, int pageSize) { | ||
| 22 | + return new ResultJson("410","场站管理服务接口访问失败"); | ||
| 23 | + } | ||
| 24 | + }; | ||
| 25 | + } | ||
| 26 | +} |
| 1 | +package com.sy.service.feigin; | ||
| 2 | + | ||
| 3 | + | ||
| 4 | +import com.sy.response.ResultJson; | ||
| 5 | +import org.springframework.cloud.openfeign.FeignClient; | ||
| 6 | +import org.springframework.web.bind.annotation.GetMapping; | ||
| 7 | +import org.springframework.web.bind.annotation.RequestParam; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * 金二报文发送接口 | ||
| 11 | + * @author mrz | ||
| 12 | + */ | ||
| 13 | +@FeignClient(name = "STATION-MANAGE",fallbackFactory = StationManageFallBackFactory.class) | ||
| 14 | +public interface StationManageFeignService { | ||
| 15 | + | ||
| 16 | + @GetMapping("/bayonet/page") | ||
| 17 | + ResultJson getChanels(@RequestParam(value = "channel") String channel,@RequestParam(value = "pageNum") int pageNum,@RequestParam(value = "pageSize") int pageSize); | ||
| 18 | +} | ||
| 19 | + |
| @@ -209,11 +209,10 @@ public class EnginCheckServiceImpl implements EnginCheckService { | @@ -209,11 +209,10 @@ public class EnginCheckServiceImpl implements EnginCheckService { | ||
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | log.info(String.format("开始发送指令:车牌%s,场站%s,通道%s,重量%s",info.getVename(),info.getAreaid(),info.getChnlno(),info.getGrosswt())); | 211 | log.info(String.format("开始发送指令:车牌%s,场站%s,通道%s,重量%s",info.getVename(),info.getAreaid(),info.getChnlno(),info.getGrosswt())); |
| 212 | - boolean flag = false; | 212 | + |
| 213 | if (check) { | 213 | if (check) { |
| 214 | CommandClient.Client(info, PERMITTHOUGH); | 214 | CommandClient.Client(info, PERMITTHOUGH); |
| 215 | log.info("=============>>>>>>>>放行报文发送成功<<<<<<<<<=============="); | 215 | log.info("=============>>>>>>>>放行报文发送成功<<<<<<<<<=============="); |
| 216 | - flag = true; | ||
| 217 | record(info,executeParams); | 216 | record(info,executeParams); |
| 218 | 217 | ||
| 219 | //总进出车次计数 | 218 | //总进出车次计数 |
| @@ -233,6 +232,11 @@ public class EnginCheckServiceImpl implements EnginCheckService { | @@ -233,6 +232,11 @@ public class EnginCheckServiceImpl implements EnginCheckService { | ||
| 233 | sendBw(info,true,PERMITTHOUGH,executeParams); | 232 | sendBw(info,true,PERMITTHOUGH,executeParams); |
| 234 | } | 233 | } |
| 235 | 234 | ||
| 235 | + @Override | ||
| 236 | + public void passFaild(GatherInfo info,String reason,ExecuteParams executeParams) { | ||
| 237 | + sendBw(info,false,reason,executeParams); | ||
| 238 | + } | ||
| 239 | + | ||
| 236 | /** | 240 | /** |
| 237 | * 记录进出区信息 | 241 | * 记录进出区信息 |
| 238 | */ | 242 | */ |
| 1 | +package com.sy.service.impl; | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSON; | ||
| 4 | +import com.sy.model.DxpMsg; | ||
| 5 | +import com.sy.model.GatherInfo; | ||
| 6 | +import com.sy.model.X82Feedback; | ||
| 7 | +import com.sy.service.CommandLogService; | ||
| 8 | +import com.sy.service.RedisService; | ||
| 9 | +import com.sy.service.X82Service; | ||
| 10 | +import com.thoughtworks.xstream.XStream; | ||
| 11 | +import com.thoughtworks.xstream.converters.Converter; | ||
| 12 | +import com.thoughtworks.xstream.converters.MarshallingContext; | ||
| 13 | +import com.thoughtworks.xstream.converters.UnmarshallingContext; | ||
| 14 | +import com.thoughtworks.xstream.io.HierarchicalStreamReader; | ||
| 15 | +import com.thoughtworks.xstream.io.HierarchicalStreamWriter; | ||
| 16 | +import com.thoughtworks.xstream.io.xml.DomDriver; | ||
| 17 | +import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder; | ||
| 18 | +import lombok.extern.slf4j.Slf4j; | ||
| 19 | +import org.apache.commons.lang.StringUtils; | ||
| 20 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 21 | +import org.springframework.stereotype.Service; | ||
| 22 | + | ||
| 23 | +import java.text.ParseException; | ||
| 24 | +import java.text.SimpleDateFormat; | ||
| 25 | +import java.util.Date; | ||
| 26 | + | ||
| 27 | +@Service | ||
| 28 | +@Slf4j | ||
| 29 | +public class X82ServiceImpl implements X82Service { | ||
| 30 | + | ||
| 31 | + @Autowired | ||
| 32 | + private RedisService redisService; | ||
| 33 | + | ||
| 34 | + @Autowired | ||
| 35 | + private CommandLogService commandLogService; | ||
| 36 | + | ||
| 37 | + @Override | ||
| 38 | + public DxpMsg analysis(String response) { | ||
| 39 | + XStream xstream = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_"))); | ||
| 40 | + xstream.processAnnotations(DxpMsg.class); | ||
| 41 | + //对xstream对象设置默认的安全防护 | ||
| 42 | + XStream.setupDefaultSecurity(xstream); | ||
| 43 | + //对xstream对象设置默认的安全防护时,允许设置类 | ||
| 44 | + xstream.allowTypes(new Class[]{DxpMsg.class}); | ||
| 45 | + return (DxpMsg) xstream.fromXML(response); | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + @Override | ||
| 49 | + public X82Feedback x82Analysis(String xml) { | ||
| 50 | + XStream xstream = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_"))); | ||
| 51 | + | ||
| 52 | + xstream.processAnnotations(X82Feedback.class); | ||
| 53 | + //对xstream对象设置默认的安全防护 | ||
| 54 | + XStream.setupDefaultSecurity(xstream); | ||
| 55 | + //对xstream对象设置默认的安全防护时,允许设置类 | ||
| 56 | + xstream.allowTypes(new Class[]{X82Feedback.class}); | ||
| 57 | + return (X82Feedback) xstream.fromXML(xml); | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + @Override | ||
| 61 | + public Boolean X82ReleaseCheck(X82Feedback var) { | ||
| 62 | + log.info("[X82-Result]金二验放结果-{}-{}",var.getCheckResult(),var.getOpHint()); | ||
| 63 | + if ("Y".equals(var.getCheckResult().trim()) || "1".equals(var.getCheckResult().trim())) { | ||
| 64 | + return true; | ||
| 65 | + } | ||
| 66 | + return false; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + /** | ||
| 70 | + * 根据seqno 获取缓存的X21信息 | ||
| 71 | + * @param seqno | ||
| 72 | + * @return x21的gatherInfo | ||
| 73 | + */ | ||
| 74 | + @Override | ||
| 75 | + public GatherInfo readCacheWithSeqno(String seqno){ | ||
| 76 | + if (StringUtils.isNotEmpty(seqno)) { | ||
| 77 | + String X21_GatherInfo = redisService.get(seqno); | ||
| 78 | + if (StringUtils.isNotEmpty(X21_GatherInfo)){ | ||
| 79 | + GatherInfo gatherInfo = JSON.parseObject(X21_GatherInfo, GatherInfo.class); | ||
| 80 | + return gatherInfo; | ||
| 81 | + } | ||
| 82 | + } | ||
| 83 | + return null; | ||
| 84 | + } | ||
| 85 | + | ||
| 86 | + @Override | ||
| 87 | + public GatherInfo X82FeedBackToX21GatherInfo(X82Feedback var) { | ||
| 88 | + GatherInfo gatherInfo = new GatherInfo(); | ||
| 89 | + gatherInfo.setAreaid(var.getAreaId()); | ||
| 90 | + gatherInfo.setChnlno(var.getChannelNo()); | ||
| 91 | + gatherInfo.setSeqno(var.getSessionId()); | ||
| 92 | + | ||
| 93 | + return gatherInfo; | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + public static class DateConverter implements Converter { | ||
| 97 | + private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX"; | ||
| 98 | + private final SimpleDateFormat dateFormat; | ||
| 99 | + | ||
| 100 | + public DateConverter() { | ||
| 101 | + this.dateFormat = new SimpleDateFormat(DATE_FORMAT); | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + @Override | ||
| 105 | + public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext context) { | ||
| 106 | + // Not used for unmarshalling | ||
| 107 | + } | ||
| 108 | + | ||
| 109 | + @Override | ||
| 110 | + public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { | ||
| 111 | + String dateString = reader.getValue(); | ||
| 112 | + try { | ||
| 113 | + return dateFormat.parse(dateString); | ||
| 114 | + } catch (ParseException e) { | ||
| 115 | + throw new IllegalArgumentException("Error parsing date string: " + dateString, e); | ||
| 116 | + } | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + @Override | ||
| 120 | + public boolean canConvert(Class aClass) { | ||
| 121 | + return aClass.equals(Date.class); | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + | ||
| 128 | +} |
| 1 | +package com.sy.service.router; | ||
| 2 | + | ||
| 3 | +import com.sy.bwAssist.Message; | ||
| 4 | +import com.sy.model.GatherInfo; | ||
| 5 | + | ||
| 6 | +/** | ||
| 7 | + * 卡口业务报文处理路由 | ||
| 8 | + * 处理接收的卡口报文X22与X21, | ||
| 9 | + * 并根据路由表,决定X21报文是否发送给金二,由金二验放处理,并本地记录.还是不发金二本地验放处理 | ||
| 10 | + * 集中核销流转申请. | ||
| 11 | + * @author mrz | ||
| 12 | + */ | ||
| 13 | +public interface MessageRouterG2 { | ||
| 14 | + /** | ||
| 15 | + * X82报文实体路由处理 | ||
| 16 | + */ | ||
| 17 | + void route(GatherInfo gatherInfo,String reason); | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * 不放行处理 | ||
| 21 | + */ | ||
| 22 | + void faild(GatherInfo gatherInfo,String reason); | ||
| 23 | + | ||
| 24 | + | ||
| 25 | + | ||
| 26 | + | ||
| 27 | +} |
| 1 | +package com.sy.service.router; | ||
| 2 | + | ||
| 3 | +import com.sy.bwAssist.Message; | ||
| 4 | +import com.sy.model.GatherInfo; | ||
| 5 | +import com.sy.service.CommandLogService; | ||
| 6 | +import com.sy.service.EnginCheckService; | ||
| 7 | +import lombok.extern.slf4j.Slf4j; | ||
| 8 | +import org.basis.enhance.groovy.entity.ExecuteParams; | ||
| 9 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 10 | +import org.springframework.stereotype.Service; | ||
| 11 | + | ||
| 12 | +@Slf4j | ||
| 13 | +@Service("X82") | ||
| 14 | +public class MessageRouterX82 implements MessageRouterG2 { | ||
| 15 | + | ||
| 16 | + @Autowired | ||
| 17 | + private EnginCheckService enginCheckService; | ||
| 18 | + | ||
| 19 | + @Autowired | ||
| 20 | + private CommandLogService commandLogService; | ||
| 21 | + | ||
| 22 | + @Override | ||
| 23 | + public void route(GatherInfo gatherInfo,String reason) { | ||
| 24 | + log.info("[G2-SUCCESS]-金二验放通过,下放最终抬杆指令."); | ||
| 25 | + enginCheck(gatherInfo,reason); | ||
| 26 | + } | ||
| 27 | + | ||
| 28 | + @Override | ||
| 29 | + public void faild(GatherInfo gatherInfo,String reason) { | ||
| 30 | + commandLogService.commandlog(gatherInfo,false,"金二验放失败,原因:"+reason,null,null,0.0,0.0,0.0,0.0); | ||
| 31 | + ExecuteParams executeParams = enginCheckService.makeParaByGagherInfo(gatherInfo); | ||
| 32 | + enginCheckService.passFaild(gatherInfo,reason,executeParams); | ||
| 33 | + log.info("[G2-FEEDBACK-CHECK-FAILD]-{}",reason); | ||
| 34 | + | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + public void enginCheck(GatherInfo gatherInfo,String reason){ | ||
| 38 | + commandLogService.commandlog(gatherInfo,true,"金二验放通过"+reason,null,null,0.0,0.0,0.0,0.0); | ||
| 39 | + ExecuteParams executeParams = enginCheckService.makeParaByGagherInfo(gatherInfo); | ||
| 40 | + | ||
| 41 | + enginCheckService.pass(gatherInfo,executeParams); | ||
| 42 | + | ||
| 43 | + enginCheckService.formRelease(gatherInfo,executeParams); | ||
| 44 | + | ||
| 45 | + log.info("引擎验放完结"); | ||
| 46 | + } | ||
| 47 | +} |
src/main/java/com/sy/utils/Base64Tool.java
0 → 100644
| 1 | +package com.sy.utils; | ||
| 2 | + | ||
| 3 | +import lombok.extern.slf4j.Slf4j; | ||
| 4 | + | ||
| 5 | +import java.io.UnsupportedEncodingException; | ||
| 6 | +import java.nio.charset.StandardCharsets; | ||
| 7 | +import java.util.Base64; | ||
| 8 | + | ||
| 9 | +@Slf4j | ||
| 10 | +public class Base64Tool { | ||
| 11 | + | ||
| 12 | + public static String encodeUtf8ToUtf8(String content){ | ||
| 13 | + String encodeToString = Base64.getEncoder().encodeToString(content.getBytes(StandardCharsets.UTF_8)); | ||
| 14 | + log.info("[BASE64-ENCODE] = {}" , encodeToString); | ||
| 15 | + return encodeToString; | ||
| 16 | + } | ||
| 17 | + | ||
| 18 | + public static String decodeUtf8ToUtf8(String encodeStr){ | ||
| 19 | + byte[] base64decodedBytes = Base64.getDecoder().decode(encodeStr); | ||
| 20 | + String resoult = new String(base64decodedBytes, StandardCharsets.UTF_8); | ||
| 21 | + log.info("[BASE64-DECODE]={}",resoult); | ||
| 22 | + return resoult; | ||
| 23 | + } | ||
| 24 | +} |
| 1 | +package com.sy.utils; | ||
| 2 | + | ||
| 3 | +import java.util.concurrent.LinkedBlockingQueue; | ||
| 4 | +import java.util.concurrent.ThreadPoolExecutor; | ||
| 5 | +import java.util.concurrent.TimeUnit; | ||
| 6 | + | ||
| 7 | +public class G2ThreadPoolFactory { | ||
| 8 | + | ||
| 9 | + private static ThreadPoolExecutor threadPool; | ||
| 10 | + | ||
| 11 | + public static ThreadPoolExecutor instance(String busstype){ | ||
| 12 | + if (threadPool==null){ | ||
| 13 | + XMLThreadFactory xmlThreadFactory = new XMLThreadFactory(busstype); | ||
| 14 | + threadPool = new ThreadPoolExecutor(10, 200, | ||
| 15 | + 1L, TimeUnit.SECONDS, | ||
| 16 | + new LinkedBlockingQueue<Runnable>(4000), | ||
| 17 | + xmlThreadFactory, | ||
| 18 | + new ThreadPoolExecutor.AbortPolicy()); | ||
| 19 | + | ||
| 20 | + } | ||
| 21 | + return threadPool; | ||
| 22 | + } | ||
| 23 | +} |
src/test/java/com/sy/Base64Test.java
0 → 100644
| 1 | +package com.sy; | ||
| 2 | + | ||
| 3 | +import com.sy.model.G2X81Template; | ||
| 4 | +import lombok.extern.slf4j.Slf4j; | ||
| 5 | +import org.junit.runner.RunWith; | ||
| 6 | +import org.junit.Test; | ||
| 7 | +import org.springframework.boot.test.context.SpringBootTest; | ||
| 8 | +import org.springframework.test.context.junit4.SpringRunner; | ||
| 9 | + | ||
| 10 | +import java.io.UnsupportedEncodingException; | ||
| 11 | +import java.nio.charset.Charset; | ||
| 12 | +import java.util.Base64; | ||
| 13 | + | ||
| 14 | +@RunWith(SpringRunner.class) | ||
| 15 | +@SpringBootTest | ||
| 16 | +@Slf4j | ||
| 17 | +public class Base64Test { | ||
| 18 | + | ||
| 19 | + @Test | ||
| 20 | + public void base64Encode(){ | ||
| 21 | + String encode = "<?xml version='1.0' encoding='UTF-8'?><GATHER_FEEDBACK xmlns=\"http://rpb.customs.gov.cn/common/FrontEndSchemas/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema\"><AREA_ID>4604000006</AREA_ID><CHNL_NO>46040012232</CHNL_NO><SESSION_ID>20220630184441000028</SESSION_ID><FEEDBACK_TIME>2023-08-20 15:07:16</FEEDBACK_TIME><CHECK_RESULT>1</CHECK_RESULT><OP_HINT>海关放行</OP_HINT></GATHER_FEEDBACK>"; | ||
| 22 | + String encodeToString = Base64.getEncoder().encodeToString(encode.getBytes(Charset.forName("utf-8"))); | ||
| 23 | + System.out.println("encodeToString = " + encodeToString); | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + @Test | ||
| 27 | + public void base64Decode(){ | ||
| 28 | + String testcode = "PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48R0FUSEVSX0ZFRURCQUNLIHhtbG5zPSJodHRwOi8vcnBiLmN1c3RvbXMuZ292LmNuL2NvbW1vbi9Gcm9udEVuZFNjaGVtYXMvIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj48QVJFQV9JRD40NjA0MDAwMDA2PC9BUkVBX0lEPjxDSE5MX05PPjQ2MDQwMDEyMjMyPC9DSE5MX05PPjxTRVNTSU9OX0lEPjIwMjIwNjMwMTg0NDQxMDAwMDI4PC9TRVNTSU9OX0lEPjxGRUVEQkFDS19USU1FPjIwMjMtMDgtMjAgMTU6MDc6MTY8L0ZFRURCQUNLX1RJTUU+PENIRUNLX1JFU1VMVD4wPC9DSEVDS19SRVNVTFQ+PE9QX0hJTlQ+55S15a2Q6L2m54mMOjrkuI3mlL7ooYzvvJrmib7kuI3liLDlr7nlupTnmoTmoLjmlL7ljZXvvIzkuI3kuojmlL7ooYw8L09QX0hJTlQ+PC9HQVRIRVJfRkVFREJBQ0s+"; | ||
| 29 | + byte[] base64decodedBytes = Base64.getDecoder().decode(testcode); | ||
| 30 | + try { | ||
| 31 | + System.out.println("解密后的信息为:"+new String(base64decodedBytes, "utf-8")); | ||
| 32 | + } catch (UnsupportedEncodingException e) { | ||
| 33 | + e.printStackTrace(); | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + @Test | ||
| 38 | + public void replaceTest(){ | ||
| 39 | + String x81XML= G2X81Template.template.replace("#{ie_flag1}","I") | ||
| 40 | + .replace("#{area_id}","stationG2") | ||
| 41 | + .replace("#{chnl_no}","channelG2") | ||
| 42 | + .replace("#{session_id}","123") | ||
| 43 | + .replace("#{ve_license_no}","豫A61CR7") | ||
| 44 | + .replace("#{rfid_id}","AFFC231321") | ||
| 45 | + .replace("#{ve_wt}","1234.2") | ||
| 46 | + .replace("#{operate_time}","2023-07-23 12:01:32"); | ||
| 47 | + System.out.println("x81XML = " + x81XML); | ||
| 48 | + } | ||
| 49 | +} |
src/test/java/com/sy/X82Test.java
0 → 100644
| 1 | +package com.sy; | ||
| 2 | + | ||
| 3 | +import com.sy.model.DxpMsg; | ||
| 4 | +import com.sy.model.X82Feedback; | ||
| 5 | +import com.thoughtworks.xstream.XStream; | ||
| 6 | +import com.thoughtworks.xstream.converters.Converter; | ||
| 7 | +import com.thoughtworks.xstream.converters.MarshallingContext; | ||
| 8 | +import com.thoughtworks.xstream.converters.UnmarshallingContext; | ||
| 9 | +import com.thoughtworks.xstream.io.HierarchicalStreamReader; | ||
| 10 | +import com.thoughtworks.xstream.io.HierarchicalStreamWriter; | ||
| 11 | +import com.thoughtworks.xstream.io.xml.DomDriver; | ||
| 12 | +import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder; | ||
| 13 | + | ||
| 14 | +import java.text.ParseException; | ||
| 15 | +import java.text.SimpleDateFormat; | ||
| 16 | +import java.util.Date; | ||
| 17 | + | ||
| 18 | +public class X82Test { | ||
| 19 | + | ||
| 20 | + static String dxpmsg="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + | ||
| 21 | + "<DxpMsg ver=\"1.0\" xmlns=\"http://www.chinaport.gov.cn/dxp\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + | ||
| 22 | + "\t<TransInfo>\n" + | ||
| 23 | + "\t\t<CopMsgId>256afcf4887d49a2840ec24b78ed1755</CopMsgId>\n" + | ||
| 24 | + "\t\t<SenderId>GJCKK00000000001</SenderId>\n" + | ||
| 25 | + "\t\t<ReceiverIds>\n" + | ||
| 26 | + "\t\t\t<ReceiverId>GDXPKK0000000002</ReceiverId>\n" + | ||
| 27 | + "\t\t</ReceiverIds>\n" + | ||
| 28 | + "\t\t<CreatTime>2022-08-17T15:00:52</CreatTime>\n" + | ||
| 29 | + "\t\t<MsgType>JCKK</MsgType>\n" + | ||
| 30 | + "\t</TransInfo>\n" + | ||
| 31 | + "\t<Data>4lxLiQICAAAiNDYwNDYwMDAwMDQ2MDQ2MDEwMTFJ/////9oBAAA8Q09NTUFORF9JTkZPIEFSRUFfSUQ9IjQ2MDQ2MDAwMDAiIENITkxfTk89IjQ2MDQ2MDEwMTEiIElfRV9UWVBFPSJJIiBTRVFfTk89IjIwMjIwODE3MTQ0MjE1NjEwMDEwIj4KICAgIDxDSEVDS19SRVNVTFQ+MTEwMDAwMDAwMDAwMDAwMDAwMDA8L0NIRUNLX1JFU1VMVD4KICAgIDxPUF9ISU5UPrbByKGyu7W9tP3R6brLyv2+3TwvT1BfSElOVD4KICAgIDxHUFM+CiAgICAgICAgPFZFX05BTUU+PC9WRV9OQU1FPgogICAgICAgIDxHUFNfSUQ+PC9HUFNfSUQ+CiAgICAgICAgPE9SSUdJTl9DVVNUT01TPjwvT1JJR0lOX0NVU1RPTVM+CiAgICAgICAgPERFU1RfQ1VTVE9NUz48L0RFU1RfQ1VTVE9NUz4KICAgIDwvR1BTPgogICAgPFNFQUw+CiAgICAgICAgPEVTRUFMX0lEPjwvRVNFQUxfSUQ+CiAgICAgICAgPFNFQUxfS0VZPjwvU0VBTF9LRVk+CiAgICA8L1NFQUw+CiAgICA8Rk9STV9JRD48L0ZPUk1fSUQ+CjwvQ09NTUFORF9JTkZPPgr//w==</Data>\n" + | ||
| 32 | + "\t<AddInfo>\n" + | ||
| 33 | + "\t\t<FileName>20220817150050391844.dat</FileName>\n" + | ||
| 34 | + "\t</AddInfo>\n" + | ||
| 35 | + "</DxpMsg>"; | ||
| 36 | + | ||
| 37 | + static String x82 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + | ||
| 38 | + "<GATHER_FEEDBACK xmlns=\"http://rpb.customs.gov.cn/common/FrontEndSchemas/\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n" + | ||
| 39 | + " <AREA_ID>123</AREA_ID>\n" + | ||
| 40 | + " <CHNL_NO>456</CHNL_NO>\n" + | ||
| 41 | + " <SESSION_ID>789</SESSION_ID>\n" + | ||
| 42 | + " <RELLIST_TYPE>TypeA</RELLIST_TYPE>\n" + | ||
| 43 | + " <RELLIST_ID_TYPE>IDType1</RELLIST_ID_TYPE>\n" + | ||
| 44 | + " <RELLIST_ID>001</RELLIST_ID>\n" + | ||
| 45 | + " <FEEDBACK_TIME>2022-07-15T14:23:51.4679206+08:00</FEEDBACK_TIME>\n" + | ||
| 46 | + " <CHECK_RESULT>Y</CHECK_RESULT>\n" + | ||
| 47 | + " <INSTRUCTION>设备A:操作</INSTRUCTION>\n" + | ||
| 48 | + " <PROC_ERROR_CODE>100</PROC_ERROR_CODE>\n" + | ||
| 49 | + " <PROC_ERROR_DESCRIPTION>Error description</PROC_ERROR_DESCRIPTION>\n" + | ||
| 50 | + " <TECH_ERROR_CODE>200</TECH_ERROR_CODE>\n" + | ||
| 51 | + " <TECH_ERROR_DESCRIPTION>Technical error</TECH_ERROR_DESCRIPTION>\n" + | ||
| 52 | + " <IC_INFO>\n" + | ||
| 53 | + " <IC_ID>IC001</IC_ID>\n" + | ||
| 54 | + " <IC_NO>123456</IC_NO>\n" + | ||
| 55 | + " <IC_TYPE>TypeA</IC_TYPE>\n" + | ||
| 56 | + " <IC_EXTENDED_CONTENT>Extended content for IC card</IC_EXTENDED_CONTENT>\n" + | ||
| 57 | + " </IC_INFO>\n" + | ||
| 58 | + " <VE_INFO>\n" + | ||
| 59 | + " <VE_CUSTOMS_NO>7890123</VE_CUSTOMS_NO>\n" + | ||
| 60 | + " <VE_LICENSE_NO>ABC123</VE_LICENSE_NO>\n" + | ||
| 61 | + " <VE_LICENSE_NO2>XYZ987</VE_LICENSE_NO2>\n" + | ||
| 62 | + " <DR_CUSTOMS_NO>4567890</DR_CUSTOMS_NO>\n" + | ||
| 63 | + " <DR_NAME>John Doe</DR_NAME>\n" + | ||
| 64 | + " <TRAILER_ID>Trailer001</TRAILER_ID>\n" + | ||
| 65 | + " <WEIGHT_DIFF>0.5</WEIGHT_DIFF>\n" + | ||
| 66 | + " <CHANNEL_WEIGHT>1000.0</CHANNEL_WEIGHT>\n" + | ||
| 67 | + " <GROSS_WEIGHT>2000.0</GROSS_WEIGHT>\n" + | ||
| 68 | + " <VEHICLE_WEIGHT>1000.0</VEHICLE_WEIGHT>\n" + | ||
| 69 | + " </VE_INFO>\n" + | ||
| 70 | + " <CONTA_ID>Container001</CONTA_ID>\n" + | ||
| 71 | + " <ESEAL_ID>ESeal001</ESEAL_ID>\n" + | ||
| 72 | + " <SEAL_ID>Seal001</SEAL_ID>\n" + | ||
| 73 | + " <FORM_INFO>\n" + | ||
| 74 | + " <FORM_TYPE>TypeA</FORM_TYPE>\n" + | ||
| 75 | + " <FORM_ID>Form001</FORM_ID>\n" + | ||
| 76 | + " <MASTER_CUSTOMS_CODE>MasterCode</MASTER_CUSTOMS_CODE>\n" + | ||
| 77 | + " </FORM_INFO>\n" + | ||
| 78 | + " <PACK_NO>10</PACK_NO>\n" + | ||
| 79 | + " <DECL_PACK>12</DECL_PACK>\n" + | ||
| 80 | + " <DECL_GOODS_WEIGHT>5000.0</DECL_GOODS_WEIGHT>\n" + | ||
| 81 | + " <OP_HINT>Operation hint message</OP_HINT>\n" + | ||
| 82 | + " <LED_HINT>LED hint message</LED_HINT>\n" + | ||
| 83 | + " <EXTENDED_CONTENT>Extended content</EXTENDED_CONTENT>\n" + | ||
| 84 | + "</GATHER_FEEDBACK>\n"; | ||
| 85 | + public static void main(String[] args) { | ||
| 86 | + | ||
| 87 | + System.out.println(x82); | ||
| 88 | +// DxpMsg analysis = analysis(dxpmsg); | ||
| 89 | + X82Feedback x82Feedback = x82analysis(x82); | ||
| 90 | + System.out.println("OK"); | ||
| 91 | + | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + static DxpMsg analysis(String str) { | ||
| 95 | + XStream xstream = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_"))); | ||
| 96 | + xstream.processAnnotations(DxpMsg.class); | ||
| 97 | + //对xstream对象设置默认的安全防护 | ||
| 98 | + XStream.setupDefaultSecurity(xstream); | ||
| 99 | + //对xstream对象设置默认的安全防护时,允许设置类 | ||
| 100 | + xstream.allowTypes(new Class[]{DxpMsg.class}); | ||
| 101 | + return (DxpMsg) xstream.fromXML(str); | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + static X82Feedback x82analysis(String str) { | ||
| 105 | + XStream xstream = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_"))); | ||
| 106 | + // 注册自定义转换器 | ||
| 107 | + xstream.registerConverter(new DateConverter()); | ||
| 108 | + xstream.processAnnotations(X82Feedback.class); | ||
| 109 | + //对xstream对象设置默认的安全防护 | ||
| 110 | + XStream.setupDefaultSecurity(xstream); | ||
| 111 | + //对xstream对象设置默认的安全防护时,允许设置类 | ||
| 112 | + xstream.allowTypes(new Class[]{X82Feedback.class}); | ||
| 113 | + return (X82Feedback) xstream.fromXML(str); | ||
| 114 | + } | ||
| 115 | + | ||
| 116 | + public static class DateConverter implements Converter { | ||
| 117 | + private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX"; | ||
| 118 | + private final SimpleDateFormat dateFormat; | ||
| 119 | + | ||
| 120 | + public DateConverter() { | ||
| 121 | + this.dateFormat = new SimpleDateFormat(DATE_FORMAT); | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + @Override | ||
| 125 | + public void marshal(Object o, HierarchicalStreamWriter writer, MarshallingContext context) { | ||
| 126 | + // Not used for unmarshalling | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + @Override | ||
| 130 | + public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { | ||
| 131 | + String dateString = reader.getValue(); | ||
| 132 | + try { | ||
| 133 | + return dateFormat.parse(dateString); | ||
| 134 | + } catch (ParseException e) { | ||
| 135 | + throw new IllegalArgumentException("Error parsing date string: " + dateString, e); | ||
| 136 | + } | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + @Override | ||
| 140 | + public boolean canConvert(Class aClass) { | ||
| 141 | + return aClass.equals(Date.class); | ||
| 142 | + } | ||
| 143 | + | ||
| 144 | + | ||
| 145 | + } | ||
| 146 | +} | ||
| 147 | + |
-
请 注册 或 登录 后发表评论