From 2a24e1a8a190149805dd640c8c5d1ef19adeeb8d Mon Sep 17 00:00:00 2001 From: ZZ Date: Fri, 10 Dec 2021 11:12:46 +0800 Subject: [PATCH] handle json parse exception, just catch it n return null --- .../com/xhpc/evcs/encryption/EvcsConst.java | 2 +- .../java/com/xhpc/evcs/utils/JSONUtil.java | 14 +- ...NotificationChargeOrderInfoController.java | 2 +- ...tificationStartChargeResultController.java | 2 +- .../evcs/api/NotifyNoBillOrderController.java | 2 +- .../evcs/api/QueryEquipAuthController.java | 81 +++--- .../QueryEquipBusinessPolicyController.java | 247 +++++++++--------- .../api/QueryEquipChargeStatusController.java | 181 ++++++------- .../evcs/api/QueryStartChargeController.java | 114 ++++---- .../api/QueryStationStatusController.java | 116 ++++---- .../evcs/api/QueryStopChargeController.java | 148 ++++++----- .../evcs/api/QueryTerminalCodeController.java | 23 +- .../xhpc/evcs/api/QueryTokenController.java | 94 ++++--- .../java/com/xhpc/evcs/config/EvcsFilter.java | 153 ++++++----- .../evcs/notification/CheckChargeOrders.java | 2 +- .../NotificationChargeOrderInfo.java | 180 ------------- 16 files changed, 614 insertions(+), 747 deletions(-) delete mode 100644 evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfo.java diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/EvcsConst.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/EvcsConst.java index 5d77557a..9de6c1fa 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/EvcsConst.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/EvcsConst.java @@ -5,6 +5,6 @@ public class EvcsConst { //请求成功 public static final String RET_SUCC = "0"; //请求失败 - public static final String RET_FAIL = "1"; + public static final String RET_FAIL = "500"; } diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/utils/JSONUtil.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/utils/JSONUtil.java index e1f46901..06d3c73b 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/utils/JSONUtil.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/utils/JSONUtil.java @@ -6,6 +6,8 @@ import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.CollectionType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.Iterator; @@ -13,7 +15,8 @@ import java.util.List; public class JSONUtil { - private static ObjectMapper mapper = new ObjectMapper(); + private static final ObjectMapper mapper = new ObjectMapper(); + private static final Logger logger = LoggerFactory.getLogger(JSONUtil.class); /** * 将一个对象转换成目标对象 @@ -33,9 +36,14 @@ public class JSONUtil { } // 适用于简单对象,复杂对象参考下面的main方法 - public static T readParams(String params, Class clz) throws IOException { + public static T readParams(String params, Class clz) { - return mapper.readValue(params, clz); + try { + return mapper.readValue(params, clz); + } catch (JsonProcessingException e) { + logger.debug("invalid json:{}", params); + return null; + } } public static List readParamsList(String data, Class clzo) throws IOException { diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotificationChargeOrderInfoController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotificationChargeOrderInfoController.java index 26ca62a9..2f575903 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotificationChargeOrderInfoController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotificationChargeOrderInfoController.java @@ -22,7 +22,7 @@ public class NotificationChargeOrderInfoController { stationInfo.setOperatorId(operatorID); String data = commonRequest.getData(); ChargeOrderInfo chargeOrderInfo = JSONUtil.readParams(data, ChargeOrderInfo.class); - chargeOrderInfo.setInfraOperatorId("759588065"); //todo use common request operator id? + chargeOrderInfo.setInfraOperatorId("759588065"); //todo use common request operator id && check NPE chargeOrderInfo.setBillerOperatorId("MA6DFCTD5"); log.info(">>notify charge order OID: " + operatorID); // chargeOrderInfoRepository.save(chargeOrderInfo); diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotificationStartChargeResultController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotificationStartChargeResultController.java index 5e23a806..967d237b 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotificationStartChargeResultController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotificationStartChargeResultController.java @@ -27,7 +27,7 @@ public class NotificationStartChargeResultController { String data = commonRequest.getData(); NotificationStartChargeResultRequestData startChargeResultRequest = JSONUtil.readParams(data, - NotificationStartChargeResultRequestData.class); + NotificationStartChargeResultRequestData.class); // todo check NPE String startChargeSeq = startChargeResultRequest.getStartChargeSeq(); // ChargeOrderInfo chargeOrderInfo = chargeOrderInfoRepository.findById(startChargeSeq).orElse(new ChargeOrderInfo() // .setStartChargeSeqAndReturn(startChargeSeq)); diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotifyNoBillOrderController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotifyNoBillOrderController.java index b03b1aa3..7d42a5d5 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotifyNoBillOrderController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/NotifyNoBillOrderController.java @@ -25,7 +25,7 @@ public class NotifyNoBillOrderController { public CommonResponse notifyNoBillOrder(@RequestBody CommonRequest commonRequest) throws IOException { NotifyNoBillOrderRequest notifyNoBillOrderRequest = JSONUtil.readParams(commonRequest.getData(), - NotifyNoBillOrderRequest.class); + NotifyNoBillOrderRequest.class);// todo check NPE CommonResponse commonResponse = new CommonResponse(); commonResponse.setMsg("Query equipment business policy success"); diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipAuthController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipAuthController.java index 4d5fa7db..ca622472 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipAuthController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipAuthController.java @@ -6,6 +6,7 @@ import com.xhpc.evcs.dto.CommonRequest; import com.xhpc.evcs.dto.CommonResponse; import com.xhpc.evcs.dto.EquipAuthRequest; import com.xhpc.evcs.dto.EquipAuthResponse; +import com.xhpc.evcs.encryption.EvcsConst; import com.xhpc.evcs.jpa.XhpcInternetUserRepository; import com.xhpc.evcs.jpa.XhpcStationInternetBlacklistRepository; import com.xhpc.evcs.utils.JSONUtil; @@ -38,56 +39,58 @@ public class QueryEquipAuthController { public CommonResponse queryEquipAuth(@RequestBody CommonRequest commonRequest) throws Exception { CommonResponse resp = new CommonResponse(); - EquipAuthResponse equipAuthResponse = new EquipAuthResponse(); + resp.setRet(EvcsConst.RET_FAIL); EquipAuthRequest equipAuthRequest = JSONUtil.readParams(commonRequest.getData(), EquipAuthRequest.class); - String equipAuthSeq = equipAuthRequest.getEquipAuthSeq(); - String connectorId = equipAuthRequest.getConnectorId(); - equipAuthResponse.setEquipAuthSeq(equipAuthSeq); - equipAuthResponse.setConnectorId(connectorId); - String pileId = connectorId.substring(0, connectorId.length() - 2); - Map pileDataModel = REDIS.getCacheMap("pile:" + pileId); - Long stationId = Long.parseLong(pileDataModel.get("stationId").toString()); - Instant now = Instant.now(); - XhpcInternetUser xhpcInternetUser = xhpcInternetUserRepository - .findByOperatorIdEvcsLikeAndCooperationStartTimeBeforeAndCooperationEndTimeAfter(commonRequest.getOperatorId(), now, now); - if (xhpcInternetUser == null) { - equipAuthResponse.setSuccStat(1); - equipAuthResponse.setFailReason(2); - resp.setRet("500"); - resp.setMsg("auth denied"); + if (equipAuthRequest == null) { + resp.setMsg("Request or token params validation failed"); } else { - Long internetUserId = xhpcInternetUser.getInternetUserId(); - XhpcStationInternetBlacklist xhpcStationInternetBlacklist = - xhpcStationInternetBlacklistRepo.findByChargingStationIdAndInternetUserId(stationId, internetUserId).orElse(null); - if (null != xhpcStationInternetBlacklist) { + EquipAuthResponse equipAuthResponse = new EquipAuthResponse(); + String equipAuthSeq = equipAuthRequest.getEquipAuthSeq(); + String connectorId = equipAuthRequest.getConnectorId(); + equipAuthResponse.setEquipAuthSeq(equipAuthSeq); + equipAuthResponse.setConnectorId(connectorId); + String pileId = connectorId.substring(0, connectorId.length() - 2); + Map pileDataModel = REDIS.getCacheMap("pile:" + pileId); + Long stationId = Long.parseLong(pileDataModel.get("stationId").toString()); + Instant now = Instant.now(); + XhpcInternetUser xhpcInternetUser = xhpcInternetUserRepository + .findByOperatorIdEvcsLikeAndCooperationStartTimeBeforeAndCooperationEndTimeAfter(commonRequest.getOperatorId(), now, now); + if (xhpcInternetUser == null) { equipAuthResponse.setSuccStat(1); equipAuthResponse.setFailReason(2); - resp.setRet("500"); resp.setMsg("auth denied"); } else { - Map cacheGun = REDIS.getCacheMap("gun:".concat(connectorId)); - String terminalStatus = (String) cacheGun.get("vehicleGunStatus"); - String status = (String) cacheGun.get("status"); - if (!"空闲".equals(status)) { - resp.setMsg("终端不在空闲状态:[".concat(status == null ? "未注册" : isInteger(status) ? "充电中" : status).concat("]")); - resp.setRet("500"); + Long internetUserId = xhpcInternetUser.getInternetUserId(); + XhpcStationInternetBlacklist xhpcStationInternetBlacklist = + xhpcStationInternetBlacklistRepo.findByChargingStationIdAndInternetUserId(stationId, internetUserId).orElse(null); + if (null != xhpcStationInternetBlacklist) { equipAuthResponse.setSuccStat(1); - equipAuthResponse.setFailReason(1); - } else if ("否".equals(terminalStatus)) { - resp.setMsg("未插枪"); - resp.setRet("500"); - equipAuthResponse.setSuccStat(1); - equipAuthResponse.setFailReason(1); + equipAuthResponse.setFailReason(2); + resp.setMsg("auth denied"); } else { - resp.setRet("0"); - resp.setMsg("success"); - equipAuthResponse.setSuccStat(0); - equipAuthResponse.setFailReason(0); - } + Map cacheGun = REDIS.getCacheMap("gun:".concat(connectorId)); + String terminalStatus = (String) cacheGun.get("vehicleGunStatus"); + String status = (String) cacheGun.get("status"); + if (!"空闲".equals(status)) { + resp.setMsg("终端不在空闲状态:[".concat(status == null ? "未注册" : isInteger(status) ? "充电中" : status).concat( + "]")); + equipAuthResponse.setSuccStat(1); + equipAuthResponse.setFailReason(1); + } else if ("否".equals(terminalStatus)) { + resp.setMsg("未插枪"); + equipAuthResponse.setSuccStat(1); + equipAuthResponse.setFailReason(1); + } else { + resp.setRet("0"); + resp.setMsg("success"); + equipAuthResponse.setSuccStat(0); + equipAuthResponse.setFailReason(0); + } + } } + resp.setData(JSONUtil.toJSONString(equipAuthResponse)); } - resp.setData(JSONUtil.toJSONString(equipAuthResponse)); return resp; } } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipBusinessPolicyController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipBusinessPolicyController.java index d7ec442c..ea89aa5a 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipBusinessPolicyController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipBusinessPolicyController.java @@ -29,130 +29,133 @@ public class QueryEquipBusinessPolicyController { public CommonResponse queryEquipBusinessPolicy(@RequestBody CommonRequest commonRequest) throws IOException { //获取充电设备接口编码(枪编码) EquipBizRequest equipBizRequest = JSONUtil.readParams(commonRequest.getData(), EquipBizRequest.class); - String connectorId = equipBizRequest.getConnectorId(); - //获取枪所对应的桩编码 - String pileSerialNumber = xhpcTerminalRepository.selectBySql(connectorId); - Map cachePile = REDIS.getCacheMap("pile:" + pileSerialNumber); - if (pileSerialNumber == null || cachePile == null) { - CommonResponse commonResponse = new CommonResponse(); - commonResponse.setMsg("ConnectorID not found"); - commonResponse.setRet("1"); - return commonResponse; - } - ArrayList modelTypes = new ArrayList<>(); - //存储时段个数 - ArrayList modelCount = new ArrayList<>(); - Long rateModelId = (Long) cachePile.get("rateModelId"); - CacheRateModel rateModel = REDIS.getCacheObject("rateModel:" + rateModelId); - PolicyInfos[] policyInfosArr = new PolicyInfos[0]; - if (rateModel != null) { - String[] tfPricesSeq = rateModel.getTfPricesSeq(); - //存储时段 - //建立对应时段的映射Map集合,存放其对应的价格和服务费 - Map timeMap = new HashMap<>(); - //个数计数器 - int count = 0; - //最后一个时段的前一个时段的下标索引 - int index = 0; - //遍历获取每一个时段 - for (int i = 0; i < tfPricesSeq.length - 1; i++) { - count++; - //如果当前时段与后面的时段不相同,则表示当前时段已经结束,添加当前时段到list中,并将其坐标存放到另一个集合中。 - if (!tfPricesSeq[i].equals(tfPricesSeq[i + 1])) { - //将每段时间的索引,赋值 - index = i; - modelTypes.add(tfPricesSeq[i]); - modelCount.add(count); - //如果这段时段结束,则重置计数器 - count = 0; - } - } - //获取最后一个时段的费率值 - String lastModelType = tfPricesSeq[tfPricesSeq.length - 1]; - //放入到类型list中 - modelTypes.add(lastModelType); - //获取最后一个时段的费率的个数 - int lastCount = (tfPricesSeq.length - 1) - index; - //放入到个数List中 - modelCount.add(lastCount); - - //获取各个类型的时段的时间区间,并将其存放至timeList集合中。 - //定义一个初始时间段 - String initTime = "000000"; - //添加临时存储变量 - int temp = -1; - ArrayList timeList = new ArrayList<>(); - //放入必有初始时间 - timeList.add(initTime); - //根据出现的时段个数确定他们的时间区间,然后存放至List集合中 - for (int i = 0; i < modelCount.size() - 1; i++) { - if (temp != -1) { - Integer integer = modelCount.get(i); - int hours = integer / 2; - temp = temp + hours; - String hoursStr = String.format("%02d", temp); - String finalTime = hoursStr + "0000"; - timeList.add(finalTime); - } else { - Integer integer = modelCount.get(i); - int hours = integer / 2; - //记录中间时间 - temp = hours; - String hoursStr = String.format("%02d", temp); - String finalTime = hoursStr + "0000"; - timeList.add(finalTime); - } - } - policyInfosArr = new PolicyInfos[timeList.size()]; - for (int i = 0; i <= timeList.size() - 1; i++) { - PolicyInfos policyInfos = new PolicyInfos(); - policyInfos.setStartTime(timeList.get(i)); - String modelType = modelTypes.get(i); - switch (modelType) { - case "00": - policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT1SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT1Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - break; - case "01": - policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT2SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT2Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - break; - case "02": - policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT3SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT3Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - break; - case "03": - policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT4SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT4Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - break; - default: - break; - } - policyInfosArr[i] = policyInfos; - } - } - - //封装数据 - EquipBizResponse equipBizResponse = new EquipBizResponse(); - //业务查询流水号 - equipBizResponse.setEquipBizSeq(equipBizRequest.getEquipBizSeq()); - //充电设备接口编码 - equipBizResponse.setConnectorId(connectorId); - //操作结果 - equipBizResponse.setSuccStat(0); - //失败原因 - equipBizResponse.setFailReason(0); - //总时段数 - equipBizResponse.setSumPeriod(modelTypes.size()); - //计费信息 - equipBizResponse.setPolicyInfos(policyInfosArr); - - //塞入包装类 CommonResponse commonResponse = new CommonResponse(); - commonResponse.setMsg("Query equipment business policy success"); - commonResponse.setRet("0"); - commonResponse.setData(JSONUtil.toJSONString(equipBizResponse)); + if (equipBizRequest == null) { + commonResponse.setRet("500"); + commonResponse.setMsg("Request or token params validation failed"); + } else { + String connectorId = equipBizRequest.getConnectorId(); + //获取枪所对应的桩编码 + String pileSerialNumber = xhpcTerminalRepository.selectBySql(connectorId); + Map cachePile = REDIS.getCacheMap("pile:" + pileSerialNumber); + if (pileSerialNumber == null || cachePile == null) { + commonResponse.setMsg("ConnectorID not found"); + commonResponse.setRet("500"); + return commonResponse; + } + ArrayList modelTypes = new ArrayList<>(); + //存储时段个数 + ArrayList modelCount = new ArrayList<>(); + Long rateModelId = (Long) cachePile.get("rateModelId"); + CacheRateModel rateModel = REDIS.getCacheObject("rateModel:" + rateModelId); + PolicyInfos[] policyInfosArr = new PolicyInfos[0]; + if (rateModel != null) { + String[] tfPricesSeq = rateModel.getTfPricesSeq(); + //存储时段 + //建立对应时段的映射Map集合,存放其对应的价格和服务费 + Map timeMap = new HashMap<>(); + //个数计数器 + int count = 0; + //最后一个时段的前一个时段的下标索引 + int index = 0; + //遍历获取每一个时段 + for (int i = 0; i < tfPricesSeq.length - 1; i++) { + count++; + //如果当前时段与后面的时段不相同,则表示当前时段已经结束,添加当前时段到list中,并将其坐标存放到另一个集合中。 + if (!tfPricesSeq[i].equals(tfPricesSeq[i + 1])) { + //将每段时间的索引,赋值 + index = i; + modelTypes.add(tfPricesSeq[i]); + modelCount.add(count); + //如果这段时段结束,则重置计数器 + count = 0; + } + } + //获取最后一个时段的费率值 + String lastModelType = tfPricesSeq[tfPricesSeq.length - 1]; + //放入到类型list中 + modelTypes.add(lastModelType); + //获取最后一个时段的费率的个数 + int lastCount = (tfPricesSeq.length - 1) - index; + //放入到个数List中 + modelCount.add(lastCount); + //获取各个类型的时段的时间区间,并将其存放至timeList集合中。 + //定义一个初始时间段 + String initTime = "000000"; + //添加临时存储变量 + int temp = -1; + ArrayList timeList = new ArrayList<>(); + //放入必有初始时间 + timeList.add(initTime); + //根据出现的时段个数确定他们的时间区间,然后存放至List集合中 + for (int i = 0; i < modelCount.size() - 1; i++) { + if (temp != -1) { + Integer integer = modelCount.get(i); + int hours = integer / 2; + temp = temp + hours; + String hoursStr = String.format("%02d", temp); + String finalTime = hoursStr + "0000"; + timeList.add(finalTime); + } else { + Integer integer = modelCount.get(i); + int hours = integer / 2; + //记录中间时间 + temp = hours; + String hoursStr = String.format("%02d", temp); + String finalTime = hoursStr + "0000"; + timeList.add(finalTime); + } + } + policyInfosArr = new PolicyInfos[timeList.size()]; + for (int i = 0; i <= timeList.size() - 1; i++) { + PolicyInfos policyInfos = new PolicyInfos(); + policyInfos.setStartTime(timeList.get(i)); + String modelType = modelTypes.get(i); + switch (modelType) { + case "00": + policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT1SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT1Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + break; + case "01": + policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT2SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT2Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + break; + case "02": + policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT3SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT3Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + break; + case "03": + policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT4SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT4Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + break; + default: + break; + } + policyInfosArr[i] = policyInfos; + } + } + + //封装数据 + EquipBizResponse equipBizResponse = new EquipBizResponse(); + //业务查询流水号 + equipBizResponse.setEquipBizSeq(equipBizRequest.getEquipBizSeq()); + //充电设备接口编码 + equipBizResponse.setConnectorId(connectorId); + //操作结果 + equipBizResponse.setSuccStat(0); + //失败原因 + equipBizResponse.setFailReason(0); + //总时段数 + equipBizResponse.setSumPeriod(modelTypes.size()); + //计费信息 + equipBizResponse.setPolicyInfos(policyInfosArr); + + //塞入包装类 + commonResponse.setMsg("Query equipment business policy success"); + commonResponse.setRet("0"); + commonResponse.setData(JSONUtil.toJSONString(equipBizResponse)); + } return commonResponse; } } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipChargeStatusController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipChargeStatusController.java index f54ad153..a1772d69 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipChargeStatusController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipChargeStatusController.java @@ -40,100 +40,105 @@ public class QueryEquipChargeStatusController { //充电订单号 三方传进来都是27位 String data = commonRequest.getData(); ChargeInfoRequest chargeInfoRequest = JSONUtil.readParams(data, ChargeInfoRequest.class); - String startChargeSeq = chargeInfoRequest.getStartChargeSeq(); - equipChargeStatus.setStartChargeSeq(startChargeSeq); CommonResponse response = new CommonResponse(); - //充电订单状态 - EtOrderMapping etOrderMapping = orderMappingRepository.findByEvcsOrderNo(startChargeSeq).orElse(null); - if (etOrderMapping == null) { + if (chargeInfoRequest == null) { response.setRet(EvcsConst.RET_FAIL); - response.setMsg("Order not found/started"); - log.error("3rdpty order[{}] not found", startChargeSeq); - return response; - } - String internalOrderNum = etOrderMapping.getXhOrderNo(); - Map cacheOrder = REDIS.getCacheMap("order:" + internalOrderNum); - if (cacheOrder == null) { - response.setRet(EvcsConst.RET_FAIL); - response.setMsg("Order cache data not found"); + response.setMsg("Request or token params validation failed"); } else { - String orderStatus = (String) cacheOrder.get("status"); - int startChargeSeqStat; - if (orderStatus == null) { - startChargeSeqStat = 5; - } else switch (orderStatus) { - case "启动中": - startChargeSeqStat = 1; - break; - case "充电中": - startChargeSeqStat = 2; - break; - case "停止中": - startChargeSeqStat = 3; - break; - case "已结束": - startChargeSeqStat = 4; - break; - default: - startChargeSeqStat = 5; - break; + String startChargeSeq = chargeInfoRequest.getStartChargeSeq(); + equipChargeStatus.setStartChargeSeq(startChargeSeq); + //充电订单状态 + EtOrderMapping etOrderMapping = orderMappingRepository.findByEvcsOrderNo(startChargeSeq).orElse(null); + if (etOrderMapping == null) { + response.setRet(EvcsConst.RET_FAIL); + response.setMsg("Order not found/started"); + log.error("3rdpty order[{}] not found", startChargeSeq); + return response; } - equipChargeStatus.setStartChargeSeqStat(startChargeSeqStat); - //充电设备接口编码 - String connectorId = internalOrderNum.substring(0, 16); - equipChargeStatus.setConnectorID(connectorId); - //充电设备接口状态 - Map cacheGunData = REDIS.getCacheMap("gun:" + connectorId); - String gunStatus = (String) cacheGunData.get("status"); - int connectorStatus = 0; - switch (gunStatus) { - case "空闲": - connectorStatus = 1; - break; - case "离线": - connectorStatus = 2; - break; - case "故障": - connectorStatus = 255; - break; - default: - connectorStatus = 3; - break; - } - equipChargeStatus.setConnectorStatus(connectorStatus); - //A相电流 - Double current = (Double) cacheGunData.get("current"); - equipChargeStatus.setCurrentA(current); - //A相电压 - Double voltage = (Double) cacheGunData.get("voltage"); - equipChargeStatus.setVoltageA(voltage); - //电池剩余电量 - Integer endSoc = (Integer) cacheOrder.get("endSoc"); - Double soc = Double.valueOf(endSoc == null ? 0 : endSoc); - equipChargeStatus.setSoc(soc); - //开始充电时间 - String startTime = (String) cacheOrder.get("startTime"); - if (startTime == null) startTime = orderNo2DateStr(internalOrderNum); - equipChargeStatus.setStartTime(startTime); - //本次采样时间 直接new一个当前时间的Date就可以了 - CacheRealtimeData lord = REDIS.getCacheObject("order:" + internalOrderNum + ".lord"); - if (lord != null) { - equipChargeStatus.setEndTime(lord.getCreateTime()); - equipChargeStatus.setTotalMoney(lord.getAmountCharged() / 10000.0); - equipChargeStatus.setTotalPower(lord.getChargingDegree() / 10000.0); + String internalOrderNum = etOrderMapping.getXhOrderNo(); + Map cacheOrder = REDIS.getCacheMap("order:" + internalOrderNum); + if (cacheOrder == null) { + response.setRet(EvcsConst.RET_FAIL); + response.setMsg("Order cache data not found"); } else { - equipChargeStatus.setEndTime(equipChargeStatus.getStartTime()); - equipChargeStatus.setTotalMoney(0.0); - equipChargeStatus.setTotalPower(0.0); + String orderStatus = (String) cacheOrder.get("status"); + int startChargeSeqStat; + if (orderStatus == null) { + startChargeSeqStat = 5; + } else switch (orderStatus) { + case "启动中": + startChargeSeqStat = 1; + break; + case "充电中": + startChargeSeqStat = 2; + break; + case "停止中": + startChargeSeqStat = 3; + break; + case "已结束": + startChargeSeqStat = 4; + break; + default: + startChargeSeqStat = 5; + break; + } + equipChargeStatus.setStartChargeSeqStat(startChargeSeqStat); + //充电设备接口编码 + String connectorId = internalOrderNum.substring(0, 16); + equipChargeStatus.setConnectorID(connectorId); + //充电设备接口状态 + Map cacheGunData = REDIS.getCacheMap("gun:" + connectorId); + String gunStatus = (String) cacheGunData.get("status"); + int connectorStatus = 0; + switch (gunStatus) { + case "空闲": + connectorStatus = 1; + break; + case "离线": + connectorStatus = 2; + break; + case "故障": + connectorStatus = 255; + break; + default: + connectorStatus = 3; + break; + } + equipChargeStatus.setConnectorStatus(connectorStatus); + //A相电流 + Double current = (Double) cacheGunData.get("current"); + equipChargeStatus.setCurrentA(current); + //A相电压 + Double voltage = (Double) cacheGunData.get("voltage"); + equipChargeStatus.setVoltageA(voltage); + //电池剩余电量 + Integer endSoc = (Integer) cacheOrder.get("endSoc"); + Double soc = Double.valueOf(endSoc == null ? 0 : endSoc); + equipChargeStatus.setSoc(soc); + //开始充电时间 + String startTime = (String) cacheOrder.get("startTime"); + if (startTime == null) startTime = orderNo2DateStr(internalOrderNum); + equipChargeStatus.setStartTime(startTime); + //本次采样时间 直接new一个当前时间的Date就可以了 + CacheRealtimeData lord = REDIS.getCacheObject("order:" + internalOrderNum + ".lord"); + if (lord != null) { + equipChargeStatus.setEndTime(lord.getCreateTime()); + equipChargeStatus.setTotalMoney(lord.getAmountCharged() / 10000.0); + equipChargeStatus.setTotalPower(lord.getChargingDegree() / 10000.0); + } else { + equipChargeStatus.setEndTime(equipChargeStatus.getStartTime()); + equipChargeStatus.setTotalMoney(0.0); + equipChargeStatus.setTotalPower(0.0); + } + Integer chargeModel = (Integer) cacheOrder.get("chargeModel"); + equipChargeStatus.setChargeModel(chargeModel == null ? 0 : chargeModel); + final Long rateModelId = REDIS.getCacheMapValue("pile:".concat(connectorId.substring(0, 14)), "rateModelId"); + final CacheRateModel cacheRateModel = REDIS.getCacheObject("rateModel:" + rateModelId); + calculateEm(equipChargeStatus, cacheRateModel); + response.setRet(EvcsConst.RET_SUCC); + response.setData(JSONUtil.toJSONString(equipChargeStatus)); + response.setMsg("success"); } - Integer chargeModel = (Integer) cacheOrder.get("chargeModel"); - equipChargeStatus.setChargeModel(chargeModel == null ? 0 : chargeModel); - final Long rateModelId = REDIS.getCacheMapValue("pile:".concat(connectorId.substring(0, 14)), "rateModelId"); - final CacheRateModel cacheRateModel = REDIS.getCacheObject("rateModel:" + rateModelId); - calculateEm(equipChargeStatus, cacheRateModel); - response.setRet(EvcsConst.RET_SUCC); - response.setData(JSONUtil.toJSONString(equipChargeStatus)); - response.setMsg("success"); } return response; } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStartChargeController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStartChargeController.java index 6c126dee..1334f72d 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStartChargeController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStartChargeController.java @@ -45,70 +45,72 @@ public class QueryStartChargeController { CommonResponse resp = new CommonResponse(); resp.setRet(EvcsConst.RET_FAIL); - StartChargeResponse startChargeResponse = new StartChargeResponse(); - startChargeResponse.setFailReason(0); - startChargeResponse.setSuccStat(1); - startChargeResponse.setStartChargeSeqStat(4); StartChargeRequest startChargeRequest = JSONUtil.readParams(commonRequest.getData(), StartChargeRequest.class); - String startChargeSeq = startChargeRequest.getStartChargeSeq(); - String connectorId = startChargeRequest.getConnectorId(); - Map cacheGun = REDIS.getCacheMap("gun:".concat(connectorId)); - String terminalStatus = (String) cacheGun.get("vehicleGunStatus"); - String status = (String) cacheGun.get("status"); - EtOrderMapping etOrderMapping = new EtOrderMapping(); - Date now = DateUtils.getNowDate(); - etOrderMapping.setCreateTime(now); - etOrderMapping.setEvcsOrderNo(startChargeSeq); - if (!"空闲".equals(status)) { - resp.setMsg("终端状态异常:[".concat(status == null ? "未注册" : status).concat("]")); - resp.setRet("500"); - emptyHorder(startChargeSeq, connectorId, etOrderMapping); - } else if ("否".equals(terminalStatus)) { - resp.setMsg("未插枪"); - resp.setRet("500"); - emptyHorder(startChargeSeq, connectorId, etOrderMapping); + if (startChargeRequest == null) { + resp.setMsg("Request or token params validation failed"); } else { - String plateNum = startChargeRequest.getPlateNum(); - plateNum = plateNum == null ? startChargeRequest.getPlateNum2() : plateNum; - R res = pileOrderService.pileStartUpBy3rd(startChargeSeq, startChargeRequest.getDriverId(), - startChargeRequest.getChargingAmt(), plateNum, -1, connectorId); - startChargeResponse.setStartChargeSeq(startChargeSeq); - startChargeResponse.setConnectorID(connectorId); - resp.setMsg(res.getMsg()); - if (res.getCode() != 200) { - if (res.getCode() != 500) { - startChargeResponse.setFailReason(res.getCode()); - } else { - startChargeResponse.setFailReason(3); - } - startChargeResponse.setSuccStat(1); - startChargeResponse.setStartChargeSeqStat(4); + StartChargeResponse startChargeResponse = new StartChargeResponse(); + startChargeResponse.setFailReason(0); + startChargeResponse.setSuccStat(1); + startChargeResponse.setStartChargeSeqStat(4); + String startChargeSeq = startChargeRequest.getStartChargeSeq(); + String connectorId = startChargeRequest.getConnectorId(); + Map cacheGun = REDIS.getCacheMap("gun:".concat(connectorId)); + String terminalStatus = (String) cacheGun.get("vehicleGunStatus"); + String status = (String) cacheGun.get("status"); + EtOrderMapping etOrderMapping = new EtOrderMapping(); + Date now = DateUtils.getNowDate(); + etOrderMapping.setCreateTime(now); + etOrderMapping.setEvcsOrderNo(startChargeSeq); + if (!"空闲".equals(status)) { + resp.setMsg("终端状态异常:[".concat(status == null ? "未注册" : status).concat("]")); + emptyHorder(startChargeSeq, connectorId, etOrderMapping); + } else if ("否".equals(terminalStatus)) { + resp.setMsg("未插枪"); emptyHorder(startChargeSeq, connectorId, etOrderMapping); } else { - Map etOrderData = (Map) res.getData(); - if (etOrderData != null) { - resp.setRet(EvcsConst.RET_SUCC); - startChargeResponse.setStartChargeSeqStat(1); - startChargeResponse.setSuccStat(0); - startChargeResponse.setFailReason(0); - Map pushOrder = new HashMap<>(); - pushOrder.put("startChargeSeqStat", 1); - pushOrder.put("internetSerialNumber", startChargeRequest.getStartChargeSeq()); - pushOrder.put("connectorID", connectorId); - pushOrder.put("startChargeNotificationStat", 0); - pushOrder.put("chargeOrderInfoNotificationStat", 0); - pushOrder.put("operatorId3rdpty", startChargeSeq.substring(0, 9)); - pushOrder.put("startTime", etOrderData.get("startTime")); - String orderNo = (String) etOrderData.get("orderNo"); - etOrderMapping.setXhOrderNo(orderNo); - REDIS.setCacheMap("pushOrder:".concat(orderNo), pushOrder); - } else { + String plateNum = startChargeRequest.getPlateNum(); + plateNum = plateNum == null ? startChargeRequest.getPlateNum2() : plateNum; + R res = pileOrderService.pileStartUpBy3rd(startChargeSeq, startChargeRequest.getDriverId(), + startChargeRequest.getChargingAmt(), plateNum, -1, connectorId); + startChargeResponse.setStartChargeSeq(startChargeSeq); + startChargeResponse.setConnectorID(connectorId); + resp.setMsg(res.getMsg()); + if (res.getCode() != 200) { + if (res.getCode() != 500) { + startChargeResponse.setFailReason(res.getCode()); + } else { + startChargeResponse.setFailReason(3); + } + startChargeResponse.setSuccStat(1); + startChargeResponse.setStartChargeSeqStat(4); emptyHorder(startChargeSeq, connectorId, etOrderMapping); + } else { + Map etOrderData = (Map) res.getData(); + if (etOrderData != null) { + resp.setRet(EvcsConst.RET_SUCC); + startChargeResponse.setStartChargeSeqStat(1); + startChargeResponse.setSuccStat(0); + startChargeResponse.setFailReason(0); + Map pushOrder = new HashMap<>(); + pushOrder.put("startChargeSeqStat", 1); + pushOrder.put("internetSerialNumber", startChargeRequest.getStartChargeSeq()); + pushOrder.put("connectorID", connectorId); + pushOrder.put("startChargeNotificationStat", 0); + pushOrder.put("chargeOrderInfoNotificationStat", 0); + pushOrder.put("operatorId3rdpty", startChargeSeq.substring(0, 9)); + pushOrder.put("startTime", etOrderData.get("startTime")); + String orderNo = (String) etOrderData.get("orderNo"); + etOrderMapping.setXhOrderNo(orderNo); + REDIS.setCacheMap("pushOrder:".concat(orderNo), pushOrder); + } else { + emptyHorder(startChargeSeq, connectorId, etOrderMapping); + } } } + etOrderMappingRepo.save(etOrderMapping); + resp.setData(JSONUtil.toJSONString(startChargeResponse)); } - etOrderMappingRepo.save(etOrderMapping); - resp.setData(JSONUtil.toJSONString(startChargeResponse)); return resp; } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationStatusController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationStatusController.java index 23e85818..faef9a02 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationStatusController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationStatusController.java @@ -2,6 +2,7 @@ package com.xhpc.evcs.api; import com.xhpc.common.api.dto.ChargingStationDto; import com.xhpc.evcs.dto.*; +import com.xhpc.evcs.encryption.EvcsConst; import com.xhpc.evcs.utils.JSONUtil; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -19,68 +20,73 @@ public class QueryStationStatusController { @PostMapping("/v1/query_station_status") public CommonResponse queryStationsInfo(@RequestBody CommonRequest commonRequest) throws Exception { + CommonResponse resp = new CommonResponse(); + resp.setRet(EvcsConst.RET_FAIL); StationStatusRequest stationStatusRequest = JSONUtil.readParams(commonRequest.getData(), StationStatusRequest.class); - String[] stationIDs = stationStatusRequest.getStationIds(); - List stationStatusInfos = new ArrayList<>(); - //Loading data through redis at first. - Collection guns = REDIS.keys("gun:*"); - List gunsNewList = new ArrayList<>(); - for (String value : guns) { - gunsNewList.add(value.substring(4)); - } - List gunsIds = new ArrayList<>(); - for (String value : gunsNewList) { - if (value.length() == 16) { - gunsIds.add(value); + if (stationStatusRequest == null) { + resp.setMsg("Request or token params validation failed"); + } else { + String[] stationIDs = stationStatusRequest.getStationIds(); + List stationStatusInfos = new ArrayList<>(); + //Loading data through redis at first. + Collection guns = REDIS.keys("gun:*"); + List gunsNewList = new ArrayList<>(); + for (String value : guns) { + gunsNewList.add(value.substring(4)); } - } - Map statusMap = new HashMap<>(); - String[] keys = {"离线", "空闲", "故障"}; - Integer[] values = {0, 1, 255}; - for (int i = 0; i < keys.length; i++) { - statusMap.put(keys[i], values[i]); - } - for (String stationID : stationIDs) { - ChargingStationDto chargingStationDto = REDIS.getCacheObject("station:" + stationID); - Set pileIds = new HashSet<>(); - if (null != chargingStationDto) { - pileIds = chargingStationDto.getPiles(); - } - boolean existsGun = false; - List connectorStatusInfos = new ArrayList<>(); - for (String pileId : pileIds) { - for (String value : gunsIds) { - if (pileId.equals(value.substring(0, 14))) { - existsGun = true; - ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo(); - Object status = REDIS.getCacheMapValue("gun:" + value, "status"); - if (isInteger(status.toString())) { - connectorStatusInfo.setStatus(3); - } else { - connectorStatusInfo.setStatus(statusMap.get(status)); - } - connectorStatusInfo.setConnectorID(value); - connectorStatusInfos.add(connectorStatusInfo); - } + List gunsIds = new ArrayList<>(); + for (String value : gunsNewList) { + if (value.length() == 16) { + gunsIds.add(value); } } - if (existsGun) { - StationStatusInfo stationStatusInfo = new StationStatusInfo(); - stationStatusInfo.setStationID(stationID); - stationStatusInfo.setConnectorStatusInfos(connectorStatusInfos); - stationStatusInfos.add(stationStatusInfo); + Map statusMap = new HashMap<>(); + String[] keys = {"离线", "空闲", "故障"}; + Integer[] values = {0, 1, 255}; + for (int i = 0; i < keys.length; i++) { + statusMap.put(keys[i], values[i]); + } + for (String stationID : stationIDs) { + ChargingStationDto chargingStationDto = REDIS.getCacheObject("station:" + stationID); + Set pileIds = new HashSet<>(); + if (null != chargingStationDto) { + pileIds = chargingStationDto.getPiles(); + } + boolean existsGun = false; + List connectorStatusInfos = new ArrayList<>(); + for (String pileId : pileIds) { + for (String value : gunsIds) { + if (pileId.equals(value.substring(0, 14))) { + existsGun = true; + ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo(); + Object status = REDIS.getCacheMapValue("gun:" + value, "status"); + if (isInteger(status.toString())) { + connectorStatusInfo.setStatus(3); + } else { + connectorStatusInfo.setStatus(statusMap.get(status)); + } + connectorStatusInfo.setConnectorID(value); + connectorStatusInfos.add(connectorStatusInfo); + } + } + } + if (existsGun) { + StationStatusInfo stationStatusInfo = new StationStatusInfo(); + stationStatusInfo.setStationID(stationID); + stationStatusInfo.setConnectorStatusInfos(connectorStatusInfos); + stationStatusInfos.add(stationStatusInfo); + } } - } - StationStatusInfoWrapper stationStatusInfoWrappers = new StationStatusInfoWrapper(); - stationStatusInfoWrappers.setTotal(stationStatusInfos.size()); - if (stationStatusInfos.size() != 0) { - stationStatusInfoWrappers.setStationStatusInfos(stationStatusInfos); + StationStatusInfoWrapper stationStatusInfoWrappers = new StationStatusInfoWrapper(); + stationStatusInfoWrappers.setTotal(stationStatusInfos.size()); + if (stationStatusInfos.size() != 0) { + stationStatusInfoWrappers.setStationStatusInfos(stationStatusInfos); + } + resp.setRet("0"); + resp.setMsg("Query station status success"); + resp.setData(JSONUtil.toJSONString(stationStatusInfoWrappers)); } - CommonResponse resp = new CommonResponse(); - resp.setRet("0"); - resp.setMsg("Query station status success"); - resp.setData(JSONUtil.toJSONString(stationStatusInfoWrappers)); return resp; } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStopChargeController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStopChargeController.java index bfda2124..ab69bf19 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStopChargeController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStopChargeController.java @@ -9,6 +9,7 @@ import com.xhpc.evcs.dto.CommonRequest; import com.xhpc.evcs.dto.CommonResponse; import com.xhpc.evcs.dto.QueryStopChargeRequest; import com.xhpc.evcs.dto.QueryStopChargeResponse; +import com.xhpc.evcs.encryption.EvcsConst; import com.xhpc.evcs.jpa.OrderMappingRepository; import com.xhpc.evcs.jpa.XhpcChargingPileRepository; import com.xhpc.evcs.utils.JSONUtil; @@ -40,77 +41,82 @@ public class QueryStopChargeController { @PostMapping("/v1/query_stop_charge") public CommonResponse queryStopCharge(@RequestBody CommonRequest commonRequest) throws IOException { - QueryStopChargeRequest queryStopChargeRequest = JSONUtil.readParams(commonRequest.getData(), QueryStopChargeRequest.class); - // evcs电订单号(27位) - String startChargeSeq = queryStopChargeRequest.getStartChargeSeq(); - QueryStopChargeResponse queryStopChargeResponse = new QueryStopChargeResponse(); - queryStopChargeResponse.setStartChargeSeq(startChargeSeq); - //判断三方的订单号是否存在 - EtOrderMapping etOrderMapping = etOrderMappingRepo.findByEvcsOrderNo(startChargeSeq).orElse(null); - if (etOrderMapping == null) { - return failCommonResponse(queryStopChargeResponse, "错误的充电订单号"); - } - String xhOrderNo = etOrderMapping.getXhOrderNo(); - String pushOrderkey = "pushOrder:".concat(xhOrderNo); - Map pushOrder = REDIS.getCacheMap(pushOrderkey); - if (pushOrder == null || (pushOrder.get("isStopNotified") != null && (Boolean) pushOrder.get("isStopNotified"))) { - return failCommonResponse(queryStopChargeResponse, "已下发停止充电指令"); - } - //充电设备接口编码(枪编码) - String connectorId = queryStopChargeRequest.getConnectorId(); - String pileNum = connectorId.substring(0, connectorId.length() - 2); - //从数据库中查询对应的桩的版本信息 - XhpcChargingPile pileInfo = XhpcChargingPileRepository.findBySerialNumber(pileNum).orElse(null); - String versionNum = pileInfo.getCommunicationProtocolVersion() != null ? pileInfo.getCommunicationProtocolVersion() : - "0A"; - //给对应的枪发送停止充电指令 - R r = powerPileService.stopCharging(xhOrderNo, pileNum, connectorId, versionNum); - // 判断停止指令发送是否成功 - if (r.getCode() != 200) { - //向redis中放入停止充电指令没有下发成功的标识 - REDIS.setCacheMap(pushOrderkey, pushOrder); - //充电订单状态 - queryStopChargeResponse.setStartChargeSeqStat(5); - //操作结果 - queryStopChargeResponse.setSuccStat(1); - //失败原因 - String errorMsg = r.getMsg(); - if (errorMsg.contains("未注册")) { - queryStopChargeResponse.setFailReason(1); - } - if (errorMsg.contains("离线")) { - queryStopChargeResponse.setFailReason(2); - } - if (errorMsg.contains("订单号")) { - //4 means error orderNumber - queryStopChargeResponse.setFailReason(4); - } - if (errorMsg.contains("端口")) { - //5 means port is not charging - queryStopChargeResponse.setFailReason(5); - } - queryStopChargeResponse.setStartChargeSeqStat(4); - queryStopChargeResponse.setSuccStat(1); - String data = JSONUtil.toJSONString(queryStopChargeResponse); - CommonResponse commonResponse = new CommonResponse(); - commonResponse.setRet("1"); - commonResponse.setMsg("请求停止充电失败"); - commonResponse.setData(data); - return commonResponse; - } - //设置该订单已经被停止的标识 - Map order = REDIS.getCacheMap("order:" + xhOrderNo); - order.replace("status", "已结束"); - REDIS.setCacheMap("order:".concat(xhOrderNo), order); - REDIS.setCacheMap(pushOrderkey, pushOrder); - queryStopChargeResponse.setStartChargeSeqStat(3); - queryStopChargeResponse.setSuccStat(0); - queryStopChargeResponse.setFailReason(0); - String data = JSONUtil.toJSONString(queryStopChargeResponse); CommonResponse commonResponse = new CommonResponse(); - commonResponse.setRet("0"); - commonResponse.setMsg("请求停止充电成功"); - commonResponse.setData(data); + commonResponse.setRet(EvcsConst.RET_FAIL); + QueryStopChargeRequest queryStopChargeRequest = JSONUtil.readParams(commonRequest.getData(), + QueryStopChargeRequest.class); + if (queryStopChargeRequest == null) { + commonResponse.setMsg("Request or token params validation failed"); + } else { + // evcs电订单号(27位) + String startChargeSeq = queryStopChargeRequest.getStartChargeSeq(); + QueryStopChargeResponse queryStopChargeResponse = new QueryStopChargeResponse(); + queryStopChargeResponse.setStartChargeSeq(startChargeSeq); + //判断三方的订单号是否存在 + EtOrderMapping etOrderMapping = etOrderMappingRepo.findByEvcsOrderNo(startChargeSeq).orElse(null); + if (etOrderMapping == null) { + return failCommonResponse(queryStopChargeResponse, "错误的充电订单号"); + } + String xhOrderNo = etOrderMapping.getXhOrderNo(); + String pushOrderkey = "pushOrder:".concat(xhOrderNo); + Map pushOrder = REDIS.getCacheMap(pushOrderkey); + if (pushOrder == null || (pushOrder.get("isStopNotified") != null && (Boolean) pushOrder.get("isStopNotified"))) { + return failCommonResponse(queryStopChargeResponse, "已下发停止充电指令"); + } + //充电设备接口编码(枪编码) + String connectorId = queryStopChargeRequest.getConnectorId(); + String pileNum = connectorId.substring(0, connectorId.length() - 2); + //从数据库中查询对应的桩的版本信息 + XhpcChargingPile pileInfo = XhpcChargingPileRepository.findBySerialNumber(pileNum).orElse(null); + String versionNum = pileInfo.getCommunicationProtocolVersion() != null ? + pileInfo.getCommunicationProtocolVersion() : + "0A"; + //给对应的枪发送停止充电指令 + R r = powerPileService.stopCharging(xhOrderNo, pileNum, connectorId, versionNum); + // 判断停止指令发送是否成功 + if (r.getCode() != 200) { + //向redis中放入停止充电指令没有下发成功的标识 + REDIS.setCacheMap(pushOrderkey, pushOrder); + //充电订单状态 + queryStopChargeResponse.setStartChargeSeqStat(5); + //操作结果 + queryStopChargeResponse.setSuccStat(1); + //失败原因 + String errorMsg = r.getMsg(); + if (errorMsg.contains("未注册")) { + queryStopChargeResponse.setFailReason(1); + } + if (errorMsg.contains("离线")) { + queryStopChargeResponse.setFailReason(2); + } + if (errorMsg.contains("订单号")) { + //4 means error orderNumber + queryStopChargeResponse.setFailReason(4); + } + if (errorMsg.contains("端口")) { + //5 means port is not charging + queryStopChargeResponse.setFailReason(5); + } + queryStopChargeResponse.setStartChargeSeqStat(4); + queryStopChargeResponse.setSuccStat(1); + String data = JSONUtil.toJSONString(queryStopChargeResponse); + commonResponse.setMsg("请求停止充电失败"); + commonResponse.setData(data); + return commonResponse; + } + //设置该订单已经被停止的标识 + Map order = REDIS.getCacheMap("order:" + xhOrderNo); + order.replace("status", "已结束"); + REDIS.setCacheMap("order:".concat(xhOrderNo), order); + REDIS.setCacheMap(pushOrderkey, pushOrder); + queryStopChargeResponse.setStartChargeSeqStat(3); + queryStopChargeResponse.setSuccStat(0); + queryStopChargeResponse.setFailReason(0); + String data = JSONUtil.toJSONString(queryStopChargeResponse); + commonResponse.setRet("0"); + commonResponse.setMsg("请求停止充电成功"); + commonResponse.setData(data); + } return commonResponse; } @@ -121,7 +127,7 @@ public class QueryStopChargeController { queryStopChargeResponse.setFailReason(0); String data = JSONUtil.toJSONString(queryStopChargeResponse); CommonResponse commonResponse = new CommonResponse(); - commonResponse.setRet("0"); + commonResponse.setRet("500"); commonResponse.setMsg(msg); commonResponse.setData(data); return commonResponse; diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTerminalCodeController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTerminalCodeController.java index 36a1d2af..9cb67975 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTerminalCodeController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTerminalCodeController.java @@ -22,18 +22,23 @@ public class QueryTerminalCodeController { public CommonResponse queryTerminalCode(@RequestBody CommonRequest commonRequest) throws IOException { CommonResponse resp = new CommonResponse(); - QueryTerminalCodeResponse queryTerminalCodeResponse = new QueryTerminalCodeResponse(); - QueryTerminalCodeRequest queryTerminalCodeRequest = JSONUtil.readParams(commonRequest.getData(), QueryTerminalCodeRequest.class); resp.setRet(EvcsConst.RET_FAIL); - resp.setMsg("fail"); - if (null != queryTerminalCodeRequest) { + QueryTerminalCodeRequest queryTerminalCodeRequest = JSONUtil.readParams(commonRequest.getData(), + QueryTerminalCodeRequest.class); + if (queryTerminalCodeRequest == null) { + resp.setMsg("Request or token params validation failed"); + } else { + resp.setMsg("Please check the qrcode format"); + QueryTerminalCodeResponse queryTerminalCodeResponse = new QueryTerminalCodeResponse(); String qRCode = queryTerminalCodeRequest.getQRCode(); if (null != qRCode) { - resp.setRet(EvcsConst.RET_SUCC); - resp.setMsg("success"); - String terminalCode = qRCode.split("=")[1]; - queryTerminalCodeResponse.setTerminalCode(terminalCode); - resp.setData(JSONUtil.toJSONString(queryTerminalCodeResponse)); + String[] terminalId = qRCode.split("="); + if (terminalId.length == 2) { + resp.setRet(EvcsConst.RET_SUCC); + resp.setMsg("success"); + queryTerminalCodeResponse.setTerminalCode(terminalId[1]); + resp.setData(JSONUtil.toJSONString(queryTerminalCodeResponse)); + } } } return resp; diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java index 4686b398..919eeea2 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java @@ -5,6 +5,7 @@ import com.xhpc.evcs.domain.XhpcInternetUser; import com.xhpc.evcs.dto.CommonResponse; import com.xhpc.evcs.dto.TokenRequest; import com.xhpc.evcs.dto.TokenResponse; +import com.xhpc.evcs.encryption.EvcsConst; import com.xhpc.evcs.jpa.AuthSecretTokenRepository; import com.xhpc.evcs.jpa.XhpcInternetUserRepository; import com.xhpc.evcs.utils.JSONUtil; @@ -24,6 +25,8 @@ import java.util.Calendar; import java.util.Date; import java.util.UUID; +import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; + @Slf4j @RestController() public class QueryTokenController { @@ -39,59 +42,54 @@ public class QueryTokenController { log.debug("< 0) { + requestWrapper = new HttpServletRequestWritableWrapper(request, + JSONUtil.toJSONString(commonRequest).getBytes(StandardCharsets.UTF_8)); + } else { + resp.setRet("4004"); + resp.setMsg(erroMsg); + String data = JSONUtil.toJSONString(resp); + response.getOutputStream().write(data.getBytes(StandardCharsets.UTF_8)); + chain.doFilter(requestWrapper, responseWrapper); + return; + } } - if (decryptedReq != null && decryptedReq.length > 0) { - requestWrapper = new HttpServletRequestWritableWrapper(request, - JSONUtil.toJSONString(commonRequest).getBytes(StandardCharsets.UTF_8)); - } else { - resp.setRet("4004"); - resp.setMsg(erroMsg); - String data = JSONUtil.toJSONString(resp); - response.getOutputStream().write(data.getBytes(StandardCharsets.UTF_8)); - chain.doFilter(requestWrapper, responseWrapper); - return; - } - } - //encrypt response - final String encout = request.getHeader("enc.out"); + //encrypt response + final String encout = request.getHeader("enc.out"); // if (requestWrapper == null) { // chain.doFilter(request, responseWrapper); // } else { - chain.doFilter(requestWrapper, responseWrapper); + chain.doFilter(requestWrapper, responseWrapper); // } // responseWrapper.copyBodyToResponse(); // responseWrapper = new ContentCachingResponseWrapper(responseWrapper); - byte[] buf = responseWrapper.getContentAsByteArray(); - log.debug("out.plain: {}", new String(buf, StandardCharsets.UTF_8)); - String encryptedData; + byte[] buf = responseWrapper.getContentAsByteArray(); + log.debug("out.plain: {}", new String(buf, StandardCharsets.UTF_8)); + String encryptedData; // AuthSecretToken authSecretTokenOut = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType // (operatorId, // AuthSecretToken.SECRET_TOKEN_TYPE_OUT).orElse(null); - if (encout == null) { - encryptedData = encryptRespOut(authSecretTokenIn.getDataSecret(), authSecretTokenIn.getDataSecretIV(), - authSecretTokenIn.getSigSecret(), buf).toString(); - log.debug("out.enc: {}", encryptedData); - response.getOutputStream().write(encryptedData == null ? internalError() : - encryptedData.getBytes(StandardCharsets.UTF_8)); - } else if ("false".equals(encout)) { - response.getOutputStream().write(buf); + if (encout == null) { + encryptedData = encryptRespOut(authSecretTokenIn.getDataSecret(), authSecretTokenIn.getDataSecretIV(), + authSecretTokenIn.getSigSecret(), buf).toString(); + log.debug("out.enc: {}", encryptedData); + response.getOutputStream().write(encryptedData == null ? internalError() : + encryptedData.getBytes(StandardCharsets.UTF_8)); + } else if ("false".equals(encout)) { + response.getOutputStream().write(buf); // } else { // resp.setRet("4004"); // resp.setMsg("Encryption error"); // String data = JSONUtil.toJSONString(resp); // response.getOutputStream().write(data.getBytes(StandardCharsets.UTF_8)); //// chain.doFilter(requestWrapper, responseWrapper); + } } } } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/CheckChargeOrders.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/CheckChargeOrders.java index e99e36fb..122d8954 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/CheckChargeOrders.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/CheckChargeOrders.java @@ -105,7 +105,7 @@ public class CheckChargeOrders extends CoreDispatcher { //推送并处理推送结果 String result = ok(commonRequest, "/check_charge_orders", authSecretTokenOut); CheckChargeOrderResponseData checkChargeOrderResponseData = JSONUtil.readParams(result, - CheckChargeOrderResponseData.class); + CheckChargeOrderResponseData.class); //todo check NPE if (checkChargeOrderResponseData.getDisputeOrders() == null) { //没有争议订单 REDIS.deleteObject(pushOrderKey); diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfo.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfo.java deleted file mode 100644 index a9eaa36d..00000000 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationChargeOrderInfo.java +++ /dev/null @@ -1,180 +0,0 @@ -package com.xhpc.evcs.notification; - -import com.xhpc.common.data.redis.CacheOrderData; -import com.xhpc.common.redis.service.RedisService; -import com.xhpc.evcs.domain.AuthSecretToken; -import com.xhpc.evcs.domain.XhpcRate; -import com.xhpc.evcs.dto.ChargeOrderInfo; -import com.xhpc.evcs.dto.ChargeOrderInfoResponse; -import com.xhpc.evcs.dto.CommonRequest; -import com.xhpc.evcs.jpa.AuthSecretTokenRepository; -import com.xhpc.evcs.jpa.XhpcRateRepository; -import com.xhpc.evcs.utils.JSONUtil; -import org.springframework.beans.factory.annotation.Autowired; - -import java.io.IOException; -import java.math.BigDecimal; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; -import static com.xhpc.evcs.domain.AuthSecretToken.SECRET_TOKEN_TYPE_OUT; - -/** - * 用于进行充电历史订单的推送 - * - * @author WH - * @date 2021/11/7 14:39 - * @since version-1.0 - */ -public class NotificationChargeOrderInfo extends CoreDispatcher { - - @Autowired - private RedisService redisService; - - @Autowired - private AuthSecretTokenRepository authSecretTokenRepository; - - @Autowired - private XhpcRateRepository xhpcRateRepository; - - - public static void main(String[] args) { - - } - - public void pushChargeOrderInfo() throws IOException { - - //获取Redis中的所有订单的状态数据 - Collection pushOrders = REDIS.keys("pushOrder:*"); - - for (String pushOrderKey : pushOrders) { - Map pushOrder = REDIS.getCacheMap(pushOrderKey); - Boolean isStopNotified = (Boolean) pushOrder.get("isStopNotified"); - if (isStopNotified) { - continue; - } - String orderNo = pushOrderKey.substring(10); - Map order = REDIS.getCacheMap("order:" + orderNo); - String operatorId3rdpty = (String) pushOrder.get("operatorId3rdpty"); - if (operatorId3rdpty == null) { - continue; - } - AuthSecretToken authSecretTokenOut = - authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId3rdpty, - SECRET_TOKEN_TYPE_OUT).orElse(null); - if (authSecretTokenOut == null) { - continue; - } - CommonRequest commonRequest = new CommonRequest<>(); - //封装数据的实体类 - ChargeOrderInfo chargeOrderInfo = new ChargeOrderInfo(); - //判断是否是结束了的充电订单 - if (isStopNotified) { - //充电订单号(内部对应的第三方充电订单号) - CacheOrderData orderData = (CacheOrderData) order.get("orderData"); - String internetSerialNumber = (String) pushOrder.get("internetSerialNumber"); - chargeOrderInfo.setStartChargeSeq(internetSerialNumber); - if (orderData != null) { - //使用指定包装类封装数据 - //充电设备接口编码 - chargeOrderInfo.setConnectorID(orderData.getPileNo() + orderData.getGunId()); - //开始充电时间 - chargeOrderInfo.setStartTime(orderData.getStartTime()); - //结束充电时间 - chargeOrderInfo.setEndTime(orderData.getEndTime()); - //累计充电量 - chargeOrderInfo.setTotalPower(Double.parseDouble(orderData.getTotalPowerQuantity().toString()) / 10000); - //总电费 - Map map = getTotalElecMoneyAndTotalServiceMoney(orderNo); - Double totalPowerPrice = map.get("totalPowerPrice"); - chargeOrderInfo.setTotalPower(totalPowerPrice); - //总服务费 - Double totalServicePrice = map.get("totalServicePrice"); - chargeOrderInfo.setTotalSeviceMoney(totalServicePrice); - //累计总金额 - Double sumMoney = totalPowerPrice + totalServicePrice; - chargeOrderInfo.setTotalMoney(sumMoney); - //充电结束原因 - chargeOrderInfo.setStopReason(0); - - //将其转换为json - String jsonData = JSONUtil.toJSONString(chargeOrderInfo); - commonRequest.setData(jsonData); - String result = ok(commonRequest, "/notification_charge_order_info", authSecretTokenOut); - - ChargeOrderInfoResponse chargeOrderInfoResponse = JSONUtil.readParams(result, ChargeOrderInfoResponse.class); - Integer confirmResult = chargeOrderInfoResponse.getConfirmResult(); - //无视争议订单,对结果不进行处理,在下面的推送中在进行处理 - } - } - } - } - - private Map getTotalElecMoneyAndTotalServiceMoney(String orderNo) { - - //获取结算后的订单 - Map cacheMap = redisService.getCacheMap("order:" + orderNo); - CacheOrderData cacheOrderData = (CacheOrderData) cacheMap.get("orderData"); - //总金额 - BigDecimal bigDecimal = new BigDecimal(10000); - BigDecimal money = new BigDecimal(cacheOrderData.getCost()).divide(bigDecimal); - //00: 尖费率 01: 峰费率 02: 平费率 03: 谷费率 - BigDecimal t1powerFee = new BigDecimal(0); - BigDecimal t2powerFee = new BigDecimal(0); - BigDecimal t3powerFee = new BigDecimal(0); - BigDecimal t4powerFee = new BigDecimal(0); - //费率计费模型 - Long rateModelId = (Long) cacheMap.get("rateModelId"); - List rateModelList = xhpcRateRepository.findByRateModelId(rateModelId); - for (XhpcRate xhpcRate : rateModelList) { - if ("00".equals(xhpcRate.getRateValue())) { - t1powerFee = xhpcRate.getPowerFee(); - } - if ("01".equals(xhpcRate.getRateValue())) { - t2powerFee = xhpcRate.getPowerFee(); - } - if ("02".equals(xhpcRate.getRateValue())) { - t3powerFee = xhpcRate.getPowerFee(); - } - if ("03".equals(xhpcRate.getRateValue())) { - t4powerFee = xhpcRate.getPowerFee(); - } - } - //总电费 - BigDecimal powerPrice = new BigDecimal(0); - Integer totalPower = 0; - if (!"0".equals(cacheOrderData.getT1PowerQuantity().toString())) { - BigDecimal multiply = new BigDecimal(cacheOrderData.getT1PowerQuantity()).divide(bigDecimal).multiply(t1powerFee); - totalPower = totalPower + cacheOrderData.getT1PowerQuantity(); - powerPrice = powerPrice.add(multiply); - } - if (!"0".equals(cacheOrderData.getT2PowerQuantity().toString())) { - BigDecimal multiply = new BigDecimal(cacheOrderData.getT2PowerQuantity()).divide(bigDecimal).multiply(t2powerFee); - totalPower = totalPower + cacheOrderData.getT2PowerQuantity(); - powerPrice = powerPrice.add(multiply); - } - if (!"0".equals(cacheOrderData.getT3PowerQuantity().toString())) { - BigDecimal multiply = new BigDecimal(cacheOrderData.getT3PowerQuantity()).divide(bigDecimal).multiply(t3powerFee); - totalPower = totalPower + cacheOrderData.getT3PowerQuantity(); - powerPrice = powerPrice.add(multiply); - } - if (!"0".equals(cacheOrderData.getT4PowerQuantity().toString())) { - BigDecimal multiply = new BigDecimal(cacheOrderData.getT4PowerQuantity()).divide(bigDecimal).multiply(t4powerFee); - totalPower = totalPower + cacheOrderData.getT4PowerQuantity(); - powerPrice = powerPrice.add(multiply); - } - powerPrice = powerPrice.setScale(2, BigDecimal.ROUND_DOWN); - //总服务费 - BigDecimal servicePrice = money.subtract(powerPrice); - - HashMap data = new HashMap<>(7); - data.put("totalPowerPrice", servicePrice.doubleValue()); - data.put("totalServicePrice", servicePrice.doubleValue()); - - return data; - } - -}