From a82f2bca47ab1caa613e01bd0e6e2389133d50b2 Mon Sep 17 00:00:00 2001 From: gaoshuguang Date: Sun, 28 Sep 2025 11:07:23 +0800 Subject: [PATCH] =?UTF-8?q?2025=E5=B9=B409=E6=9C=8828=E6=97=A5=20=20=20=20?= =?UTF-8?q?=201.0.2=20=20=20=20=20=20=E5=A2=9E=E5=8A=A0ETC=20=E9=97=A8?= =?UTF-8?q?=E6=9E=B6=E8=AE=A1=E8=B4=B9=E6=89=A3=E8=B4=B9=E4=BA=A4=E6=98=93?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=8A=E4=BC=A0=E6=8E=A5=E5=8F=A3/DCPC/upl?= =?UTF-8?q?oadEtcGantryPassData?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nmggs/query/common/config/CorsConfig.java | 1 + .../common/config/LongStringTypeHandler.java | 40 + .../com/nmggs/query/common/emnu/Constant.java | 1 + .../nmggs/query/common/utils/JsonUtil.java | 27 + .../controller/AddInterfaceController.java | 5 + .../com/nmggs/query/entity/DCPCFailList.java | 14 + .../nmggs/query/entity/DCPCGantryPass.java | 1331 +++++++++++++++++ .../query/entity/DCPCUploadGantryData.java | 20 + .../query/entity/DCPCUploadReturnData.java | 19 + .../com/nmggs/query/entity/RequestExSta.java | 20 + .../com/nmggs/query/entity/RequestMinFee.java | 20 + .../com/nmggs/query/entity/RequestParam.java | 18 + .../nmggs/query/entity/RequestVersion.java | 18 + .../query/entity/fx/EquipmentStatistics.java | 25 + .../query/mapper/DCPCGantryPassMapper.java | 14 + .../nmggs/query/mapper/GantryTableMapper.java | 15 + .../nmggs/query/mapper/GantryTableMapper.xml | 12 + .../mapper/fx/EquipmentStatisticsMapper.java | 16 + .../mapper/fx/EquipmentStatisticsMapper.xml | 7 + .../query/service/AddInterfaceService.java | 11 + .../service/impl/AddInterfaceServiceImpl.java | 208 ++- .../service/impl/GetDataServiceImpl.java | 26 +- .../service/impl/ZDYHDataServiceImpl.java | 64 +- .../java/com/nmggs/query/test/Test250825.java | 148 +- .../version/{1.0.1.txt => 1.0.2.txt} | 1 + .../query/common/config/CorsConfig.class | Bin 2821 -> 2841 bytes .../nmggs/query/common/emnu/Constant.class | Bin 2180 -> 2245 bytes .../controller/AddInterfaceController.class | Bin 2375 -> 2609 bytes .../query/service/AddInterfaceService.class | Bin 732 -> 789 bytes .../impl/AddInterfaceServiceImpl.class | Bin 15308 -> 20887 bytes .../service/impl/GetDataServiceImpl.class | Bin 5808 -> 6547 bytes .../query/common/config/CorsConfig.class | Bin 2821 -> 2841 bytes .../nmggs/query/common/emnu/Constant.class | Bin 2180 -> 2245 bytes .../controller/AddInterfaceController.class | Bin 2375 -> 2609 bytes .../query/service/AddInterfaceService.class | Bin 732 -> 789 bytes .../impl/AddInterfaceServiceImpl.class | Bin 15308 -> 20887 bytes .../service/impl/GetDataServiceImpl.class | Bin 5808 -> 6547 bytes 37 files changed, 1959 insertions(+), 122 deletions(-) create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/common/config/LongStringTypeHandler.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/common/utils/JsonUtil.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCFailList.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCGantryPass.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCUploadGantryData.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCUploadReturnData.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/entity/RequestExSta.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/entity/RequestMinFee.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/entity/RequestParam.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/entity/RequestVersion.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/entity/fx/EquipmentStatistics.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/mapper/DCPCGantryPassMapper.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/mapper/GantryTableMapper.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/mapper/GantryTableMapper.xml create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/mapper/fx/EquipmentStatisticsMapper.java create mode 100644 GetDataInterface/src/main/java/com/nmggs/query/mapper/fx/EquipmentStatisticsMapper.xml rename GetDataInterface/src/main/resources/version/{1.0.1.txt => 1.0.2.txt} (92%) diff --git a/GetDataInterface/src/main/java/com/nmggs/query/common/config/CorsConfig.java b/GetDataInterface/src/main/java/com/nmggs/query/common/config/CorsConfig.java index e3c51aa..c8a92d7 100644 --- a/GetDataInterface/src/main/java/com/nmggs/query/common/config/CorsConfig.java +++ b/GetDataInterface/src/main/java/com/nmggs/query/common/config/CorsConfig.java @@ -33,6 +33,7 @@ public class CorsConfig implements WebMvcConfigurer { // 是否允许证书 .excludePathPatterns( "/test/**", + "/DCPC/**", "/ZDYH/**", "/ReceptionMobileWeighInfo", "/laneRequest/forward", diff --git a/GetDataInterface/src/main/java/com/nmggs/query/common/config/LongStringTypeHandler.java b/GetDataInterface/src/main/java/com/nmggs/query/common/config/LongStringTypeHandler.java new file mode 100644 index 0000000..a160edd --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/common/config/LongStringTypeHandler.java @@ -0,0 +1,40 @@ +package com.nmggs.query.common.config; + + +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedTypes; + +import java.sql.*; + +/** + * @author: shuguang + * @date: 2025年09月28日 9:42 + * @description: Long ↔ VARCHAR2 互转 + */ +@MappedTypes(Long.class) +public class LongStringTypeHandler extends BaseTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType) throws SQLException { + ps.setString(i, parameter.toString()); // 入库转字符串 + } + + @Override + public Long getNullableResult(ResultSet rs, String columnName) throws SQLException { + String val = rs.getString(columnName); + return val == null ? null : Long.valueOf(val); // 出库转 Long + } + + @Override + public Long getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + String val = rs.getString(columnIndex); + return val == null ? null : Long.valueOf(val); + } + + @Override + public Long getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + String val = cs.getString(columnIndex); + return val == null ? null : Long.valueOf(val); + } +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/common/emnu/Constant.java b/GetDataInterface/src/main/java/com/nmggs/query/common/emnu/Constant.java index 368ccbd..c0ce3a2 100644 --- a/GetDataInterface/src/main/java/com/nmggs/query/common/emnu/Constant.java +++ b/GetDataInterface/src/main/java/com/nmggs/query/common/emnu/Constant.java @@ -21,6 +21,7 @@ public class Constant { public static final String YYYYMMDDHH = "yyyyMMddHH"; public static final String YYMMDD = "yyMMdd"; public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + public static final String YYYY_MM_DD_T_HH_MM_SS = "yyyy-MM-ddTHH:mm:ss"; public static final String YYYY_MM_DD = "yyyy-MM-dd"; public static final String APP_KEY = "2Z6hOpl5kNYWAzr8PeA5"; diff --git a/GetDataInterface/src/main/java/com/nmggs/query/common/utils/JsonUtil.java b/GetDataInterface/src/main/java/com/nmggs/query/common/utils/JsonUtil.java new file mode 100644 index 0000000..4484263 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/common/utils/JsonUtil.java @@ -0,0 +1,27 @@ +package com.nmggs.query.common.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; + +import java.util.Map; + +/** + * @author: shuguang + * @date: 2025年09月25日 14:28 + * @description: + */ +@Slf4j +public class JsonUtil { + public static String conversionJson(Map map, String uuid) { + String result = ""; + // 使用ObjectMapper将List>转换为JSON字符串 + com.fasterxml.jackson.databind.ObjectMapper objectMapper = new ObjectMapper(); + try { + result = objectMapper.writeValueAsString(map); + } catch (JsonProcessingException e) { + log.info("[uuid:" + uuid + "]-转换json数据报错:" + e.getMessage()); + } + return result; + } +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/controller/AddInterfaceController.java b/GetDataInterface/src/main/java/com/nmggs/query/controller/AddInterfaceController.java index 1021267..b0b963a 100644 --- a/GetDataInterface/src/main/java/com/nmggs/query/controller/AddInterfaceController.java +++ b/GetDataInterface/src/main/java/com/nmggs/query/controller/AddInterfaceController.java @@ -22,6 +22,11 @@ public class AddInterfaceController { private AddInterfaceService addInterfaceService; + @PostMapping("/DCPC/uploadEtcGantryPassData") + public String uploadEtcGantryPassData(@RequestBody Map params) { + String uuid = UuidUtil.getUuid(); + return addInterfaceService.uploadEtcGantryPassData(params, uuid); + } @PostMapping("/baseinfo/QueryExStationTrans") public String QueryExStationTrans(@RequestBody Map params) { String uuid = UuidUtil.getUuid(); diff --git a/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCFailList.java b/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCFailList.java new file mode 100644 index 0000000..29e5fb5 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCFailList.java @@ -0,0 +1,14 @@ +package com.nmggs.query.entity; + +import lombok.Data; + +/** + * @author: shuguang + * @date: 2025年09月26日 10:16 + * @description: + */ +@Data +public class DCPCFailList { + private String tradeId; + private String info; +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCGantryPass.java b/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCGantryPass.java new file mode 100644 index 0000000..9d46fd4 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCGantryPass.java @@ -0,0 +1,1331 @@ +package com.nmggs.query.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.nmggs.query.common.config.LongStringTypeHandler; +import lombok.Data; + +import java.util.Date; + +/** + * @author: shuguang + * @date: 2025年09月26日 9:31 + * @description: ETC 门架计费扣费交易数据 + */ +@Data +@TableName("DCPC_GANTRY_PASS") +public class DCPCGantryPass { + + /** + * 计费交易编号(唯一索引) + */ + @TableField("TRADEID") + @JsonProperty("tradeId") + private String tradeId; + + /** + * 门架编号(全网唯一) + */ + @TableField("GANTRYID") + @JsonProperty("gantryId") + private String gantryId; + + /** + * 控制器序号 1-主机 2-备机1 + */ + @TableField("COMPUTERORDER") + @JsonProperty("computerOrder") + private Integer computerOrder; + + /** + * 小时批次号 yyyyMMddHH + */ + @TableField("HOURBATCHNO") + @JsonProperty("hourBatchNo") + private String hourBatchNo; + + /** + * 门架顺序号 方向+序号 + */ + @TableField("GANTRYORDERNUM") + @JsonProperty("gantryOrderNum") + private Integer gantryOrderNum; + + /** + * 当前门架HEX值 + */ + @TableField("GANTRYHEX") + @JsonProperty("gantryHex") + private String gantryHex; + + /** + * 门架类型 1路段 2省界入口 3省界出口 + */ + @TableField("GANTRYTYPE") + @JsonProperty("gantryType") + private String gantryType; + + /** + * 对向门架HEX值 + */ + @TableField("GANTRYHEXOPPOSITE") + @JsonProperty("gantryHexOpposite") + private String gantryHexOpposite; + + /** + * 计费交易时间 yyyy-MM-ddTHH:mm:ss + */ + @TableField("TRANSTIME") + @JsonProperty("transTime") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "GMT+8") + private Date transTime; + + /** + * 应收金额(分) + */ + @TableField("PAYFEE") + @JsonProperty("payFee") + private Long payFee; + + /** + * 交易金额(实收,分) + */ + @TableField("FEE") + @JsonProperty("fee") + private Long fee; + + /** + * 优惠金额(分) + */ + @TableField("DISCOUNTFEE") + @JsonProperty("discountFee") + private Long discountFee; + + /** + * 卡面扣费金额(分) + */ + @TableField("TRANSFEE") + @JsonProperty("transFee") + private Long transFee; + + /** + * 通行介质类型 1-OBU 2-CPC + */ + @TableField("MEDIATYPE") + @JsonProperty("mediaType") + private Integer mediaType; + + /** + * OBU单双片标识 1单片 2双片 + */ + @TableField("OBUSIGN") + @JsonProperty("obuSign") + private Integer obuSign; + + /** + * 收费单元编号组合 + */ + @TableField("TOLLINTERVALID") + @JsonProperty("tollIntervalId") + private String tollIntervalId; + + /** + * 收费单元处理标识组合 + */ + @TableField("TOLLINTERVALSIGN") + @JsonProperty("tollIntervalSign") + private String tollIntervalSign; + + /** + * 收费单元应收金额组合 + */ + @TableField("PAYFEEGROUP") + @JsonProperty("payFeeGroup") + private String payFeeGroup; + + /** + * 收费单元交易金额组合 + */ + @TableField("FEEGROUP") + @JsonProperty("feeGroup") + private String feeGroup; + + /** + * 收费单元优惠金额组合 + */ + @TableField("DISCOUNTFEEGROUP") + @JsonProperty("discountFeeGroup") + private String discountFeeGroup; + + /** + * 计费车辆车牌号码+颜色 + */ + @TableField("VEHICLEPLATE") + @JsonProperty("vehiclePlate") + private String vehiclePlate; + + /** + * 入口车型 + */ + @TableField("VEHICLETYPE") + @JsonProperty("vehicleType") + private Integer vehicleType; + + /** + * 识别车型 + */ + @TableField("IDENTIFYVEHICLETYPE") + @JsonProperty("identifyVehicleType") + private Integer identifyVehicleType; + + /** + * 车种 + */ + @TableField("VEHICLECLASS") + @JsonProperty("vehicleClass") + private Integer vehicleClass; + + /** + * 车辆状态标识 + */ + @TableField("VEHICLESIGN") + @JsonProperty("vehicleSign") + private String vehicleSign; + + /** + * TAC码 + */ + @TableField("TAC") + @JsonProperty("TAC") + private String tac; + + /** + * 交易类型标识 PBOC定义 + */ + @TableField("TRANSTYPE") + @JsonProperty("transType") + private String transType; + + /** + * 终端机编号 + */ + @TableField("TERMINALNO") + @JsonProperty("terminalNo") + private String terminalNo; + + /** + * PSAM卡脱机交易序列号 + */ + @TableField("TERMINALTRANSNO") + @JsonProperty("terminalTransNo") + private String terminalTransNo; + + /** + * IC卡交易序号 + */ + @TableField(value = "TRANSNO", typeHandler = LongStringTypeHandler.class) + @JsonProperty("transNo") + private Long transNo; + + /** + * 交易的服务类型 + */ + @TableField("SERVICETYPE") + @JsonProperty("serviceType") + private Integer serviceType; + + /** + * 算法标识 1-3DES 2-SM4 + */ + @TableField("ALGORITHMIDENTIFIER") + @JsonProperty("algorithmIdentifier") + private Integer algorithmIdentifier; + + /** + * 消费密钥版本号 + */ + @TableField("KEYVERSION") + @JsonProperty("keyVersion") + private String keyVersion; + + /** + * 天线ID编号 + */ + @TableField("ANTENNAID") + @JsonProperty("antennaID") + private Integer antennaId; + + /** + * 计费模块和计费参数版本号 + */ + @TableField("RATEVERSION") + @JsonProperty("rateVersion") + private String rateVersion; + + /** + * 交易耗时(毫秒) + */ + @TableField("CONSUMETIME") + @JsonProperty("consumeTime") + private Integer consumeTime; + + /** + * 通行状态 1有入口 2无入口 + */ + @TableField("PASSSTATE") + @JsonProperty("passState") + private Integer passState; + + /** + * 入口车道编号 + */ + @TableField("ENTOLLLANEID") + @JsonProperty("enTollLaneId") + private String enTollLaneId; + + /** + * 入口站HEX字符串 + */ + @TableField("ENTOLLSTATIONHEX") + @JsonProperty("enTollStationHex") + private String enTollStationHex; + + /** + * 入口交易时间 + */ + @TableField("ENTIME") + @JsonProperty("enTime") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "GMT+8") + private Date enTime; + + /** + * 入口车道类型 + */ + @TableField("ENLANETYPE") + @JsonProperty("enLaneType") + private String enLaneType; + + /** + * 通行标识ID + */ + @TableField("PASSID") + @JsonProperty("passId") + private String passId; + + /** + * 上一个门架HEX编号 + */ + @TableField("LASTGANTRYHEX") + @JsonProperty("lastGantryHex") + private String lastGantryHex; + + /** + * 通过上一个门架的时间 + */ + @TableField("LASTGANTRYTIME") + @JsonProperty("lastGantryTime") + private String lastGantryTime; + + /** + * OBU/CPC物理地址 + */ + @TableField("OBUMAC") + @JsonProperty("OBUMAC") + private String obuMac; + + /** + * OBU/CPC发行方标识 + */ + @TableField("OBUISSUEID") + @JsonProperty("OBUIssueID") + private String obuIssueId; + + /** + * OBU/CPC序号编码 + */ + @TableField("OBUSN") + @JsonProperty("OBUSN") + private String obuSn; + + /** + * OBU/CPC版本号 + */ + @TableField("OBUVERSION") + @JsonProperty("OBUVersion") + private Integer obuVersion; + + /** + * OBU/CPC起始日期 + */ + @TableField("OBUSTARTDATE") + @JsonProperty("OBUStartDate") + private Integer obuStartDate; + + /** + * OBU/CPC截止日期 + */ + @TableField("OBUENDDATE") + @JsonProperty("OBUEndDate") + private Integer obuEndDate; + + /** + * OBU/CPC电量百分比 + */ + @TableField("OBUELECTRICAL") + @JsonProperty("OBUElectrical") + private Integer obuElectrical; + + /** + * OBU/CPC状态 + */ + @TableField("OBUSTATE") + @JsonProperty("OBUState") + private String obuState; + + /** + * 标签内车牌号码 + */ + @TableField("OBUVEHICLEPLATE") + @JsonProperty("OBUVehiclePlate") + private String obuVehiclePlate; + + /** + * 标签内车型 + */ + @TableField("OBUVEHICLETYPE") + @JsonProperty("OBUVehicleType") + private Integer obuVehicleType; + + /** + * 车辆用户类型 + */ + @TableField("VEHICLEUSERTYPE") + @JsonProperty("vehicleUserType") + private Integer vehicleUserType; + + /** + * 车辆座位数/载重 + */ + @TableField("VEHICLESEAT") + @JsonProperty("vehicleSeat") + private Integer vehicleSeat; + + /** + * 车轴数 + */ + @TableField("AXLECOUNT") + @JsonProperty("axleCount") + private Integer axleCount; + + /** + * 车货总重(kg) + */ + @TableField("TOTALWEIGHT") + @JsonProperty("totalWeight") + private Integer totalWeight; + + /** + * 车辆长(dm) + */ + @TableField("VEHICLELENGTH") + @JsonProperty("vehicleLength") + private Integer vehicleLength; + + /** + * 车辆宽(dm) + */ + @TableField("VEHICLEWIDTH") + @JsonProperty("vehicleWidth") + private Integer vehicleWidth; + + /** + * 车辆高(dm) + */ + @TableField("VEHICLEHIGHT") + @JsonProperty("vehicleHight") + private Integer vehicleHight; + + /** + * CPU卡片网络编号 + */ + @TableField("CPUNETID") + @JsonProperty("CPUNetID") + private String cpuNetId; + + /** + * CPU卡片发行方标识 + */ + @TableField("CPUISSUEID") + @JsonProperty("CPUIssueID") + private String cpuIssueId; + + /** + * CPU内车牌号码 + */ + @TableField("CPUVEHICLEPLATE") + @JsonProperty("CPUVehiclePlate") + private String cpuVehiclePlate; + + /** + * CPU内车型 + */ + @TableField("CPUVEHICLETYPE") + @JsonProperty("CPUVehicleType") + private Integer cpuVehicleType; + + /** + * CPU起始日期 + */ + @TableField("CPUSTARTDATE") + @JsonProperty("CPUStartDate") + private Integer cpuStartDate; + + /** + * CPU截止日期 + */ + @TableField("CPUENDDATE") + @JsonProperty("CPUEndDate") + private Integer cpuEndDate; + + /** + * CPU用户卡版本号 + */ + @TableField("CPUVERSION") + @JsonProperty("CPUVersion") + private Integer cpuVersion; + + /** + * CPU卡类型 0默认 1储值 2记账 + */ + @TableField("CPUCARDTYPE") + @JsonProperty("CPUCardType") + private Integer cpuCardType; + + /** + * CPU卡编号 + */ + @TableField("CPUCARDID") + @JsonProperty("CPUCardId") + private String cpuCardId; + + /** + * 交易前余额(分) + */ + @TableField("BALANCEBEFORE") + @JsonProperty("balanceBefore") + private Long balanceBefore; + + /** + * 交易后余额(分) + */ + @TableField("BALANCEAFTER") + @JsonProperty("balanceAfter") + private Long balanceAfter; + + /** + * CPC卡过站信息数量 + */ + @TableField("GANTRYPASSCOUNT") + @JsonProperty("gantryPassCount") + private Integer gantryPassCount; + + /** + * CPC卡EF02过站信息 + */ + @TableField("GANTRYPASSINFO") + @JsonProperty("gantryPassInfo") + private String gantryPassInfo; + + /** + * CPC卡省内计费信息(弃用) + */ + @TableField("FEEPROVINFO") + @JsonProperty("feeProvInfo") + private String feeProvInfo; + + /** + * 读出的本省累计金额 + */ + @TableField("FEESUMLOCALBEFORE") + @JsonProperty("feeSumLocalBefore") + private Long feeSumLocalBefore; + + /** + * 写入的本省累计金额 + */ + @TableField("FEESUMLOCALAFTER") + @JsonProperty("feeSumLocalAfter") + private Long feeSumLocalAfter; + + /** + * 计费接口特情值 + */ + @TableField("FEECALCSPECIAL") + @JsonProperty("feeCalcSpecial") + private Integer feeCalcSpecial; + + /** + * 计费模块响应结果 0正常 负数为异常 + */ + @TableField("FEECALCRESULT") + @JsonProperty("feeCalcResult") + private Integer feeCalcResult; + + /** + * 计费模块返回信息1 + */ + @TableField("FEEINFO1") + @JsonProperty("feeInfo1") + private String feeInfo1; + + /** + * 计费模块返回信息2 + */ + @TableField("FEEINFO2") + @JsonProperty("feeInfo2") + private String feeInfo2; + + /** + * 计费模块返回信息3 + */ + @TableField("FEEINFO3") + @JsonProperty("feeInfo3") + private String feeInfo3; + + /** + * 本次交易前标签累计应收金额 + */ + @TableField("OBUPAYFEESUMBEFORE") + @JsonProperty("OBUpayFeeSumBefore") + private Long obuPayFeeSumBefore; + + /** + * 本次交易后标签累计应收金额 + */ + @TableField("OBUPAYFEESUMAFTER") + @JsonProperty("OBUpayFeeSumAfter") + private Long obuPayFeeSumAfter; + + /** + * 本次交易前标签累计优惠金额 + */ + @TableField("OBUDISCOUNTFEESUMBEFORE") + @JsonProperty("OBUdiscountFeeSumBefore") + private Long obuDiscountFeeSumBefore; + + /** + * 本次交易后标签累计优惠金额 + */ + @TableField("OBUDISCOUNTFEESUMAFTER") + @JsonProperty("OBUdiscountFeeSumAfter") + private Long obuDiscountFeeSumAfter; + + /** + * 本次交易前标签累计实收金额(省内) + */ + @TableField("OBUPROVFEESUMBEFORE") + @JsonProperty("OBUProvfeeSumBefore") + private Long obuProvFeeSumBefore; + + /** + * 本次交易后标签累计实收金额(省内) + */ + @TableField("OBUPROVFEESUMAFTER") + @JsonProperty("OBUProvfeeSumAfter") + private Long obuProvFeeSumAfter; + + /** + * 本次交易前卡片累计金额 + */ + @TableField("CARDFEESUMBEFORE") + @JsonProperty("cardfeeSumBefore") + private Long cardFeeSumBefore; + + /** + * 本次交易后卡片累计金额 + */ + @TableField("CARDFEESUMAFTER") + @JsonProperty("cardfeeSumAfter") + private Long cardFeeSumAfter; + + /** + * 本次交易前累计无卡次数 + */ + @TableField("NOCARDTIMESBEFORE") + @JsonProperty("noCardTimesBefore") + private Integer noCardTimesBefore; + + /** + * 本次交易后累计无卡次数 + */ + @TableField("NOCARDTIMESAFTER") + @JsonProperty("noCardTimesAfter") + private Integer noCardTimesAfter; + + /** + * 本次交易前累计省份数量 + */ + @TableField("PROVINCENUMBEFORE") + @JsonProperty("provinceNumBefore") + private Integer provinceNumBefore; + + /** + * 本次交易后累计省份数量 + */ + @TableField("PROVINCENUMAFTER") + @JsonProperty("provinceNumAfter") + private Integer provinceNumAfter; + + /** + * 本次交易前标签累计写入成功总量 + */ + @TableField("OBUTOTALTRADESUCCNUMBEFORE") + @JsonProperty("OBUTotalTradeSuccNumBefore") + private Integer obuTotalTradeSuccNumBefore; + + /** + * 本次交易后标签累计写入成功总量 + */ + @TableField("OBUTOTALTRADESUCCNUMAFTER") + @JsonProperty("OBUTotalTradeSuccNumAfter") + private Integer obuTotalTradeSuccNumAfter; + + /** + * 本次交易前标签累计交易成功次数(省内) + */ + @TableField("OBUPROVTRADESUCCNUMBEFORE") + @JsonProperty("OBUProvTradeSuccNumBefore") + private Integer obuProvTradeSuccNumBefore; + + /** + * 本次交易后标签累计交易成功次数(省内) + */ + @TableField("OBUPROVTRADESUCCNUMAFTER") + @JsonProperty("OBUProvTradeSuccNumAfter") + private Integer obuProvTradeSuccNumAfter; + + /** + * 标签写入结果 0成功 1失败 2不计费但写卡成功 + */ + @TableField("OBUTRADERESULT") + @JsonProperty("OBUTradeResult") + private Integer obuTradeResult; + + /** + * 交易类型 0复合+写卡 1仅标签 2仅复合 + */ + @TableField("TRADETYPE") + @JsonProperty("tradeType") + private Integer tradeType; + + /** + * 读取标签入口信息类型 0AA 1BB 2CC 3其他 + */ + @TableField("OBUINFOTYPEREAD") + @JsonProperty("OBUInfoTypeRead") + private Integer obuInfoTypeRead; + + /** + * 本次写入标签入口信息类型 0AA 1BB 2CC + */ + @TableField("OBUINFOTYPEWRITE") + @JsonProperty("OBUInfoTypeWrite") + private Integer obuInfoTypeWrite; + + /** + * 标签入口状态 1有入口 2无入口 + */ + @TableField("OBUPASSSTATE") + @JsonProperty("OBUPassState") + private Integer obuPassState; + + /** + * 计费车型 + */ + @TableField("FEEVEHICLETYPE") + @JsonProperty("feeVehicleType") + private Integer feeVehicleType; + + /** + * OBU中上一个门架HEX + */ + @TableField("OBULASTGANTRYHEX") + @JsonProperty("OBULastGantryHex") + private String obuLastGantryHex; + + /** + * OBU中通过上一个门架时间 + */ + @TableField("OBULASTGANTRYTIME") + @JsonProperty("OBULastGantryTime") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "GMT+8") + private Date obuLastGantryTime; + + /** + * 本次计费里程(米) + */ + @TableField("FEEMILEAGE") + @JsonProperty("feeMileage") + private Integer feeMileage; + + /** + * 本次交易前标签累计里程 + */ + @TableField("OBUMILEAGEBEFORE") + @JsonProperty("OBUMileageBefore") + private Long obuMileageBefore; + + /** + * 本次交易后标签累计里程 + */ + @TableField("OBUMILEAGEAFTER") + @JsonProperty("OBUMileageAfter") + private Long obuMileageAfter; + + /** + * 本次交易读取的EF04加密摘要 + */ + @TableField("TRADEREADCIPHERTEXT") + @JsonProperty("tradeReadCiphertext") + private String tradeReadCiphertext; + + /** + * 本次读取EF04加密摘要验证结果 0成功 1失败 + */ + @TableField("READCIPHERTEXTVERIFY") + @JsonProperty("readCiphertextVerify") + private Integer readCiphertextVerify; + + /** + * 本次交易生成的EF04加密摘要 + */ + @TableField("TRADEWRITECIPHERTEXT") + @JsonProperty("tradeWriteCiphertext") + private String tradeWriteCiphertext; + + /** + * 省界出口参考金额(分) + */ + @TableField("PROVMINFEE") + @JsonProperty("provMinFee") + private Long provMinFee; + + /** + * 本省累计通行金额计算方式 1最短路径 2最小费额 3其他 + */ + @TableField("PROVMINFEECALCMODE") + @JsonProperty("provMinFeeCalcMode") + private Integer provMinFeeCalcMode; + + /** + * 计费协议保留字段1 + */ + @TableField("FEESPARE1") + @JsonProperty("feeSpare1") + private Integer feeSpare1; + + /** + * 计费协议保留字段2 + */ + @TableField("FEESPARE2") + @JsonProperty("feeSpare2") + private Integer feeSpare2; + + /** + * 计费协议保留字段3 + */ + @TableField("FEESPARE3") + @JsonProperty("feeSpare3") + private String feeSpare3; + + /** + * 本省计费起点 + */ + @TableField("FEEPROVBEGINHEX") + @JsonProperty("feeProvBeginHex") + private String feeProvBeginHex; + + /** + * 计费模块计费模式 1无拟合路径 2拟合路径 + */ + @TableField("RATECOMPUTE") + @JsonProperty("rateCompute") + private Integer rateCompute; + + /** + * 计费模块拟合点总数 + */ + @TableField("RATEFITCOUNT") + @JsonProperty("rateFitCount") + private Integer rateFitCount; + + /** + * 本次交易前标签累计实收金额 + */ + @TableField("OBUFEESUMBEFORE") + @JsonProperty("OBUFeeSumBefore") + private Long obuFeeSumBefore; + + /** + * 本次交易后标签累计实收金额 + */ + @TableField("OBUFEESUMAFTER") + @JsonProperty("OBUFeeSumAfter") + private Long obuFeeSumAfter; + + /** + * 本次交易前标签累计应收金额(省内) + */ + @TableField("OBUPROVPAYFEESUMBEFORE") + @JsonProperty("OBUProvPayFeeSumBefore") + private Long obuProvPayFeeSumBefore; + + /** + * 本次交易后标签累计应收金额(省内) + */ + @TableField("OBUPROVPAYFEESUMAFTER") + @JsonProperty("OBUProvPayFeeSumAfter") + private Long obuProvPayFeeSumAfter; + + /** + * 本次计费拟合结果标识 0未拟合或成功 1失败 + */ + @TableField("PATHFITFLAG") + @JsonProperty("pathFitFlag") + private Integer pathFitFlag; + + /** + * 计费特情值组合 + */ + @TableField("FEECALCSPECIALS") + @JsonProperty("feeCalcSpecials") + private String feeCalcSpecials; + + /** + * 本省累计金额取整(分) + */ + @TableField("PAYFEEPROVSUMLOCAL") + @JsonProperty("payFeeProvSumLocal") + private Long payFeeProvSumLocal; + + /** + * PC-RSU接口协议版本号 + */ + @TableField("PCRSUVERSION") + @JsonProperty("PCRSUVersion") + private Integer pcRsuVersion; + + /** + * 本次写入CPC卡EF02过站信息 + */ + @TableField("GANTRYPASSINFOAFTER") + @JsonProperty("gantryPassInfoAfter") + private String gantryPassInfoAfter; + + /** + * 更新过站信息结果 1成功 2失败(弃用) + */ + @TableField("UPDATERESULT") + @JsonProperty("updateResult") + private Integer updateResult; + + /** + * CPC卡计费信息文件写入结果 0成功 1失败 + */ + @TableField("CPCFEETRADERESULT") + @JsonProperty("CPCFeeTradeResult") + private Integer cpcFeeTradeResult; + + /** + * 本次写入CPC EF04本省计费信息 + */ + @TableField("FEEPROVEF04") + @JsonProperty("feeProvEF04") + private String feeProvEF04; + + /** + * CPC卡是否进行全省路径拟合的标识 0未拟合 >0省内定义 + */ + @TableField("FITPROVFLAG") + @JsonProperty("fitProvFlag") + private Integer fitProvFlag; + + /** + * 读取CPC卡EF02已写门架数量 + */ + @TableField("GANTRYPASSCOUNTBEFORE") + @JsonProperty("gantryPassCountBefore") + private Integer gantryPassCountBefore; + + /** + * 拟合后的本省省界入口ETC门架HEX码 + */ + @TableField("FEEPROVBEGINHEXFIT") + @JsonProperty("feeProvBeginHexFit") + private String feeProvBeginHexFit; + + /** + * 拟合后的本省省界入口ETC门架通行时间 + */ + @TableField("FEEPROVBEGINTIMEFIT") + @JsonProperty("feeProvBeginTimeFit") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "GMT+8") + private Date feeProvBeginTimeFit; + + /** + * CPC本省省界入口ETC门架通行时间 + */ + @TableField("FEEPROVBEGINTIME") + @JsonProperty("feeProvBeginTime") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "GMT+8") + private Date feeProvBeginTime; + + /** + * CPC本省累计拆分金额 + */ + @TableField("FEESUMLOCALAFTEREF04") + @JsonProperty("feeSumLocalAfterEF04") + private Long feeSumLocalAfterEF04; + + /** + * CPC EF02上个门架的计费金额 + */ + @TableField("LASTGANTRYFEEPASS") + @JsonProperty("lastGantryFeePass") + private Integer lastGantryFeePass; + + /** + * CPC EF02上个门架的计费里程 + */ + @TableField("LASTGANTRYMILEPASS") + @JsonProperty("lastGantryMilePass") + private Integer lastGantryMilePass; + + /** + * 路侧单元厂商代码 + */ + @TableField("RSUMANUID") + @JsonProperty("RSUManuid") + private String rsuManuid; + + /** + * 计费协议数据结构版本号 + */ + @TableField("FEEDATAVERSION") + @JsonProperty("feeDataVersion") + private String feeDataVersion; + + /** + * 配置的反向门架阈值组合 + */ + @TableField("GANTRYHEXOPPOTIME") + @JsonProperty("gantryHexOppotime") + private String gantryHexOppotime; + + /** + * 本次交易后标签累计应收金额(门架拟合前) + */ + @TableField("OBUPAYFEESUMAFTERNOFIT") + @JsonProperty("OBUpayFeeSumAfterNoFit") + private Integer obuPayFeeSumAfterNoFit; + + /** + * 本次交易后标签累计实收金额(门架拟合前) + */ + @TableField("OBUFEESUMAFTERNOFIT") + @JsonProperty("OBUFeeSumAfterNoFit") + private Integer obuFeeSumAfterNoFit; + + /** + * 标签内车辆用户类型 + */ + @TableField("OBUVEHICLEUSERTYPE") + @JsonProperty("OBUVehicleUserType") + private Integer obuVehicleUserType; + + /** + * 交易前读取的本省或邻省计费起点 + */ + @TableField("FEEPROVBEGINHEXBEFORE") + @JsonProperty("feeProvBeginHexBefore") + private String feeProvBeginHexBefore; + + /** + * 门架拟合结果 + */ + @TableField("GANTRYFITRESULT") + @JsonProperty("gantryFitResult") + private Integer gantryFitResult; + + /** + * 门架拟合参数版本信息 + */ + @TableField("GANTRYFITVERSION") + @JsonProperty("gantryFitVersion") + private String gantryFitVersion; + + + + /** + * 门架拟合出的HEX集合 _分隔 + */ + @TableField("GANTRYFITHexs") + @JsonProperty("gantryFitHexs") + private String gantryFitHexs; + + /** + * 门架拟合出的收费单元集合 _分隔 |代收 + */ + @TableField("GANTRYFITTOLLS") + @JsonProperty("gantryFitTolls") + private String gantryFitTolls; + + /** + * 邻省拟合门架应收金额(分) + */ + @TableField("GANTRYFITNPROVPAYFEE") + @JsonProperty("gantryFitNProvPayfee") + private Long gantryFitNProvPayfee; + + /** + * 邻省拟合门架优惠金额(分) + */ + @TableField("GANTRYFITNPROVDISCONTEE") + @JsonProperty("gantryFitNProvDiscontfee") + private Long gantryFitNProvDiscontfee; + + /** + * 邻省拟合门架实收金额(分) + */ + @TableField("GANTRYFITNPROVREALFEE") + @JsonProperty("gantryFitNProvRealfee") + private Long gantryFitNProvRealfee; + + /** + * 邻省拟合门架里程(米) + */ + @TableField("GANTRYFITNPROVMILES") + @JsonProperty("gantryFitNProvMiles") + private Integer gantryFitNProvMiles; + + /** + * 邻省拟合门架应收金额组合 _分隔 |代收 + */ + @TableField("GANTRYFITNPROVPAYFEEGROUP") + @JsonProperty("gantryFitNProvPayfeeGroup") + private String gantryFitNProvPayfeeGroup; + + /** + * 邻省拟合门架优惠金额组合 _分隔 |代收 + */ + @TableField("GANTRYFITNPROVDISCONTEEGROUP") + @JsonProperty("gantryFitNProvDiscontfeeGroup") + private String gantryFitNProvDiscontfeeGroup; + + /** + * 邻省拟合门架实收金额组合 _分隔 |代收 + */ + @TableField("GANTRYFITNPROVREALFEEGROUP") + @JsonProperty("gantryFitNProvRealfeeGroup") + private String gantryFitNProvRealfeeGroup; + + /** + * 拟合后邻省全省累计应收金额(分) + */ + @TableField("GANTRYFITNPROVPAYFEESUM") + @JsonProperty("gantryFitNProvPayFeeSum") + private Long gantryFitNProvPayFeeSum; + + /** + * 拟合后邻省全省累计拆分金额(分) + */ + @TableField("GANTRYFITNPROVREALFEESUM") + @JsonProperty("gantryFitNProvRealFeeSum") + private Long gantryFitNProvRealFeeSum; + + /** + * 拟合后邻省全省累计里程(米) + */ + @TableField("GANTRYFITNPROVMILESUM") + @JsonProperty("gantryFitNProvMileSum") + private Integer gantryFitNProvMileSum; + + /** + * 邻省拟合门架预实收金额(分) + */ + @TableField("GANTRYFITNPROVPREREALFEE") + @JsonProperty("gantryFitNProvPreRealfee") + private Long gantryFitNProvPreRealfee; + + /** + * 邻省拟合门架实收金额描述 + */ + @TableField("PATHFITDESC") + @JsonProperty("pathfitDesc") + private String pathfitDesc; + + /** + * 邻省省份代码 + */ + @TableField("GANTRYFITNEIGHBORPROVCODE") + @JsonProperty("gantryFitNeighborProvCode") + private Integer gantryFitNeighborProvCode; + + /** + * 节假日状态 0非节假日 1节假日 + */ + @TableField("HOLIDAYSTATE") + @JsonProperty("holidayState") + private Integer holidayState; + + /** + * 卡片复合交易结果 0成功 1失败 + */ + @TableField("TRADERESULT") + @JsonProperty("tradeResult") + private Integer tradeResult; + + /** + * 计费文件中上一个门架HEX(弃用) + */ + @TableField("LASTGANTRYHEXFEE") + @JsonProperty("lastGantryHexFee") + private String lastGantryHexFee; + + /** + * 过站信息中上一个门架HEX + */ + @TableField("LASTGANTRYHEXPASS") + @JsonProperty("lastGantryHexPass") + private String lastGantryHexPass; + + /** + * 门架特情类型 |分隔 + */ + @TableField("SPECIALTYPE") + @JsonProperty("specialType") + private String specialType; + + /** + * 收费特情类型 + */ + @TableField("CHARGESSPECIALTYPE") + @JsonProperty("chargesSpecialType") + private String chargesSpecialType; + + /** + * 关键字段校验码 + */ + @TableField("VERIFYCODE") + @JsonProperty("verifyCode") + private String verifyCode; + + /** + * 干扰信号 1无 2有 + */ + @TableField("INTERRUPTSIGNAL") + @JsonProperty("interruptSignal") + private Integer interruptSignal; + + /** + * 车牌识别流水号 + */ + @TableField("VEHICLEPICID") + @JsonProperty("vehiclePicId") + private String vehiclePicId; + + /** + * 车尾识别流水号 + */ + @TableField("VEHICLETAILPICID") + @JsonProperty("vehicleTailPicId") + private String vehicleTailPicId; + + /** + * 匹配状态 0未处理 1有匹配 2无匹配 3反向 + */ + @TableField("MATCHSTATUS") + @JsonProperty("matchStatus") + private Integer matchStatus; + + /** + * 去重状态 0未处理 1有效 2重复 + */ + @TableField("VALIDSTATUS") + @JsonProperty("validStatus") + private Integer validStatus; + + /** + * 处理状态 0未处理 1已处理 + */ + @TableField("DEALSTATUS") + @JsonProperty("dealStatus") + private Integer dealStatus; + + /** + * 是否修正过 0未修正 1已修正 + */ + @TableField("ISFIXDATA") + @JsonProperty("isFixData") + private Integer isFixData; + + /** + * 同一收费单元成功关联流水 |分隔 + */ + @TableField("RELATEDTRADEID") + @JsonProperty("relatedTradeId") + private String relatedTradeId; + + /** + * 全部关联流水 |分隔 + */ + @TableField("ALLRELATEDTRADEID") + @JsonProperty("allRelatedTradeId") + private String allRelatedTradeId; + + /** + * 门架后台入库时间 + */ + @TableField("STATIONDBTIME") + @JsonProperty("stationDBTime") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "GMT+8") + private Date stationDbTime; + + /** + * 门架后台处理时间 + */ + @TableField("STATIONDEALTIME") + @JsonProperty("stationDealTime") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "GMT+8") + private Date stationDealTime; + + /** + * 门架后台去重时间 + */ + @TableField("STATIONVALIDTIME") + @JsonProperty("stationValidTime") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "GMT+8") + private Date stationValidTime; + + /** + * 门架后台匹配时间 + */ + @TableField("STATIONMATCHTIME") + @JsonProperty("stationMatchTime") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "GMT+8") + private Date stationMatchTime; + /** + * 路段编号 + */ + @TableField("ROADNO") + @JsonProperty("roadno") + private Integer roadno; + /** + * 站点编码 + */ + @TableField("STANO") + @JsonProperty("stano") + private Integer stano; +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCUploadGantryData.java b/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCUploadGantryData.java new file mode 100644 index 0000000..6cf7731 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCUploadGantryData.java @@ -0,0 +1,20 @@ +package com.nmggs.query.entity; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * @author: shuguang + * @date: 2025年09月26日 9:35 + * @description: + */ +@Data +public class DCPCUploadGantryData { + @JsonProperty("msgId") + private String msgId; + + @JsonProperty("tradeInfoList") + private List tradeInfoList; +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCUploadReturnData.java b/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCUploadReturnData.java new file mode 100644 index 0000000..6bd7ae8 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/entity/DCPCUploadReturnData.java @@ -0,0 +1,19 @@ +package com.nmggs.query.entity; + +import lombok.Data; + +import java.util.List; + +/** + * @author: shuguang + * @date: 2025年09月26日 10:14 + * @description: + */ +@Data +public class DCPCUploadReturnData { + private Integer subCode; + private String info; + private String receiveTime; + private Integer successCount; + private List failList; +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestExSta.java b/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestExSta.java new file mode 100644 index 0000000..066d785 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestExSta.java @@ -0,0 +1,20 @@ +package com.nmggs.query.entity; + +import lombok.Data; + +/** + * @author: shuguang + * @date: 2025年09月25日 14:30 + * @description: + */ +@Data +public class RequestExSta { + + private String VehiclePlate; + private String dateStart; + private String dateEnd; + + private String authKey; + + private String md5; +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestMinFee.java b/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestMinFee.java new file mode 100644 index 0000000..dd5bd46 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestMinFee.java @@ -0,0 +1,20 @@ +package com.nmggs.query.entity; + +import lombok.Data; + +/** + * @author: shuguang + * @date: 2025年09月25日 14:30 + * @description: + */ +@Data +public class RequestMinFee { + + private String version; + private Integer subcomno; + private Integer stano; + + private String authKey; + + private String md5; +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestParam.java b/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestParam.java new file mode 100644 index 0000000..e3067fa --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestParam.java @@ -0,0 +1,18 @@ +package com.nmggs.query.entity; + +import lombok.Data; + +/** + * @author: shuguang + * @date: 2025年09月25日 14:30 + * @description: + */ +@Data +public class RequestParam { + + private String fileName; + + private String authKey; + + private String md5; +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestVersion.java b/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestVersion.java new file mode 100644 index 0000000..11c9195 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/entity/RequestVersion.java @@ -0,0 +1,18 @@ +package com.nmggs.query.entity; + +import lombok.Data; + +/** + * @author: shuguang + * @date: 2025年09月25日 14:30 + * @description: + */ +@Data +public class RequestVersion { + + private Integer version; + + private String authKey; + + private String md5; +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/entity/fx/EquipmentStatistics.java b/GetDataInterface/src/main/java/com/nmggs/query/entity/fx/EquipmentStatistics.java new file mode 100644 index 0000000..e03a8fa --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/entity/fx/EquipmentStatistics.java @@ -0,0 +1,25 @@ +package com.nmggs.query.entity.fx; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * @author: shuguang + * @date: 2025年09月18日 17:51 + * @description: + */ +@Data +@TableName("zdyh_equipment_statistics") +public class EquipmentStatistics { + @TableField("classdate") + private Date classdate; + @TableField("equipmentid") + private Integer equipmentid; + @TableField("departmentno") + private Integer departmentno; + @TableField("state") + private Integer state; +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/mapper/DCPCGantryPassMapper.java b/GetDataInterface/src/main/java/com/nmggs/query/mapper/DCPCGantryPassMapper.java new file mode 100644 index 0000000..21aee3d --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/mapper/DCPCGantryPassMapper.java @@ -0,0 +1,14 @@ +package com.nmggs.query.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nmggs.query.entity.DCPCGantryPass; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author: shuguang + * @date: 2025年09月26日 10:00 + * @description: + */ +@Mapper +public interface DCPCGantryPassMapper extends BaseMapper { +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/mapper/GantryTableMapper.java b/GetDataInterface/src/main/java/com/nmggs/query/mapper/GantryTableMapper.java new file mode 100644 index 0000000..cabc905 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/mapper/GantryTableMapper.java @@ -0,0 +1,15 @@ +package com.nmggs.query.mapper; + +import org.apache.ibatis.annotations.Mapper; + +import java.util.Map; + +/** + * @author: shuguang + * @date: 2025年09月26日 11:28 + * @description: + */ +@Mapper +public interface GantryTableMapper { + Map selectByGantryId(String gantryId); +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/mapper/GantryTableMapper.xml b/GetDataInterface/src/main/java/com/nmggs/query/mapper/GantryTableMapper.xml new file mode 100644 index 0000000..71ab416 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/mapper/GantryTableMapper.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/GetDataInterface/src/main/java/com/nmggs/query/mapper/fx/EquipmentStatisticsMapper.java b/GetDataInterface/src/main/java/com/nmggs/query/mapper/fx/EquipmentStatisticsMapper.java new file mode 100644 index 0000000..2c869a8 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/mapper/fx/EquipmentStatisticsMapper.java @@ -0,0 +1,16 @@ +package com.nmggs.query.mapper.fx; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nmggs.query.entity.fx.EquipmentStatistics; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author: shuguang + * @date: 2025年09月18日 17:54 + * @description: + */ +@Mapper +@DS("fx") +public interface EquipmentStatisticsMapper extends BaseMapper { +} diff --git a/GetDataInterface/src/main/java/com/nmggs/query/mapper/fx/EquipmentStatisticsMapper.xml b/GetDataInterface/src/main/java/com/nmggs/query/mapper/fx/EquipmentStatisticsMapper.xml new file mode 100644 index 0000000..0ee34f2 --- /dev/null +++ b/GetDataInterface/src/main/java/com/nmggs/query/mapper/fx/EquipmentStatisticsMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/GetDataInterface/src/main/java/com/nmggs/query/service/AddInterfaceService.java b/GetDataInterface/src/main/java/com/nmggs/query/service/AddInterfaceService.java index ff3512b..71aba33 100644 --- a/GetDataInterface/src/main/java/com/nmggs/query/service/AddInterfaceService.java +++ b/GetDataInterface/src/main/java/com/nmggs/query/service/AddInterfaceService.java @@ -49,4 +49,15 @@ public interface AddInterfaceService { * @date 2025-04-27 9:53 */ String QueryExStationTrans(Map params, String uuid); + + /** + * 上传ETC门架数据 + * + * @param params 输入参数 + * @param uuid uuid + * @return java.lang.String + * @author shuguang + * @date 2025-04-27 9:53 + */ + String uploadEtcGantryPassData(Map params, String uuid); } diff --git a/GetDataInterface/src/main/java/com/nmggs/query/service/impl/AddInterfaceServiceImpl.java b/GetDataInterface/src/main/java/com/nmggs/query/service/impl/AddInterfaceServiceImpl.java index 0abbd42..27f8151 100644 --- a/GetDataInterface/src/main/java/com/nmggs/query/service/impl/AddInterfaceServiceImpl.java +++ b/GetDataInterface/src/main/java/com/nmggs/query/service/impl/AddInterfaceServiceImpl.java @@ -1,22 +1,36 @@ package com.nmggs.query.service.impl; import com.alibaba.fastjson2.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.nmggs.query.common.config.ExecutionTimeLogger; +import com.nmggs.query.common.emnu.Constant; import com.nmggs.query.common.emnu.MessageEnum; import com.nmggs.query.common.exception.PPException; import com.nmggs.query.common.utils.CheckUtils; +import com.nmggs.query.common.utils.DateTimeUtil; import com.nmggs.query.common.utils.FileUtil; +import com.nmggs.query.common.utils.JsonUtil; import com.nmggs.query.common.utils.MD5Util; import com.nmggs.query.common.utils.PropertiesUtil; import com.nmggs.query.common.utils.SM4Utils; +import com.nmggs.query.entity.DCPCFailList; +import com.nmggs.query.entity.DCPCGantryPass; +import com.nmggs.query.entity.DCPCUploadGantryData; +import com.nmggs.query.entity.DCPCUploadReturnData; +import com.nmggs.query.entity.RequestExSta; +import com.nmggs.query.entity.RequestMinFee; +import com.nmggs.query.entity.RequestVersion; import com.nmggs.query.entity.ResData; import com.nmggs.query.mapper.AddInterfaceMapper; +import com.nmggs.query.mapper.DCPCGantryPassMapper; +import com.nmggs.query.mapper.GantryTableMapper; import com.nmggs.query.service.AddInterfaceService; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; @@ -29,6 +43,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,6 +60,10 @@ public class AddInterfaceServiceImpl implements AddInterfaceService { @Resource private AddInterfaceMapper addInterfaceMapper; + @Resource + private DCPCGantryPassMapper dcpcGantryPassMapper; + @Resource + private GantryTableMapper gantryTableMapper; /** * 查询收费门架费率 @@ -59,11 +78,25 @@ public class AddInterfaceServiceImpl implements AddInterfaceService { @ExecutionTimeLogger public String gantryfee(Map params, String uuid) { log.info("[uuid:" + uuid + "]-开始通过接口获取收费门架费率,参数为" + params); - // 鉴权码 String authKey = PropertiesUtil.getValue("authKey"); - int version = (Integer) params.get("version"); - String reqAuthKey = (String) params.get("authKey"); - String reqMd5 = (String) params.get("md5"); + String dataJson = JsonUtil.conversionJson(params, uuid); + // 解析响应数据 + ResData resData = JSON.parseObject(dataJson, ResData.class); + // 提取密钥和加密数据 + String returnedKey = resData.getKey(); + String encryptedData = resData.getData(); + + // 解密数据 + String decryptedData = SM4Utils.sm4Decrypt(encryptedData, SM4Utils.sm4Decrypt(returnedKey, authKey)); + log.info("[uuid:" + uuid + "]-解密后的数据{}", decryptedData); + RequestVersion requestParam = JSON.parseObject(decryptedData, RequestVersion.class); + + + int version = requestParam.getVersion(); + String reqAuthKey = requestParam.getAuthKey(); + String reqMd5 = requestParam.getMd5(); + + String verifyMd5 = MD5Util.md5(version + authKey); log.info("[uuid:" + uuid + "]-鉴权码为:" + authKey + ",请求鉴权码为:" + reqAuthKey + ",请求md5为:" + reqMd5 + ",验证md5为:" + verifyMd5); CheckUtils.checkAddParams(authKey, reqAuthKey, reqMd5, verifyMd5); @@ -82,7 +115,7 @@ public class AddInterfaceServiceImpl implements AddInterfaceService { String jsonResult = conversionJson(list, uuid); //对数据进行加密返回并携带加密密钥 result = encryptData(jsonResult, uuid); - log.info("[uuid:{}]-数据处理完成",uuid); + log.info("[uuid:{}]-数据处理完成", uuid); return result; } @@ -92,7 +125,7 @@ public class AddInterfaceServiceImpl implements AddInterfaceService { try { // 生成SM4密钥 String key = SM4Utils.generateKey(); - log.info("[uuid:{}]-生成的SM4密钥为:{}",uuid,key); + log.info("[uuid:{}]-生成的SM4密钥为:{}", uuid, key); // 加密JSON数据 String encryptedJson = SM4Utils.sm4Encrypt(jsonResult, key); @@ -104,7 +137,7 @@ public class AddInterfaceServiceImpl implements AddInterfaceService { // 推送数据 result = JSON.toJSONString(resData); } catch (Exception e) { - log.error("[uuid:{}]-加密或生成密钥时出错:{}",uuid,e.getMessage(),e); + log.error("[uuid:{}]-加密或生成密钥时出错:{}", uuid, e.getMessage(), e); throw new PPException(MessageEnum.加密失败.getCode(), MessageEnum.加密失败.getMessage()); } return result; @@ -123,11 +156,23 @@ public class AddInterfaceServiceImpl implements AddInterfaceService { @ExecutionTimeLogger public String gantryinfo(Map params, String uuid) { log.info("[uuid:" + uuid + "]-开始通过接口获取连通关系数据,参数为" + params); - //鉴权码 String authKey = PropertiesUtil.getValue("authKey"); - int version = (Integer) params.get("version"); - String reqAuthKey = (String) params.get("authKey"); - String reqMd5 = (String) params.get("md5"); + String dataJson = JsonUtil.conversionJson(params, uuid); + // 解析响应数据 + ResData resData = JSON.parseObject(dataJson, ResData.class); + // 提取密钥和加密数据 + String returnedKey = resData.getKey(); + String encryptedData = resData.getData(); + + // 解密数据 + String decryptedData = SM4Utils.sm4Decrypt(encryptedData, SM4Utils.sm4Decrypt(returnedKey, authKey)); + log.info("[uuid:" + uuid + "]-解密后的数据{}", decryptedData); + RequestVersion requestParam = JSON.parseObject(decryptedData, RequestVersion.class); + + + int version = requestParam.getVersion(); + String reqAuthKey = requestParam.getAuthKey(); + String reqMd5 = requestParam.getMd5(); String verifyMd5 = MD5Util.md5(version + authKey); log.info("[uuid:" + uuid + "]-鉴权码为:" + authKey + ",请求鉴权码为:" + reqAuthKey + ",请求md5为:" + reqMd5 + ",验证md5为:" + verifyMd5); CheckUtils.checkAddParams(authKey, reqAuthKey, reqMd5, verifyMd5); @@ -145,15 +190,15 @@ public class AddInterfaceServiceImpl implements AddInterfaceService { String jsonResult = conversionJson(list, uuid); //对数据进行加密返回并携带加密密钥 result = encryptData(jsonResult, uuid); - log.info("[uuid:{}]-数据处理完成",uuid); + log.info("[uuid:{}]-数据处理完成", uuid); return result; } /** * 根据参数下载最小费额文件 * - * @param params 参数 - * @param uuid uuid + * @param params 参数 + * @param uuid uuid * @param response HttpServletResponse * @author shuguang * @date 2025-04-27 9:53 @@ -163,13 +208,26 @@ public class AddInterfaceServiceImpl implements AddInterfaceService { @ExecutionTimeLogger public void minPath(Map params, String uuid, HttpServletResponse response) { log.info("[uuid:" + uuid + "]-开始通过接口根据参数下载最小费额文件,参数为" + params); - String version = (String) params.get("version"); - int subcomno = (Integer) params.get("subcomno"); - int stano = (Integer) params.get("stano"); - //鉴权码 String authKey = PropertiesUtil.getValue("authKey"); - String reqAuthKey = (String) params.get("authKey"); - String reqMd5 = (String) params.get("md5"); + String dataJson = JsonUtil.conversionJson(params, uuid); + // 解析响应数据 + ResData resData = JSON.parseObject(dataJson, ResData.class); + // 提取密钥和加密数据 + String returnedKey = resData.getKey(); + String encryptedData = resData.getData(); + + // 解密数据 + String decryptedData = SM4Utils.sm4Decrypt(encryptedData, SM4Utils.sm4Decrypt(returnedKey, authKey)); + log.info("[uuid:" + uuid + "]-解密后的数据{}", decryptedData); + RequestMinFee requestParam = JSON.parseObject(decryptedData, RequestMinFee.class); + + + String version = requestParam.getVersion(); + int subcomno = requestParam.getSubcomno(); + int stano = requestParam.getStano(); + String reqAuthKey = requestParam.getAuthKey(); + String reqMd5 = requestParam.getMd5(); + String verifyMd5 = MD5Util.md5(version + subcomno + stano + authKey); log.info("[uuid:" + uuid + "]-鉴权码为:" + authKey + ",请求鉴权码为:" + reqAuthKey + ",请求md5为:" + reqMd5 + ",验证md5为:" + verifyMd5); CheckUtils.checkAddParams(authKey, reqAuthKey, reqMd5, verifyMd5); @@ -252,14 +310,24 @@ public class AddInterfaceServiceImpl implements AddInterfaceService { public String QueryExStationTrans(Map params, String uuid) { String result; log.info("[uuid:" + uuid + "]-开始通过接口获取出口交易数据,参数为" + params); - String vehiclePlate = (String) params.get("VehiclePlate"); - String dateStart = (String) params.get("dateStart"); - String dateEnd = (String) params.get("dateEnd"); - //鉴权码 String authKey = PropertiesUtil.getValue("authKey"); - String reqAuthKey = (String) params.get("authKey"); - String reqMd5 = (String) params.get("md5"); - String verifyMd5 = MD5Util.md5(vehiclePlate+dateStart+dateEnd + authKey); + String dataJson = JsonUtil.conversionJson(params, uuid); + // 解析响应数据 + ResData resData = JSON.parseObject(dataJson, ResData.class); + // 提取密钥和加密数据 + String returnedKey = resData.getKey(); + String encryptedData = resData.getData(); + + // 解密数据 + String decryptedData = SM4Utils.sm4Decrypt(encryptedData, SM4Utils.sm4Decrypt(returnedKey, authKey)); + log.info("[uuid:" + uuid + "]-解密后的数据{}", decryptedData); + RequestExSta requestParam = JSON.parseObject(decryptedData, RequestExSta.class); + String vehiclePlate = requestParam.getVehiclePlate(); + String dateStart = requestParam.getDateStart(); + String dateEnd = requestParam.getDateEnd(); + String reqAuthKey = requestParam.getAuthKey(); + String reqMd5 = requestParam.getMd5(); + String verifyMd5 = MD5Util.md5(vehiclePlate + dateStart + dateEnd + authKey); log.info("[uuid:" + uuid + "]-鉴权码为:" + authKey + ",请求鉴权码为:" + reqAuthKey + ",请求md5为:" + reqMd5 + ",验证md5为:" + verifyMd5); CheckUtils.checkAddParams(authKey, reqAuthKey, reqMd5, verifyMd5); List> list = addInterfaceMapper.selectExStationTransList(vehiclePlate, dateStart, dateEnd); @@ -270,7 +338,91 @@ public class AddInterfaceServiceImpl implements AddInterfaceService { String jsonResult = conversionMapToJson(map, uuid); //对数据进行加密返回并携带加密密钥 result = encryptData(jsonResult, uuid); - log.info("[uuid:{}]-数据处理完成",uuid); + log.info("[uuid:{}]-数据处理完成", uuid); + return result; + } + + /** + * 上传ETC门架数据 + * + * @param params 输入参数 + * @param uuid uuid + * @return java.lang.String + * @author shuguang + * @date 2025-04-27 9:53 + */ + @Override + @Transactional(rollbackFor = Exception.class) + @ExecutionTimeLogger + public String uploadEtcGantryPassData(Map params, String uuid) { + String result; + log.info("[uuid:" + uuid + "]-开始通过接口接收DCPC-ETC门架计费扣费交易数据,参数为" + params); + DCPCUploadReturnData returnData = new DCPCUploadReturnData(); + try { + String authKey = PropertiesUtil.getValue("authKey"); + String dataJson = JsonUtil.conversionJson(params, uuid); + // 解析响应数据 + ResData resData = JSON.parseObject(dataJson, ResData.class); + // 提取密钥和加密数据 + String returnedKey = resData.getKey(); + String encryptedData = resData.getData(); + // 解密数据 + String decryptedData = SM4Utils.sm4Decrypt(encryptedData, SM4Utils.sm4Decrypt(returnedKey, authKey)); + log.info("[uuid:" + uuid + "]-解密后的数据{}", decryptedData); + DCPCUploadGantryData dcpcUploadGantryData = JSON.parseObject(decryptedData, DCPCUploadGantryData.class); + List tradeInfoList = dcpcUploadGantryData.getTradeInfoList(); + + returnData.setReceiveTime(DateTimeUtil.getFormateString(new Date(), Constant.YYYY_MM_DD_T_HH_MM_SS)); + int successCount = 0; + if (tradeInfoList != null && tradeInfoList.size() > 0) { + if (tradeInfoList.size() > 100) { + returnData.setSubCode(998); + returnData.setInfo("业务数组长度超出100"); + } else { + + for (DCPCGantryPass pass : tradeInfoList) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("TRADEID", pass.getTradeId()); + boolean exists = dcpcGantryPassMapper.exists(queryWrapper); + if (!exists) { + //入库的时候STANO、ROADNO需要查询GANTRY_TABLE表获取 + Map gantryTable = gantryTableMapper.selectByGantryId(pass.getGantryId()); + if (gantryTable != null) { + pass.setStano(Integer.valueOf(gantryTable.get("STANO").toString())); + pass.setRoadno(Integer.valueOf(gantryTable.get("ROADNO").toString())); + dcpcGantryPassMapper.insert(pass); + successCount++; + }else { + DCPCFailList failList = new DCPCFailList(); + failList.setTradeId(pass.getTradeId()); + failList.setInfo(pass.getGantryId()+"门架信息不存在"); + returnData.getFailList().add(failList); + } + } else { + //重复记录不做入库 + DCPCFailList failList = new DCPCFailList(); + failList.setTradeId(pass.getTradeId()); + failList.setInfo("主键重复记录不做入库"); + returnData.getFailList().add(failList); + } + } + returnData.setSubCode(200); + returnData.setInfo("DCPC-ETC门架计费扣费交易数据接收成功"); + returnData.setSuccessCount(successCount); + } + } else { + returnData.setSubCode(401); + returnData.setInfo("业务数据为空"); + } + } catch (Exception e) { + log.error("[uuid:" + uuid + "]-DCPC-ETC门架计费扣费交易数据接收异常:" + e.getMessage(), e); + returnData.setSubCode(501); + returnData.setInfo("DCPC-ETC门架计费扣费交易数据接收异常"); + } + String jsonResult = JSON.toJSONString(returnData); + //对数据进行加密返回并携带加密密钥 + result = encryptData(jsonResult, uuid); + log.info("[uuid:{}]-接收DCPC-ETC门架计费扣费交易数据处理完成", uuid); return result; } diff --git a/GetDataInterface/src/main/java/com/nmggs/query/service/impl/GetDataServiceImpl.java b/GetDataInterface/src/main/java/com/nmggs/query/service/impl/GetDataServiceImpl.java index 788a2d2..f00677b 100644 --- a/GetDataInterface/src/main/java/com/nmggs/query/service/impl/GetDataServiceImpl.java +++ b/GetDataInterface/src/main/java/com/nmggs/query/service/impl/GetDataServiceImpl.java @@ -1,12 +1,17 @@ package com.nmggs.query.service.impl; +import com.alibaba.fastjson2.JSON; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.nmggs.query.common.config.ExecutionTimeLogger; import com.nmggs.query.common.emnu.MessageEnum; import com.nmggs.query.common.exception.PPException; import com.nmggs.query.common.utils.CheckUtils; +import com.nmggs.query.common.utils.JsonUtil; import com.nmggs.query.common.utils.PropertiesUtil; +import com.nmggs.query.common.utils.SM4Utils; +import com.nmggs.query.entity.RequestParam; +import com.nmggs.query.entity.ResData; import com.nmggs.query.mapper.InterfaceQueryMapper; import com.nmggs.query.service.GetDataService; import lombok.extern.slf4j.Slf4j; @@ -40,11 +45,22 @@ public class GetDataServiceImpl implements GetDataService { @ExecutionTimeLogger public String getData(Map params, String uuid) { log.info("[uuid:" + uuid + "]-开始通过接口获取基础信息,参数为"+params); - //鉴权码 String authKey = PropertiesUtil.getValue("authKey"); - String fileName = (String) params.get("fileName"); - String reqAuthKey = (String) params.get("authKey"); - String reqMd5 = (String) params.get("md5"); + String dataJson = JsonUtil.conversionJson(params, uuid); + // 解析响应数据 + ResData resData = JSON.parseObject(dataJson, ResData.class); + // 提取密钥和加密数据 + String returnedKey = resData.getKey(); + String encryptedData = resData.getData(); + + // 解密数据 + String decryptedData = SM4Utils.sm4Decrypt(encryptedData, SM4Utils.sm4Decrypt(returnedKey, authKey)); + log.info("[uuid:" + uuid + "]-解密后的数据{}", decryptedData); + RequestParam requestParam = JSON.parseObject(decryptedData, RequestParam.class); + + String fileName = requestParam.getFileName(); + String reqAuthKey = requestParam.getAuthKey(); + String reqMd5 = requestParam.getMd5(); CheckUtils.checkParams(authKey, reqAuthKey, reqMd5, fileName); List> list; String result = null; @@ -53,7 +69,7 @@ public class GetDataServiceImpl implements GetDataService { log.info("[uuid:" + uuid + "]-当前获取的是收费公路业主信息"); list = interfaceQueryMapper.getBasicLinkOwnerDownloadReq15(); //收费公路信息 - } else if (fileName.contains("BASIC_TOLLROADDOWNLOAD_REdisplayedSideImageQ_15")) { + } else if (fileName.contains("BASIC_TOLLROADDOWNLOAD_REQ_15")) { log.info("[uuid:" + uuid + "]-当前获取的是收费公路信息"); list = interfaceQueryMapper.getBasicTollRoadDownloadReq15(); //收费路段信息 diff --git a/GetDataInterface/src/main/java/com/nmggs/query/service/impl/ZDYHDataServiceImpl.java b/GetDataInterface/src/main/java/com/nmggs/query/service/impl/ZDYHDataServiceImpl.java index b036b9e..b000fab 100644 --- a/GetDataInterface/src/main/java/com/nmggs/query/service/impl/ZDYHDataServiceImpl.java +++ b/GetDataInterface/src/main/java/com/nmggs/query/service/impl/ZDYHDataServiceImpl.java @@ -7,13 +7,16 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.nmggs.query.common.config.ExecutionTimeLogger; import com.nmggs.query.common.exception.Result; +import com.nmggs.query.common.utils.DateTimeUtil; import com.nmggs.query.common.utils.PropertiesUtil; import com.nmggs.query.common.utils.SM4Utils; import com.nmggs.query.entity.ResData; import com.nmggs.query.entity.fx.EquipmentInfo; +import com.nmggs.query.entity.fx.EquipmentStatistics; import com.nmggs.query.entity.fx.UseInfo; import com.nmggs.query.entity.fx.WarningInfo; import com.nmggs.query.mapper.fx.EquipmentInfoMapper; +import com.nmggs.query.mapper.fx.EquipmentStatisticsMapper; import com.nmggs.query.mapper.fx.UseInfoMapper; import com.nmggs.query.mapper.fx.WarningInfoMapper; import com.nmggs.query.service.ZDYHDataService; @@ -39,6 +42,8 @@ public class ZDYHDataServiceImpl implements ZDYHDataService { private UseInfoMapper useInfoMapper; @Resource private WarningInfoMapper warningInfoMapper; + @Resource + private EquipmentStatisticsMapper equipmentStatisticsMapper; /** * 接收重点隐患车辆设备信息 @@ -52,7 +57,7 @@ public class ZDYHDataServiceImpl implements ZDYHDataService { @Override @ExecutionTimeLogger public Result getEquipmentInfo(Map params, String uuid) { - log.info("[uuid:{}]-开始接收重点隐患车辆设备信息" ,uuid); + log.info("[uuid:{}]-开始接收重点隐患车辆设备信息", uuid); String authKey = PropertiesUtil.getValue("authKey"); String dataJson = conversionJson(params, uuid); // 解析响应数据 @@ -65,9 +70,12 @@ public class ZDYHDataServiceImpl implements ZDYHDataService { String decryptedData = SM4Utils.sm4Decrypt(encryptedData, SM4Utils.sm4Decrypt(returnedKey, authKey)); // 将解密后的数据解析为 EquipmentInfo 列表 List equipmentInfos = JSON.parseArray(decryptedData, EquipmentInfo.class); - int updateCount=0; - int insertCount=0; - if(equipmentInfos!=null && equipmentInfos.size()>0){ + int updateCount = 0; + int insertCount = 0; + int updateCount2 = 0; + int insertCount2 = 0; + Date classdate = DateTimeUtil.getDateByDay(new Date()); + if (equipmentInfos != null && equipmentInfos.size() > 0) { for (EquipmentInfo info : equipmentInfos) { Integer equipmentid = info.getEquipmentid(); info.setUpdatetime(new Date()); @@ -75,19 +83,35 @@ public class ZDYHDataServiceImpl implements ZDYHDataService { queryWrapper.eq("equipmentid", equipmentid); boolean exists = equipmentInfoMapper.exists(queryWrapper); if (exists) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); + UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("equipmentid", equipmentid); equipmentInfoMapper.update(info, updateWrapper); updateCount++; - }else { + } else { equipmentInfoMapper.insert(info); insertCount++; } + QueryWrapper statisticsQueryWrapper = new QueryWrapper<>(); + statisticsQueryWrapper.eq("classdate", classdate) + .eq("equipmentid", equipmentid); + EquipmentStatistics statistics = new EquipmentStatistics(); + statistics.setClassdate(classdate); + statistics.setEquipmentid(equipmentid); + statistics.setState(info.getState()); + statistics.setDepartmentno(info.getDepartmentno()); + + boolean staExist = equipmentStatisticsMapper.exists(statisticsQueryWrapper); + if (!staExist) { + equipmentStatisticsMapper.insert(statistics); + insertCount2++; + }else { + equipmentStatisticsMapper.update(statistics, statisticsQueryWrapper); + updateCount2++; + } } } log.info("[uuid:{}]-接收重点隐患车辆设备信息完成,更新数量:{},插入数量:{}", uuid, updateCount, insertCount); - - + log.info("[uuid:{}]-更新设备状态统计表zdyh_equipment_statistics完成,更新数量:{},插入数量:{}", uuid, updateCount2, insertCount2); return Result.success("接收重点隐患车辆设备数据成功"); } @@ -103,7 +127,7 @@ public class ZDYHDataServiceImpl implements ZDYHDataService { @Override @ExecutionTimeLogger public Result getUseFrequency(Map params, String uuid) { - log.info("[uuid:{}]-开始接收重点隐患车辆使用频次数据" ,uuid); + log.info("[uuid:{}]-开始接收重点隐患车辆使用频次数据", uuid); String authKey = PropertiesUtil.getValue("authKey"); String dataJson = conversionJson(params, uuid); // 解析响应数据 @@ -116,9 +140,9 @@ public class ZDYHDataServiceImpl implements ZDYHDataService { String decryptedData = SM4Utils.sm4Decrypt(encryptedData, SM4Utils.sm4Decrypt(returnedKey, authKey)); // 将解密后的数据解析为 UseInfo列表 List infoList = JSON.parseArray(decryptedData, UseInfo.class); - int updateCount=0; - int insertCount=0; - if(infoList!=null && infoList.size()>0){ + int updateCount = 0; + int insertCount = 0; + if (infoList != null && infoList.size() > 0) { for (UseInfo info : infoList) { Integer equipmentid = info.getEquipmentid(); info.setUpdatetime(new Date()); @@ -127,12 +151,12 @@ public class ZDYHDataServiceImpl implements ZDYHDataService { .eq("classdate", info.getClassdate()); boolean exists = useInfoMapper.exists(queryWrapper); if (exists) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); + UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("equipmentid", equipmentid) .eq("classdate", info.getClassdate()); useInfoMapper.update(info, updateWrapper); updateCount++; - }else { + } else { useInfoMapper.insert(info); insertCount++; } @@ -155,7 +179,7 @@ public class ZDYHDataServiceImpl implements ZDYHDataService { */ @Override public Result getWarningData(Map params, String uuid) { - log.info("[uuid:{}]-开始接收重点隐患车辆预警结果数据" ,uuid); + log.info("[uuid:{}]-开始接收重点隐患车辆预警结果数据", uuid); String authKey = PropertiesUtil.getValue("authKey"); String dataJson = conversionJson(params, uuid); // 解析响应数据 @@ -168,9 +192,9 @@ public class ZDYHDataServiceImpl implements ZDYHDataService { String decryptedData = SM4Utils.sm4Decrypt(encryptedData, SM4Utils.sm4Decrypt(returnedKey, authKey)); // 将解密后的数据解析为 WarningInfo 列表 List infoList = JSON.parseArray(decryptedData, WarningInfo.class); - int updateCount=0; - int insertCount=0; - if(infoList!=null && infoList.size()>0){ + int updateCount = 0; + int insertCount = 0; + if (infoList != null && infoList.size() > 0) { for (WarningInfo info : infoList) { Integer equipmentid = info.getEquipmentid(); info.setUpdatetime(new Date()); @@ -179,12 +203,12 @@ public class ZDYHDataServiceImpl implements ZDYHDataService { .eq("classdate", info.getClassdate()); boolean exists = warningInfoMapper.exists(queryWrapper); if (exists) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); + UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("equipmentid", equipmentid) .eq("classdate", info.getClassdate()); warningInfoMapper.update(info, updateWrapper); updateCount++; - }else { + } else { warningInfoMapper.insert(info); insertCount++; } diff --git a/GetDataInterface/src/main/java/com/nmggs/query/test/Test250825.java b/GetDataInterface/src/main/java/com/nmggs/query/test/Test250825.java index a9c950b..18d70b8 100644 --- a/GetDataInterface/src/main/java/com/nmggs/query/test/Test250825.java +++ b/GetDataInterface/src/main/java/com/nmggs/query/test/Test250825.java @@ -15,76 +15,86 @@ public class Test250825 { String fixedKey = "8c602c65fe6f57c4b721c5078bb8a916"; String s = SM4Utils.generateKey(); System.out.println("密钥"+s); - - String json ="[\n" + - " {\n" + - " \"classdate\": \"2025-09-15\",\n" + - " \"equipmentid\": 487,\n" + - " \"equipmentname\": \"高速二支队\u200C\u200C赤峰大队\",\n" + - " \"departmentno\": 16,\n" + - " \"departmentname\": \"高速二支队\",\n" + - " \"passcount\": 120,\n" + - " \"warncount\": 5,\n" + - " \"fatiguecount\": 3,\n" + - " \"truckfatiguecount\": 1,\n" + - " \"dangerfatiguecount\": 1,\n" + - " \"carfatiguecount\": 1,\n" + - " \"severefatiguecount\": 2,\n" + - " \"truckseverefatiguecount\": 1,\n" + - " \"dangerseverefatiguecount\": 1,\n" + - " \"carseverefatiguecount\": 1,\n" + - " \"speedcount\": 10,\n" + - " \"truckspeedcount\": 3,\n" + - " \"dangerspeedcount\": 2,\n" + - " \"carspeedcount\": 5,\n" + - " \"facilitycount\": 8,\n" + - " \"truckfacilitycount\": 3,\n" + - " \"dangerfacilitycount\": 2,\n" + - " \"carfacilitycount\": 3,\n" + - " \"feeevasioncount\": 5,\n" + - " \"truckfeeevasioncount\": 2,\n" + - " \"dangerfeeevasioncount\": 1,\n" + - " \"carfeeevasioncount\": 2\n" + - " },\n" + - " {\n" + - " \"classdate\": \"2025-09-16\",\n" + - " \"equipmentid\": 335,\n" + - " \"equipmentname\": \"高速一支队\u200C\u200C苏木山大队\",\n" + - " \"departmentno\": 15,\n" + - " \"departmentname\": \"高速一支队\",\n" + - " \"passcount\": 150,\n" + - " \"warncount\": 7,\n" + - " \"fatiguecount\": 4,\n" + - " \"truckfatiguecount\": 2,\n" + - " \"dangerfatiguecount\": 1,\n" + - " \"carfatiguecount\": 1,\n" + - " \"severefatiguecount\": 3,\n" + - " \"truckseverefatiguecount\": 1,\n" + - " \"dangerseverefatiguecount\": 1,\n" + - " \"carseverefatiguecount\": 1,\n" + - " \"speedcount\": 12,\n" + - " \"truckspeedcount\": 4,\n" + - " \"dangerspeedcount\": 3,\n" + - " \"carspeedcount\": 5,\n" + - " \"facilitycount\": 10,\n" + - " \"truckfacilitycount\": 4,\n" + - " \"dangerfacilitycount\": 3,\n" + - " \"carfacilitycount\": 3,\n" + - " \"feeevasioncount\": 6,\n" + - " \"truckfeeevasioncount\": 3,\n" + - " \"dangerfeeevasioncount\": 2,\n" + - " \"carfeeevasioncount\": 1\n" + - " }\n" + - "]"; - String sm4Encrypt = SM4Utils.sm4Encrypt(json, s); - ResData resData = new ResData(); - resData.setKey(SM4Utils.sm4Encrypt(s, fixedKey)); - resData.setData(sm4Encrypt); - // 推送数据 - String pushJson = JSON.toJSONString(resData); - System.out.println(pushJson); // - ResData returnResData = JSON.parseObject(pushJson, ResData.class); + //String json ="[\n" + + // " {\n" + + // " \"classdate\": \"2025-09-15\",\n" + + // " \"equipmentid\": 487,\n" + + // " \"equipmentname\": \"高速二支队\u200C\u200C赤峰大队\",\n" + + // " \"departmentno\": 16,\n" + + // " \"departmentname\": \"高速二支队\",\n" + + // " \"passcount\": 120,\n" + + // " \"warncount\": 5,\n" + + // " \"fatiguecount\": 3,\n" + + // " \"truckfatiguecount\": 1,\n" + + // " \"dangerfatiguecount\": 1,\n" + + // " \"carfatiguecount\": 1,\n" + + // " \"severefatiguecount\": 2,\n" + + // " \"truckseverefatiguecount\": 1,\n" + + // " \"dangerseverefatiguecount\": 1,\n" + + // " \"carseverefatiguecount\": 1,\n" + + // " \"speedcount\": 10,\n" + + // " \"truckspeedcount\": 3,\n" + + // " \"dangerspeedcount\": 2,\n" + + // " \"carspeedcount\": 5,\n" + + // " \"facilitycount\": 8,\n" + + // " \"truckfacilitycount\": 3,\n" + + // " \"dangerfacilitycount\": 2,\n" + + // " \"carfacilitycount\": 3,\n" + + // " \"feeevasioncount\": 5,\n" + + // " \"truckfeeevasioncount\": 2,\n" + + // " \"dangerfeeevasioncount\": 1,\n" + + // " \"carfeeevasioncount\": 2\n" + + // " },\n" + + // " {\n" + + // " \"classdate\": \"2025-09-16\",\n" + + // " \"equipmentid\": 335,\n" + + // " \"equipmentname\": \"高速一支队\u200C\u200C苏木山大队\",\n" + + // " \"departmentno\": 15,\n" + + // " \"departmentname\": \"高速一支队\",\n" + + // " \"passcount\": 150,\n" + + // " \"warncount\": 7,\n" + + // " \"fatiguecount\": 4,\n" + + // " \"truckfatiguecount\": 2,\n" + + // " \"dangerfatiguecount\": 1,\n" + + // " \"carfatiguecount\": 1,\n" + + // " \"severefatiguecount\": 3,\n" + + // " \"truckseverefatiguecount\": 1,\n" + + // " \"dangerseverefatiguecount\": 1,\n" + + // " \"carseverefatiguecount\": 1,\n" + + // " \"speedcount\": 12,\n" + + // " \"truckspeedcount\": 4,\n" + + // " \"dangerspeedcount\": 3,\n" + + // " \"carspeedcount\": 5,\n" + + // " \"facilitycount\": 10,\n" + + // " \"truckfacilitycount\": 4,\n" + + // " \"dangerfacilitycount\": 3,\n" + + // " \"carfacilitycount\": 3,\n" + + // " \"feeevasioncount\": 6,\n" + + // " \"truckfeeevasioncount\": 3,\n" + + // " \"dangerfeeevasioncount\": 2,\n" + + // " \"carfeeevasioncount\": 1\n" + + // " }\n" + + // "]"; + //String json ="{\"fileName\":\"BASIC_LINKOWNERDOWNLOAD_REQ_15_20250925111943000000.json\",\"authKey\":\"8c602c65fe6f57c4b721c5078bb8a916\",\"md5\":\"f9c7245154069df4f1f5b46115a71388\"}"; + //String sm4Encrypt = SM4Utils.sm4Encrypt(json, s); + //ResData resData = new ResData(); + //resData.setKey(SM4Utils.sm4Encrypt(s, fixedKey)); + //resData.setData(sm4Encrypt); + //// 推送数据 + //String pushJson = JSON.toJSONString(resData); + //System.out.println(pushJson); + // + + //String pushJson = "{\n" + + // " \"key\": \"F1m2UtAVAvgyA3F+/z9zsvWNQmarbzhCFfhrVZBhgfAyRRRGvmXZDx4peEXwAv9j\",\n" + + // " \"data\": \"kLgoY4eqf84MCan7fFTTibHMKVvpidaQICAD1LwSi/eumspzr7RhIZE/skQUZln/5SWW4Ep5S8G6LMIPy67BR5x79Qldj/TYVHsooUCWRoC0xGOMQAA896HvorjOxz4sW0BHtT/7ngp57IMvO8hV9HahTWW3fcVNzWppo9LkV2qZlvWoGoZEgdYUCXmSpjBNlUjMjk+BUR5Dp5Vh5JaAOQ==\"\n" + + // "}"; + String pushJson="{\n" + + " \"data\": \"VHtIhqoFZTimL3rv0yTera+wUyDpW1UIzKo2ETSr2bcj+KfMAOQGcPED7Nkv8OSJ8vVPcxfNCcH2a9T7HACLtLy4mwI3/c+Blwx8Nal4qRlNXGqAYs52/hq5FDkqv9VQtNHCsdK2PKHjJRgutN5dSCl1fs7gKgBCyWZsIukXRliyCsYmdc7MJFkT8rTJx6okdjaslSzt/Tcvfa0dMQbp+JVOpdLT+1ku7Okw/u1cyQJwpnsE91RTAxKPpBnzkrBdWODamQ8ORqHz6Bzmtc4zqKyBEsw5t9uR8LbwZ7iviP1jsjv00hzGWavz+25/qcBmGlC+BEQYr8E1SGj//p51dPTKp8Sy4gj2xkFmzWcDrF+CH4vaRUy4xUwv+/+x8BfL3VaQUJ7O1IrNks6kbJRbAEwhQARtLjFQOf2wiMh+HFyd4MMsmTPClp2S7a4AHGNNi6MKmDArqYOYlHtXXdgqg0usJ50X47t7F1ZYvRFFx7v/svculmgPWCqma5+qgEeEESvJhfYCvlDDVaIMnVOf4YRyGHp/yYUj/vM8ZTx6bzdMW05VVH+V8NesGzGQKb6l\",\n" + + " \"key\": \"Sz/6H1ZrpW1uJQOmp/aeueOhvom4SVdk5+2ONatgcxAyRRRGvmXZDx4peEXwAv9j\"\n" + + "}"; + ResData returnResData = JSON.parseObject(pushJson, ResData.class); String resDataKey = returnResData.getKey(); String deReturnKey = SM4Utils.sm4Decrypt(resDataKey, fixedKey); String deDataJson = SM4Utils.sm4Decrypt(returnResData.getData(), deReturnKey); diff --git a/GetDataInterface/src/main/resources/version/1.0.1.txt b/GetDataInterface/src/main/resources/version/1.0.2.txt similarity index 92% rename from GetDataInterface/src/main/resources/version/1.0.1.txt rename to GetDataInterface/src/main/resources/version/1.0.2.txt index 4bdda91..c32fce2 100644 --- a/GetDataInterface/src/main/resources/version/1.0.1.txt +++ b/GetDataInterface/src/main/resources/version/1.0.2.txt @@ -11,3 +11,4 @@ 出口交易查询http://ip:port/GetDataInterface/baseinfo/QueryExStationTrans 同时增加返回json进行SM4加密,文件也进行SM4加密 2 2025年09月10日 1.0.1 修改通过堡垒机转发相关请求 +3 2025年09月28日 1.0.2 增加ETC 门架计费扣费交易数据上传接口/DCPC/uploadEtcGantryPassData diff --git a/GetDataInterface/target/GetDataInterface/WEB-INF/classes/com/nmggs/query/common/config/CorsConfig.class b/GetDataInterface/target/GetDataInterface/WEB-INF/classes/com/nmggs/query/common/config/CorsConfig.class index 4bdf7796ee41cd0b8b29797a8658daa50f55a71c..39dd4492ebdd340e4713708942499232fc734f61 100644 GIT binary patch delta 694 zcmX|;+fEZ<6otR(bUM>_Ll1L=jqBNK7i`!L-TD`=RKp!3~3gG~CpgH3^e3xaIMj2e&;a8r<=C-sCR#yz0Krf=Pso2a7r- zlK~#+Jk)ulQ*L}v)qH}a#V{i}k1Z-ZQ3x%UHcIK0Qmv9M)Yq136$Le&Na!qCEK^l5 z()IFsU5>mmpSzZGf2)7g6{>E-KQ{7|n#HOI&!{PA_0?)wn&;GX)-2YkTfAVy-J@j# zFL|X9cYD;ZTlMv7771Q&ztz5|@j(egVMu}?Xqp@_s%us zrVmfu#xK}U4^ifcu^@`xCa0s;-6Xo4lDAYiBQs5r##?`uvF`d$VqKN9Op9=Fhu$km z+i9||jr-epAh~JxH945{f8$V-!!06mvHxny){;%4Ee49I9b#J|(s4FSQ0j3ECfLoS zJbQ*dvf?u*ndK#cX<0whb{p+1@47WOC*Qaj93{kgE{LL}9BIcq(Oz(|jg$YwpMrl3 CMPK0n delta 687 zcmX|<%Tg0T7=^#dWHOy`ii!auf`N#NBoo04iVBzrctOD%A_gyr8WllMiI*J<%Lkxl zVd=sLU?qh$Sf<3i55Y6|1eSj%(M6y0&)+@gocX6eCf+BOfBpHs3H0#RVGp?|?c^O! zGiWoU7K?m1Vb(x( zmx@azf6Lr5pEB$J4EJW{n0I-mVS#xAtF$;*TyR-r-sZW>3tqY`Q8MWFS3*hucc{&B zdBtmg#_Ecsd1KJIvf8@7ZoM{*69Xycm%j#(+cx zcT}*+i|-6*_LjrnXbIR=CMgG7$FgzD3ur5oDr7g<{Y6Bo$vTKieH=v}bqvrzj%MivQ-@*Hkg+ui(J{_9^%ajow^n diff --git a/GetDataInterface/target/GetDataInterface/WEB-INF/classes/com/nmggs/query/common/emnu/Constant.class b/GetDataInterface/target/GetDataInterface/WEB-INF/classes/com/nmggs/query/common/emnu/Constant.class index 4b5ee9dc473de01416735c31404a3f53e98e29b3..648ea846dd20ff0a98433e61861456c66de491a6 100644 GIT binary patch delta 584 zcmYjOy>1gh5dP*I`_{$Py9`Hz##+RUqHpySm+H zK4(diFcerP)Fvp71#S^46Ye%)y5MY**f6wlTsT?_+##GiLYO0z9rrt|5xC3ux3bK( zWiD`!$+SRP21*)%4MMqVB703>lV=KpEU;NCw*vEoso0oIU@#swNINOdaDNPSr=|J5 z58OLy(nI%=X6TVSptJPY{iHMW#QmlV^wgd9E}q*WoQhIql+@bx!#uWYQY}ZhHEFw8 z%QLs(U83i1$D5-UZr}TGEQIv&vW{1H?R4o=efllSLXs>D24?uH)bnU|7*xK~_6(Nb zgEz|G=ON%j;9}MhM=rA^w&nTHp#4$Gb=H+pP#|W%ewct|tS}O2|0_N}Vt`s>?)U+` TAxcFD!v78@P$hIY=pp$FAwYFj delta 572 zcmZXR%T5$Q6o&s(%;hk$aF7LwF_RbpZVT z(uu|`;RVbrG%nb&!1zqY)5DC>Sc|Ij)qgI3rOxUf>Wv@2zMle^$Lku(Xw{IQJ&qF6 zDzYjb9yRVnhETQ6c(Ur~*E4PsO0jbpV`KQDAZ?{$baRNd)wE)2EB{Q5-ZR2flp1HW zwSLfLMVqBaMm{H8{a0Dk&bOLvErSZfF9_5BCq!C{55~)UQr)0e`GT6E?R-r&XeWQC zW@$G+QFFAH|5TqY-A7Qx{sazim>-NC_h(CqqHFy(m2-NlKoDK_P=4{YoFr%Y)>qIM w2^6&KmBA$=l6c}G0gH%*7)yVOuMZTUR-e244XTf^q67WaVN&RU+$k*o2EOcacmMzZ diff --git a/GetDataInterface/target/GetDataInterface/WEB-INF/classes/com/nmggs/query/controller/AddInterfaceController.class b/GetDataInterface/target/GetDataInterface/WEB-INF/classes/com/nmggs/query/controller/AddInterfaceController.class index 1eb1dfd50c15c97a714cc98d24d6a0755f4363a5..8d5e5d23d9c4ddc45cbe71afea27582b120e3bd3 100644 GIT binary patch literal 2609 zcmcIlTT|Oc6#mvWICfkvAx)Z6T1Y}-%w?eoZ5mTjV#sC2q%KZ)=}XtvVm6f}S6UJH zSM5w^dU@y%=#T33tYmzVUE)448tv-rp38T>J!kdzKY#uO;31x8k;P^fU*O9OGI(?q zU*WMCie}g{!`EimPUA@$-!RMw%X;Z(=^cr>tV-`h)g{Afx$ZW((`+<+{!<{mGww%Q zd}mO-$Z+c*aI|X5L*=WQEq5Hp)j})R@fl{zZ^el?<)X9552Wt~UR{#q_?B{%-eySV zmkt?HCD)?(lV#<|S3$ETz1M;qGF&UWbzvV0PZ_zrn9|3JB0LyCTX!Apxwb96KES2U zGDW@_v}{*cd%FHykoH+c`2McYg5gd+gvS?fHR&3-pqgT_58-`3vBx-M=Lj;VdAk6o)`&`3H+LX@eh zh9h*~5pgeL$&BcCXv&*q*K2UUWf(Xz;oiC4kNlmi@tSh1-V?64z9!~c5mjR+!VU<_ z9N#TfO8h^GzujL(os|0OX>z)68fdEBprb3w9YLX=~J zDCY^q!sVj8A4i$TQkzSkqNfP?G;#SV2L*S$u(Q61^yO`kgAi>LoW#w`S j=5d18FGhJ~5al|d+_+qn8~rE~_?*a3;6bNP9|HdZTvSwO delta 857 zcmcJNNm9Z<6o&s!0wEzXi3ozoBxnE?K}E#@-FpBicizAQa0bl2Y$JXn%gce*oy<)`o>c8*Owfgm4tbF;1lDN^vU1nTc}~y{GP% zSJ6|GJ24bqPtSW(?S3-QUxXV$)Wn5@OI$gy5jJt{U=4i-+qiL1msS&ff!4EVO$LFa zcnEPSAfU;5YKLBsdWAYb&6bogdi&HuM%_1vF%1oIN?8o7B0=f+1@w~i1V^XXB<78* z^vKZh%Al?;*}M#7VIZe278nPo_!p(Mjx-w>Y?;9ZtFz4e?PV^<+$JLdK?lh5XxLKl z5vB?}#UaEaN+>gD3Pc4ev;;R%RZRI%W)v_WKg4H>D24)O7CFD9xLkT5@r*0}%Oztq z>~N^TO-Vw1j!;(32rW$!*4W0U-2JC4|6#fcleIpjra_oXY-AoKZ0G@XhGXMYp delta 54 zcmbQrc868q)W2Q(7#J8#7)00^gxDE`Hwv6*ocxoqh?Rwfk%4*gMJBn)eN1s&42%o{ JKxIq}f&iPu3>*Le diff --git a/GetDataInterface/target/GetDataInterface/WEB-INF/classes/com/nmggs/query/service/impl/AddInterfaceServiceImpl.class b/GetDataInterface/target/GetDataInterface/WEB-INF/classes/com/nmggs/query/service/impl/AddInterfaceServiceImpl.class index 1f590a75c0db674aab53f244e28c493dbc238c4a..a364dacb66cbb56423a4de37c79b50a34ec92f66 100644 GIT binary patch literal 20887 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 J>ZYo*{~s1bWo`ff literal 15308 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 diff --git a/GetDataInterface/target/GetDataInterface/WEB-INF/classes/com/nmggs/query/service/impl/GetDataServiceImpl.class b/GetDataInterface/target/GetDataInterface/WEB-INF/classes/com/nmggs/query/service/impl/GetDataServiceImpl.class index 6a83fe9492f35b820b317ad4f4dd469c93ffcddb..a51ba0d540f11de328e372bd4fb49d0e54a99697 100644 GIT binary patch delta 2958 zcmaJ@3t$w*8UAMX?sjf(bCRo-kTki#-33i3 zTx%6mHEP{zRp`^&V5<@my(CfuZA&Zmp|+L26s-g;wbj~cZMCHT+>$^{Xma<@H?#A7 z|NQ^_J9B-7R!RKOiKm_hFo$KSs6e+HOYkKHx2cfP&2hVE@8IYW?VZBh<-y(fGDo9| zdtj;f3hq^Kp9f#X{VKe8K$r(r?7&WruZg)|SMUuL>G-BF-xB8ADjvdjI38B<-8gzV zb_uVKcd^ifO|OlIR*rLg5yb!gn)w_Lma~bKE<(@;|Bun<9M25 zzkmlgo>B0u8$ZO4R5Cvn=AeqX_zA~PJ$Md>)P)q%^Bg}DlYY+e3kAPau>jq|yrAGk zj+aziiGw1NU#a*te#7yyg2O6)i{B~uy@Eds%wX@Zcw;CQDv!2@8I*__Eu$X8tjdP= zwqUresVN%V)L}+CgJw9^9P11&w`a^_@I=g5Mj+*-|Bs6WcT)wyYGDS!JCiW+jp$z@hw}0qkk~WCgIYl6L%^u z4gVCf?+f#R(EgW(5Akp7181&>0@d&ze8f;-y{JsL=DE_mHCU?PV-5es35FTgYM1U< zwzhb#6;yJpM_eiLC{9?zu5t$h0YzEvV2r>TrNY4^0*@+{4ki=$Sd2IbRB#$`64=34 zW-yn=6vj2?ru8sYEUK1yEXAEy^s2@*mZISZ^D<;o;JXKp?YYSg`RGv3$Yb}9?A)a> zALHbj;R5R}cZSt0r#m&4%KX+H?rSs_p!~BmjZMRQ*4yrxR;pT}uyl=OuuQ95t@fw3 zgf@qQt)XyJur?NH4mSz)kN)nvw! zl{@Yzy|!wO@DpWFqiu7_>;ks7`kL}QG3I%SVcWXrFlIZg6!HtZGaTl^h4SUt3UOec)<`-42SLrc!%IS0I%WH zoe88GF46c6MOSoJ;Sd7!F?fu^FVr1DBW=D?gTOn zRWzA~M>JW6R;YV)O;?AYGsCN^@j!M0(;q80aW%eZE**39;hrGKqKInR(|Ya+AqBEyDaH z5l4u4flaiY56oI>hhJzv?4^eno>?_GX*ESQubp_sCq+jCS<`6SPV-!noMaWJWz@_$ zO<^zQuIk6d36v)7rw4J#{;4+0Ada3g3_A7`xO7Z9IbvOyrpM<`(!4CGNj9k&xZLpV z#R4j>D~wbsF@=;9xC74fRWw@B$$V=$OG0=s1*iNH8xQu=UTuxX10z8a` z*hRDYaTQ*|BD{vHaU4tNJS=BfsARdQVhd5tmSP#J!*bR|hh#TauzRqQ#rttBJAgWN zi0+o-Sj|4fT1mn>DHkEB2#t~fQ>w#yX#<+2ZnQ`{(JCE8oAd(0(z|Gv9oQsuL}foZ zq_Ffc6lYaqkliwl_Kl~1X_oXIBW>jqk)d1e7OXTgk%)U1uzLYFkha9^@umYi85Ko z1{!psLJpvrkb>)ECt3(`Y?lt>vuK4IJrs2tjnNM<={bZ6d9Xuz7VU&I%FHu%bl4?5 ziH$VorOd3rCPF^SPbDIVA{8;(A&{L7LMO8!kev-e z$#~acGuX+ch_M^USs%1fDhi*18x?da=oyG9#P_ delta 2182 zcmZ{kdvsLQ6^FlbW|Dj6&Mk%s5(Y&;L@{It5HUC?k`Pp2WF&wXCB#TVAiPv4sI?uX z#W&V^eLuk$Dhh#U9-tt!iXtl2VyW6{D@n00Z2xjCS4;Pq$;@)CXx3!!-#zy``<}he z*~c$yiKX`cZ^tg+EdJwC#hMV6T<37TOMo?o8?66{;YRC!YR%8Wq`1jY>vA(|4fDhN zoL@MsGu+~GE4LYLcR7JO40qaKcZFHc-G*Np?y>S$hIF$PZ=Jt`a#1(hKH?u z#PF!$F)JT8JYjg!$_<8%hNrB2+VG6Svmu^ilPl(VYhG}P@uFdKn3s6ju5^oGt7TdY z+Z?vLjAxBCtq!jkUUiwk3*o_%O`A(Q9fnSu+75@EF0b*r!!C#2t&`L-)p{T>L>26G zcti4Z*dx&-Myt+?D3jn~j|;faKRJJRU@yP+tMbb$_VOE#H+joppU2z0t-htiRxrURaJ8CjD+~Q>M0G2S6;oe{`$s-S&JJQr!K2+ zYMfa&W}M=58>nyBx|fc&Z#}YmWB1KlJ$}!}ewQ;X$YBv>raH(UMBHws2l+(AVUq~* zsfZCF8Tm}anouIdAMFB$)yDjL3WoW|LZkZgCy&qh!sE}p_=rjCYFXH#_6Z4PtO^&IQBd?f(W}w|e=>v@vS;nS`&KEyj zd_cTxv)CE_ib(&mWY0Tf)+M4nc>{UOq*}aU7PAR5Lx!Ff?@53{zo4+6e;`s6kNl{U zKAJZ;As!qV3FjX2Mn(#95BafZUNk=%?4YlTn`kf+X`|48vao1qzc%vQ2zBCWieKTx zPWmh2&L*{6sG=-2pcfU*P`3&-FiV}(i#j<&C50N4rB3NZ4bD(SLJi4MLwixDrYSxb zYFL&!trs;sLv0f3^elBoFKR@FS|QY#J=DPBUew48Rc>oNq~trVcM_}F&Zss@({^+_ zV|J&Zu>wV%PRbN*oRzI>&&VUBBTX3BE7IBNNMh5GBIWVWPR7@?b57iix>2W%cs#U; zSUhY$k~-IZB;3Y%**Ft5(NIYT=f}-4W+sxtN03L$-raVv9MA z60tGL<++MdIcTG~g0ak(YkLvnxQ(-UKyJ1ToFgYI&ikAz{d^wZFj1xQsZa$}s?khV z6Pcne;sUjZ3)O0-shgOtHjq$TNU9DlQHPnSx|yxMW{xi4Qhf?FdLozWYUb%1snxeI zUq45k-a)1!ZJATrMMQ8>^@3tg7L1+lZpBV4gH`vHpr$QuAbDx&BOwHBZV~ zr9Yrflys}!%ax+?CA&R63!JZCrC!F2WH*PaM1>^B1Pf@urBOCxq4-Qf3v&sH>Pg6| zOhQ(r6H3VxM`bdyDwC0@o{U7L*IYxB?0;q{c5IP+>;}B!vaunD#SYC5OTPOPW(kyM z{*F`j16ayoX`1|&rsE7C{Jp_4P&)iFl*95fSs@DuX{jnwPq_Ll1L=jqBNK7i`!L-TD`=RKp!3~3gG~CpgH3^e3xaIMj2e&;a8r<=C-sCR#yz0Krf=Pso2a7r- zlK~#+Jk)ulQ*L}v)qH}a#V{i}k1Z-ZQ3x%UHcIK0Qmv9M)Yq136$Le&Na!qCEK^l5 z()IFsU5>mmpSzZGf2)7g6{>E-KQ{7|n#HOI&!{PA_0?)wn&;GX)-2YkTfAVy-J@j# zFL|X9cYD;ZTlMv7771Q&ztz5|@j(egVMu}?Xqp@_s%us zrVmfu#xK}U4^ifcu^@`xCa0s;-6Xo4lDAYiBQs5r##?`uvF`d$VqKN9Op9=Fhu$km z+i9||jr-epAh~JxH945{f8$V-!!06mvHxny){;%4Ee49I9b#J|(s4FSQ0j3ECfLoS zJbQ*dvf?u*ndK#cX<0whb{p+1@47WOC*Qaj93{kgE{LL}9BIcq(Oz(|jg$YwpMrl3 CMPK0n delta 687 zcmX|<%Tg0T7=^#dWHOy`ii!auf`N#NBoo04iVBzrctOD%A_gyr8WllMiI*J<%Lkxl zVd=sLU?qh$Sf<3i55Y6|1eSj%(M6y0&)+@gocX6eCf+BOfBpHs3H0#RVGp?|?c^O! zGiWoU7K?m1Vb(x( zmx@azf6Lr5pEB$J4EJW{n0I-mVS#xAtF$;*TyR-r-sZW>3tqY`Q8MWFS3*hucc{&B zdBtmg#_Ecsd1KJIvf8@7ZoM{*69Xycm%j#(+cx zcT}*+i|-6*_LjrnXbIR=CMgG7$FgzD3ur5oDr7g<{Y6Bo$vTKieH=v}bqvrzj%MivQ-@*Hkg+ui(J{_9^%ajow^n diff --git a/GetDataInterface/target/classes/com/nmggs/query/common/emnu/Constant.class b/GetDataInterface/target/classes/com/nmggs/query/common/emnu/Constant.class index 4b5ee9dc473de01416735c31404a3f53e98e29b3..648ea846dd20ff0a98433e61861456c66de491a6 100644 GIT binary patch delta 584 zcmYjOy>1gh5dP*I`_{$Py9`Hz##+RUqHpySm+H zK4(diFcerP)Fvp71#S^46Ye%)y5MY**f6wlTsT?_+##GiLYO0z9rrt|5xC3ux3bK( zWiD`!$+SRP21*)%4MMqVB703>lV=KpEU;NCw*vEoso0oIU@#swNINOdaDNPSr=|J5 z58OLy(nI%=X6TVSptJPY{iHMW#QmlV^wgd9E}q*WoQhIql+@bx!#uWYQY}ZhHEFw8 z%QLs(U83i1$D5-UZr}TGEQIv&vW{1H?R4o=efllSLXs>D24?uH)bnU|7*xK~_6(Nb zgEz|G=ON%j;9}MhM=rA^w&nTHp#4$Gb=H+pP#|W%ewct|tS}O2|0_N}Vt`s>?)U+` TAxcFD!v78@P$hIY=pp$FAwYFj delta 572 zcmZXR%T5$Q6o&s(%;hk$aF7LwF_RbpZVT z(uu|`;RVbrG%nb&!1zqY)5DC>Sc|Ij)qgI3rOxUf>Wv@2zMle^$Lku(Xw{IQJ&qF6 zDzYjb9yRVnhETQ6c(Ur~*E4PsO0jbpV`KQDAZ?{$baRNd)wE)2EB{Q5-ZR2flp1HW zwSLfLMVqBaMm{H8{a0Dk&bOLvErSZfF9_5BCq!C{55~)UQr)0e`GT6E?R-r&XeWQC zW@$G+QFFAH|5TqY-A7Qx{sazim>-NC_h(CqqHFy(m2-NlKoDK_P=4{YoFr%Y)>qIM w2^6&KmBA$=l6c}G0gH%*7)yVOuMZTUR-e244XTf^q67WaVN&RU+$k*o2EOcacmMzZ diff --git a/GetDataInterface/target/classes/com/nmggs/query/controller/AddInterfaceController.class b/GetDataInterface/target/classes/com/nmggs/query/controller/AddInterfaceController.class index 1eb1dfd50c15c97a714cc98d24d6a0755f4363a5..8d5e5d23d9c4ddc45cbe71afea27582b120e3bd3 100644 GIT binary patch literal 2609 zcmcIlTT|Oc6#mvWICfkvAx)Z6T1Y}-%w?eoZ5mTjV#sC2q%KZ)=}XtvVm6f}S6UJH zSM5w^dU@y%=#T33tYmzVUE)448tv-rp38T>J!kdzKY#uO;31x8k;P^fU*O9OGI(?q zU*WMCie}g{!`EimPUA@$-!RMw%X;Z(=^cr>tV-`h)g{Afx$ZW((`+<+{!<{mGww%Q zd}mO-$Z+c*aI|X5L*=WQEq5Hp)j})R@fl{zZ^el?<)X9552Wt~UR{#q_?B{%-eySV zmkt?HCD)?(lV#<|S3$ETz1M;qGF&UWbzvV0PZ_zrn9|3JB0LyCTX!Apxwb96KES2U zGDW@_v}{*cd%FHykoH+c`2McYg5gd+gvS?fHR&3-pqgT_58-`3vBx-M=Lj;VdAk6o)`&`3H+LX@eh zh9h*~5pgeL$&BcCXv&*q*K2UUWf(Xz;oiC4kNlmi@tSh1-V?64z9!~c5mjR+!VU<_ z9N#TfO8h^GzujL(os|0OX>z)68fdEBprb3w9YLX=~J zDCY^q!sVj8A4i$TQkzSkqNfP?G;#SV2L*S$u(Q61^yO`kgAi>LoW#w`S j=5d18FGhJ~5al|d+_+qn8~rE~_?*a3;6bNP9|HdZTvSwO delta 857 zcmcJNNm9Z<6o&s!0wEzXi3ozoBxnE?K}E#@-FpBicizAQa0bl2Y$JXn%gce*oy<)`o>c8*Owfgm4tbF;1lDN^vU1nTc}~y{GP% zSJ6|GJ24bqPtSW(?S3-QUxXV$)Wn5@OI$gy5jJt{U=4i-+qiL1msS&ff!4EVO$LFa zcnEPSAfU;5YKLBsdWAYb&6bogdi&HuM%_1vF%1oIN?8o7B0=f+1@w~i1V^XXB<78* z^vKZh%Al?;*}M#7VIZe278nPo_!p(Mjx-w>Y?;9ZtFz4e?PV^<+$JLdK?lh5XxLKl z5vB?}#UaEaN+>gD3Pc4ev;;R%RZRI%W)v_WKg4H>D24)O7CFD9xLkT5@r*0}%Oztq z>~N^TO-Vw1j!;(32rW$!*4W0U-2JC4|6#fcleIpjra_oXY-AoKZ0G@XhGXMYp delta 54 zcmbQrc868q)W2Q(7#J8#7)00^gxDE`Hwv6*ocxoqh?Rwfk%4*gMJBn)eN1s&42%o{ JKxIq}f&iPu3>*Le diff --git a/GetDataInterface/target/classes/com/nmggs/query/service/impl/AddInterfaceServiceImpl.class b/GetDataInterface/target/classes/com/nmggs/query/service/impl/AddInterfaceServiceImpl.class index 1f590a75c0db674aab53f244e28c493dbc238c4a..a364dacb66cbb56423a4de37c79b50a34ec92f66 100644 GIT binary patch literal 20887 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 J>ZYo*{~s1bWo`ff literal 15308 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 diff --git a/GetDataInterface/target/classes/com/nmggs/query/service/impl/GetDataServiceImpl.class b/GetDataInterface/target/classes/com/nmggs/query/service/impl/GetDataServiceImpl.class index 6a83fe9492f35b820b317ad4f4dd469c93ffcddb..a51ba0d540f11de328e372bd4fb49d0e54a99697 100644 GIT binary patch delta 2958 zcmaJ@3t$w*8UAMX?sjf(bCRo-kTki#-33i3 zTx%6mHEP{zRp`^&V5<@my(CfuZA&Zmp|+L26s-g;wbj~cZMCHT+>$^{Xma<@H?#A7 z|NQ^_J9B-7R!RKOiKm_hFo$KSs6e+HOYkKHx2cfP&2hVE@8IYW?VZBh<-y(fGDo9| zdtj;f3hq^Kp9f#X{VKe8K$r(r?7&WruZg)|SMUuL>G-BF-xB8ADjvdjI38B<-8gzV zb_uVKcd^ifO|OlIR*rLg5yb!gn)w_Lma~bKE<(@;|Bun<9M25 zzkmlgo>B0u8$ZO4R5Cvn=AeqX_zA~PJ$Md>)P)q%^Bg}DlYY+e3kAPau>jq|yrAGk zj+aziiGw1NU#a*te#7yyg2O6)i{B~uy@Eds%wX@Zcw;CQDv!2@8I*__Eu$X8tjdP= zwqUresVN%V)L}+CgJw9^9P11&w`a^_@I=g5Mj+*-|Bs6WcT)wyYGDS!JCiW+jp$z@hw}0qkk~WCgIYl6L%^u z4gVCf?+f#R(EgW(5Akp7181&>0@d&ze8f;-y{JsL=DE_mHCU?PV-5es35FTgYM1U< zwzhb#6;yJpM_eiLC{9?zu5t$h0YzEvV2r>TrNY4^0*@+{4ki=$Sd2IbRB#$`64=34 zW-yn=6vj2?ru8sYEUK1yEXAEy^s2@*mZISZ^D<;o;JXKp?YYSg`RGv3$Yb}9?A)a> zALHbj;R5R}cZSt0r#m&4%KX+H?rSs_p!~BmjZMRQ*4yrxR;pT}uyl=OuuQ95t@fw3 zgf@qQt)XyJur?NH4mSz)kN)nvw! zl{@Yzy|!wO@DpWFqiu7_>;ks7`kL}QG3I%SVcWXrFlIZg6!HtZGaTl^h4SUt3UOec)<`-42SLrc!%IS0I%WH zoe88GF46c6MOSoJ;Sd7!F?fu^FVr1DBW=D?gTOn zRWzA~M>JW6R;YV)O;?AYGsCN^@j!M0(;q80aW%eZE**39;hrGKqKInR(|Ya+AqBEyDaH z5l4u4flaiY56oI>hhJzv?4^eno>?_GX*ESQubp_sCq+jCS<`6SPV-!noMaWJWz@_$ zO<^zQuIk6d36v)7rw4J#{;4+0Ada3g3_A7`xO7Z9IbvOyrpM<`(!4CGNj9k&xZLpV z#R4j>D~wbsF@=;9xC74fRWw@B$$V=$OG0=s1*iNH8xQu=UTuxX10z8a` z*hRDYaTQ*|BD{vHaU4tNJS=BfsARdQVhd5tmSP#J!*bR|hh#TauzRqQ#rttBJAgWN zi0+o-Sj|4fT1mn>DHkEB2#t~fQ>w#yX#<+2ZnQ`{(JCE8oAd(0(z|Gv9oQsuL}foZ zq_Ffc6lYaqkliwl_Kl~1X_oXIBW>jqk)d1e7OXTgk%)U1uzLYFkha9^@umYi85Ko z1{!psLJpvrkb>)ECt3(`Y?lt>vuK4IJrs2tjnNM<={bZ6d9Xuz7VU&I%FHu%bl4?5 ziH$VorOd3rCPF^SPbDIVA{8;(A&{L7LMO8!kev-e z$#~acGuX+ch_M^USs%1fDhi*18x?da=oyG9#P_ delta 2182 zcmZ{kdvsLQ6^FlbW|Dj6&Mk%s5(Y&;L@{It5HUC?k`Pp2WF&wXCB#TVAiPv4sI?uX z#W&V^eLuk$Dhh#U9-tt!iXtl2VyW6{D@n00Z2xjCS4;Pq$;@)CXx3!!-#zy``<}he z*~c$yiKX`cZ^tg+EdJwC#hMV6T<37TOMo?o8?66{;YRC!YR%8Wq`1jY>vA(|4fDhN zoL@MsGu+~GE4LYLcR7JO40qaKcZFHc-G*Np?y>S$hIF$PZ=Jt`a#1(hKH?u z#PF!$F)JT8JYjg!$_<8%hNrB2+VG6Svmu^ilPl(VYhG}P@uFdKn3s6ju5^oGt7TdY z+Z?vLjAxBCtq!jkUUiwk3*o_%O`A(Q9fnSu+75@EF0b*r!!C#2t&`L-)p{T>L>26G zcti4Z*dx&-Myt+?D3jn~j|;faKRJJRU@yP+tMbb$_VOE#H+joppU2z0t-htiRxrURaJ8CjD+~Q>M0G2S6;oe{`$s-S&JJQr!K2+ zYMfa&W}M=58>nyBx|fc&Z#}YmWB1KlJ$}!}ewQ;X$YBv>raH(UMBHws2l+(AVUq~* zsfZCF8Tm}anouIdAMFB$)yDjL3WoW|LZkZgCy&qh!sE}p_=rjCYFXH#_6Z4PtO^&IQBd?f(W}w|e=>v@vS;nS`&KEyj zd_cTxv)CE_ib(&mWY0Tf)+M4nc>{UOq*}aU7PAR5Lx!Ff?@53{zo4+6e;`s6kNl{U zKAJZ;As!qV3FjX2Mn(#95BafZUNk=%?4YlTn`kf+X`|48vao1qzc%vQ2zBCWieKTx zPWmh2&L*{6sG=-2pcfU*P`3&-FiV}(i#j<&C50N4rB3NZ4bD(SLJi4MLwixDrYSxb zYFL&!trs;sLv0f3^elBoFKR@FS|QY#J=DPBUew48Rc>oNq~trVcM_}F&Zss@({^+_ zV|J&Zu>wV%PRbN*oRzI>&&VUBBTX3BE7IBNNMh5GBIWVWPR7@?b57iix>2W%cs#U; zSUhY$k~-IZB;3Y%**Ft5(NIYT=f}-4W+sxtN03L$-raVv9MA z60tGL<++MdIcTG~g0ak(YkLvnxQ(-UKyJ1ToFgYI&ikAz{d^wZFj1xQsZa$}s?khV z6Pcne;sUjZ3)O0-shgOtHjq$TNU9DlQHPnSx|yxMW{xi4Qhf?FdLozWYUb%1snxeI zUq45k-a)1!ZJATrMMQ8>^@3tg7L1+lZpBV4gH`vHpr$QuAbDx&BOwHBZV~ zr9Yrflys}!%ax+?CA&R63!JZCrC!F2WH*PaM1>^B1Pf@urBOCxq4-Qf3v&sH>Pg6| zOhQ(r6H3VxM`bdyDwC0@o{U7L*IYxB?0;q{c5IP+>;}B!vaunD#SYC5OTPOPW(kyM z{*F`j16ayoX`1|&rsE7C{Jp_4P&)iFl*95fSs@DuX{jnwPq