This commit is contained in:
2026-11-05 11:55:23 +08:00
parent 94a36b8c4c
commit 5a8918e2e4
10 changed files with 418 additions and 27 deletions
@@ -0,0 +1,62 @@
package com.baiyue.lastleg.export;
import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class LastlegExportLabelsTest {
@Test void translatesEveryEnumColumnOfAllLastlegTaskTypes() {
Object[][] examples = {
{"LAST_MILE_ORDER_LIST", "currentStatus", "WAIT_PDA_RECEIVING", "入库测量中"},
{"LAST_MILE_ORDER_LIST", "orderTypeName", "FIRST_LEG", "头程订单"},
{"LAST_MILE_ORDER_LIST", "businessSource.label", "LOCAL_LOOSEBOARD", "本土散板"},
{"LAST_MILE_ORDER_LIST", "containerNode", "PICKUP_READY", "已清关、可提柜"},
{"LAST_MILE_ORDER_LIST", "relabelStatus", "CUSTOMER_CONFIRM_PENDING", "待客户确认"},
{"LAST_MILE_ORDER_LIST", "palletMergeFlag", "REQUIRED", "待合托"},
{"OVERSEAS_INVENTORY_LEDGER", "businessType", "RETURN_STOCK_IN", "退回入库"},
{"OVERSEAS_INVENTORY_LEDGER", "statusFrom", "PICKED", "已拣货"},
{"OVERSEAS_INVENTORY_LEDGER", "statusTo", "SHIPPED", "已出库"},
{"OVERSEAS_QUOTE_LIST", "status", "ACTIVE", "启用"},
{"MONTHLY_EXCHANGE_RATE_LIST", "status", "INACTIVE", "停用"},
{"FLEET_QUOTE_LIST", "status", "ACTIVE", "启用"},
{"FLEET_QUOTE_LIST", "details.kind", "PURCHASE", "车队采购报价"},
{"FLEET_QUOTE_LIST", "details.kind", "SALE", "外接销售报价"},
{"VEHICLE_LIST", "status", "DISPATCHED", "外派中"},
{"VEHICLE_LIST", "ownership", "DISPATCHED", "外派"},
{"VEHICLE_LIST", "region", "OVERSEAS", "海外"},
{"TRIP_OPERATIONS_LIST", "status", "COMPLETED", "货物已结案"}
};
for (Object[] example : examples) {
assertEquals(example[3], LastlegExportLabels.value((String) example[0], (String) example[1], example[2]), example[0] + ":" + example[1]);
assertTrue(LastlegExportColumns.columns((String) example[0]).stream().anyMatch(c -> c.key().equals(example[1])), "映射必须对应实际导出列");
}
}
@Test void translatesCompositeSubOrdersAndAllVehicleStatuses() {
assertEquals("出库单:已出库;派送单:待派送", LastlegExportLabels.value("LAST_MILE_ORDER_LIST", "subOrderStatus", "OUTBOUND:OUTBOUNDED;DELIVERY:WAIT_DELIVERY"));
assertEquals("入库单:部分入库", LastlegExportLabels.value("LAST_MILE_ORDER_LIST", "subOrderStatus", "INBOUND_PLAN:PARTIAL_INBOUND"));
for (String code : List.of("IN_SERVICE", "DISPATCHED", "MAINTENANCE", "INACTIVE", "RETURNED")) {
String label = (String) LastlegExportLabels.value("VEHICLE_LIST", "status", code);
assertTrue(label.matches(".*[一-鿿].*")); assertFalse(label.contains("未知"));
}
for (String code : List.of("OUTSIDE", "UNBOUND", "IN_TRANSIT", "RECEIVING", "AVAILABLE", "HOLD", "ALLOCATED", "PICKED", "SHIPPED")) {
assertFalse(LastlegExportLabels.value("OVERSEAS_INVENTORY_LEDGER", "statusTo", code).toString().contains("未知"));
}
for (String code : List.of("RECEIVING_WAREHOUSE_CHANGED", "INTERNAL_MOVE", "RELABEL_PALLET_DISASSEMBLE")) {
assertFalse(LastlegExportLabels.value("OVERSEAS_INVENTORY_LEDGER", "businessType", code).toString().contains("未知"));
}
}
@Test void preservesBusinessIdentifiersAmountsDatesCurrenciesAndFreeText() {
for (String type : List.of("LAST_MILE_ORDER_LIST", "OVERSEAS_INVENTORY_BALANCE", "OVERSEAS_INVENTORY_LEDGER", "OVERSEAS_QUOTE_LIST", "MONTHLY_EXCHANGE_RATE_LIST", "VEHICLE_LIST", "FLEET_QUOTE_LIST", "TRIP_OPERATIONS_LIST", "SELFOP_INVENTORY_TURNOVER")) {
assertEquals("ACTIVE", LastlegExportLabels.value(type, "remark", "ACTIVE"));
assertEquals("ONT8", LastlegExportLabels.value(type, "warehouseCode", "ONT8"));
assertEquals("USD", LastlegExportLabels.value(type, "currency", "USD"));
assertEquals(BigDecimal.TEN, LastlegExportLabels.value(type, "amount", BigDecimal.TEN));
assertNull(LastlegExportLabels.value(type, "status", null));
}
assertEquals("已完成", LastlegExportLabels.value("LAST_MILE_ORDER_LIST", "currentStatus", "已完成"));
assertEquals("未知状态", LastlegExportLabels.value("TRIP_OPERATIONS_LIST", "status", "NEW_INTERNAL_STATE"));
}
}
@@ -46,6 +46,17 @@ class LastlegExportProviderServiceTest {
}
@AfterEach void close() { validators.close(); }
@Test void rowProjectionTranslatesOnlyBusinessEnumsBeforeWritingBatches() {
Map<String, Object> row = ReflectionTestUtils.invokeMethod(service, "row", "FLEET_QUOTE_LIST",
Map.of("status", "ACTIVE", "quoteNo", "ACTIVE", "details", Map.of("kind", "SALE", "currency", "USD", "remark", "SALE")),
LastlegExportColumns.columns("FLEET_QUOTE_LIST"));
assertEquals("启用", row.get("status"));
assertEquals("外接销售报价", row.get("details.kind"));
assertEquals("ACTIVE", row.get("quoteNo"));
assertEquals("USD", row.get("details.currency"));
assertEquals("SALE", row.get("details.remark"));
}
@Test void batchesAllRowsAndBindsSnapshotToFiltersRequesterAndAttempt() {
var row = new MonthlyExchangeRateDtos.Response("2026-10", "USD", "CNY", new BigDecimal("7.12"), "ACTIVE", 1, "operator", LocalDateTime.of(2026,10,8,12,0), null);
when(rates.page(any())).thenAnswer(call -> {