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 fe9422887..f34dd4580 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 @@ -10,14 +10,15 @@ import com.jsowell.common.enums.thirdparty.ThirdPlatformTypeEnum; import com.jsowell.common.util.DateUtils; import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.id.IdUtils; -import com.jsowell.pile.domain.PileBasicInfo; -import com.jsowell.pile.domain.PileConnectorInfo; -import com.jsowell.pile.domain.ThirdPartyPlatformConfig; -import com.jsowell.pile.domain.ThirdPartySettingInfo; +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.service.*; +import com.jsowell.pile.vo.base.ThirdPartyStationRelationVO; import com.jsowell.pile.vo.huawei.QueryEquipAuthVO; +import com.jsowell.pile.vo.uniapp.BillingPriceVO; import com.jsowell.pile.vo.web.PileStationVO; import com.jsowell.thirdparty.lianlian.common.CommonResult; import com.jsowell.thirdparty.lianlian.domain.ConnectorStatusInfo; @@ -27,13 +28,17 @@ import com.jsowell.thirdparty.lianlian.util.Cryptos; import com.jsowell.thirdparty.lianlian.util.Encodes; import com.jsowell.thirdparty.lianlian.util.GBSignUtils; import com.jsowell.thirdparty.lianlian.util.HttpRequestUtil; +import com.jsowell.thirdparty.zhongdianlian.dto.ZDLGetTokenDTO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; /** @@ -61,6 +66,12 @@ public class HuaweiServiceV2 { @Autowired private ThirdPartyPlatformConfigService thirdPartyPlatformConfigService; + @Autowired + private PileBillingTemplateService pileBillingTemplateService; + + @Autowired + private ThirdPartyStationRelationService thirdPartyStationRelationService; + @Autowired private RedisCache redisCache; @@ -258,6 +269,11 @@ public class HuaweiServiceV2 { } + /** + * 请求设备认证 + * @param connectorId + * @return + */ public QueryEquipAuthVO queryEquipAuth(String connectorId) { ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo(); if (settingInfo == null) { @@ -303,6 +319,178 @@ public class HuaweiServiceV2 { return queryEquipAuthVO; } + + /** + * 请求计费策略 + * @param dto + * @return + */ + public Map requestEquipBusinessPolicy(QueryStartChargeDTO dto) { + String pileConnectorCode = dto.getConnectorID(); + String equipBizSeq = dto.getEquipBizSeq(); + // 根据枪口号查询计费模板,并返回信息 + ThirdPartyPlatformConfig configInfo = thirdPartyPlatformConfigService.getInfoByOperatorId(dto.getOperatorId()); + if (configInfo == null) { + return null; + } + // 截取桩号 + String pileSn = StringUtils.substring(pileConnectorCode, 0, 14); + // 查询该桩的站点id + PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(pileSn); + // 根据桩号查询正在使用的计费模板 + List billingPriceVOList = pileBillingTemplateService.queryBillingPrice(String.valueOf(pileBasicInfo.getStationId())); + + JSONObject resultJson = new JSONObject(); + resultJson.put("EquipBizSeq", equipBizSeq); + resultJson.put("ConnectorID", pileConnectorCode); + if (CollectionUtils.isEmpty(billingPriceVOList)) { + // 为空说明未查到该枪口的计费模板 + resultJson.put("SuccStat", 1); + resultJson.put("FailReason", 1); + }else { + // 延时 500ms,异步调用 下发计费策略 接口 + CompletableFuture.runAsync(() -> { + try { + Thread.sleep(500); + } catch (Exception e) { + e.printStackTrace(); + } + String result = deliverEquipBusinessPolicy(equipBizSeq, pileConnectorCode); + log.info("华为 异步调用 下发计费策略 接口 result:{}", result); + }); + + resultJson.put("SuccStat", 0); + resultJson.put("FailReason", 0); + } + // 加密 + Map resultMap = Maps.newLinkedHashMap(); + // 加密数据 + byte[] encryptText = Cryptos.aesEncrypt(resultJson.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); + + return resultMap; + } + + + /** + * 下发计费策略 + * @param equipBizSeq 策略下发流水号 + * @param pileConnectorCode 枪口号 + * @return + */ + public String deliverEquipBusinessPolicy(String equipBizSeq, String pileConnectorCode) { + DeliverEquipBusinessDTO params = new DeliverEquipBusinessDTO(); + + // 充电业务策略信息 + List chargePolicyInfos = new ArrayList<>(); + DeliverEquipBusinessDTO.ChargePolicyInfo chargePolicyInfo = new DeliverEquipBusinessDTO.ChargePolicyInfo(); + + // 业务策略信息体 + List pricePolicyInfos = new ArrayList<>(); + DeliverEquipBusinessDTO.ChargePolicyInfo.PricePolicyInfo pricePolicyInfo = new DeliverEquipBusinessDTO.ChargePolicyInfo.PricePolicyInfo(); + + // 计费信息 + List policyInfoList = new ArrayList<>(); + DeliverEquipBusinessDTO.ChargePolicyInfo.PricePolicyInfo.PolicyInfo policyInfo = null; + + // 截取桩号 + String pileSn = StringUtils.substring(pileConnectorCode, 0, 14); + // 查询该桩的站点id + PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(pileSn); + String stationId = String.valueOf(pileBasicInfo.getStationId()); + + // 获取运营商组织结构代码 + // MerchantInfoVO merchantInfoVO = pileMerchantInfoService.getMerchantInfoVO(String.valueOf(pileBasicInfo.getMerchantId())); + // String organizationCode = merchantInfoVO.getOrganizationCode(); + + // 通过站点id查询相关配置信息 + // ThirdPartyStationRelation relation = new ThirdPartyStationRelation(); + // relation.setStationId(Long.parseLong(stationId)); + // ThirdPartyStationRelationVO relationInfo = thirdPartyStationRelationService.selectRelationInfo(relation); + // if (relationInfo == null) { + // return null; + // } + + // 通过站点id查询相关配置信息 换成如下方法 + ThirdPartySettingInfo settingInfo = getHuaWeiSettingInfo(); + + // 根据站点id查询正在使用的计费模板 + List billingPriceVOList = pileBillingTemplateService.queryBillingPrice(stationId); + if (CollectionUtils.isEmpty(billingPriceVOList)) { + return null; + } + for (BillingPriceVO billingPriceVO : billingPriceVOList) { + // 将时段开始时间、电费、服务费信息进行封装 + policyInfo = new DeliverEquipBusinessDTO.ChargePolicyInfo.PricePolicyInfo.PolicyInfo(); + String startTime = billingPriceVO.getStartTime() + ":00"; // 00:00:00 格式 + // 需要将中间的冒号去掉,改为 000000 格式 + String replace = StringUtils.replace(startTime, ":", ""); + policyInfo.setStartTime(replace); + policyInfo.setElecPrice(new BigDecimal(billingPriceVO.getElectricityPrice()).setScale(4, RoundingMode.DOWN)); + policyInfo.setSevicePrice(new BigDecimal(billingPriceVO.getServicePrice()).setScale(4, RoundingMode.DOWN)); + + policyInfoList.add(policyInfo); + } + + BillingPriceVO billingPriceVO = billingPriceVOList.get(0); + // String equipmentOwnerId = ""; + // if (StringUtils.isNotBlank(organizationCode) && organizationCode.length() == 18) { + // equipmentOwnerId = StringUtils.substring(organizationCode, organizationCode.length() - 10, organizationCode.length() - 1); + // }else { + // equipmentOwnerId = Constants.OPERATORID_JIANG_SU; + // } + + // 封装参数 + pricePolicyInfo.setEquipBizID(Constants.OPERATORID_JIANG_SU + billingPriceVO.getTemplateCode()); // 计费策略ID + pricePolicyInfo.setValidStat(1); // 执行状态 + pricePolicyInfo.setValidStartTime(billingPriceVO.getPublishTime()); // 生效时间 + pricePolicyInfo.setValidEndTime("2099-12-31 23:59:59"); // 失效时间 + pricePolicyInfo.setSumPeriod(policyInfoList.size()); // 时段数 + pricePolicyInfo.setPolicyInfos(policyInfoList); + + pricePolicyInfos.add(pricePolicyInfo); + + chargePolicyInfo.setConnectorID(pileConnectorCode); + chargePolicyInfo.setPricePolicyInfos(pricePolicyInfos); + + chargePolicyInfos.add(chargePolicyInfo); + + params.setEquipBizSeq(equipBizSeq); + params.setSumChargePolicyInfos(pricePolicyInfos.size()); + params.setChargePolicyInfos(chargePolicyInfos); + + 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; + } + + /** * 获取华为配置信息 * @return