diff --git a/evcs-modules/evcs-core/pom.xml b/evcs-modules/evcs-core/pom.xml index b1b5c592..c10b40e9 100644 --- a/evcs-modules/evcs-core/pom.xml +++ b/evcs-modules/evcs-core/pom.xml @@ -119,6 +119,10 @@ druid-spring-boot-starter ${druid.version} + + junit + junit + 1.8 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 30d63099..c1a264cb 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 @@ -4,11 +4,13 @@ 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.domain.XhpcChargingPile; 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.jpa.XhpcChargingPileRepository; import com.xhpc.evcs.utils.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -33,48 +35,32 @@ public class QueryStopChargeController { @Autowired private OrderMappingRepository etOrderMappingRepo; + @Autowired + private XhpcChargingPileRepository XhpcChargingPileRepository; + @PostMapping("/v1/query_stop_charge") 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(); - //获取桩编码 - String pileNum = connectorId.substring(0, connectorId.length() - 2); - //从桩上面获取版本号 - //获取Redis中的桩信息 - Map pile = REDIS.getCacheMap("pile:" + pileNum); - String vesrionNum = (String) pile.get("vesrion"); + // 获取充电订单号 充电订单号是一个27位的数字 + String startChargeSeq = queryStopChargeRequest.getStartChargeSeq(); - //给对应的枪发送停止充电指令 - R r = powerPileService.stopCharging(chargingOrderSeq, pileNum, connectorId, "0A");//ToDo 暂时写死 - //todo 判断停止指令发送是否成功 - EtOrderMapping etOrderMapping = etOrderMappingRepo.findByEvcsOrderNo(chargingOrderSeq).orElse(null); + //封装实体类数据 + QueryStopChargeResponse queryStopChargeResponse = new QueryStopChargeResponse(); + queryStopChargeResponse.setStartChargeSeq(startChargeSeq); + + //判断三方的订单号是否在我们的内部有对应的订单 + EtOrderMapping etOrderMapping = etOrderMappingRepo.findByEvcsOrderNo(startChargeSeq).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); - order.replace("status", "已结束"); - REDIS.setCacheMap("order:" + chargingOrderSeq, order); - - //封装实体类数据 - QueryStopChargeResponse queryStopChargeResponse = new QueryStopChargeResponse(); - //充电订单号 - queryStopChargeResponse.setStartChargeSeq(chargingOrderSeq); //充电订单状态 - queryStopChargeResponse.setStartChargeSeqStat(4); + queryStopChargeResponse.setStartChargeSeqStat(5); //操作结果 - queryStopChargeResponse.setSuccStat(0); - //失败原因 - queryStopChargeResponse.setFailReason(0); + queryStopChargeResponse.setSuccStat(1); + //5 are custom value, means "error startChargeSeq" + queryStopChargeResponse.setFailReason(10); //转换为json对象 String data = null; @@ -87,16 +73,95 @@ public class QueryStopChargeController { CommonResponse commonResponse = new CommonResponse(); commonResponse.setRet("0"); - commonResponse.setMsg("请求停止充电成功"); + commonResponse.setMsg("请求停止充电失败:错误的充电订单号"); commonResponse.setData(data); - return commonResponse; - } else { - - return null; + } + String xhOrderNo = etOrderMapping.getXhOrderNo(); + //充电设备接口编码(枪编码) + String connectorId = queryStopChargeRequest.getConnectorId(); + //获取桩编码 + String pileNum = connectorId.substring(0, connectorId.length() - 2); + //从数据库中查询对应的桩的版本信息 + XhpcChargingPile pileInfo = XhpcChargingPileRepository.findBySerialNumber(pileNum).orElse(null); + String versionNum = null; + if (pileInfo != null) { + versionNum = pileInfo.getCommunicationProtocolVersion(); } + //给对应的枪发送停止充电指令 + R r = powerPileService.stopCharging(xhOrderNo, pileNum, connectorId, versionNum); + // 判断停止指令发送是否成功 + if (r.getCode() != 200) { + //充电订单状态 + 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 = null; + try { + data = JSONUtil.toJSONString(queryStopChargeResponse); + } catch (JsonProcessingException e) { + e.printStackTrace(); + System.out.println("json转换出问题了"); + } + CommonResponse commonResponse = new CommonResponse(); + commonResponse.setRet("0"); + commonResponse.setMsg("请求停止充电失败"); + commonResponse.setData(data); + } + + //设置该订单已经被停止的标识 + Map order = REDIS.getCacheMap("order:" + xhOrderNo); + order.replace("status", "已结束"); + REDIS.setCacheMap("order:" + xhOrderNo, order); + HashMap pushOrder = new HashMap<>(16); + pushOrder.put("stopCommandSent", true); + REDIS.setCacheMap("pushOrder:".concat(xhOrderNo), pushOrder); + + //充电订单状态 + queryStopChargeResponse.setStartChargeSeqStat(3); + //操作结果 + queryStopChargeResponse.setSuccStat(0); + //失败原因 + queryStopChargeResponse.setFailReason(0); + + //转换为json对象 + String data = null; + try { + data = JSONUtil.toJSONString(queryStopChargeResponse); + } catch (JsonProcessingException e) { + e.printStackTrace(); + System.out.println("json转换出问题了"); + } + + CommonResponse commonResponse = new CommonResponse(); + commonResponse.setRet("0"); + commonResponse.setMsg("请求停止充电成功"); + commonResponse.setData(data); + + return commonResponse; } } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/XhpcChargingPileRepository.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/XhpcChargingPileRepository.java index 40abb93f..0761b194 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/XhpcChargingPileRepository.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/XhpcChargingPileRepository.java @@ -6,8 +6,18 @@ 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 XhpcChargingPileRepository extends JpaRepository, QueryByExampleExecutor, JpaSpecificationExecutor { + /** + * 通过桩的序列号来查询查询指定的桩的信息 + * + * @param pileNum 桩的序列号 + * @return 返回一条桩数据 + */ + Optional findBySerialNumber(String pileNum); + } 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 a7ac1b0b..b1e91c7a 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 @@ -13,7 +13,6 @@ 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; @@ -31,7 +30,17 @@ public class NotificationStopChargeResultTask extends CoreDispatcher { notifyService3(); } - + /** + * 获取充电订单号 + * 获取充电订单状态 + * 获取充电设备接口编码 + * 获取成功标识 + * 获取停止失败原因 + * 推送过去 + *

+ * 出现异常逻辑 + * 如果当充电桩因为异常停止充电时,那么谁告诉我订单是个异常订单? + */ public void notifyService3() throws JsonProcessingException { //获取Redis中的所有订单状态数据 @@ -62,186 +71,23 @@ public class NotificationStopChargeResultTask extends CoreDispatcher { // 获取指定的订单的数据 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) { //使用指定包装类封装数据 + int succStat = 0; + int failReason = 0; 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); - } - } - - /** - * 获取充电订单号 - * 获取充电订单状态 - * 获取充电设备接口编码 - * 获取成功标识 - * 获取停止失败原因 - * 推送过去 - *

- * 出现异常逻辑 - * 如果当充电桩因为异常停止充电时,那么谁告诉我订单是个异常订单? - */ - public void notifyService() { - - List authSecretTokenOutList = authSecretTokenRepository.findBySecretTokenType(SECRET_TOKEN_TYPE_OUT); - for (AuthSecretToken authSecretTokenOut : authSecretTokenOutList) { - //20秒检测一次Redis中的数据状态,并推送 - - //获取Redis中的所有订单状态数据 - List orderStatusDataList = REDIS.getCacheList("orderStatusData:*"); - - //使用for循环遍历所有订单状态数据找到已结束的充电订单 - for (int i = 0; i < orderStatusDataList.size() - 1; i++) { - - //获取订单数据 - Map orderStatusData = (Map) orderStatusDataList.get(i); - //判断该订单数据是否已经被推送过了,如果已经推送过了,则不在推送 - Boolean isPush = (Boolean) orderStatusData.get("isPush"); - if (!isPush) { - //获取内部的充电订单号 - 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(4); - 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", authSecretTokenOut, "MA6DFCTD5"); - - //设置该订单数据已经被推送的标识符 - orderStatusData.put("isPush", true); - String statusDataNum = (String) orderStatusData.get("statusDataNum"); - REDIS.setCacheMap("orderStatusData:" + statusDataNum, orderStatusData); - } - - // TODO:如果充电状态为停止中: + String jsonData = JSONUtil.toJSONString(chargeResultRequest); + chargeResultRequestCommonRequest.setData(jsonData); + String result = ok(chargeResultRequestCommonRequest, "/notification_stop_charge_result", authSecretTokenOut, operatorId3rdpty); } } } - - } - - //第二种更快的逻辑 -// 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:如果充电状态为停止中: -// -// -// } -// -// -// } - -} +} \ No newline at end of file