update 重构华为Service

This commit is contained in:
Lemon
2024-01-27 15:25:39 +08:00
parent 10ea307cf7
commit bf7e2a4ad9
5 changed files with 326 additions and 205 deletions

View File

@@ -16,6 +16,7 @@ public enum ThirdPartyOperatorIdEnum {
NING_XIA_JIAO_TOU("5", "MA771QENX"), NING_XIA_JIAO_TOU("5", "MA771QENX"),
XIN_DIAN_TU("6", "MA25CNM38"), XIN_DIAN_TU("6", "MA25CNM38"),
HAI_NAN("7", "578725200"), HAI_NAN("7", "578725200"),
HUA_WEI("8", "");
; ;
private String type; private String type;

View File

@@ -0,0 +1,15 @@
package com.jsowell.pile.dto.huawei;
import com.jsowell.pile.vo.huawei.QueryChargeStatusVO;
import lombok.Data;
/**
* 接收华为所推送的设备充电状态DTO
*
* @author Lemon
* @Date 2024/1/27 10:23:53
*/
@Data
public class ReceiveEquipChargeStatusDTO extends QueryChargeStatusVO {
}

View File

@@ -0,0 +1,23 @@
package com.jsowell.pile.vo.huawei;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 下发计费模板VO
*
* @author Lemon
* @Date 2024/1/27 15:12:18
*/
@Data
public class DeliverEquipBusinessPolicyVO {
@JsonProperty(value = "EquipBizSeq")
private String equipBizSeq;
@JsonProperty(value = "SuccStat")
private Integer succStat;
@JsonProperty(value = "FailReason")
private Integer failReason;
}

View File

@@ -3,10 +3,11 @@ package com.jsowell.pile.vo.huawei;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal;
import java.util.List; import java.util.List;
/** /**
* TODO * 华为 查询充电状态VO
* *
* @author Lemon * @author Lemon
* @Date 2024/1/26 16:29:29 * @Date 2024/1/26 16:29:29
@@ -15,115 +16,138 @@ import java.util.List;
public class QueryChargeStatusVO { public class QueryChargeStatusVO {
/** /**
* * 充电订单号
*/ */
@JsonProperty(value = "StartChargeSeq") @JsonProperty(value = "StartChargeSeq")
private String startChargeSeq; private String startChargeSeq;
/** /**
* * 充电订单状态
* 1启动中
* 2充电中
* 3停止中
* 4已结束
* 5未知
*/ */
@JsonProperty(value = "StartChargeSeqStat") @JsonProperty(value = "StartChargeSeqStat")
private String startChargeSeqStat; private Integer startChargeSeqStat;
/** /**
* * 充电设备接口编码
*/ */
@JsonProperty(value = "ConnectorID") @JsonProperty(value = "ConnectorID")
private String connectorID; private String connectorID;
/** /**
* * 充电设备接口状态
* 0离网
* 1空闲
* 2占用未充电
* 3占用充电中
* 4占用预约锁定
* 255充电枪故障
* 21501设备升级中
* 21502充电启动中
* 21503设备禁用
*/ */
@JsonProperty(value = "ConnectorStatus") @JsonProperty(value = "ConnectorStatus")
private String connectorStatus; private Integer connectorStatus;
/** /**
* * A相电流
* 单位A默认0 含直流(输出)
*/ */
@JsonProperty(value = "CurrentA") @JsonProperty(value = "CurrentA")
private String currentA; private BigDecimal currentA;
/** /**
* * B相电流
*/ */
@JsonProperty(value = "CurrentB") @JsonProperty(value = "CurrentB")
private String currentB; private BigDecimal currentB;
/** /**
* * C相电流
*/ */
@JsonProperty(value = "CurrentC") @JsonProperty(value = "CurrentC")
private String currentC; private BigDecimal currentC;
/** /**
* * A相电压
*/ */
@JsonProperty(value = "VoltageA") @JsonProperty(value = "VoltageA")
private String voltageA; private BigDecimal voltageA;
/** /**
* * B相电压
*/ */
@JsonProperty(value = "VoltageB") @JsonProperty(value = "VoltageB")
private String voltageB; private BigDecimal voltageB;
/** /**
* * C相电压
*/ */
@JsonProperty(value = "VoltageC") @JsonProperty(value = "VoltageC")
private String voltageC; private BigDecimal voltageC;
/** /**
* * 电池剩余电量
*/ */
@JsonProperty(value = "Soc") @JsonProperty(value = "Soc")
private String soc; private BigDecimal soc;
/** /**
* * 开始充电时间
* 格式“yyyy-MM-dd HH:mm:ss”
*/ */
@JsonProperty(value = "StartTime") @JsonProperty(value = "StartTime")
private String startTime; private String startTime;
/** /**
* * 本次采样时间
* 格式“yyyy-MM-dd HH:mm:ss”
*/ */
@JsonProperty(value = "EndTime") @JsonProperty(value = "EndTime")
private String endTime; private String endTime;
/** /**
* * 累计充电量
* 单位小数点后4位。
*/ */
@JsonProperty(value = "TotalPower") @JsonProperty(value = "TotalPower")
private String totalPower; private BigDecimal totalPower;
/** /**
* * 累计电费
* 单位小数点后4位。
*/ */
@JsonProperty(value = "ElecMoney") @JsonProperty(value = "ElecMoney")
private String elecMoney; private BigDecimal elecMoney;
/** /**
* * 累计服务费
* 单位小数点后4位。
*/ */
@JsonProperty(value = "SeviceMoney") @JsonProperty(value = "SeviceMoney")
private String seviceMoney; private BigDecimal seviceMoney;
/** /**
* * 累计总金额
* 单位小数点后4位。
*/ */
@JsonProperty(value = "TotalMoney") @JsonProperty(value = "TotalMoney")
private String totalMoney; private BigDecimal totalMoney;
/** /**
* * 时段数N
* 范围048
*/ */
@JsonProperty(value = "SumPeriod") @JsonProperty(value = "SumPeriod")
private String sumPeriod; private Integer sumPeriod;
/** /**
* * 充电明细信息
* 单时段充电明细信息
*/ */
@JsonProperty(value = "ChargeDetails") @JsonProperty(value = "ChargeDetails")
private List<ChargeDetail> chargeDetails; private List<ChargeDetail> chargeDetails;
@@ -132,42 +156,52 @@ public class QueryChargeStatusVO {
@Data @Data
public static class ChargeDetail{ public static class ChargeDetail{
/** /**
* * 开始时间
* 格式“yyyy-MM-dd HH:mm:ss”
*/ */
@JsonProperty(value = "DetailStartTime") @JsonProperty(value = "DetailStartTime")
private String detailStartTime; private String detailStartTime;
/** /**
* * 结束时间
* 格式“yyyy-MM-dd HH:mm:ss”
*/ */
@JsonProperty(value = "DetailEndTime") @JsonProperty(value = "DetailEndTime")
private String detailEndTime; private String detailEndTime;
/** /**
* * 时段电价
* 小数点后4位。
*/ */
@JsonProperty(value = "ElecPrice") @JsonProperty(value = "ElecPrice")
private String elecPrice; private BigDecimal elecPrice;
/** /**
* * 时段服务费价格
* 小数点后4位。
*/ */
@JsonProperty(value = "SevicePrice") @JsonProperty(value = "SevicePrice")
private String sevicePrice; private BigDecimal sevicePrice;
/** /**
* * 时段充电量
* 单位小数点后4位。
*/ */
@JsonProperty(value = "DetailPower") @JsonProperty(value = "DetailPower")
private String detailPower; private BigDecimal detailPower;
/** /**
* * 时段电费
* 小数点后4位
*/ */
@JsonProperty(value = "DetailElecMoney") @JsonProperty(value = "DetailElecMoney")
private String detailElecMoney; private BigDecimal detailElecMoney;
/**
* 时段服务费
* 小数点后4位
*/
@JsonProperty(value = "DetailSeviceMoney") @JsonProperty(value = "DetailSeviceMoney")
private String detailSeviceMoney; private BigDecimal detailSeviceMoney;
} }
} }

