ChargingBusinessServiceImpl.java 9.9 KB

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