This commit is contained in:
2026-08-20 16:13:51 +08:00
parent 164d862588
commit 09f6e28c1f
10 changed files with 164 additions and 15 deletions
@@ -144,7 +144,7 @@ class FinancePhase1OperationBehaviorTest {
when(rs.getString("currency_code")).thenReturn("CNY");
when(rs.getString("review_status")).thenReturn("APPROVED");
when(rs.getString("effective_status")).thenReturn("AVAILABLE");
when(rs.getString("source_snapshot")).thenReturn("{\"customerName\":\"客户9\",\"supplierId\":79,\"supplierName\":\"供应商A\",\"inboundCode\":\"IN-9\",\"containerNo\":\"CONT-9\",\"businessDate\":\"2026-08-11\",\"chargeableQuantity\":\"10\"}");
when(rs.getString("source_snapshot")).thenReturn("{\"customerName\":\"客户9\",\"supplierId\":\"79\",\"supplierName\":\"供应商A\",\"inboundCode\":\"IN-9\",\"containerNo\":\"CONT-9\",\"businessDate\":\"2026-08-11\",\"chargeableQuantity\":\"10\"}");
when(rs.getBigDecimal("amount")).thenReturn(new BigDecimal("120.00"));
when(rs.getBoolean("statement_generated")).thenReturn(false);
return List.of(mapper.mapRow(rs, 0));
@@ -164,6 +164,7 @@ class FinancePhase1OperationBehaviorTest {
assertThat(source.sourceBusinessId()).isEqualTo("IN-9");
assertThat(source.inboundCode()).isEqualTo("IN-9");
assertThat(source.containerNo()).isEqualTo("CONT-9");
assertThat(source.supplierId()).isEqualTo(79L);
assertThat(source.supplierName()).isEqualTo("供应商A");
assertThat(source.reviewStatus()).isEqualTo("APPROVED");
assertThat(source.businessDate()).isEqualTo(LocalDate.of(2026, 8, 11));
@@ -10,6 +10,7 @@ import com.baiyue.finance.dto.FinanceSettlementDtos.CreatePayableSettlementReque
import com.baiyue.finance.dto.FinanceSettlementDtos.CreateReceivableSettlementRequest;
import com.baiyue.finance.dto.FinanceSettlementDtos.CreateSettlementPaymentRequest;
import com.baiyue.finance.dto.FinanceSettlementDtos.SettlementDetail;
import com.baiyue.finance.dto.FinanceSettlementDtos.SettlementLine;
import com.baiyue.finance.dto.FinanceSettlementDtos.SettlementSummary;
import com.baiyue.finance.dto.FinanceSettlementDtos.SettlementActionRequest;
import com.baiyue.finance.service.FinanceEventException;
@@ -286,6 +287,66 @@ class FinanceSettlementBehaviorTest {
verify(jdbc).update(startsWith("INSERT INTO fin_settlement_line"), eq(88L), eq(10L), eq(501L));
}
@Test
void receivableSettlementLineDoesNotRequireSupplierSnapshot() {
Map<String, Object> row = new java.util.HashMap<>(Map.ofEntries(
Map.entry("fee_source_id", 31L), Map.entry("source_type", "FBA_PRICING"),
Map.entry("source_fee_id", 41L), Map.entry("source_fee_version", 1),
Map.entry("direction", "RECEIVABLE"), Map.entry("customer_id", 10L),
Map.entry("source_snapshot", "{\"customerName\":\"客户10\",\"businessDate\":\"2026-08-11\"}"),
Map.entry("fee_item_name", "头程运费"), Map.entry("amount", new BigDecimal("100.00")),
Map.entry("currency_code", "CNY"), Map.entry("review_status", "APPROVED"),
Map.entry("status", "GENERATED")));
row.put("order_id", null);
row.put("inbound_id", null);
row.put("container_id", null);
SettlementLine line = ReflectionTestUtils.invokeMethod(
service(org.mockito.Mockito.mock(JdbcTemplate.class), org.mockito.Mockito.mock(FinanceFileClient.class)),
"line", row, detail("RECEIVABLE", "ISSUED", BigDecimal.ZERO,
new BigDecimal("100.00"), 0).summary());
assertThat(line.direction()).isEqualTo("RECEIVABLE");
assertThat(line.supplierId()).isNull();
assertThat(line.customerName()).isEqualTo("客户10");
}
@Test
void payableSettlementLineStillRequiresSupplierSnapshot() {
Map<String, Object> row = new java.util.HashMap<>(Map.ofEntries(
Map.entry("direction", "PAYABLE"),
Map.entry("source_snapshot", "{\"customerName\":\"客户10\",\"businessDate\":\"2026-08-11\"}"),
Map.entry("amount", new BigDecimal("100.00"))));
assertCode(() -> ReflectionTestUtils.invokeMethod(
service(org.mockito.Mockito.mock(JdbcTemplate.class), org.mockito.Mockito.mock(FinanceFileClient.class)),
"line", row, detail("PAYABLE", "ISSUED", BigDecimal.ZERO,
new BigDecimal("100.00"), 0).summary()), "FIN_409");
}
@Test
void payableSettlementLineAcceptsStringEncodedSupplierIdSnapshot() {
Map<String, Object> row = new java.util.HashMap<>(Map.ofEntries(
Map.entry("fee_source_id", 31L), Map.entry("source_type", "INBOUND_FEE"),
Map.entry("source_fee_id", 41L), Map.entry("source_fee_version", 1),
Map.entry("direction", "PAYABLE"), Map.entry("customer_id", 10L),
Map.entry("source_snapshot", "{\"customerName\":\"客户10\",\"supplierId\":\"2090349552523644929\",\"supplierName\":\"供应商A\",\"businessDate\":\"2026-08-11\"}"),
Map.entry("fee_item_name", "装车费"), Map.entry("amount", new BigDecimal("80.00")),
Map.entry("currency_code", "CNY"), Map.entry("review_status", "APPROVED"),
Map.entry("status", "AVAILABLE")));
row.put("order_id", null);
row.put("inbound_id", null);
row.put("container_id", null);
SettlementLine line = ReflectionTestUtils.invokeMethod(
service(org.mockito.Mockito.mock(JdbcTemplate.class), org.mockito.Mockito.mock(FinanceFileClient.class)),
"line", row, detail("PAYABLE", "ISSUED", BigDecimal.ZERO,
new BigDecimal("80.00"), 0).summary());
assertThat(line.supplierId()).isEqualTo(2090349552523644929L);
assertThat(line.supplierName()).isEqualTo("供应商A");
}
@Test
void receivableCreationRejectsAlreadySettledStatement() {
JdbcTemplate jdbc = org.mockito.Mockito.mock(JdbcTemplate.class);