View File

@@ -1,11 +1,14 @@
package com.jsowell.thirdparty.huawei; package com.jsowell.thirdparty.huawei;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.jsowell.common.constant.Constants; import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.domain.ykc.RealTimeMonitorData;
import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.core.redis.RedisCache;
import com.jsowell.common.enums.thirdparty.ThirdPartyOperatorIdEnum;
import com.jsowell.common.enums.thirdparty.ThirdPlatformTypeEnum; import com.jsowell.common.enums.thirdparty.ThirdPlatformTypeEnum;
import com.jsowell.common.enums.thirdparty.huawei.StartFailedReasonEnum; import com.jsowell.common.enums.thirdparty.huawei.StartFailedReasonEnum;
import com.jsowell.common.enums.ykc.OrderStatusEnum; import com.jsowell.common.enums.ykc.OrderStatusEnum;
@@ -18,11 +21,10 @@ import com.jsowell.pile.domain.*;
import com.jsowell.pile.domain.huawei.HWStationInfo; import com.jsowell.pile.domain.huawei.HWStationInfo;
import com.jsowell.pile.dto.PushStationInfoDTO; import com.jsowell.pile.dto.PushStationInfoDTO;
import com.jsowell.pile.dto.QueryStartChargeDTO; import com.jsowell.pile.dto.QueryStartChargeDTO;
import com.jsowell.pile.dto.huawei.DeliverEquipBusinessDTO; import com.jsowell.pile.dto.huawei.*;
import com.jsowell.pile.dto.huawei.HWQueryStartChargeDTO;
import com.jsowell.pile.dto.huawei.ReceiveStartChargeResultDTO;
import com.jsowell.pile.dto.huawei.RequestEquipBusinessPolicyDTO;
import com.jsowell.pile.service.*; import com.jsowell.pile.service.*;
import com.jsowell.pile.vo.huawei.DeliverEquipBusinessPolicyVO;
import com.jsowell.pile.vo.huawei.QueryChargeStatusVO;
import com.jsowell.pile.vo.huawei.QueryEquipAuthVO; import com.jsowell.pile.vo.huawei.QueryEquipAuthVO;
import com.jsowell.pile.vo.huawei.QueryStartChargeVO; import com.jsowell.pile.vo.huawei.QueryStartChargeVO;
import com.jsowell.pile.vo.uniapp.BillingPriceVO; import com.jsowell.pile.vo.uniapp.BillingPriceVO;
@@ -118,8 +120,18 @@ public class HuaweiServiceV2 {
dataSecret.getBytes(), dataSecretIv.getBytes()); dataSecret.getBytes(), dataSecretIv.getBytes());
String strData = Encodes.encodeBase64(encryptText); String strData = Encodes.encodeBase64(encryptText);
Map<String, String> request = new LinkedHashMap<>();
request.put("OperatorID", Constants.OPERATORID_JIANG_SU);
request.put("Data", strData);
request.put("TimeStamp", DateUtils.parseDateToStr(DateUtils.YYYYMMDDHHMMSS, new Date()));
request.put("Seq", "0001");
// 生成签名
String sig = GBSignUtils.sign(request, signSecret);
request.put("Sig", sig);
String tokenRequest = JSONObject.toJSONString(request);
// 向华为发送请求 // 向华为发送请求
String response = sendRequest2HuaWei(strData, signSecret, requestUrl); String response = HttpUtil.post(requestUrl, tokenRequest);
CommonResult<?> commonResult = JSONObject.parseObject(response, CommonResult.class); CommonResult<?> commonResult = JSONObject.parseObject(response, CommonResult.class);
if (commonResult.getRet() != 0) { if (commonResult.getRet() != 0) {
@@ -202,42 +214,22 @@ public class HuaweiServiceV2 {
* @return * @return
*/ */
public List<StationStatusInfo> queryStationStatus(List<String> stationIds) { public List<StationStatusInfo> queryStationStatus(List<String> stationIds) {
ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo(); String requestName = "query_station_status";
if (settingInfo == null) {
return null;
}
String operatorSecret = settingInfo.getOperatorSecret();
String dataSecret = settingInfo.getDataSecret();
String dataSecretIv = settingInfo.getDataSecretIv();
String signSecret = settingInfo.getSignSecret();
String urlAddress = settingInfo.getUrlAddress();
String requestUrl = urlAddress + "query_station_status";
// 拼装参数 // 拼装参数
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("StationIDs", stationIds); jsonObject.put("StationIDs", stationIds);
String jsonString = jsonObject.toJSONString();
// 加密
byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8),
dataSecret.getBytes(), dataSecretIv.getBytes());
String strData = Encodes.encodeBase64(encryptText);
// 向华为发送请求 // 向华为发送请求
String response = sendRequest2HuaWei(strData, signSecret, requestUrl); // 获取令牌
String token = getHuaWeiToken();
CommonResult<?> commonResult = JSONObject.parseObject(response, CommonResult.class); // 发送请求
if (commonResult.getRet() != 0) { String result = sendMsg2HuaWei(jsonString, token, requestName);
log.error("查询华为设备接口状态 error:{}, ", commonResult.getMsg()); if (result == null) {
return new ArrayList<>(); return new ArrayList<>();
} }
// 解密data
byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64((String) commonResult.getData()),
dataSecret.getBytes(), dataSecretIv.getBytes());
String dataStr = new String(plainText, StandardCharsets.UTF_8);
// 转换成 StationStatus 对象 // 转换成 StationStatus 对象
List<StationStatusInfo> list = JSON.parseArray(dataStr, StationStatusInfo.class); List<StationStatusInfo> list = JSON.parseArray(result, StationStatusInfo.class);
return list; return list;
} }
@@ -261,18 +253,8 @@ public class HuaweiServiceV2 {
// 构造返回参数 // 构造返回参数
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("Status", 0); jsonObject.put("Status", 0);
// 加密
Map<String, String> resultMap = Maps.newLinkedHashMap();
// 加密数据
byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(),
configInfo.getDataSecret().getBytes(), configInfo.getDataSecretIv().getBytes());
String encryptData = Encodes.encodeBase64(encryptText);
resultMap.put("Data", encryptData);
// 生成sig
String resultSign = GBSignUtils.sign(resultMap, configInfo.getSignSecret());
resultMap.put("Sig", resultSign);
Map<String, String> resultMap = getResultMap(jsonObject);
return resultMap; return resultMap;
} }
@@ -283,17 +265,7 @@ public class HuaweiServiceV2 {
* @return * @return
*/ */
public QueryEquipAuthVO queryEquipAuth(String connectorId) { public QueryEquipAuthVO queryEquipAuth(String connectorId) {
ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo(); String requestName = "query_equip_auth";
if (settingInfo == null) {
return null;
}
String operatorSecret = settingInfo.getOperatorSecret();
String dataSecret = settingInfo.getDataSecret();
String dataSecretIv = settingInfo.getDataSecretIv();
String signSecret = settingInfo.getSignSecret();
String urlAddress = settingInfo.getUrlAddress();
String requestUrl = urlAddress + "query_equip_auth";
// 生成设备认证流水号格式“运营商ID + 唯一编号”(<=27字符) // 生成设备认证流水号格式“运营商ID + 唯一编号”(<=27字符)
// 生成唯一编号(用时间戳表示) // 生成唯一编号(用时间戳表示)
@@ -304,26 +276,18 @@ public class HuaweiServiceV2 {
jsonObject.put("EquipAuthSeq", equipAuthSeq); jsonObject.put("EquipAuthSeq", equipAuthSeq);
jsonObject.put("ConnectorID", connectorId); jsonObject.put("ConnectorID", connectorId);
// 加密 String jsonString = jsonObject.toJSONString();
byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8),
dataSecret.getBytes(), dataSecretIv.getBytes());
String strData = Encodes.encodeBase64(encryptText);
// 向华为发送请求 // 向华为发送请求
String response = sendRequest2HuaWei(strData, signSecret, requestUrl); // 获取令牌
String token = getHuaWeiToken();
CommonResult<?> commonResult = JSONObject.parseObject(response, CommonResult.class); // 发送请求
if (commonResult.getRet() != 0) { String result = sendMsg2HuaWei(jsonString, token, requestName);
log.error("查询华为设备接口状态 error:{}, ", commonResult.getMsg()); if (result == null) {
return null; return null;
} }
// 解密data
byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64((String) commonResult.getData()),
dataSecret.getBytes(), dataSecretIv.getBytes());
String dataStr = new String(plainText, StandardCharsets.UTF_8);
// 转换成 StationStatus 对象 // 转换成 StationStatus 对象
QueryEquipAuthVO queryEquipAuthVO = JSON.parseObject(dataStr, QueryEquipAuthVO.class); QueryEquipAuthVO queryEquipAuthVO = JSON.parseObject(result, QueryEquipAuthVO.class);
return queryEquipAuthVO; return queryEquipAuthVO;
} }
@@ -363,8 +327,8 @@ public class HuaweiServiceV2 {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
String result = deliverEquipBusinessPolicy(equipBizSeq, pileConnectorCode); DeliverEquipBusinessPolicyVO vo = deliverEquipBusinessPolicy(equipBizSeq, pileConnectorCode);
log.info("华为 异步调用 下发计费策略 接口 result:{}", result); log.info("华为 异步调用 下发计费策略 接口 result:{}", JSONObject.toJSONString(vo));
}); });
resultJson.put("SuccStat", 0); resultJson.put("SuccStat", 0);
@@ -392,7 +356,8 @@ public class HuaweiServiceV2 {
* @param pileConnectorCode 枪口号 * @param pileConnectorCode 枪口号
* @return * @return
*/ */
public String deliverEquipBusinessPolicy(String equipBizSeq, String pileConnectorCode) { public DeliverEquipBusinessPolicyVO deliverEquipBusinessPolicy(String equipBizSeq, String pileConnectorCode) {
String requestName = "deliver_equip_business_policy";
DeliverEquipBusinessDTO params = new DeliverEquipBusinessDTO(); DeliverEquipBusinessDTO params = new DeliverEquipBusinessDTO();
// 充电业务策略信息 // 充电业务策略信息
@@ -431,9 +396,6 @@ public class HuaweiServiceV2 {
// return null; // return null;
// } // }
// 通过站点id查询相关配置信息 换成如下方法
ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo();
// 根据站点id查询正在使用的计费模板 // 根据站点id查询正在使用的计费模板
List<BillingPriceVO> billingPriceVOList = pileBillingTemplateService.queryBillingPrice(stationId); List<BillingPriceVO> billingPriceVOList = pileBillingTemplateService.queryBillingPrice(stationId);
if (CollectionUtils.isEmpty(billingPriceVOList)) { if (CollectionUtils.isEmpty(billingPriceVOList)) {
@@ -481,21 +443,17 @@ public class HuaweiServiceV2 {
String jsonString = JSONObject.toJSONString(params); String jsonString = JSONObject.toJSONString(params);
// 获取请求参数 // 向华为发送请求
String operatorId = Constants.OPERATORID_JIANG_SU;
String operatorSecret = settingInfo.getOperatorSecret();
String signSecret = settingInfo.getSignSecret();
String dataSecret = settingInfo.getDataSecret();
String dataSecretIv = settingInfo.getDataSecretIv();
String urlAddress = settingInfo.getUrlAddress();
String url = urlAddress + "deliver_equip_business_policy";
// 获取令牌 // 获取令牌
String token = getHuaWeiToken(); String token = getHuaWeiToken();
// 发送请求 // 发送请求
String result = HttpRequestUtil.sendPost(token, jsonString, url, dataSecret, dataSecretIv, operatorId, signSecret); String result = sendMsg2HuaWei(jsonString, token, requestName);
return result; if (result == null) {
return null;
}
// 转换成 DeliverEquipBusinessPolicyVO 对象
DeliverEquipBusinessPolicyVO vo = JSON.parseObject(result, DeliverEquipBusinessPolicyVO.class);
return vo;
} }
/** /**
@@ -507,18 +465,8 @@ public class HuaweiServiceV2 {
public QueryStartChargeVO queryStartCharge(HWQueryStartChargeDTO dto) { public QueryStartChargeVO queryStartCharge(HWQueryStartChargeDTO dto) {
String pileConnectorCode = dto.getConnectorID(); String pileConnectorCode = dto.getConnectorID();
BigDecimal chargeAmount = dto.getMoneyLimit(); BigDecimal chargeAmount = dto.getMoneyLimit();
// 获取华为配置参数
ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo();
if (settingInfo == null) {
return null;
}
String operatorSecret = settingInfo.getOperatorSecret();
String dataSecret = settingInfo.getDataSecret();
String dataSecretIv = settingInfo.getDataSecretIv();
String signSecret = settingInfo.getSignSecret();
String urlAddress = settingInfo.getUrlAddress();
String requestUrl = urlAddress + "query_start_charge"; String requestName = "query_start_charge";
// 生成订单 // 生成订单
String orderCode = IdUtils.getOrderCode(); String orderCode = IdUtils.getOrderCode();
@@ -540,26 +488,18 @@ public class HuaweiServiceV2 {
jsonObject.put("ConnectorID", pileConnectorCode); jsonObject.put("ConnectorID", pileConnectorCode);
jsonObject.put("MoneyLimit", chargeAmount); jsonObject.put("MoneyLimit", chargeAmount);
// 加密 String jsonString = jsonObject.toJSONString();
byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8),
dataSecret.getBytes(), dataSecretIv.getBytes());
String strData = Encodes.encodeBase64(encryptText);
// 向华为发送请求 // 向华为发送请求
String response = sendRequest2HuaWei(strData, signSecret, requestUrl); // 获取令牌
String token = getHuaWeiToken();
CommonResult<?> commonResult = JSONObject.parseObject(response, CommonResult.class); // 发送请求
if (commonResult.getRet() != 0) { String result = sendMsg2HuaWei(jsonString, token, requestName);
log.error("解析华为请求启动充电接口result error:{}, ", commonResult.getMsg()); if (result == null) {
return null; return null;
} }
// 解密data
byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64((String) commonResult.getData()),
dataSecret.getBytes(), dataSecretIv.getBytes());
String dataStr = new String(plainText, StandardCharsets.UTF_8);
// 转换成 QueryStartChargeVO 对象 // 转换成 QueryStartChargeVO 对象
QueryStartChargeVO vo = JSON.parseObject(dataStr, QueryStartChargeVO.class); QueryStartChargeVO vo = JSON.parseObject(result, QueryStartChargeVO.class);
return vo; return vo;
} }
@@ -567,7 +507,7 @@ public class HuaweiServiceV2 {
/** /**
* 接收启动充电结果 * 接收启动充电结果
*/ */
public void receiveStartChargeResult(ReceiveStartChargeResultDTO dto) { public Map<String, String> receiveStartChargeResult(ReceiveStartChargeResultDTO dto) {
String startChargeSeq = dto.getStartChargeSeq(); String startChargeSeq = dto.getStartChargeSeq();
Integer startChargeSeqStat = dto.getStartChargeSeqStat(); // 充电订单状态 Integer startChargeSeqStat = dto.getStartChargeSeqStat(); // 充电订单状态
Integer failReason = dto.getFailReason(); Integer failReason = dto.getFailReason();
@@ -588,50 +528,102 @@ public class HuaweiServiceV2 {
// 给用户退款(执行0x33中启动失败的操作流程) // 给用户退款(执行0x33中启动失败的操作流程)
orderBasicInfoService.chargingPileFailedToStart(orderBasicInfo.getTransactionCode(), reason); orderBasicInfoService.chargingPileFailedToStart(orderBasicInfo.getTransactionCode(), reason);
} }
// 构建返回参数
JSONObject jsonObject = new JSONObject();
jsonObject.put("StartChargeSeq", startChargeSeq);
jsonObject.put("SuccStat", 0);
jsonObject.put("FailReason", 0);
Map<String, String> resultMap = getResultMap(jsonObject);
return resultMap;
} }
/** /**
* 查询充电状态 * 查询充电状态
* @param startChargeSeq * @param startChargeSeq 订单号
*/ */
public void queryChargeStatus(String startChargeSeq) { public QueryChargeStatusVO queryChargeStatus(String startChargeSeq) {
ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo(); String requestName = "query_equip_auth";
if (settingInfo == null) {
return;
}
String operatorSecret = settingInfo.getOperatorSecret();
String dataSecret = settingInfo.getDataSecret();
String dataSecretIv = settingInfo.getDataSecretIv();
String signSecret = settingInfo.getSignSecret();
String urlAddress = settingInfo.getUrlAddress();
String requestUrl = urlAddress + "query_equip_auth";
// 拼装参数 // 拼装参数
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("StartChargeSeq", startChargeSeq); jsonObject.put("StartChargeSeq", startChargeSeq);
// 加密 String jsonString = jsonObject.toJSONString();
byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8),
dataSecret.getBytes(), dataSecretIv.getBytes());
String strData = Encodes.encodeBase64(encryptText);
// 向华为发送请求 // 向华为发送请求
String response = sendRequest2HuaWei(strData, signSecret, requestUrl); // 获取令牌
String token = getHuaWeiToken();
// 发送请求
String result = sendMsg2HuaWei(jsonString, token, requestName);
if (result == null) {
return null;
}
// 转换成 QueryChargeStatusVO 对象
QueryChargeStatusVO vo = JSON.parseObject(result, QueryChargeStatusVO.class);
return vo;
CommonResult<?> commonResult = JSONObject.parseObject(response, CommonResult.class); }
if (commonResult.getRet() != 0) {
log.error("解析查询华为充电状态接口result error:{}, ", commonResult.getMsg()); /**
* 接收华为所推送的设备充电状态
* @param dto
*/
public Map<String, String> receiveEquipChargeStatus(ReceiveEquipChargeStatusDTO dto) {
String startChargeSeq = dto.getStartChargeSeq(); // 订单号
String startTime = dto.getStartTime();
String endTime = dto.getEndTime();
// 计算时间间隔
String poorDays = DateUtils.getDatePoor(DateUtils.parseDate(endTime), DateUtils.parseDate(startTime));
// 通过订单号查询交易流水号
OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(startChargeSeq);
if (orderBasicInfo == null) {
return null;
}
// 将源数据存储至缓存
String redisKey = "HUA_WEI_ORDER_INFO_BY_ORDER_CODE:" + startChargeSeq;
String jsonMsg = JSONObject.toJSONString(dto);
// 在同一分钟内,只保留最后一条实时数据
redisCache.hset(redisKey, DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:00", new Date()), jsonMsg);
// 封装成实时数据对象
RealTimeMonitorData data = RealTimeMonitorData.builder()
.transactionCode(orderBasicInfo.getTransactionCode())
.pileSn(orderBasicInfo.getPileSn())
.connectorCode(orderBasicInfo.getConnectorCode())
.connectorStatus(String.valueOf(dto.getConnectorStatus()))
.pileConnectorCode(orderBasicInfo.getPileConnectorCode())
.outputVoltage(String.valueOf(dto.getVoltageA()))
.outputCurrent(String.valueOf(dto.getCurrentA()))
.SOC(String.valueOf(dto.getSoc()))
.sumChargingTime(poorDays)
.chargingDegree(String.valueOf(dto.getTotalPower()))
.chargingAmount(String.valueOf(dto.getTotalMoney()))
.build();
// 将实时数据信息保存至缓存
pileBasicInfoService.saveRealTimeMonitorData2Redis(data);
// 构建返回参数
JSONObject jsonObject = new JSONObject();
jsonObject.put("StartChargeSeq", startChargeSeq);
jsonObject.put("SuccStat", 0);
Map<String, String> resultMap = getResultMap(jsonObject);
return resultMap;
}
public void queryStopCharge(String startChargeSeq) {
// 通过订单号查询订单信息
OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(startChargeSeq);
if(orderBasicInfo == null) {
return; return;
} }
// 解密data JSONObject jsonObject = new JSONObject();
byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64((String) commonResult.getData()), jsonObject.put("StartChargeSeq", startChargeSeq);
dataSecret.getBytes(), dataSecretIv.getBytes()); jsonObject.put("ConnectorID", orderBasicInfo.getPileConnectorCode());
String dataStr = new String(plainText, StandardCharsets.UTF_8);
// 转换成对应的对象
} }
@@ -650,26 +642,82 @@ public class HuaweiServiceV2 {
/** /**
* 向华为发送请求 * 向华为发送请求
* @param strData 加密后的Data * @param jsonString 封装好的json请求参数
* @param signSecret 签名密钥 * @param token 从华为平台请求到的令牌
* @param requestUrl 请求url * @param requestName 请求接口名称
* @return 请求结果 * @return 请求结果
*/ */
private String sendRequest2HuaWei(String strData, String signSecret, String requestUrl) { private String sendMsg2HuaWei(String jsonString, String token, String requestName) {
Map<String, String> request = new LinkedHashMap<>(); ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo();
request.put("OperatorID", Constants.OPERATORID_JIANG_SU); if (settingInfo == null) {
request.put("Data", strData); return null;
request.put("TimeStamp", DateUtils.parseDateToStr(DateUtils.YYYYMMDDHHMMSS, new Date())); }
request.put("Seq", "0001"); //加密
// 生成签名 byte[] encryptText = Cryptos.aesEncrypt(jsonString.getBytes(),
String sig = GBSignUtils.sign(request, signSecret); settingInfo.getDataSecret().getBytes(), settingInfo.getDataSecretIv().getBytes());
request.put("Sig", sig); String encryptData = Encodes.encodeBase64(encryptText);
String tokenRequest = JSONObject.toJSONString(request); Map<String, String> params = Maps.newLinkedHashMap();
String response = HttpUtil.post(requestUrl, tokenRequest); params.put("OperatorID", settingInfo.getOperatorId());
return response; params.put("Data", encryptData);
params.put("TimeStamp", DateUtils.parseDateToStr(DateUtils.YYYYMMDDHHMMSS, new Date()));
params.put("Seq", "001");
String sign = GBSignUtils.sign(params, settingInfo.getSignSecret());
params.put("Sig", sign);
String postData = JSON.toJSONString(params);
// 请求url
String requestUrl = settingInfo.getUrlAddress() + requestName;
String hutoolRequest = HttpRequest.post(requestUrl)
.header("Authorization", "Bearer " + token)
.body(postData).execute().body();
log.info("华为发送请求 接收到返回数据:{}", hutoolRequest);
if (StringUtils.isBlank(hutoolRequest)) {
return null;
}
Map<String, Object> map = (Map<String, Object>) JSON.parse(hutoolRequest);
int ret = (int) map.get("Ret");
String resultMsg = (String) map.get("Msg");
if (ret != 0) {
// 表示请求有异常
log.error("华为发送请求 error:{}, 源数据:{}", resultMsg, jsonString);
return null;
}
String rData = (String) map.get("Data");
// 解密
byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(rData),
settingInfo.getDataSecret().getBytes(), settingInfo.getDataSecretIv().getBytes());
String plainData = new String(plainText, StandardCharsets.UTF_8);
return plainData;
} }
/**
* 将需要发送至华为的返回参数加密返回
* @param jsonObject
* @return
*/
private Map<String, String> getResultMap(JSONObject jsonObject) {
String operatorId = ThirdPartyOperatorIdEnum.HUA_WEI.getOperatorId();
ThirdPartyPlatformConfig platformConfig = thirdPartyPlatformConfigService.getInfoByOperatorId(operatorId);
if (platformConfig == null) {
return null;
}
Map<String, String> resultMap = Maps.newLinkedHashMap();
// 加密数据
byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(),
platformConfig.getDataSecret().getBytes(), platformConfig.getDataSecretIv().getBytes());
String encryptData = Encodes.encodeBase64(encryptText);
resultMap.put("Data", encryptData);
// 生成sig
String resultSign = GBSignUtils.sign(resultMap, platformConfig.getSignSecret());
resultMap.put("Sig", resultSign);
return resultMap;
}
/** /**
* 获取桩列表 * 获取桩列表