charge details.
This commit is contained in:
parent
724fd541de
commit
29ccbed11a
@ -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 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user