diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationEquipChargeStatusTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationEquipChargeStatusTask.java index 2f696f0e..1cc9f2d6 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationEquipChargeStatusTask.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationEquipChargeStatusTask.java @@ -3,6 +3,7 @@ package com.xhpc.evcs.notification; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; import com.xhpc.common.data.redis.CacheRateModel; +import com.xhpc.common.data.redis.CacheRealtimeData; import com.xhpc.evcs.domain.AuthSecretToken; import com.xhpc.evcs.dto.*; import com.xhpc.evcs.jpa.AuthSecretTokenRepository; @@ -20,6 +21,10 @@ import org.springframework.stereotype.Component; import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.*; import static cn.hutool.core.util.NumberUtil.isInteger; @@ -61,11 +66,17 @@ public class NotificationEquipChargeStatusTask extends CoreDispatcher { equipChargeStatus.setCurrentA(HexUtils.reverseHexInt(current == null ? "9600" : current) / 10.0); String voltage = REDIS.getCacheMapValue(gunkey, "voltage"); equipChargeStatus.setVoltageA(HexUtils.reverseHexInt(voltage == null ? "D80E" : voltage) / 10.0); - Double soc = REDIS.getCacheMapValue(orderkey, "endSoc"); - equipChargeStatus.setSoc(soc == null ? 0 : soc); + Integer soc = REDIS.getCacheMapValue(orderkey, "endSoc"); + equipChargeStatus.setSoc(soc == null ? 0.0 : Double.valueOf(soc.toString())); equipChargeStatus.setStartTime(cacheGun.get("orderstarttime").toString()); - equipChargeStatus.setEndTime(DateUtil.date2String(Calendar.getInstance().getTime(), - DATE_FORMAT_DATE_TIME)); + CacheRealtimeData lord = REDIS.getCacheObject(orderkey.concat(".lord")); + String lordTime; + if (lord != null) { + lordTime = lord.getCreateTime(); + } else { + lordTime = DateUtil.date2String(Calendar.getInstance().getTime(), DATE_FORMAT_DATE_TIME); + } + equipChargeStatus.setEndTime(lordTime); equipChargeStatus.setChargeModel(3); equipChargeStatus.setTotalPower(REDIS.getCacheMapValue(orderkey, "totalPower")); equipChargeStatus.setTotalMoney(REDIS.getCacheMapValue(orderkey, "totalMoney")); @@ -87,50 +98,60 @@ public class NotificationEquipChargeStatusTask extends CoreDispatcher { long totalMilSec = endTime.getTime() - startTime.getTime(); BigDecimal hours = new BigDecimal(totalMilSec).divide(new BigDecimal(3600000), 2, RoundingMode.HALF_UP); BigDecimal minutes = new BigDecimal(totalMilSec).divide(new BigDecimal(60000), 2, RoundingMode.HALF_UP); - equipChargeStatusCD.setSumPeriod(hours.setScale(0, RoundingMode.CEILING).intValue()); + Instant startIst = startTime.toInstant(); + final Instant endInst = endTime.toInstant(); + equipChargeStatusCD.setSumPeriod(hours.setScale(0, RoundingMode.CEILING).intValue()); //todo calc offset final Integer sumPeriod = equipChargeStatusCD.getSumPeriod(); DateTime firstNDT = DateTime.of(startTime); - List chargeDetails = new ArrayList<>(); + List chargeDetailsList = new ArrayList<>(); Double firstNElecMoney = 0.0; - for (int i = 0; i < sumPeriod - 1; i++) { - ChargeDetails cd = new ChargeDetails(); + ChargeDetails chargeDetails = null; + String rtfTemp = null; + for (int i = 0; i < sumPeriod; i++) { + boolean newCd = false; int firstSTHourOfDay = firstNDT.getField(DateField.HOUR_OF_DAY); int tf = (firstSTHourOfDay + i) * 2; final String rtf = cacheRateModel.getTfPricesSeq()[tf]; + if (chargeDetails == null || rtfTemp == null || !rtf.equals(rtfTemp)) { + newCd = true; + chargeDetails = new ChargeDetails(); + } + rtfTemp = rtf; BigDecimal timePeriodRatio = BigDecimal.valueOf(60).divide(minutes, 2, RoundingMode.HALF_UP); BigDecimal tpPower = BigDecimal.valueOf(equipChargeStatusCD.getTotalPower()).multiply(timePeriodRatio); - calculateCD(cacheRateModel, rtf, timePeriodRatio, tpPower, cd); + calculateCD(cacheRateModel, rtf, timePeriodRatio, tpPower, chargeDetails); if (i == 0) { - cd.setDetailStartTime(equipChargeStatusCD.getStartTime()); + chargeDetails.setDetailStartTime(equipChargeStatusCD.getStartTime()); } else { - if (firstSTHourOfDay == 23) { - firstNDT.setField(DateField.DAY_OF_MONTH, firstNDT.getField(DateField.DAY_OF_MONTH) + 1); - firstNDT.setField(DateField.HOUR_OF_DAY, 0);//todo no, there are more to considered like day of month, - // month of year etc... - } else { - firstNDT.setField(DateField.HOUR_OF_DAY, firstSTHourOfDay + 1); + startIst = startIst.truncatedTo(ChronoUnit.HOURS).plusSeconds(3600L); + if (newCd) { + chargeDetails.setDetailStartTime(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()).format(startIst)); } - firstNDT.setField(DateField.MINUTE, 0); - firstNDT.setField(DateField.SECOND, 0); - cd.setDetailStartTime(firstNDT.toString(DATE_FORMAT_DATE_TIME)); } - firstNElecMoney += cd.getDetailElecMoney(); - chargeDetails.add(cd); + Instant endPeriod = startIst.truncatedTo(ChronoUnit.HOURS).plusSeconds(3599L); + if (!endPeriod.isBefore(endInst)) { + endPeriod = endInst; + } + chargeDetails.setDetailEndTime(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()).format(endPeriod)); + firstNElecMoney += chargeDetails.getDetailElecMoney(); + if (newCd) { + chargeDetailsList.add(chargeDetails); + } } - DateTime lastDT = DateTime.of(endTime); - int tf = (lastDT.getField(DateField.HOUR_OF_DAY)) * 2; - final String rtf = cacheRateModel.getTfPricesSeq()[tf]; - BigDecimal timePeriodRatio = BigDecimal.valueOf(60).divide(minutes, 2, RoundingMode.HALF_UP); - BigDecimal tpPower = BigDecimal.valueOf(equipChargeStatusCD.getTotalPower()) - .multiply(timePeriodRatio).divide(BigDecimal.valueOf(100000), 2, RoundingMode.HALF_UP); - ChargeDetails cd = new ChargeDetails(); - calculateCD(cacheRateModel, rtf, timePeriodRatio, tpPower, cd); - firstNElecMoney += cd.getDetailElecMoney(); - cd.setDetailStartTime(firstNDT.toString(DATE_FORMAT_DATE_TIME)); - chargeDetails.add(cd); - ChargeDetails[] cda = new ChargeDetails[chargeDetails.size()]; - equipChargeStatusCD.setChargeDetails(chargeDetails.toArray(cda)); - equipChargeStatusCD.setSumPeriod(sumPeriod); +// DateTime lastDT = DateTime.of(endTime); +// int tf = (lastDT.getField(DateField.HOUR_OF_DAY)) * 2; +// final String rtf = cacheRateModel.getTfPricesSeq()[tf]; +// BigDecimal timePeriodRatio = BigDecimal.valueOf(60).divide(minutes, 2, RoundingMode.HALF_UP); +// BigDecimal tpPower = BigDecimal.valueOf(equipChargeStatusCD.getTotalPower()) +// .multiply(timePeriodRatio).divide(BigDecimal.valueOf(100000), 2, RoundingMode.HALF_UP); +// ChargeDetails cd = new ChargeDetails(); +// calculateCD(cacheRateModel, rtf, timePeriodRatio, tpPower, cd); +// firstNElecMoney += cd.getDetailElecMoney(); +// cd.setDetailStartTime(firstNDT.toString(DATE_FORMAT_DATE_TIME)); +// chargeDetailsList.add(cd); + ChargeDetails[] cda = new ChargeDetails[chargeDetailsList.size()]; + equipChargeStatusCD.setChargeDetails(chargeDetailsList.toArray(cda)); + equipChargeStatusCD.setSumPeriod(chargeDetailsList.size()); equipChargeStatusCD.setElecMoney(firstNElecMoney); equipChargeStatusCD.setSeviceMoney(equipChargeStatusCD.getTotalMoney() - firstNElecMoney); } @@ -156,10 +177,14 @@ public class NotificationEquipChargeStatusTask extends CoreDispatcher { } cd.setElecPrice((double) Math.round(powerPrice / 1000D) / 100D); cd.setSevicePrice((double) Math.round(svcPrice / 1000D) / 100D); - cd.setDetailElecMoney(BigDecimal.valueOf(cd.getElecPrice()).multiply(BigDecimal.valueOf(cd.getDetailPower())).divide(BigDecimal.valueOf(10000), 2, - RoundingMode.HALF_UP).doubleValue()); - cd.setDetailSeviceMoney(BigDecimal.valueOf(cd.getSevicePrice()).multiply(BigDecimal.valueOf(cd.getDetailPower())).divide(BigDecimal.valueOf(10000), 2, - RoundingMode.HALF_UP).doubleValue()); + final double detailElecMoney = + BigDecimal.valueOf(cd.getElecPrice()).multiply(BigDecimal.valueOf(cd.getDetailPower())).setScale(2, + RoundingMode.HALF_UP).doubleValue(); + cd.setDetailElecMoney(cd.getDetailElecMoney() + detailElecMoney); + final double detailSeviceMoney = + BigDecimal.valueOf(cd.getSevicePrice()).multiply(BigDecimal.valueOf(cd.getDetailPower())).setScale(2, + RoundingMode.HALF_UP).doubleValue(); + cd.setDetailSeviceMoney(cd.getDetailSeviceMoney() + detailSeviceMoney); } public void notify(EquipChargeStatus equipChargeStatus, AuthSecretToken authSecretTokenOut) throws IOException {