mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-08-14 18:17:31 +08:00
fix: 修复无交易记录自动结算并增加分时电量观测对比
复用 settleOrder 主路径纠正状态/锁/实时数据取值等问题,补充 mock 单测与 sys_job SQL;交易记录到达时按实时曲线估算尖峰平谷仅打日志对比,不参与结算。
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package com.jsowell.pile.util;
|
||||
|
||||
import com.jsowell.common.core.domain.ykc.RealTimeMonitorData;
|
||||
import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
|
||||
import com.jsowell.pile.domain.OrderBasicInfo;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* SettlementDataConverter 单元测试
|
||||
*/
|
||||
public class SettlementDataConverterTest {
|
||||
|
||||
@Test
|
||||
public void testConvertKeepsPileAmountWithoutTouBreakdown() {
|
||||
OrderBasicInfo order = new OrderBasicInfo();
|
||||
order.setOrderCode("O001");
|
||||
order.setTransactionCode("T001");
|
||||
order.setPileSn("32010600000001");
|
||||
order.setConnectorCode("01");
|
||||
order.setChargeStartTime(new Date(System.currentTimeMillis() - 3600_000L));
|
||||
order.setChargeEndTime(new Date(System.currentTimeMillis() - 1200_000L));
|
||||
|
||||
RealTimeMonitorData realTime = new RealTimeMonitorData();
|
||||
realTime.setTransactionCode("T001");
|
||||
realTime.setChargingDegree("12.3456");
|
||||
realTime.setChargingAmount("23.45");
|
||||
realTime.setLossDegree("12.3456");
|
||||
realTime.setDateTime("2026-08-11 12:00:00");
|
||||
|
||||
TransactionRecordsData data = SettlementDataConverter.convertFromRealTimeData(order, realTime);
|
||||
Assert.assertEquals("23.45", data.getConsumptionAmount());
|
||||
Assert.assertEquals("12.3456", data.getTotalElectricity());
|
||||
Assert.assertNull("不应填充尖段电量,否则 settleOrder 会改用平台计价", data.getSharpUsedElectricity());
|
||||
Assert.assertNull(data.getPeakUsedElectricity());
|
||||
Assert.assertNull(data.getFlatUsedElectricity());
|
||||
Assert.assertNull(data.getValleyUsedElectricity());
|
||||
Assert.assertEquals("无交易记录自动结算", data.getStopReasonMsg());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsValidForSettlement() {
|
||||
RealTimeMonitorData ok = new RealTimeMonitorData();
|
||||
ok.setChargingDegree("1.0");
|
||||
ok.setChargingAmount("1.2");
|
||||
Assert.assertTrue(SettlementDataConverter.isValidForSettlement(ok));
|
||||
|
||||
RealTimeMonitorData zeroAmount = new RealTimeMonitorData();
|
||||
zeroAmount.setChargingDegree("1.0");
|
||||
zeroAmount.setChargingAmount("0");
|
||||
Assert.assertFalse(SettlementDataConverter.isValidForSettlement(zeroAmount));
|
||||
|
||||
RealTimeMonitorData zeroDegree = new RealTimeMonitorData();
|
||||
zeroDegree.setChargingDegree("0");
|
||||
zeroDegree.setChargingAmount("1.2");
|
||||
Assert.assertFalse(SettlementDataConverter.isValidForSettlement(zeroDegree));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package com.jsowell.pile.util;
|
||||
|
||||
import com.jsowell.common.core.domain.ykc.RealTimeMonitorData;
|
||||
import com.jsowell.pile.vo.web.BillingTemplateVO;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
||||
public class TouElectricityEstimatorTest {
|
||||
|
||||
@Test
|
||||
public void emptySamples() {
|
||||
TouElectricityEstimateResult r = TouElectricityEstimator.estimate(Collections.emptyList(), null);
|
||||
Assert.assertEquals("no_realtime_samples", r.getNote());
|
||||
Assert.assertEquals(0, r.getSampleCount());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void splitByPeriodRules() {
|
||||
BillingTemplateVO template = new BillingTemplateVO();
|
||||
// 08:00-12:00 峰;其余若未配置则 unmatched 记入平
|
||||
template.setPeakApplyDate("08:00:00-12:00:00");
|
||||
template.setFlatApplyDate("00:00:00-08:00:00,12:00:00-23:59:59");
|
||||
|
||||
RealTimeMonitorData s1 = sample("2026-08-12 07:50:00", "1.0000");
|
||||
RealTimeMonitorData s2 = sample("2026-08-12 08:10:00", "2.0000"); // delta 1.0 -> peak? end 08:10 peak
|
||||
// wait: delta from 07:50 to 08:10 attributed to 08:10 -> peak
|
||||
RealTimeMonitorData s3 = sample("2026-08-12 09:00:00", "5.0000"); // delta 3.0 peak
|
||||
RealTimeMonitorData s4 = sample("2026-08-12 12:30:00", "6.5000"); // delta 1.5 flat (12:30 in flat)
|
||||
|
||||
TouElectricityEstimateResult r = TouElectricityEstimator.estimate(Arrays.asList(s1, s2, s3, s4), template);
|
||||
Assert.assertEquals(4, r.getSampleCount());
|
||||
Assert.assertEquals(0, new BigDecimal("4.0000").compareTo(r.getPeak().setScale(4))); // 1+3
|
||||
Assert.assertEquals(0, new BigDecimal("1.5000").compareTo(r.getFlat().setScale(4)));
|
||||
Assert.assertEquals(0, new BigDecimal("5.5000").compareTo(r.getTotalFromDeltas().setScale(4)));
|
||||
Assert.assertEquals(0, new BigDecimal("6.5000").compareTo(r.getTotalFromLastSample().setScale(4)));
|
||||
Assert.assertEquals("ok", r.getNote());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void negativeDeltaIgnored() {
|
||||
BillingTemplateVO template = new BillingTemplateVO();
|
||||
template.setFlatApplyDate("00:00:00-23:59:59");
|
||||
RealTimeMonitorData s1 = sample("2026-08-12 10:00:00", "2.0000");
|
||||
RealTimeMonitorData s2 = sample("2026-08-12 10:01:00", "1.5000"); // neg
|
||||
RealTimeMonitorData s3 = sample("2026-08-12 10:02:00", "3.0000"); // +1.5 from 1.5
|
||||
|
||||
TouElectricityEstimateResult r = TouElectricityEstimator.estimate(Arrays.asList(s1, s2, s3), template);
|
||||
Assert.assertEquals(1, r.getNegativeOrZeroDeltaCount());
|
||||
Assert.assertEquals(0, new BigDecimal("1.5000").compareTo(r.getFlat().setScale(4)));
|
||||
}
|
||||
|
||||
private static RealTimeMonitorData sample(String dt, String degree) {
|
||||
RealTimeMonitorData d = new RealTimeMonitorData();
|
||||
d.setDateTime(dt);
|
||||
d.setChargingDegree(degree);
|
||||
return d;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user