feat: add self-operated analytics and enforce Lastleg module boundaries

This commit is contained in:
2026-10-12 20:27:35 +08:00
parent c06e788b0f
commit a1f1d93902
174 changed files with 13514 additions and 490 deletions
@@ -1,7 +1,9 @@
package com.baiyue.lastleg.service;
import com.baiyue.lastleg.entity.LastlegOrder;
import com.baiyue.lastleg.fleet.customer.FleetCustomerDirectory;
import com.baiyue.lastleg.service.reference.ReturnCustomerReferenceClient;
import com.baiyue.common.core.api.ApiResponse;
import com.baiyue.common.core.api.PageResult;
import com.baiyue.lastleg.inboundplan.pda.gateway.WarehouseResourceGateway;
import org.junit.jupiter.api.Test;
import java.util.List;
@@ -11,11 +13,11 @@ import static org.mockito.Mockito.*;
class ReturnOrderReferenceResolverTest {
@Test
void directoryFailureBlocksNewSnapshotButDoesNotHideHistoricalOrders() {
var customers = mock(FleetCustomerDirectory.class);
var customers = mock(ReturnCustomerReferenceClient.class);
var warehouses = mock(WarehouseResourceGateway.class);
when(customers.find("1")).thenThrow(new org.springframework.web.server.ResponseStatusException(org.springframework.http.HttpStatus.SERVICE_UNAVAILABLE));
when(customers.customers("test-token", 1, 30, null, "ACTIVE", 1L)).thenThrow(new org.springframework.web.server.ResponseStatusException(org.springframework.http.HttpStatus.SERVICE_UNAVAILABLE));
when(warehouses.requireActiveSharedWarehouse(10L)).thenReturn(new WarehouseResourceGateway.WarehouseReference(10L, "USLAX01", "洛杉矶仓", "ACTIVE"));
var resolver = new ReturnOrderReferenceResolver(customers, warehouses);
var resolver = new ReturnOrderReferenceResolver(customers, warehouses, "test-token");
org.junit.jupiter.api.Assertions.assertThrows(org.springframework.web.server.ResponseStatusException.class, () -> resolver.populate(List.of(order())));
var historical = order();
resolver.populateForRead(List.of(historical));
@@ -24,24 +26,55 @@ class ReturnOrderReferenceResolverTest {
@Test
void resolvesMissingReturnReferencesOncePerCustomerAndWarehouseAndPreservesSnapshots() {
var customers = mock(FleetCustomerDirectory.class);
var customers = mock(ReturnCustomerReferenceClient.class);
var warehouses = mock(WarehouseResourceGateway.class);
when(customers.find("1")).thenReturn(new FleetCustomerDirectory.Customer("1", "C1", "测试货主", null, null));
when(customers.customers("test-token", 1, 30, null, "ACTIVE", 1L)).thenReturn(ApiResponse.success(new PageResult<>(
List.of(new ReturnCustomerReferenceClient.Customer(1L, "C1", "测试货主", "ACTIVE", null, null)), 1, 30, 1, 1)));
when(warehouses.requireActiveSharedWarehouse(10L)).thenReturn(new WarehouseResourceGateway.WarehouseReference(10L, "USLAX01", "洛杉矶仓", "ACTIVE"));
LastlegOrder first = order(), second = order(), frozen = order();
frozen.setCustomerName("原货主快照"); frozen.setOverseasWarehouseCode("OLD"); frozen.setOverseasWarehouseName("原仓库快照");
new ReturnOrderReferenceResolver(customers, warehouses).populate(List.of(first, second, frozen));
new ReturnOrderReferenceResolver(customers, warehouses, "test-token").populate(List.of(first, second, frozen));
assertEquals("测试货主", first.getCustomerName());
assertEquals("USLAX01", second.getOverseasWarehouseCode());
assertEquals("洛杉矶仓", second.getOverseasWarehouseName());
assertEquals("原货主快照", frozen.getCustomerName());
assertEquals("原仓库快照", frozen.getOverseasWarehouseName());
verify(customers, times(1)).find("1");
verify(customers, times(1)).customers("test-token", 1, 30, null, "ACTIVE", 1L);
verify(warehouses, times(1)).requireActiveSharedWarehouse(10L);
}
@Test
void foreignOrInactiveCustomerCannotSupplyReturnSnapshot() {
var customers = mock(ReturnCustomerReferenceClient.class);
var warehouses = mock(WarehouseResourceGateway.class);
when(customers.customers("test-token", 1, 30, null, "ACTIVE", 1L)).thenReturn(ApiResponse.success(new PageResult<>(List.of(
new ReturnCustomerReferenceClient.Customer(2L, "C2", "其他客户", "ACTIVE", null, null),
new ReturnCustomerReferenceClient.Customer(1L, "C1", "停用客户", "DISABLED", null, null)), 1, 30, 2, 1)));
var resolver = new ReturnOrderReferenceResolver(customers, warehouses, "test-token");
var error = org.junit.jupiter.api.Assertions.assertThrows(org.springframework.web.server.ResponseStatusException.class,
() -> resolver.populate(List.of(order())));
assertEquals(400, error.getStatusCode().value());
verifyNoInteractions(warehouses);
}
@Test
void unexpectedClientFailureDoesNotHideHistoricalReturnAndKeepsMissingNameUnknown() {
var customers = mock(ReturnCustomerReferenceClient.class);
var warehouses = mock(WarehouseResourceGateway.class);
when(customers.customers("test-token", 1, 30, null, "ACTIVE", 1L)).thenThrow(new IllegalStateException("transport failure"));
when(warehouses.requireActiveSharedWarehouse(10L)).thenReturn(new WarehouseResourceGateway.WarehouseReference(10L, "USLAX01", "洛杉矶仓", "ACTIVE"));
var resolver = new ReturnOrderReferenceResolver(customers, warehouses, "test-token");
var historical = order();
resolver.populateForRead(List.of(historical));
org.junit.jupiter.api.Assertions.assertNull(historical.getCustomerName());
assertEquals("洛杉矶仓", historical.getOverseasWarehouseName());
var error = org.junit.jupiter.api.Assertions.assertThrows(org.springframework.web.server.ResponseStatusException.class,
() -> resolver.populate(List.of(order())));
assertEquals(503, error.getStatusCode().value());
}
private LastlegOrder order() {
var order = new LastlegOrder(); order.setOrderType("RETURN_RELABEL");
order.setCustomerId("1"); order.setOverseasWarehouseId("10"); return order;