fix(lastleg): keep completed containers editable
This commit is contained in:
+19
@@ -16,6 +16,7 @@ import com.baiyue.lastleg.shipping.service.ContainerShippingNodeConsumer;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
|
||||
import java.util.Set;
|
||||
@@ -88,6 +89,24 @@ class LastlegOrderControllerTest {
|
||||
verify(service).containerProgressPage(summaryQuery);
|
||||
}
|
||||
|
||||
@Test
|
||||
void containerEndpointsUseCanonicalLastMileOrderAuthorities() throws Exception {
|
||||
var list = LastlegOrderController.class.getMethod("containerSummaries",
|
||||
AuthenticatedUser.class, LastlegOrderRequests.ContainerProgressQuery.class);
|
||||
var detail = LastlegOrderController.class.getMethod("containerSummaryDetail",
|
||||
AuthenticatedUser.class, String.class);
|
||||
var change = LastlegOrderController.class.getMethod("changeReceivingWarehouse",
|
||||
AuthenticatedUser.class, String.class, String.class,
|
||||
LastlegOrderRequests.ChangeReceivingWarehouse.class);
|
||||
|
||||
assertEquals("hasAuthority('platform:overseas-warehouse:last-mile-order:list')",
|
||||
list.getAnnotation(PreAuthorize.class).value());
|
||||
assertEquals("hasAuthority('platform:overseas-warehouse:last-mile-order:list')",
|
||||
detail.getAnnotation(PreAuthorize.class).value());
|
||||
assertEquals("hasAuthority('platform:overseas-warehouse:last-mile-order:edit')",
|
||||
change.getAnnotation(PreAuthorize.class).value());
|
||||
}
|
||||
|
||||
@Test
|
||||
void containerSummariesRejectMerchantIdentity() {
|
||||
var summaryQuery = new LastlegOrderRequests.ContainerProgressQuery(1, 20, null, null, null);
|
||||
|
||||
+11
-5
@@ -18,6 +18,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
class ContainerPlanProgressContractTest {
|
||||
@@ -40,8 +41,8 @@ class ContainerPlanProgressContractTest {
|
||||
String sql = String.join("", rows.value()).toLowerCase();
|
||||
assertTrue(sql.contains("left join ll_inbound_plan"));
|
||||
assertTrue(sql.contains("o.estimated_warehouse_at"));
|
||||
assertTrue(sql.contains("having count(distinct case when p.id is not null"));
|
||||
assertTrue(sql.contains("< count(distinct nullif(trim(o.inbound_code),''))"));
|
||||
assertTrue(sql.contains("group by o.source_container_booking_id"));
|
||||
assertFalse(sql.contains("having "));
|
||||
assertTrue(sql.contains("progress.plannedarrivalat asc"));
|
||||
assertTrue(sql.contains("progress.sourcecontainerbookingid asc"));
|
||||
assertTrue(sql.contains("limit #{limit} offset #{offset}"));
|
||||
@@ -58,7 +59,12 @@ class ContainerPlanProgressContractTest {
|
||||
assertTrue(openApi.contains("/api/platform/v1/last-leg/orders/container-summaries/{sourceContainerBookingId}:"));
|
||||
assertTrue(openApi.contains("ContainerPlanProgressSummary:"));
|
||||
assertTrue(openApi.contains("allPlansReady:"));
|
||||
assertTrue(openApi.contains("仅返回仍有入仓码待生成有效独立计划的柜"));
|
||||
assertTrue(openApi.contains("返回全部稳定来源柜"));
|
||||
assertTrue(openApi.contains("全部入仓码均已生成有效独立计划的柜仍保留"));
|
||||
assertTrue(openApi.contains("权限 platform:overseas-warehouse:last-mile-order:list"));
|
||||
assertTrue(openApi.contains("权限 platform:overseas-warehouse:last-mile-order:edit"));
|
||||
assertFalse(openApi.contains("platform:overseas-warehouse:order:list"));
|
||||
assertFalse(openApi.contains("platform:overseas-warehouse:order:edit"));
|
||||
assertTrue(openApi.contains("ll_order.estimated_warehouse_at"));
|
||||
assertTrue(schema.contains("idx_ll_order_container_progress(source_container_booking_id,estimated_warehouse_at,created_at,id)"));
|
||||
assertTrue(deployment.contains("idx_ll_order_container_progress(source_container_booking_id,estimated_warehouse_at,created_at,id)"));
|
||||
@@ -77,8 +83,8 @@ class ContainerPlanProgressContractTest {
|
||||
|
||||
assertTrue(sql.contains("source_container_booking_id<>''"));
|
||||
assertTrue(sql.contains("LEFT JOIN ll_inbound_plan"));
|
||||
assertTrue(sql.contains("HAVING COUNT(DISTINCT CASE WHEN p.id IS NOT NULL"));
|
||||
assertTrue(sql.contains("< COUNT(DISTINCT NULLIF(TRIM(o.inbound_code),''))"));
|
||||
assertTrue(sql.contains("GROUP BY o.source_container_booking_id"));
|
||||
assertFalse(sql.contains("HAVING "));
|
||||
assertTrue(!sql.contains("<"));
|
||||
}
|
||||
}
|
||||
|
||||
+26
-3
@@ -86,7 +86,7 @@ class LastlegOrderServiceTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
void changesReceivingWarehouseForWholeContainerBeforePdaSession() {
|
||||
void changesReceivingWarehouseForAllPlansReadyContainerBeforePdaSession() {
|
||||
LastlegOrder first = order(1L, "100", "PENDING_ASSIGNMENT", null);
|
||||
LastlegOrder second = order(2L, "200", "PENDING_ASSIGNMENT", null);
|
||||
for (LastlegOrder value : List.of(first, second)) {
|
||||
@@ -94,8 +94,8 @@ class LastlegOrderServiceTest {
|
||||
value.setOverseasWarehouseCode("US-LAX-01"); value.setOverseasWarehouseName("洛杉矶仓");
|
||||
}
|
||||
var updated = new ContainerPlanProgressSummary("BOOKING-1", "MSCU6639870", "900",
|
||||
"US-NYC-01", "纽约仓", 1, true, null, 2, 2, 0, 0, 0, 2,
|
||||
null, false, "存在2票尚未生成有效入库计划");
|
||||
"US-NYC-01", "纽约仓", 1, true, null, 2, 2, 0, 2, 2, 0,
|
||||
null, true, null);
|
||||
when(orders.lockContainerOrders("BOOKING-1")).thenReturn(List.of(first, second));
|
||||
when(warehouseResourceGateway.requireActiveSharedWarehouse(900L)).thenReturn(
|
||||
new WarehouseResourceGateway.WarehouseReference(900L, "US-NYC-01", "纽约仓", "ACTIVE"));
|
||||
@@ -107,6 +107,8 @@ class LastlegOrderServiceTest {
|
||||
new LastlegOrderRequests.ChangeReceivingWarehouse(900L, 0, "改派纽约"), "admin");
|
||||
|
||||
assertEquals("US-NYC-01", result.overseasWarehouseCode());
|
||||
assertTrue(result.allPlansReady());
|
||||
assertTrue(result.canChangeReceivingWarehouse());
|
||||
verify(orders).updateContainerPlanReceivingWarehouse("BOOKING-1", 900L);
|
||||
verify(receivingWarehouseOperations).insert(any(com.baiyue.lastleg.entity.ReceivingWarehouseOperation.class));
|
||||
}
|
||||
@@ -360,6 +362,27 @@ class LastlegOrderServiceTest {
|
||||
assertTrue(result.records().get(1).canChangeReceivingWarehouse());
|
||||
}
|
||||
|
||||
@Test
|
||||
void containerProgressPageKeepsReadyAndPdaLockedContainersVisible() {
|
||||
var query = new LastlegOrderRequests.ContainerProgressQuery(1, 10, null, null, null);
|
||||
var ready = summary(true, 0, null);
|
||||
var locked = new ContainerPlanProgressSummary("BOOKING-2", "TSTU0000061",
|
||||
"193000000000200003", "US-LAX-01", "洛杉矶仓", 4, false,
|
||||
"海外PDA已建立接柜会话,接柜仓已永久锁定", 1, 1, 0, 1, 1, 0,
|
||||
LocalDateTime.of(2026, 10, 4, 9, 0), true, null);
|
||||
when(orders.countContainerProgress(query)).thenReturn(2L);
|
||||
when(orders.pageContainerProgress(query, 0, 10)).thenReturn(List.of(ready, locked));
|
||||
|
||||
var result = service.containerProgressPage(query);
|
||||
|
||||
assertEquals(List.of(ready, locked), result.records());
|
||||
assertTrue(result.records().get(0).allPlansReady());
|
||||
assertTrue(result.records().get(0).canChangeReceivingWarehouse());
|
||||
assertFalse(result.records().get(1).canChangeReceivingWarehouse());
|
||||
assertEquals("海外PDA已建立接柜会话,接柜仓已永久锁定",
|
||||
result.records().get(1).receivingWarehouseLockReason());
|
||||
}
|
||||
|
||||
private static ContainerPlanProgressSummary summary(boolean ready, long pending, String reason) {
|
||||
return new ContainerPlanProgressSummary("BOOKING-1", "MSCU6639870", "193000000000200003",
|
||||
"US-LAX-01", "洛杉矶仓", 0, true, null, 15, 15, 0,
|
||||
|
||||
Reference in New Issue
Block a user