WIP:三方对接,小桔AD;TODO:calc sumPeriod offset

This commit is contained in:
ZZ 2021-11-15 19:07:12 +08:00
parent 12d7ad6e3c
commit d62f3c8ec5

View File

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