From 912745b0bfc68abb16b5816b3ff1f920b3707899 Mon Sep 17 00:00:00 2001 From: wen <1455474577@qq.com> Date: Fri, 29 Oct 2021 16:12:16 +0800 Subject: [PATCH] =?UTF-8?q?todo:=E7=AC=AC=E4=B8=89=E6=96=B9=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xhpc/evcs/dto/ChargeResultRequest.java | 2 +- .../QueryEquipBusinessPolicyController.java | 2 + .../evcs/api/QueryStartChargeController.java | 17 +- .../evcs/api/QueryStopChargeController.java | 26 ++- .../xhpc/evcs/jpa/OrderMappingRepository.java | 4 + .../NotificationStopChargeResultTask.java | 161 ++++++++++++++++-- 6 files changed, 187 insertions(+), 25 deletions(-) diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/ChargeResultRequest.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/ChargeResultRequest.java index 752b8483..49422635 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/ChargeResultRequest.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/ChargeResultRequest.java @@ -14,7 +14,7 @@ public class ChargeResultRequest { @JsonProperty("StartChargeSeq") String startChargeSeq; @JsonProperty("StartChargeSeqStat") - String startChargeSeqStat; + Integer startChargeSeqStat; @JsonProperty("ConnectorID") String connectorID; @JsonProperty("SuccStat") 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 f17efe65..8f307e9a 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 @@ -126,6 +126,8 @@ public class QueryEquipBusinessPolicyController { 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; } 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 0213feda..ddfe3ca8 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 @@ -3,11 +3,13 @@ package com.xhpc.evcs.api; import com.xhpc.common.api.PileOrderService; import com.xhpc.common.core.domain.R; import com.xhpc.evcs.domain.AuthSecretToken; +import com.xhpc.evcs.domain.EtOrderMapping; import com.xhpc.evcs.dto.CommonRequest; import com.xhpc.evcs.dto.CommonResponse; import com.xhpc.evcs.dto.StartChargeRequest; import com.xhpc.evcs.dto.StartChargeResponse; import com.xhpc.evcs.jpa.AuthSecretTokenRepository; +import com.xhpc.evcs.jpa.OrderMappingRepository; import com.xhpc.evcs.utils.JSONUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -26,6 +28,8 @@ public class QueryStartChargeController { @Autowired AuthSecretTokenRepository authSecretTokenRepository; @Autowired + private OrderMappingRepository etOrderMappingRepo; + @Autowired private PileOrderService pileOrderService; @PostMapping(value = "/v1/query_start_charge") @@ -55,15 +59,20 @@ public class QueryStartChargeController { startChargeResponse.setFailReason(0); startChargeResponse.setStartChargeSeqStat(5); } else { + EtOrderMapping etOrderMapping = new EtOrderMapping(); + etOrderMapping.setEvcsOrderNo(startChargeSeq); +// etOrderMapping.setXhOrderNo(xhOrderNo);//todo 鸿运 + etOrderMappingRepo.save(etOrderMapping); startChargeResponse.setStartChargeSeqStat(2); startChargeResponse.setSuccStat(0); startChargeResponse.setFailReason(0); //insert a gunStatusData to redis - Map gunStatus = new HashMap<>(); + Map pushOrder = new HashMap<>(); //0 means charging. - gunStatus.put("status", 0); - gunStatus.put("orderNo", (String) res.getData()); - REDIS.setCacheMap("gunStatus:", gunStatus); + pushOrder.put("status", 0); + String orderNo = (String) res.getData(); + pushOrder.put("internetSerialNumber", startChargeRequest.getStartChargeSeq()); + REDIS.setCacheMap("pushOrder:".concat(orderNo), pushOrder); } resp.setRet(String.valueOf(res.getCode())); } 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 112f8da3..30d63099 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 @@ -2,9 +2,13 @@ package com.xhpc.evcs.api; import com.fasterxml.jackson.core.JsonProcessingException; import com.xhpc.common.api.PowerPileService; +import com.xhpc.common.core.domain.R; +import com.xhpc.evcs.domain.EtOrderMapping; +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.jpa.OrderMappingRepository; import com.xhpc.evcs.utils.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -12,6 +16,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; +import java.util.HashMap; import java.util.Map; import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; @@ -23,10 +29,15 @@ public class QueryStopChargeController { @Autowired PowerPileService powerPileService; + //三方订单与redis内部订单映射表 + @Autowired + private OrderMappingRepository etOrderMappingRepo; @PostMapping("/v1/query_stop_charge") - public CommonResponse queryStopCharge(@RequestBody QueryStopChargeRequest queryStopChargeRequest) { - //充电订单号 + public CommonResponse queryStopCharge(@RequestBody CommonRequest commonRequest) throws IOException { + + QueryStopChargeRequest queryStopChargeRequest = JSONUtil.readParams(commonRequest.getData(), QueryStopChargeRequest.class); + //充电订单号 //todo 充电订单号是一个27位的数字 String chargingOrderSeq = queryStopChargeRequest.getStartChargeSeq(); //充电设备接口编码(枪编码) String connectorId = queryStopChargeRequest.getConnectorId(); @@ -38,9 +49,16 @@ public class QueryStopChargeController { String vesrionNum = (String) pile.get("vesrion"); //给对应的枪发送停止充电指令 - powerPileService.stopCharging(chargingOrderSeq, pileNum, connectorId, "0A"); //ToDo 暂时写死 - + R r = powerPileService.stopCharging(chargingOrderSeq, pileNum, connectorId, "0A");//ToDo 暂时写死 + //todo 判断停止指令发送是否成功 + EtOrderMapping etOrderMapping = etOrderMappingRepo.findByEvcsOrderNo(chargingOrderSeq).orElse(null); + if (etOrderMapping != null) { + Map pushOrder = new HashMap<>(); + pushOrder.put("stopCommandSent", false); + REDIS.setCacheMap("pushOrder:".concat(etOrderMapping.getXhOrderNo()), pushOrder); + } //Todo 获取Redis中的充电状态来判断是否启动成功 + //获取Redis中的充电订单 if (true) { //设置Redis中的充电订单为已结束 Map order = REDIS.getCacheMap("order:" + chargingOrderSeq); diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/OrderMappingRepository.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/OrderMappingRepository.java index 23c0492a..f4aaeecc 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/OrderMappingRepository.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/OrderMappingRepository.java @@ -6,9 +6,13 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.repository.query.QueryByExampleExecutor; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface OrderMappingRepository extends JpaRepository, QueryByExampleExecutor, JpaSpecificationExecutor { + Optional findByEvcsOrderNo(String chargingOrderSeq); + } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStopChargeResultTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStopChargeResultTask.java index 2a6a60e6..a7ac1b0b 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStopChargeResultTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationStopChargeResultTask.java @@ -9,14 +9,17 @@ import com.xhpc.evcs.jpa.AuthSecretTokenRepository; import com.xhpc.evcs.utils.JSONUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; import java.io.IOException; +import java.util.Collection; 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; +@Component public class NotificationStopChargeResultTask extends CoreDispatcher { @Autowired @@ -25,11 +28,61 @@ public class NotificationStopChargeResultTask extends CoreDispatcher { @Scheduled(fixedRate = 1000 * 20) public void run() throws IOException { - notifyService(); - + notifyService3(); } + public void notifyService3() throws JsonProcessingException { + + //获取Redis中的所有订单状态数据 + Collection pushOrders = REDIS.keys("pushOrder:*"); + + for (String pushOrderKey : pushOrders) { + Map pushOrder = REDIS.getCacheMap(pushOrderKey); + Boolean stopCommandSent = (Boolean) pushOrder.get("stopCommandSent"); + if (stopCommandSent == null) { + continue; + } + String orderNo = pushOrderKey.substring(10); + Map order = REDIS.getCacheMap("order:" + orderNo); + String operatorId3rdpty = (String) order.get("operatorId3rdpty"); //todo zz + if (operatorId3rdpty == null) { + continue; + } + AuthSecretToken authSecretTokenOut = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId3rdpty, SECRET_TOKEN_TYPE_OUT).orElse(null); + if (authSecretTokenOut == null) { + continue; + } + CommonRequest chargeResultRequestCommonRequest = new CommonRequest<>(); + ChargeResultRequest chargeResultRequest = new ChargeResultRequest(); + if (stopCommandSent) { + //获取内部的充电订单号 + //通过充电订单号,获取指定的订单 + //判断订单充电状态 + // 获取指定的订单的数据 + CacheOrderData orderData = (CacheOrderData) order.get("orderData"); + String internetSerialNumber = (String) pushOrder.get("internetSerialNumber"); + int succStat = 0; + int failReason = 0; + chargeResultRequest.setStartChargeSeq(internetSerialNumber); + chargeResultRequest.setConnectorID(orderNo.substring(0, 14)); + if (orderData != null) { + //使用指定包装类封装数据 + chargeResultRequest.setStartChargeSeqStat(4); + chargeResultRequest.setSuccStat(succStat); + chargeResultRequest.setFailReason(failReason); + //将其转换为json + REDIS.deleteObject(pushOrderKey); + } + } else { // todo wenhui + chargeResultRequest.setStartChargeSeqStat((Integer) pushOrder.get("status")); + } + String jsonData = JSONUtil.toJSONString(chargeResultRequest); + chargeResultRequestCommonRequest.setData(jsonData); + String result = ok(chargeResultRequestCommonRequest, "/notification_stop_charge_result", authSecretTokenOut, operatorId3rdpty); + } + } + /** * 获取充电订单号 * 获取充电订单状态 @@ -48,23 +101,23 @@ public class NotificationStopChargeResultTask extends CoreDispatcher { //20秒检测一次Redis中的数据状态,并推送 //获取Redis中的所有订单状态数据 - List orderStatusList = REDIS.getCacheList("orderStatus:*"); + List orderStatusDataList = REDIS.getCacheList("orderStatusData:*"); //使用for循环遍历所有订单状态数据找到已结束的充电订单 - for (int i = 0; i < orderStatusList.size() - 1; i++) { + for (int i = 0; i < orderStatusDataList.size() - 1; i++) { //获取订单数据 - Map orderStatus = (Map) orderStatusList.get(i); + Map orderStatusData = (Map) orderStatusDataList.get(i); //判断该订单数据是否已经被推送过了,如果已经推送过了,则不在推送 - Boolean isPush = (Boolean) orderStatus.get("isPush"); + Boolean isPush = (Boolean) orderStatusData.get("isPush"); if (!isPush) { //获取内部的充电订单号 - String orderNo = (String) orderStatus.get("orderNo"); + String orderNo = (String) orderStatusData.get("orderNo"); //通过充电订单号,获取指定的订单 Map order = REDIS.getCacheMap("order:" + orderNo); //判断订单充电状态 - String status = (String) order.get("status"); - if (status.equals("已结束")) { + String chargingStatus = (String) order.get("chargingStatus"); + if (chargingStatus.equals("已结束")) { //获取指定的订单的数据 CacheOrderData orderData = (CacheOrderData) order.get("orderData"); //获取充电设备接口编码 @@ -78,8 +131,8 @@ public class NotificationStopChargeResultTask extends CoreDispatcher { //使用指定包装类封装数据 ChargeResultRequest chargeResultRequest = new ChargeResultRequest(); - chargeResultRequest.setStartChargeSeq(null); - chargeResultRequest.setStartChargeSeqStat(status); + chargeResultRequest.setStartChargeSeq(null); //todo 使用朱老师工具缩减成27位 + chargeResultRequest.setStartChargeSeqStat(4); chargeResultRequest.setConnectorID(gunSerial); chargeResultRequest.setSuccStat(succStat); chargeResultRequest.setFailReason(failReason); @@ -99,12 +152,12 @@ public class NotificationStopChargeResultTask extends CoreDispatcher { //推送数据 //operatorId第三方的 我们场站运营商的 - ok(chargeResultRequestCommonRequest, "/notification_stop_charge_result", authSecretTokenOut, null); + ok(chargeResultRequestCommonRequest, "/notification_stop_charge_result", authSecretTokenOut, "MA6DFCTD5"); - // TODO: 2021/10/21 设置该订单数据已经被推送的标识符 - orderStatus.put("isPush", true); - // 获取对应的orderStatus的Key - //REDIS.setCacheMap("",orderStatus); + //设置该订单数据已经被推送的标识符 + orderStatusData.put("isPush", true); + String statusDataNum = (String) orderStatusData.get("statusDataNum"); + REDIS.setCacheMap("orderStatusData:" + statusDataNum, orderStatusData); } // TODO:如果充电状态为停止中: @@ -113,6 +166,82 @@ public class NotificationStopChargeResultTask extends CoreDispatcher { } } + } + //第二种更快的逻辑 +// public void notifyService2() { +// +// +// +// //20秒检测一次Redis中的数据状态,并推送 +// +// //获取Redis中的所有未推送的订单状态数据 +// Collection keys1 = REDIS.keys("orderStatusData:F*"); +// +// List orderStatusDataList = REDIS.getCacheList("orderStatusData:F"); +// Collection keys = REDIS.keys("orderStatusData:*F"); +// +// //使用for循环遍历所有未推送订单状态数据 +// for (int i = 0; i < orderStatusDataList.size() - 1; i++) { +// +// //获取订单数据 +// Map orderStatusData = (Map) orderStatusDataList.get(i); +// +// //获取内部的充电订单号 +// String orderNo = (String) orderStatusData.get("orderNo"); +// //通过充电订单号,获取指定的订单 +// Map order = REDIS.getCacheMap("order:" + orderNo); +// //判断订单充电状态 +// String chargingStatus = (String) order.get("chargingStatus"); +// if (chargingStatus.equals("已结束")) { +// //获取指定的订单的数据 +// CacheOrderData orderData = (CacheOrderData) order.get("orderData"); +// //获取充电设备接口编码 +// String pileNo = orderData.getPileNo(); +// String gunId = orderData.getGunId(); +// String gunSerial = pileNo + gunId; +// //设置成功标识 +// int succStat = 0; +// //设置停止失败原因 +// int failReason = 0; +// +// //使用指定包装类封装数据 +// ChargeResultRequest chargeResultRequest = new ChargeResultRequest(); +// chargeResultRequest.setStartChargeSeq(null); //todo 使用朱老师工具缩减成27位 +// chargeResultRequest.setStartChargeSeqStat(chargingStatus); +// chargeResultRequest.setConnectorID(gunSerial); +// chargeResultRequest.setSuccStat(succStat); +// chargeResultRequest.setFailReason(failReason); +// //将其转换为json +// String jsonData = null; +// try { +// jsonData = JSONUtil.toJSONString(chargeResultRequest); +// } catch (JsonProcessingException e) { +// e.printStackTrace(); +// System.out.println("转换成Json失败"); +// } +// +// //将包装类塞入要发送的请求的包装类中 +// //泛型为放入json数据的实体类类型 +// CommonRequest chargeResultRequestCommonRequest = new CommonRequest<>(); +// chargeResultRequestCommonRequest.setData(jsonData); +// +// //推送数据 +// //operatorId第三方的 我们场站运营商的 +// ok(chargeResultRequestCommonRequest, "/notification_stop_charge_result", "765367656", null); +// +// //往该订单所对应的订单状态数据上添加已经被推送的标识符,以避开下次扫描 +// REDIS.setCacheMap("orderStatusData:"+orderNo+"T",orderStatusData); +// System.out.println("已完成"); +// } +// +// // TODO:如果充电状态为停止中: +// +// +// } +// +// +// } + }