|
|
@@ -1,5 +1,6 @@
|
|
|
package com.zsElectric.boot.charging.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
import cn.hutool.core.util.ObjUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
@@ -20,6 +21,7 @@ import com.zsElectric.boot.charging.vo.QueryStationStatusVO;
|
|
|
import com.zsElectric.boot.common.constant.ConnectivityConstants;
|
|
|
import com.zsElectric.boot.common.constant.SystemConstants;
|
|
|
import com.zsElectric.boot.common.util.DateUtils;
|
|
|
+import com.zsElectric.boot.common.util.OkHttpUtil;
|
|
|
import com.zsElectric.boot.common.util.electric.ChargingUtil;
|
|
|
import com.zsElectric.boot.common.util.electric.RequestParmsEntity;
|
|
|
import com.zsElectric.boot.common.util.electric.ResponseParmsEntity;
|
|
|
@@ -30,6 +32,9 @@ import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.redisson.api.RLock;
|
|
|
import org.redisson.api.RedissonClient;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
@@ -41,6 +46,7 @@ import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
import java.util.function.Consumer;
|
|
|
|
|
|
@@ -68,6 +74,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
|
|
|
private final RedissonClient redissonClient;
|
|
|
private final UserAccountMapper userAccountMapper;
|
|
|
private final UserFirmMapper userFirmMapper;
|
|
|
+ private final FirmInfoMapper firmInfoMapper;
|
|
|
private final PolicyFeeMapper policyFeeMapper;
|
|
|
private final DictItemMapper dictItemMapper;
|
|
|
private final ThirdPartyEquipmentInfoMapper thirdPartyEquipmentInfoMapper;
|
|
|
@@ -75,7 +82,8 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
|
|
|
private final ThirdPartyStationInfoMapper thirdPartyStationInfoMapper;
|
|
|
private final ThirdPartyPolicyInfoMapper thirdPartyPolicyInfoMapper;
|
|
|
private final DiscountsActivityMapper discountsActivityMapper;
|
|
|
-
|
|
|
+ private final FirmAccountLogMapper firmAccountLogMapper;
|
|
|
+ private final OkHttpUtil okHttpUtil;
|
|
|
|
|
|
/**
|
|
|
* 熔断检查锁前缀
|
|
|
@@ -151,91 +159,134 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
|
|
|
ChargeOrderInfo chargeOrderInfo = chargeOrderInfoService.getOne(new LambdaQueryWrapper<ChargeOrderInfo>()
|
|
|
.eq(ChargeOrderInfo::getStartChargeSeq, startChargeSeq).last("LIMIT 1"));
|
|
|
|
|
|
- //推送订单明细
|
|
|
- chargeOrderInfo.setChargeDetails(jsonNode.toString());
|
|
|
-
|
|
|
- //优惠单价
|
|
|
- BigDecimal discountPrice = BigDecimal.ZERO;
|
|
|
-
|
|
|
- //判断当前订单是否为首单
|
|
|
- Long userId = chargeOrderInfo.getUserId();
|
|
|
- List<ChargeOrderInfo> list = chargeOrderInfoService.list(Wrappers.<ChargeOrderInfo>lambdaQuery().eq(ChargeOrderInfo::getUserId, userId).eq(ChargeOrderInfo::getStatus,
|
|
|
- SystemConstants.STATUS_THREE));
|
|
|
- if(ObjectUtil.isEmpty(list)){
|
|
|
- DiscountsActivity discountsActivity = discountsActivityMapper.selectOne(Wrappers.<DiscountsActivity>lambdaQuery()
|
|
|
- .eq(DiscountsActivity::getType, SystemConstants.STATUS_ONE)
|
|
|
- .eq(DiscountsActivity::getStatus, SystemConstants.STATUS_ONE)
|
|
|
- .last("LIMIT 1"));
|
|
|
- if(ObjectUtil.isNotEmpty(discountsActivity)){
|
|
|
- chargeOrderInfo.setDiscountInfoId(discountsActivity.getId());
|
|
|
- chargeOrderInfo.setDiscountDesc(discountsActivity.getActivityDesc());
|
|
|
- discountPrice = discountsActivity.getDiscount();
|
|
|
+ if (ObjectUtil.isNotEmpty(chargeOrderInfo)) {
|
|
|
+ if (Objects.equals(chargeOrderInfo.getOrderType(), SystemConstants.CHARGE_ORDER_TYPE_CHANNEL)) {
|
|
|
+ //订单信息渠道方推送
|
|
|
+ Map<String, Object> map = objectMapper.convertValue(jsonNode, Map.class);
|
|
|
+ map.put("chargeOrderNo", chargeOrderInfo.getChargeOrderNo());
|
|
|
+ FirmInfo firmInfo = firmInfoMapper.selectById(chargeOrderInfo.getFirmId());
|
|
|
+ if (ObjectUtil.isNotNull(firmInfo)) {
|
|
|
+ okHttpUtil.doPostForm(firmInfo.getChannelUrl() + "/notification_charge_order_info", map, null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //推送订单明细
|
|
|
+ chargeOrderInfo.setChargeDetails(jsonNode.toString());
|
|
|
+
|
|
|
+ //优惠单价
|
|
|
+ BigDecimal discountPrice = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ if (Objects.equals(chargeOrderInfo.getOrderType(), SystemConstants.CHARGE_ORDER_TYPE_PLATFORM)) {
|
|
|
+ //判断当前订单是否为首单
|
|
|
+ Long userId = chargeOrderInfo.getUserId();
|
|
|
+ List<ChargeOrderInfo> list = chargeOrderInfoService.list(Wrappers.<ChargeOrderInfo>lambdaQuery().eq(ChargeOrderInfo::getUserId, userId).eq(ChargeOrderInfo::getStatus,
|
|
|
+ SystemConstants.STATUS_THREE));
|
|
|
+ if (ObjectUtil.isEmpty(list)) {
|
|
|
+ DiscountsActivity discountsActivity = discountsActivityMapper.selectOne(Wrappers.<DiscountsActivity>lambdaQuery()
|
|
|
+ .eq(DiscountsActivity::getType, SystemConstants.STATUS_ONE)
|
|
|
+ .eq(DiscountsActivity::getStatus, SystemConstants.STATUS_ONE)
|
|
|
+ .last("LIMIT 1"));
|
|
|
+ if (ObjectUtil.isNotEmpty(discountsActivity)) {
|
|
|
+ chargeOrderInfo.setDiscountInfoId(discountsActivity.getId());
|
|
|
+ chargeOrderInfo.setDiscountDesc(discountsActivity.getActivityDesc());
|
|
|
+ discountPrice = discountsActivity.getDiscount();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- chargeOrderInfo.setStopReason(stopReason);
|
|
|
- chargeOrderInfo.setStartTime(startTime);
|
|
|
- chargeOrderInfo.setEndTime(endTime);
|
|
|
- chargeOrderInfo.setTotalCharge(new BigDecimal(totalPower));
|
|
|
-
|
|
|
- chargeOrderInfo.setThirdPartyTotalCost(new BigDecimal(totalMoney));
|
|
|
- chargeOrderInfo.setThirdPartyServerfee(new BigDecimal(totalSeviceMoney));
|
|
|
- chargeOrderInfo.setThirdPartyElecfee(new BigDecimal(totalElecMoney));
|
|
|
-
|
|
|
- ThirdPartyConnectorInfo thirdPartyConnectorInfo = connectorInfoMapper.selectOne(Wrappers.<ThirdPartyConnectorInfo>lambdaQuery()
|
|
|
- .eq(ThirdPartyConnectorInfo::getConnectorId, connectorID).last("LIMIT 1"));
|
|
|
- String stationId = thirdPartyConnectorInfo.getStationId();
|
|
|
- ThirdPartyStationInfo thirdPartyStationInfo = thirdPartyStationInfoMapper.selectOne(Wrappers.<ThirdPartyStationInfo>lambdaQuery()
|
|
|
- .eq(ThirdPartyStationInfo::getStationId, stationId).last("LIMIT 1"));
|
|
|
- if (ObjectUtil.isEmpty(thirdPartyConnectorInfo)) {
|
|
|
- log.error("thirdPartyConnectorInfo" +"为空===============================================");
|
|
|
- }
|
|
|
+ chargeOrderInfo.setStopReason(stopReason);
|
|
|
+ chargeOrderInfo.setStartTime(startTime);
|
|
|
+ chargeOrderInfo.setEndTime(endTime);
|
|
|
+ chargeOrderInfo.setTotalCharge(new BigDecimal(totalPower));
|
|
|
+
|
|
|
+ chargeOrderInfo.setThirdPartyTotalCost(new BigDecimal(totalMoney));
|
|
|
+ chargeOrderInfo.setThirdPartyServerfee(new BigDecimal(totalSeviceMoney));
|
|
|
+ chargeOrderInfo.setThirdPartyElecfee(new BigDecimal(totalElecMoney));
|
|
|
+
|
|
|
+ ThirdPartyConnectorInfo thirdPartyConnectorInfo = connectorInfoMapper.selectOne(Wrappers.<ThirdPartyConnectorInfo>lambdaQuery()
|
|
|
+ .eq(ThirdPartyConnectorInfo::getConnectorId, connectorID).last("LIMIT 1"));
|
|
|
+ String stationId = thirdPartyConnectorInfo.getStationId();
|
|
|
+ ThirdPartyStationInfo thirdPartyStationInfo = thirdPartyStationInfoMapper.selectOne(Wrappers.<ThirdPartyStationInfo>lambdaQuery()
|
|
|
+ .eq(ThirdPartyStationInfo::getStationId, stationId).last("LIMIT 1"));
|
|
|
+ if (ObjectUtil.isEmpty(thirdPartyConnectorInfo)) {
|
|
|
+ log.error("thirdPartyConnectorInfo" + "为空===============================================");
|
|
|
+ }
|
|
|
|
|
|
- //平台服务费
|
|
|
- BigDecimal serviceFee = BigDecimal.ZERO;
|
|
|
- //优惠金额
|
|
|
- BigDecimal discountFee = BigDecimal.ZERO;
|
|
|
- JsonNode chargeDetails = jsonNode.get("ChargeDetails");
|
|
|
- if (ObjectUtil.isNotEmpty(chargeDetails)) {
|
|
|
- for (JsonNode node : chargeDetails) {
|
|
|
- //提取字段值
|
|
|
- String itemFlag = node.get("ItemFlag").asText();
|
|
|
- node.get("DetailPower").asText();
|
|
|
- BigDecimal detailPower = new BigDecimal(node.get("DetailPower").asText());
|
|
|
- PolicyFee policyFee = policyFeeMapper.selectOne(Wrappers.<PolicyFee>lambdaQuery()
|
|
|
- .eq(PolicyFee::getStationInfoId, thirdPartyStationInfo.getId())
|
|
|
- .eq(PolicyFee::getPeriodFlag, Integer.parseInt(itemFlag))
|
|
|
- .last("LIMIT 1"));
|
|
|
- if (ObjectUtil.isNotEmpty(policyFee)) {
|
|
|
- BigDecimal opFee = policyFee.getOpFee();
|
|
|
- if(ObjectUtil.isNotEmpty(chargeOrderInfo.getDiscountInfoId())){
|
|
|
- opFee = opFee.subtract(discountPrice);
|
|
|
+ //平台服务费
|
|
|
+ BigDecimal serviceFee = BigDecimal.ZERO;
|
|
|
+ //优惠金额
|
|
|
+ BigDecimal discountFee = BigDecimal.ZERO;
|
|
|
+ JsonNode chargeDetails = jsonNode.get("ChargeDetails");
|
|
|
+ if (ObjectUtil.isNotEmpty(chargeDetails)) {
|
|
|
+ for (JsonNode node : chargeDetails) {
|
|
|
+ //提取字段值
|
|
|
+ String itemFlag = node.get("ItemFlag").asText();
|
|
|
+ node.get("DetailPower").asText();
|
|
|
+ BigDecimal detailPower = new BigDecimal(node.get("DetailPower").asText());
|
|
|
+ PolicyFee policyFee = policyFeeMapper.selectOne(Wrappers.<PolicyFee>lambdaQuery()
|
|
|
+ .eq(PolicyFee::getStationInfoId, thirdPartyStationInfo.getId())
|
|
|
+ .eq(PolicyFee::getPeriodFlag, Integer.parseInt(itemFlag))
|
|
|
+ .last("LIMIT 1"));
|
|
|
+ if (ObjectUtil.isNotEmpty(policyFee)) {
|
|
|
+ BigDecimal opFee = policyFee.getOpFee();
|
|
|
+ if (ObjectUtil.isNotEmpty(chargeOrderInfo.getDiscountInfoId())) {
|
|
|
+ opFee = opFee.subtract(discountPrice);
|
|
|
+ }
|
|
|
+ log.info("策略费用:{}", opFee);
|
|
|
+ serviceFee = serviceFee.add(opFee.multiply(detailPower));
|
|
|
+ discountFee = discountFee.add(discountPrice.multiply(detailPower));
|
|
|
}
|
|
|
- log.info("策略费用:{}",opFee);
|
|
|
- serviceFee = serviceFee.add(opFee.multiply(detailPower));
|
|
|
- discountFee = discountFee.add(discountPrice.multiply(detailPower));
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- log.info("计算后的平台服务费:{}", serviceFee);
|
|
|
- chargeOrderInfo.setDiscountMoney(discountFee);
|
|
|
- chargeOrderInfo.setRealServiceCost(serviceFee.setScale(2, RoundingMode.HALF_UP));
|
|
|
- //订单结算:平台实际收取金额 = 互联互通金额 + 中数电动金额(平台总服务费)
|
|
|
- chargeOrderInfo.setRealCost(chargeOrderInfo.getRealServiceCost().add(chargeOrderInfo.getThirdPartyTotalCost()));
|
|
|
+ log.info("计算后的平台服务费:{}", serviceFee);
|
|
|
+ if (chargeOrderInfo.getOrderType().equals(SystemConstants.CHARGE_ORDER_TYPE_PLATFORM)) {
|
|
|
+ chargeOrderInfo.setDiscountMoney(discountFee);
|
|
|
+ chargeOrderInfo.setRealServiceCost(serviceFee.setScale(2, RoundingMode.HALF_UP));
|
|
|
+ //订单结算:平台实际收取金额 = 互联互通金额 + 中数电动金额(平台总服务费)
|
|
|
+ chargeOrderInfo.setRealCost(chargeOrderInfo.getRealServiceCost().add(chargeOrderInfo.getThirdPartyTotalCost()));
|
|
|
|
|
|
- //订单状态->已完成
|
|
|
- chargeOrderInfo.setStatus(SystemConstants.STATUS_THREE);
|
|
|
+ //订单状态->已完成
|
|
|
+ chargeOrderInfo.setStatus(SystemConstants.STATUS_THREE);
|
|
|
|
|
|
- //计算充电时间
|
|
|
- chargeOrderInfo.setChargeTime(DateUtils.getDuration(chargeOrderInfo.getStartTime(), chargeOrderInfo.getEndTime()));
|
|
|
+ //计算充电时间
|
|
|
+ chargeOrderInfo.setChargeTime(DateUtils.getDuration(chargeOrderInfo.getStartTime(), chargeOrderInfo.getEndTime()));
|
|
|
|
|
|
- //修改订单
|
|
|
- chargeOrderInfoService.updateById(chargeOrderInfo);
|
|
|
+ //修改订单
|
|
|
+ chargeOrderInfoService.updateById(chargeOrderInfo);
|
|
|
|
|
|
- //账户余额扣减(积分增加)
|
|
|
- log.info("执行账户余额扣减(积分增加)");
|
|
|
- chargeOrderInfoService.orderSettlement(chargeOrderInfo.getId());
|
|
|
+ //账户余额扣减(积分增加)
|
|
|
+ log.info("执行账户余额扣减(积分增加)");
|
|
|
+ chargeOrderInfoService.orderSettlement(chargeOrderInfo.getId());
|
|
|
+ }
|
|
|
+ if (chargeOrderInfo.getOrderType().equals(SystemConstants.CHARGE_ORDER_TYPE_CHANNEL)) {
|
|
|
+ chargeOrderInfo.setRealServiceCost(BigDecimal.ZERO);
|
|
|
+ //订单结算:平台实际收取金额 = 互联互通金额 + 中数电动金额(平台总服务费)
|
|
|
+ chargeOrderInfo.setRealCost(chargeOrderInfo.getRealServiceCost().add(chargeOrderInfo.getThirdPartyTotalCost()));
|
|
|
+ //订单状态->已完成
|
|
|
+ chargeOrderInfo.setStatus(SystemConstants.STATUS_THREE);
|
|
|
+ //计算充电时间
|
|
|
+ chargeOrderInfo.setChargeTime(DateUtils.getDuration(chargeOrderInfo.getStartTime(), chargeOrderInfo.getEndTime()));
|
|
|
+ //修改订单
|
|
|
+ chargeOrderInfoService.updateById(chargeOrderInfo);
|
|
|
+ //渠道方账户余额扣减
|
|
|
+ BigDecimal cost = chargeOrderInfo.getRealCost();
|
|
|
+ FirmInfo firmInfo = firmInfoMapper.selectById(chargeOrderInfo.getFirmId());
|
|
|
+ FirmAccountLog accountLog = new FirmAccountLog();
|
|
|
+ accountLog.setFirmId(firmInfo.getId());
|
|
|
+ accountLog.setFirmType(firmInfo.getFirmType());
|
|
|
+ accountLog.setEventDesc("渠道方充电订单下账");
|
|
|
+ accountLog.setSerialNo(chargeOrderInfo.getChargeOrderNo());
|
|
|
+ accountLog.setIncomeType(2);
|
|
|
+ accountLog.setBeforeChange(firmInfo.getBalance());
|
|
|
+ accountLog.setAfterChange(firmInfo.getBalance().subtract(cost));
|
|
|
+ accountLog.setMoneyChange(cost);
|
|
|
+ firmAccountLogMapper.insert(accountLog);
|
|
|
+
|
|
|
+ // 渠道方账户余额修改
|
|
|
+ firmInfo.setBalance(firmInfo.getBalance().subtract(cost));
|
|
|
+ firmInfoMapper.updateById(firmInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
// 执行业务处理
|
|
|
businessHandler.accept(jsonNode);
|
|
|
@@ -277,6 +328,16 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
|
|
|
chargeOrderInfo.setStatus(SystemConstants.STATUS_ONE);
|
|
|
chargeOrderInfo.setStartTime(startTime);
|
|
|
chargeOrderInfoService.updateById(chargeOrderInfo);
|
|
|
+
|
|
|
+ // 推送渠道方启动充电结果
|
|
|
+ FirmInfo firmInfo = firmInfoMapper.selectById(chargeOrderInfo.getFirmId());
|
|
|
+ if (ObjectUtil.isNotNull(firmInfo)) {
|
|
|
+ HashMap<String, Object> map = new HashMap<>();
|
|
|
+ map.put("chargeOrderNo", chargeOrderInfo.getChargeOrderNo());
|
|
|
+ map.put("status", SystemConstants.STATUS_ONE);
|
|
|
+ map.put("startTime", startTime);
|
|
|
+ okHttpUtil.doPostForm(firmInfo.getChannelUrl() + "/notification_start_charge_result", map, null);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -330,6 +391,15 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
|
|
|
chargeOrderInfo.setStatus(SystemConstants.STATUS_TWO);
|
|
|
chargeOrderInfoService.updateById(chargeOrderInfo);
|
|
|
log.info("更新订单状态为结算中 - orderId: {}", chargeOrderInfo.getId());
|
|
|
+
|
|
|
+ // 推送停止充电订单结果
|
|
|
+ FirmInfo firmInfo = firmInfoMapper.selectById(chargeOrderInfo.getFirmId());
|
|
|
+ if (ObjectUtil.isNotNull(firmInfo)) {
|
|
|
+ HashMap<String, Object> map = new HashMap<>();
|
|
|
+ map.put("chargeOrderNo", chargeOrderInfo.getChargeOrderNo());
|
|
|
+ map.put("status", SystemConstants.STATUS_TWO);
|
|
|
+ okHttpUtil.doPostForm(firmInfo.getChannelUrl() + "/notification_stop_charge_result", map, null);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
case 5 -> log.info("未知 - StartChargeSeq: {}", startChargeSeq);
|
|
|
@@ -578,13 +648,44 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
|
|
|
log.info("新增充电状态成功 - startChargeSeq: {}", startChargeSeq);
|
|
|
}
|
|
|
|
|
|
+ //异步推送渠道方充电状态
|
|
|
+ pushChargeStatusTask(startChargeSeq, chargeStatus);
|
|
|
+
|
|
|
// 熔断保护 - 余额不足判断
|
|
|
isNeedBreak(chargeStatus, chargeOrderInfo);
|
|
|
} catch (Exception e) {
|
|
|
log.error("保存充电状态数据失败", e);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ @Qualifier("businessTaskExecutor")
|
|
|
+ private ThreadPoolTaskExecutor businessTaskExecutor;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 异步推送渠道方充电状态
|
|
|
+ */
|
|
|
+ public CompletableFuture<Void> pushChargeStatusTask(String startChargeSeq, ThirdPartyChargeStatus chargeStatus) {
|
|
|
+ return CompletableFuture.runAsync(() -> {
|
|
|
+ log.info("异步推送渠道方充电状态 - {}", startChargeSeq);
|
|
|
+ //通过startChargeSeq查询订单详情
|
|
|
+ ChargeOrderInfo chargeOrderInfo =
|
|
|
+ chargeOrderInfoService.getOne(Wrappers.<ChargeOrderInfo>lambdaQuery().eq(ChargeOrderInfo::getStartChargeSeq, startChargeSeq).last("limit 1"));
|
|
|
+ if (ObjUtil.isNotEmpty(chargeOrderInfo)) {
|
|
|
+ if (Objects.equals(chargeOrderInfo.getOrderType(), SystemConstants.CHARGE_ORDER_TYPE_CHANNEL)) {
|
|
|
+
|
|
|
+ Long firmId = chargeOrderInfo.getFirmId();
|
|
|
+ FirmInfo firmInfo = firmInfoMapper.selectById(firmId);
|
|
|
+ String channelUrl = firmInfo.getChannelUrl() + "/notification_equip_charge_status";
|
|
|
+
|
|
|
+ // 推送充电状态
|
|
|
+ okHttpUtil.doPostForm(channelUrl, BeanUtil.beanToMap(chargeStatus), null);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, businessTaskExecutor);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 计算平台实际收取金额
|
|
|
* 根据充电度数 * 当前时段的平台价格策略计算(支持跨时段计费)
|