charge details.

This commit is contained in:
ZZ 2021-11-16 11:55:16 +08:00
parent 724fd541de
commit 29ccbed11a

View File

@ -21,6 +21,7 @@ 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.Duration;
import java.time.Instant; import java.time.Instant;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
@ -91,75 +92,79 @@ public class NotificationEquipChargeStatusTask extends CoreDispatcher {
} }
} }
private void calculateEm(EquipChargeStatus equipChargeStatusCD, CacheRateModel cacheRateModel) { private void calculateEm(EquipChargeStatus equipChargeStatus, CacheRateModel cacheRateModel) {
final Date endTime = DateUtil.string2Date(equipChargeStatusCD.getEndTime()); final Date endTime = DateUtil.string2Date(equipChargeStatus.getEndTime());
final Date startTime = DateUtil.string2Date(equipChargeStatusCD.getStartTime()); final Date startTime = DateUtil.string2Date(equipChargeStatus.getStartTime());
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.FLOOR);
BigDecimal minutes = new BigDecimal(totalMilSec).divide(new BigDecimal(60000), 2, RoundingMode.HALF_UP); int sumPeriod = hours.setScale(0, RoundingMode.CEILING).intValue() + 1;
equipChargeStatus.setSumPeriod(sumPeriod);
DateTime firstNDT = DateTime.of(startTime);
Stack<ChargeDetails> chargeDetailsStack = new Stack<>();
ChargeDetails chargeDetails = null;
Double firstNElecMoney = 0.0;
Double firstNSeviceMony = 0.0;
Double firstNPower = 0.0;
String rtfTemp = null;
Instant startIst = startTime.toInstant(); Instant startIst = startTime.toInstant();
final Instant endInst = endTime.toInstant(); final Instant endInst = endTime.toInstant();
equipChargeStatusCD.setSumPeriod(hours.setScale(0, RoundingMode.CEILING).intValue()); //todo calc offset Instant endPeriod;
final Integer sumPeriod = equipChargeStatusCD.getSumPeriod(); final Double totalPower = equipChargeStatus.getTotalPower();
DateTime firstNDT = DateTime.of(startTime);
List<ChargeDetails> chargeDetailsList = new ArrayList<>();
Double firstNElecMoney = 0.0;
ChargeDetails chargeDetails = null;
String rtfTemp = null;
for (int i = 0; i < sumPeriod; i++) { for (int i = 0; i < sumPeriod; i++) {
if (!startIst.isBefore(endInst)) break;
endPeriod = startIst.truncatedTo(ChronoUnit.HOURS).plusSeconds(3599L);
if (!endPeriod.isBefore(endInst)) {
endPeriod = endInst;
}
boolean newCd = false; 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)) { if (chargeDetails == null || !rtf.equals(rtfTemp)) {
newCd = true; newCd = true;
chargeDetails = new ChargeDetails(); chargeDetails = new ChargeDetails();
} }
rtfTemp = rtf; rtfTemp = rtf;
BigDecimal timePeriodRatio = BigDecimal.valueOf(60).divide(minutes, 2, RoundingMode.HALF_UP); Duration durm = Duration.between(startIst, endPeriod);
BigDecimal tpPower = BigDecimal.valueOf(equipChargeStatusCD.getTotalPower()).multiply(timePeriodRatio); BigDecimal timePeriodRatio = BigDecimal.valueOf(durm.toMillis()).divide(BigDecimal.valueOf(totalMilSec), 2,
calculateCD(cacheRateModel, rtf, timePeriodRatio, tpPower, chargeDetails); RoundingMode.HALF_UP);
calculateCD(cacheRateModel, rtf, timePeriodRatio, BigDecimal.valueOf(totalPower), chargeDetails);
if (i == 0) { if (i == 0) {
chargeDetails.setDetailStartTime(equipChargeStatusCD.getStartTime()); chargeDetails.setDetailStartTime(equipChargeStatus.getStartTime());
} else { } else if (newCd) {
startIst = startIst.truncatedTo(ChronoUnit.HOURS).plusSeconds(3600L); chargeDetails.setDetailStartTime(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()).format(startIst));
if (newCd) {
chargeDetails.setDetailStartTime(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()).format(startIst));
}
}
Instant endPeriod = startIst.truncatedTo(ChronoUnit.HOURS).plusSeconds(3599L);
if (!endPeriod.isBefore(endInst)) {
endPeriod = endInst;
} }
startIst = startIst.truncatedTo(ChronoUnit.HOURS).plusSeconds(3600L);
chargeDetails.setDetailEndTime(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()).format(endPeriod)); chargeDetails.setDetailEndTime(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()).format(endPeriod));
firstNElecMoney += chargeDetails.getDetailElecMoney();
if (newCd) { if (newCd) {
chargeDetailsList.add(chargeDetails); chargeDetailsStack.push(chargeDetails);
} }
} }
// DateTime lastDT = DateTime.of(endTime); ChargeDetails[] cda = new ChargeDetails[chargeDetailsStack.size()];
// int tf = (lastDT.getField(DateField.HOUR_OF_DAY)) * 2; equipChargeStatus.setChargeDetails(chargeDetailsStack.toArray(cda));
// final String rtf = cacheRateModel.getTfPricesSeq()[tf]; equipChargeStatus.setSumPeriod(chargeDetailsStack.size());
// BigDecimal timePeriodRatio = BigDecimal.valueOf(60).divide(minutes, 2, RoundingMode.HALF_UP); equipChargeStatus.setElecMoney(firstNElecMoney);
// BigDecimal tpPower = BigDecimal.valueOf(equipChargeStatusCD.getTotalPower()) final Double totalMoney = equipChargeStatus.getTotalMoney();
// .multiply(timePeriodRatio).divide(BigDecimal.valueOf(100000), 2, RoundingMode.HALF_UP); for (ChargeDetails cd : chargeDetailsStack) {
// ChargeDetails cd = new ChargeDetails(); firstNElecMoney += cd.getDetailElecMoney();
// calculateCD(cacheRateModel, rtf, timePeriodRatio, tpPower, cd); firstNSeviceMony += cd.getDetailSeviceMoney();
// firstNElecMoney += cd.getDetailElecMoney(); firstNPower += cd.getDetailPower();
// cd.setDetailStartTime(firstNDT.toString(DATE_FORMAT_DATE_TIME)); }
// chargeDetailsList.add(cd); equipChargeStatus.setElecMoney(BigDecimal.valueOf(totalMoney).subtract(BigDecimal.valueOf(firstNSeviceMony)).setScale(2, RoundingMode.HALF_DOWN).doubleValue());
ChargeDetails[] cda = new ChargeDetails[chargeDetailsList.size()]; equipChargeStatus.setSeviceMoney(BigDecimal.valueOf(firstNSeviceMony).setScale(2, RoundingMode.HALF_UP).doubleValue());
equipChargeStatusCD.setChargeDetails(chargeDetailsList.toArray(cda)); final BigDecimal oddm =
equipChargeStatusCD.setSumPeriod(chargeDetailsList.size()); BigDecimal.valueOf(totalMoney).subtract(BigDecimal.valueOf(firstNElecMoney)).subtract(BigDecimal.valueOf(firstNSeviceMony));
equipChargeStatusCD.setElecMoney(firstNElecMoney); final BigDecimal oddp = BigDecimal.valueOf(totalPower).subtract(BigDecimal.valueOf(firstNPower));
equipChargeStatusCD.setSeviceMoney(equipChargeStatusCD.getTotalMoney() - firstNElecMoney); ChargeDetails peek = chargeDetailsStack.peek();
peek.setDetailElecMoney(BigDecimal.valueOf(peek.getDetailElecMoney()).add(oddm).setScale(2, RoundingMode.HALF_UP).doubleValue());
peek.setDetailPower(BigDecimal.valueOf(peek.getDetailPower()).add(oddp).setScale(2, RoundingMode.HALF_UP).doubleValue());
} }
private void calculateCD(CacheRateModel cacheRateModel, String rtf, private void calculateCD(CacheRateModel cacheRateModel, String rtf,
BigDecimal timePeriodRatio, BigDecimal tpPower, ChargeDetails cd) { BigDecimal timePeriodRatio, BigDecimal tpPower, ChargeDetails cd) {
cd.setDetailPower(tpPower.multiply(timePeriodRatio).doubleValue()); cd.setDetailPower(BigDecimal.valueOf(cd.getDetailPower() + tpPower.multiply(timePeriodRatio).doubleValue()).setScale(2, RoundingMode.HALF_UP).doubleValue());
Integer powerPrice; Integer powerPrice;
Integer svcPrice; Integer svcPrice;
if ("00".equals(rtf)) { if ("00".equals(rtf)) {
@ -177,14 +182,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);
final double detailElecMoney = final double detailElecMoney = BigDecimal.valueOf(cd.getElecPrice())
BigDecimal.valueOf(cd.getElecPrice()).multiply(BigDecimal.valueOf(cd.getDetailPower())).setScale(2, .multiply(BigDecimal.valueOf(cd.getDetailPower()))
RoundingMode.HALF_UP).doubleValue(); .setScale(2, RoundingMode.HALF_DOWN).doubleValue();
cd.setDetailElecMoney(cd.getDetailElecMoney() + detailElecMoney); cd.setDetailElecMoney(BigDecimal.valueOf(cd.getDetailElecMoney() + detailElecMoney).setScale(2, RoundingMode.HALF_UP).doubleValue());
final double detailSeviceMoney = final double detailSeviceMoney = BigDecimal.valueOf(cd.getSevicePrice())
BigDecimal.valueOf(cd.getSevicePrice()).multiply(BigDecimal.valueOf(cd.getDetailPower())).setScale(2, .multiply(BigDecimal.valueOf(cd.getDetailPower()))
RoundingMode.HALF_UP).doubleValue(); .setScale(2, RoundingMode.HALF_DOWN).doubleValue();
cd.setDetailSeviceMoney(cd.getDetailSeviceMoney() + detailSeviceMoney); cd.setDetailSeviceMoney(BigDecimal.valueOf(cd.getDetailSeviceMoney() + detailSeviceMoney).setScale(2, RoundingMode.HALF_DOWN).doubleValue());
} }
public void notify(EquipChargeStatus equipChargeStatus, AuthSecretToken authSecretTokenOut) throws IOException { public void notify(EquipChargeStatus equipChargeStatus, AuthSecretToken authSecretTokenOut) throws IOException {