package com.ruoyi.order.service.impl; import com.ruoyi.order.api.model.AccountingStrategyDetailOrder; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.vo.TransactionRecordMessageVO; import org.junit.jupiter.api.Test; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; import static org.junit.jupiter.api.Assertions.assertEquals; class ChargingSimulationSupportTest { @Test void supportsBalanceAndMixedPaymentAmounts() { TChargingOrder balance = new TChargingOrder(); balance.setPayMethod(1); balance.setRechargeAmount(new BigDecimal("10.00")); balance.setChargeAmount(new BigDecimal("10.00")); balance.setBalancePayAmount(new BigDecimal("10.00")); balance.setThirdPayAmount(BigDecimal.ZERO); assertEquals(new BigDecimal("10.00"), ChargingSimulationSupport.availableAmount(balance)); assertEquals("余额支付", ChargingSimulationSupport.paymentMode(balance)); TChargingOrder mixed = new TChargingOrder(); mixed.setPayMethod(2); mixed.setRechargePaymentType(1); mixed.setSourceName("ICBC"); mixed.setRechargeAmount(new BigDecimal("10.00")); mixed.setBalancePayAmount(new BigDecimal("4.00")); mixed.setThirdPayAmount(new BigDecimal("6.00")); assertEquals(new BigDecimal("10.00"), ChargingSimulationSupport.availableAmount(mixed)); assertEquals("余额+工行支付", ChargingSimulationSupport.paymentMode(mixed)); TChargingOrder alipay = new TChargingOrder(); alipay.setPayMethod(3); alipay.setRechargePaymentType(2); alipay.setRechargeAmount(new BigDecimal("10.00")); alipay.setBalancePayAmount(BigDecimal.ZERO); alipay.setThirdPayAmount(new BigDecimal("10.00")); assertEquals("支付宝支付", ChargingSimulationSupport.paymentMode(alipay)); TChargingOrder legacyAlipay = new TChargingOrder(); legacyAlipay.setPayMethod(3); legacyAlipay.setRechargePaymentType(2); legacyAlipay.setRechargeAmount(new BigDecimal("10.00")); assertEquals("支付宝支付", ChargingSimulationSupport.paymentMode(legacyAlipay)); assertEquals(new BigDecimal("10.00"), ChargingSimulationSupport.thirdPayAmount(legacyAlipay)); TChargingOrder legacyMixed = new TChargingOrder(); legacyMixed.setPayMethod(2); legacyMixed.setRechargePaymentType(1); legacyMixed.setSourceName("ICBC"); legacyMixed.setRechargeAmount(new BigDecimal("10.00")); legacyMixed.setBalancePayAmount(new BigDecimal("4.00")); assertEquals("余额+工行支付", ChargingSimulationSupport.paymentMode(legacyMixed)); assertEquals(new BigDecimal("6.00"), ChargingSimulationSupport.thirdPayAmount(legacyMixed)); TChargingOrder legacyIcbc = new TChargingOrder(); legacyIcbc.setPayMethod(1); legacyIcbc.setRechargePaymentType(1); legacyIcbc.setSourceName("ICBC"); legacyIcbc.setRechargeAmount(new BigDecimal("3.00")); legacyIcbc.setBalancePayAmount(BigDecimal.ZERO); assertEquals("工行支付", ChargingSimulationSupport.paymentMode(legacyIcbc)); assertEquals(new BigDecimal("3.00"), ChargingSimulationSupport.thirdPayAmount(legacyIcbc)); } @Test void buildsOneKwhRecordForSelectedTariffPeriod() { AccountingStrategyDetailOrder first = detail(1, 1, "00:00", "12:00"); AccountingStrategyDetailOrder second = detail(2, 3, "12:00", "23:59"); LocalDateTime endTime = LocalDateTime.of(2026, 7, 11, 15, 30, 0); ChargingSimulationSupport.PreparedSimulation prepared = ChargingSimulationSupport.prepare( "CD202607110001", Arrays.asList(first, second), new BigDecimal("0.03"), new BigDecimal("0.02"), endTime); assertEquals(second, prepared.getTariff()); assertEquals(new BigDecimal("0.03"), second.getElectrovalence()); assertEquals(new BigDecimal("0.02"), second.getServiceCharge()); assertEquals(new BigDecimal("0.02"), second.getCostServiceCharge()); TransactionRecordMessageVO record = prepared.getRecord(); assertEquals("CD202607110001", record.getTransaction_serial_number()); assertEquals(BigDecimal.ONE, record.getTotal_electricity()); assertEquals(BigDecimal.ONE, record.getLoss_total_electricity()); assertEquals(BigDecimal.ONE, record.getFlat_charge2()); assertEquals(new BigDecimal("0.05"), record.getPayment_amount()); } private AccountingStrategyDetailOrder detail(int id, int type, String start, String end) { AccountingStrategyDetailOrder detail = new AccountingStrategyDetailOrder(); detail.setId(id); detail.setType(type); detail.setStartTime(start); detail.setEndTime(end); return detail; } }