ChargingBusinessServiceImpl.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package com.zsElectric.boot.charging.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import com.fasterxml.jackson.core.JsonProcessingException;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import com.fasterxml.jackson.databind.JsonNode;
  6. import com.zsElectric.boot.charging.dto.StartChargingRequestDTO;
  7. import com.zsElectric.boot.charging.dto.StartChargingResponseVO;
  8. import com.zsElectric.boot.charging.service.ChargingBusinessService;
  9. import com.zsElectric.boot.charging.vo.*;
  10. import com.zsElectric.boot.common.constant.ConnectivityConstants;
  11. import com.zsElectric.boot.common.util.AESCryptoUtils;
  12. import com.zsElectric.boot.common.util.HmacMD5Util;
  13. import com.zsElectric.boot.common.util.SequenceGenUtil;
  14. import com.zsElectric.boot.common.util.electric.*;
  15. import lombok.RequiredArgsConstructor;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.springframework.stereotype.Service;
  18. import java.time.LocalDateTime;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.Objects;
  23. @Slf4j
  24. @Service
  25. @RequiredArgsConstructor
  26. public class ChargingBusinessServiceImpl implements ChargingBusinessService {
  27. private final ChargingUtil chargingUtil;
  28. private final ObjectMapper objectMapper = new ObjectMapper();
  29. @Override
  30. public ApiToken queryToken() {
  31. try {
  32. QueryTokenParms queryTokenParms = new QueryTokenParms();
  33. queryTokenParms
  34. .setOperatorID(ConnectivityConstants.OPERATOR_ID)
  35. .setOperatorSecret(ConnectivityConstants.PLATFORM_OPERATOR_SECRET);
  36. JsonNode response = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_TOKEN, BeanUtil.beanToMap(queryTokenParms), false);
  37. ResponseParmsEntity responseParms = objectMapper.readValue(response.toString(), ResponseParmsEntity.class);
  38. String data = responseParms.getRet() + responseParms.getMsg() + responseParms.getData();
  39. boolean verify = HmacMD5Util.verify(data, ConnectivityConstants.PLATFORM_SIG_SECRET, responseParms.getSig());
  40. if (!verify) {
  41. log.error("第三方接口响应数据签名验证失败");
  42. return null;
  43. }
  44. if (responseParms.getRet() != 0) {
  45. switch (responseParms.getRet()) {
  46. case -1:
  47. throw new RuntimeException("系统繁忙,此时请求方稍后重试");
  48. case 4001:
  49. throw new RuntimeException("签名错误");
  50. case 4002:
  51. throw new RuntimeException("Token错误");
  52. case 4003:
  53. throw new RuntimeException("参数不合法,缺少必需的示例:OperatorID、Sig、TimeStamp、Data、Seq五个参数");
  54. case 4004:
  55. throw new RuntimeException("请求的业务参数不合法,各接口定义自己的必须参数");
  56. case 500:
  57. throw new RuntimeException("系统错误");
  58. }
  59. }
  60. String decodeData = AESCryptoUtils.decrypt(responseParms.getData(), ConnectivityConstants.PLATFORM_DATA_SECRET,
  61. ConnectivityConstants.PLATFORM_DATA_SECRET_IV);
  62. QueryTokenResponseData responseData = objectMapper.readValue(decodeData, QueryTokenResponseData.class);
  63. if (responseData.getSuccStat() == 1) {
  64. //0-无,1-OperatorID无效
  65. String failReason = "";
  66. if (responseData.getFailReason() == 0) {
  67. failReason = "无";
  68. }
  69. if (responseData.getFailReason() == 1) {
  70. failReason = "OperatorID无效";
  71. }
  72. log.error("调用第三方接口获取Token失败,失败原因: {}", failReason);
  73. return null;
  74. }
  75. ApiToken apiToken = new ApiToken();
  76. apiToken.setAccessToken(responseData.getAccessToken());
  77. apiToken.setTokenAvailableTime(responseData.getTokenAvailableTime());
  78. apiToken.setObtainTime(LocalDateTime.now());
  79. apiToken.setExpireTime(apiToken.getObtainTime().plusSeconds(apiToken.getTokenAvailableTime()));
  80. return apiToken;
  81. } catch (Exception e) {
  82. throw new RuntimeException("调用第三方接口失败", e);
  83. }
  84. }
  85. @Override
  86. public ChargingPricePolicyVO queryEquipBusinessPolicy(String equipBizSeq, String connectorID) throws JsonProcessingException {
  87. Map<String, Object> queryTokenParms = new HashMap<>();
  88. // 注意:第三方接口要求大驼峰命名
  89. queryTokenParms.put("EquipBizSeq", equipBizSeq);
  90. queryTokenParms.put("ConnectorID", connectorID);
  91. log.info("查询设备价格策略请求参数:{}", queryTokenParms);
  92. JsonNode jsonObject = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_EQUIP_BUSINESS_POLICY, queryTokenParms, true);
  93. log.info("查询设备价格策略返回结果:{}", jsonObject);
  94. JsonNode responseDecode = chargingUtil.responseDecode(jsonObject);
  95. log.info("查询设备价格策略返回结果解密后:{}", responseDecode);
  96. return objectMapper.readValue(responseDecode.toString(), ChargingPricePolicyVO.class);
  97. }
  98. @Override
  99. public EquipmentAuthResponseVO queryEquipAuth(String EquipAuthSeq, String ConnectorID) throws JsonProcessingException {
  100. Map<String, Object> queryTokenParms = new HashMap<>();
  101. queryTokenParms.put("EquipAuthSeq", EquipAuthSeq);
  102. queryTokenParms.put("ConnectorID", ConnectorID);
  103. log.info("查询设备认证请求参数:{}", queryTokenParms);
  104. JsonNode jsonObject = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_EQUIP_AUTH, queryTokenParms, true);
  105. log.info("查询设备认证返回结果:{}", jsonObject);
  106. JsonNode responseDecode = chargingUtil.responseDecode(jsonObject);
  107. log.info("查询设备认证返回结果解密后:{}", responseDecode);
  108. return objectMapper.readValue(responseDecode.toString(), EquipmentAuthResponseVO.class);
  109. }
  110. @Override
  111. public QueryStationsInfoVO queryStationsInfo(String LastQueryTime, Integer PageNo, Integer PageSize) throws JsonProcessingException {
  112. Map<String, Object> queryParms = new HashMap<>();
  113. queryParms.put("LastQueryTime", LastQueryTime);
  114. queryParms.put("PageNo", PageNo);
  115. queryParms.put("PageSize", PageSize);
  116. log.info("查询充电站信息请求参数:{}", queryParms);
  117. JsonNode jsonObject = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_STATIONS_INFO, queryParms, true);
  118. log.info("查询充电站信息返回结果:{}", jsonObject);
  119. JsonNode responseDecode = chargingUtil.responseDecode(jsonObject);
  120. log.info("查询充电站信息返回结果解密后:{}", responseDecode);
  121. if (responseDecode == null) {
  122. return null;
  123. }
  124. return objectMapper.readValue(responseDecode.toString(), QueryStationsInfoVO.class);
  125. }
  126. @Override
  127. public QueryStationStatusVO queryStationStatus(List<String> stationIDs) throws JsonProcessingException {
  128. Map<String, Object> queryParms = new HashMap<>();
  129. queryParms.put("StationIDs", stationIDs);
  130. log.info("设备接口状态查询请求参数:{}", queryParms);
  131. JsonNode jsonObject = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_STATION_STATUS, queryParms, true);
  132. log.info("设备接口状态查询返回结果:{}", jsonObject);
  133. JsonNode responseDecode = chargingUtil.responseDecode(jsonObject);
  134. log.info("设备接口状态查询返回结果解密后:{}", responseDecode);
  135. return objectMapper.readValue(responseDecode.toString(), QueryStationStatusVO.class);
  136. }
  137. @Override
  138. public StartChargingResponseVO startCharging(StartChargingRequestDTO requestDTO) throws JsonProcessingException {
  139. Map<String, Object> stringObjectMap = BeanUtil.beanToMap(requestDTO);
  140. log.info("设备接口状态查询请求参数:{}", stringObjectMap);
  141. JsonNode jsonObject = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_START_CHARGE, stringObjectMap, true);
  142. log.info("设备接口状态查询返回结果:{}", jsonObject);
  143. JsonNode responseDecode = chargingUtil.responseDecode(jsonObject);
  144. log.info("设备接口状态查询返回结果解密后:{}", responseDecode);
  145. return objectMapper.readValue(responseDecode.toString(), StartChargingResponseVO.class);
  146. }
  147. @Override
  148. public ChargingStatusQueryResponseVO queryChargingStatus(String StartChargeSeq) throws JsonProcessingException {
  149. Map<String, Object> queryParms = new HashMap<>();
  150. queryParms.put("StartChargeSeq", StartChargeSeq);
  151. log.info("查询充电订单状态请求参数:{}", queryParms);
  152. JsonNode jsonObject = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_EQUIP_CHARGE_STATUS, queryParms, true);
  153. log.info("查询充电订单状态返回结果:{}", jsonObject);
  154. JsonNode responseDecode = chargingUtil.responseDecode(jsonObject);
  155. log.info("查询充电订单状态返回结果解密后:{}", responseDecode);
  156. return objectMapper.readValue(responseDecode.toString(), ChargingStatusQueryResponseVO.class);
  157. }
  158. @Override
  159. public StopChargingOperationResponseVO stopCharging(String StartChargeSeq, String ConnectorID) throws JsonProcessingException {
  160. Map<String, Object> queryTokenParms = new HashMap<>();
  161. queryTokenParms.put("StartChargeSeq", StartChargeSeq);
  162. queryTokenParms.put("ConnectorID", ConnectorID);
  163. log.info("停止充电请求参数:{}", queryTokenParms);
  164. JsonNode jsonObject = chargingUtil.chargingRequest(ConnectivityConstants.TEST_DOMAIN + ConnectivityConstants.QUERY_STOP_CHARGE, queryTokenParms, true);
  165. log.info("停止充电返回结果:{}", jsonObject);
  166. JsonNode responseDecode = chargingUtil.responseDecode(jsonObject);
  167. log.info("停止充电返回结果解密后:{}", responseDecode);
  168. return objectMapper.readValue(responseDecode.toString(), StopChargingOperationResponseVO.class);
  169. }
  170. }