diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/thirdparty/ThirdPartyOperatorIdEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/thirdparty/ThirdPartyOperatorIdEnum.java index a11367c99..9c2e9bdb1 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/thirdparty/ThirdPartyOperatorIdEnum.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/thirdparty/ThirdPartyOperatorIdEnum.java @@ -16,6 +16,7 @@ public enum ThirdPartyOperatorIdEnum { NING_XIA_JIAO_TOU("5", "MA771QENX"), XIN_DIAN_TU("6", "MA25CNM38"), HAI_NAN("7", "578725200"), + HUA_WEI("8", ""); ; private String type; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/huawei/ReceiveEquipChargeStatusDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/huawei/ReceiveEquipChargeStatusDTO.java new file mode 100644 index 000000000..508bec45f --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/huawei/ReceiveEquipChargeStatusDTO.java @@ -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 { + +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/huawei/DeliverEquipBusinessPolicyVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/huawei/DeliverEquipBusinessPolicyVO.java new file mode 100644 index 000000000..c1bccef15 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/huawei/DeliverEquipBusinessPolicyVO.java @@ -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; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/huawei/QueryChargeStatusVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/huawei/QueryChargeStatusVO.java index 2797fbf2a..e56b109e7 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/vo/huawei/QueryChargeStatusVO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/huawei/QueryChargeStatusVO.java @@ -3,10 +3,11 @@ package com.jsowell.pile.vo.huawei; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; +import java.math.BigDecimal; import java.util.List; /** - * TODO + * 华为 查询充电状态VO * * @author Lemon * @Date 2024/1/26 16:29:29 @@ -15,115 +16,138 @@ import java.util.List; public class QueryChargeStatusVO { /** - * + * 充电订单号 */ @JsonProperty(value = "StartChargeSeq") private String startChargeSeq; /** - * + * 充电订单状态 + * 1:启动中 + * 2:充电中 + * 3:停止中 + * 4:已结束 + * 5:未知 */ @JsonProperty(value = "StartChargeSeqStat") - private String startChargeSeqStat; + private Integer startChargeSeqStat; /** - * + * 充电设备接口编码 */ @JsonProperty(value = "ConnectorID") private String connectorID; /** - * + * 充电设备接口状态 + * 0:离网 + * 1:空闲 + * 2:占用(未充电) + * 3:占用(充电中) + * 4:占用(预约锁定) + * 255:充电枪故障 + * 21501:设备升级中 + * 21502:充电启动中 + * 21503:设备禁用 */ @JsonProperty(value = "ConnectorStatus") - private String connectorStatus; + private Integer connectorStatus; /** - * + * A相电流 + * 单位:A,默认:0 含直流(输出) */ @JsonProperty(value = "CurrentA") - private String currentA; + private BigDecimal currentA; /** - * + * B相电流 */ @JsonProperty(value = "CurrentB") - private String currentB; + private BigDecimal currentB; /** - * + * C相电流 */ @JsonProperty(value = "CurrentC") - private String currentC; + private BigDecimal currentC; /** - * + * A相电压 */ @JsonProperty(value = "VoltageA") - private String voltageA; + private BigDecimal voltageA; /** - * + * B相电压 */ @JsonProperty(value = "VoltageB") - private String voltageB; + private BigDecimal voltageB; /** - * + * C相电压 */ @JsonProperty(value = "VoltageC") - private String voltageC; + private BigDecimal voltageC; /** - * + * 电池剩余电量 */ @JsonProperty(value = "Soc") - private String soc; + private BigDecimal soc; /** - * + * 开始充电时间 + * 格式“yyyy-MM-dd HH:mm:ss” */ @JsonProperty(value = "StartTime") private String startTime; /** - * + * 本次采样时间 + * 格式“yyyy-MM-dd HH:mm:ss” */ @JsonProperty(value = "EndTime") private String endTime; /** - * + * 累计充电量 + * 单位:度,小数点后4位。 */ @JsonProperty(value = "TotalPower") - private String totalPower; + private BigDecimal totalPower; /** - * + * 累计电费 + * 单位:元,小数点后4位。 */ @JsonProperty(value = "ElecMoney") - private String elecMoney; + private BigDecimal elecMoney; /** - * + * 累计服务费 + * 单位:元,小数点后4位。 */ @JsonProperty(value = "SeviceMoney") - private String seviceMoney; + private BigDecimal seviceMoney; /** - * + * 累计总金额 + * 单位:元,小数点后4位。 */ @JsonProperty(value = "TotalMoney") - private String totalMoney; + private BigDecimal totalMoney; /** - * + * 时段数N + * 范围:0~48 */ @JsonProperty(value = "SumPeriod") - private String sumPeriod; + private Integer sumPeriod; /** - * + * 充电明细信息 + * 单时段充电明细信息 */ @JsonProperty(value = "ChargeDetails") private List chargeDetails; @@ -132,42 +156,52 @@ public class QueryChargeStatusVO { @Data public static class ChargeDetail{ /** - * + * 开始时间 + * 格式“yyyy-MM-dd HH:mm:ss” */ @JsonProperty(value = "DetailStartTime") private String detailStartTime; /** - * + * 结束时间 + * 格式“yyyy-MM-dd HH:mm:ss” */ @JsonProperty(value = "DetailEndTime") private String detailEndTime; /** - * + * 时段电价 + * 小数点后4位。 */ @JsonProperty(value = "ElecPrice") - private String elecPrice; + private BigDecimal elecPrice; /** - * + * 时段服务费价格 + * 小数点后4位。 */ @JsonProperty(value = "SevicePrice") - private String sevicePrice; + private BigDecimal sevicePrice; /** - * + * 时段充电量 + * 单位:度,小数点后4位。 */ @JsonProperty(value = "DetailPower") - private String detailPower; + private BigDecimal detailPower; /** - * + * 时段电费 + * 小数点后4位 */ @JsonProperty(value = "DetailElecMoney") - private String detailElecMoney; + private BigDecimal detailElecMoney; + /** + * 时段服务费 + * 小数点后4位 + */ @JsonProperty(value = "DetailSeviceMoney") - private String detailSeviceMoney; + private BigDecimal detailSeviceMoney; } } diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java index 615108ec2..eb205f920 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/huawei/HuaweiServiceV2.java @@ -1,11 +1,14 @@ package com.jsowell.thirdparty.huawei; +import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.google.common.collect.Maps; 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.enums.thirdparty.ThirdPartyOperatorIdEnum; import com.jsowell.common.enums.thirdparty.ThirdPlatformTypeEnum; import com.jsowell.common.enums.thirdparty.huawei.StartFailedReasonEnum; 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.dto.PushStationInfoDTO; import com.jsowell.pile.dto.QueryStartChargeDTO; -import com.jsowell.pile.dto.huawei.DeliverEquipBusinessDTO; -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.dto.huawei.*; 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.QueryStartChargeVO; import com.jsowell.pile.vo.uniapp.BillingPriceVO; @@ -118,8 +120,18 @@ public class HuaweiServiceV2 { dataSecret.getBytes(), dataSecretIv.getBytes()); String strData = Encodes.encodeBase64(encryptText); + Map 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); if (commonResult.getRet() != 0) { @@ -202,42 +214,22 @@ public class HuaweiServiceV2 { * @return */ public List queryStationStatus(List stationIds) { - 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_station_status"; + String requestName = "query_station_status"; // 拼装参数 JSONObject jsonObject = new JSONObject(); jsonObject.put("StationIDs", stationIds); - - // 加密 - byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8), - dataSecret.getBytes(), dataSecretIv.getBytes()); - String strData = Encodes.encodeBase64(encryptText); - + String jsonString = jsonObject.toJSONString(); // 向华为发送请求 - String response = sendRequest2HuaWei(strData, signSecret, requestUrl); - - CommonResult commonResult = JSONObject.parseObject(response, CommonResult.class); - if (commonResult.getRet() != 0) { - log.error("查询华为设备接口状态 error:{}, ", commonResult.getMsg()); + // 获取令牌 + String token = getHuaWeiToken(); + // 发送请求 + String result = sendMsg2HuaWei(jsonString, token, requestName); + if (result == null) { 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 对象 - List list = JSON.parseArray(dataStr, StationStatusInfo.class); + List list = JSON.parseArray(result, StationStatusInfo.class); return list; } @@ -261,18 +253,8 @@ public class HuaweiServiceV2 { // 构造返回参数 JSONObject jsonObject = new JSONObject(); jsonObject.put("Status", 0); - // 加密 - Map 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 resultMap = getResultMap(jsonObject); return resultMap; } @@ -283,17 +265,7 @@ public class HuaweiServiceV2 { * @return */ public QueryEquipAuthVO queryEquipAuth(String connectorId) { - 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_equip_auth"; + String requestName = "query_equip_auth"; // 生成设备认证流水号(格式“运营商ID + 唯一编号”(<=27字符)) // 生成唯一编号(用时间戳表示) @@ -304,26 +276,18 @@ public class HuaweiServiceV2 { jsonObject.put("EquipAuthSeq", equipAuthSeq); jsonObject.put("ConnectorID", connectorId); - // 加密 - byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8), - dataSecret.getBytes(), dataSecretIv.getBytes()); - String strData = Encodes.encodeBase64(encryptText); - + String jsonString = jsonObject.toJSONString(); // 向华为发送请求 - String response = sendRequest2HuaWei(strData, signSecret, requestUrl); - - CommonResult commonResult = JSONObject.parseObject(response, CommonResult.class); - if (commonResult.getRet() != 0) { - log.error("查询华为设备接口状态 error:{}, ", commonResult.getMsg()); + // 获取令牌 + String token = getHuaWeiToken(); + // 发送请求 + String result = sendMsg2HuaWei(jsonString, token, requestName); + if (result == 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 对象 - QueryEquipAuthVO queryEquipAuthVO = JSON.parseObject(dataStr, QueryEquipAuthVO.class); + QueryEquipAuthVO queryEquipAuthVO = JSON.parseObject(result, QueryEquipAuthVO.class); return queryEquipAuthVO; } @@ -363,8 +327,8 @@ public class HuaweiServiceV2 { } catch (Exception e) { e.printStackTrace(); } - String result = deliverEquipBusinessPolicy(equipBizSeq, pileConnectorCode); - log.info("华为 异步调用 下发计费策略 接口 result:{}", result); + DeliverEquipBusinessPolicyVO vo = deliverEquipBusinessPolicy(equipBizSeq, pileConnectorCode); + log.info("华为 异步调用 下发计费策略 接口 result:{}", JSONObject.toJSONString(vo)); }); resultJson.put("SuccStat", 0); @@ -392,7 +356,8 @@ public class HuaweiServiceV2 { * @param pileConnectorCode 枪口号 * @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(); // 充电业务策略信息 @@ -431,9 +396,6 @@ public class HuaweiServiceV2 { // return null; // } - // 通过站点id查询相关配置信息 换成如下方法 - ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo(); - // 根据站点id查询正在使用的计费模板 List billingPriceVOList = pileBillingTemplateService.queryBillingPrice(stationId); if (CollectionUtils.isEmpty(billingPriceVOList)) { @@ -481,21 +443,17 @@ public class HuaweiServiceV2 { 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 result = HttpRequestUtil.sendPost(token, jsonString, url, dataSecret, dataSecretIv, operatorId, signSecret); - return result; + String result = sendMsg2HuaWei(jsonString, token, requestName); + 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) { String pileConnectorCode = dto.getConnectorID(); 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(); @@ -540,26 +488,18 @@ public class HuaweiServiceV2 { jsonObject.put("ConnectorID", pileConnectorCode); jsonObject.put("MoneyLimit", chargeAmount); - // 加密 - byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8), - dataSecret.getBytes(), dataSecretIv.getBytes()); - String strData = Encodes.encodeBase64(encryptText); - + String jsonString = jsonObject.toJSONString(); // 向华为发送请求 - String response = sendRequest2HuaWei(strData, signSecret, requestUrl); - - CommonResult commonResult = JSONObject.parseObject(response, CommonResult.class); - if (commonResult.getRet() != 0) { - log.error("解析华为请求启动充电接口result error:{}, ", commonResult.getMsg()); + // 获取令牌 + String token = getHuaWeiToken(); + // 发送请求 + String result = sendMsg2HuaWei(jsonString, token, requestName); + if (result == 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 vo = JSON.parseObject(dataStr, QueryStartChargeVO.class); + QueryStartChargeVO vo = JSON.parseObject(result, QueryStartChargeVO.class); return vo; } @@ -567,7 +507,7 @@ public class HuaweiServiceV2 { /** * 接收启动充电结果 */ - public void receiveStartChargeResult(ReceiveStartChargeResultDTO dto) { + public Map receiveStartChargeResult(ReceiveStartChargeResultDTO dto) { String startChargeSeq = dto.getStartChargeSeq(); Integer startChargeSeqStat = dto.getStartChargeSeqStat(); // 充电订单状态 Integer failReason = dto.getFailReason(); @@ -588,50 +528,102 @@ public class HuaweiServiceV2 { // 给用户退款(执行0x33中启动失败的操作流程) orderBasicInfoService.chargingPileFailedToStart(orderBasicInfo.getTransactionCode(), reason); } + + // 构建返回参数 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("StartChargeSeq", startChargeSeq); + jsonObject.put("SuccStat", 0); + jsonObject.put("FailReason", 0); + + Map resultMap = getResultMap(jsonObject); + return resultMap; } /** * 查询充电状态 - * @param startChargeSeq + * @param startChargeSeq 订单号 */ - public void queryChargeStatus(String startChargeSeq) { - ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo(); - 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"; + public QueryChargeStatusVO queryChargeStatus(String startChargeSeq) { + String requestName = "query_equip_auth"; // 拼装参数 JSONObject jsonObject = new JSONObject(); jsonObject.put("StartChargeSeq", startChargeSeq); - // 加密 - byte[] encryptText = Cryptos.aesEncrypt(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8), - dataSecret.getBytes(), dataSecretIv.getBytes()); - String strData = Encodes.encodeBase64(encryptText); - + String jsonString = jsonObject.toJSONString(); // 向华为发送请求 - 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 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 resultMap = getResultMap(jsonObject); + return resultMap; + } + + + public void queryStopCharge(String startChargeSeq) { + // 通过订单号查询订单信息 + OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(startChargeSeq); + if(orderBasicInfo == null) { return; } - // 解密data - byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64((String) commonResult.getData()), - dataSecret.getBytes(), dataSecretIv.getBytes()); - String dataStr = new String(plainText, StandardCharsets.UTF_8); - - // 转换成对应的对象 - - + JSONObject jsonObject = new JSONObject(); + jsonObject.put("StartChargeSeq", startChargeSeq); + jsonObject.put("ConnectorID", orderBasicInfo.getPileConnectorCode()); } @@ -650,26 +642,82 @@ public class HuaweiServiceV2 { /** * 向华为发送请求 - * @param strData 加密后的Data - * @param signSecret 签名密钥 - * @param requestUrl 请求url + * @param jsonString 封装好的json请求参数 + * @param token 从华为平台请求到的令牌 + * @param requestName 请求接口名称 * @return 请求结果 */ - private String sendRequest2HuaWei(String strData, String signSecret, String requestUrl) { - Map 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); + private String sendMsg2HuaWei(String jsonString, String token, String requestName) { + ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo(); + if (settingInfo == null) { + return null; + } + //加密 + byte[] encryptText = Cryptos.aesEncrypt(jsonString.getBytes(), + settingInfo.getDataSecret().getBytes(), settingInfo.getDataSecretIv().getBytes()); + String encryptData = Encodes.encodeBase64(encryptText); - String tokenRequest = JSONObject.toJSONString(request); - String response = HttpUtil.post(requestUrl, tokenRequest); - return response; + Map params = Maps.newLinkedHashMap(); + params.put("OperatorID", settingInfo.getOperatorId()); + 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 map = (Map) 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 getResultMap(JSONObject jsonObject) { + String operatorId = ThirdPartyOperatorIdEnum.HUA_WEI.getOperatorId(); + ThirdPartyPlatformConfig platformConfig = thirdPartyPlatformConfigService.getInfoByOperatorId(operatorId); + if (platformConfig == null) { + return null; + } + Map 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; + } /** * 获取桩列表