fix(firstleg): explain coload group eligibility
This commit is contained in:
+4
@@ -41,6 +41,10 @@ class ColoadGroupOpenApiContractTest {
|
||||
.contains("任一冻结成员缺少有效 inboundCode 时失败关闭")
|
||||
.contains("全部 WAIT_SPLIT")
|
||||
.contains("国内仓和渠道一致")
|
||||
.contains("状态非待分柜")
|
||||
.contains("已分配装柜计划")
|
||||
.contains("已在其他同柜组")
|
||||
.contains("平台错误不得展示 orderId、inboundId 或 groupId")
|
||||
.doesNotContain("destinationType")
|
||||
.doesNotContain("destinationWarehouseId")
|
||||
.doesNotContain("destinationCode")
|
||||
|
||||
+66
-7
@@ -123,9 +123,11 @@ class ColoadGroupServiceTest {
|
||||
|
||||
@Test
|
||||
void createsCrossCustomerGroupAndFreezesAllAvailableFragmentsForEveryOrder() {
|
||||
InboundCandidateRow alreadyAllocatedFragment = candidate(101L, 11L, 1004L, 40);
|
||||
alreadyAllocatedFragment.setActiveAllocationCount(1);
|
||||
when(mapper.lockCandidates(List.of(11L, 12L))).thenReturn(List.of(
|
||||
candidate(101L, 11L, 1001L, 30), candidate(101L, 11L, 1003L, 20),
|
||||
candidate(202L, 12L, 1002L, 50)));
|
||||
alreadyAllocatedFragment, candidate(202L, 12L, 1002L, 50)));
|
||||
when(mapper.insertGroup(anyLong(), anyString(), eq(9L), eq("CH"),
|
||||
eq(7L), eq("operator"))).thenReturn(1);
|
||||
when(mapper.insertMember(anyLong(), anyLong(), anyLong(), anyLong(), anyLong(), anyInt()))
|
||||
@@ -152,13 +154,16 @@ class ColoadGroupServiceTest {
|
||||
verify(mapper).insertMember(anyLong(), eq(groupId.getValue()), eq(101L), eq(11L), eq(1001L), eq(30));
|
||||
verify(mapper).insertMember(anyLong(), eq(groupId.getValue()), eq(101L), eq(11L), eq(1003L), eq(20));
|
||||
verify(mapper).insertMember(anyLong(), eq(groupId.getValue()), eq(202L), eq(12L), eq(1002L), eq(50));
|
||||
verify(mapper, never()).insertMember(anyLong(), eq(groupId.getValue()), eq(101L), eq(11L),
|
||||
eq(1004L), anyInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
void rejectsSingleOrderBeforeAnyDatabaseWrite() {
|
||||
assertThatThrownBy(() -> service.create(List.of(11L), "key", 7L, "operator"))
|
||||
.isInstanceOf(BizException.class)
|
||||
.hasMessageContaining("orderIds");
|
||||
.hasMessageContaining("请选择2至100个不同的有效订单")
|
||||
.hasMessageNotContaining("orderId");
|
||||
verify(mapper, never()).insertCommand(anyLong(), anyLong(), anyString(), anyString(), anyString());
|
||||
}
|
||||
|
||||
@@ -173,7 +178,11 @@ class ColoadGroupServiceTest {
|
||||
|
||||
assertThatThrownBy(() -> service.create(List.of(11L, 12L), "key", 7L, "operator"))
|
||||
.isInstanceOf(BizException.class)
|
||||
.hasMessageContaining("不存在可创建");
|
||||
.hasMessageContaining("订单“FO-11”")
|
||||
.hasMessageContaining("入仓码“IN-1001”已分配装柜计划")
|
||||
.hasMessageNotContaining("订单 11")
|
||||
.hasMessageNotContaining("groupId")
|
||||
.hasMessageNotContaining("inboundId");
|
||||
verify(mapper, never()).insertGroup(anyLong(), anyString(), anyLong(), anyString(),
|
||||
anyLong(), any());
|
||||
}
|
||||
@@ -182,14 +191,51 @@ class ColoadGroupServiceTest {
|
||||
void rejectsDifferentWarehouseOrChannel() {
|
||||
InboundCandidateRow second = candidate(202L, 12L, 1002L, 50);
|
||||
second.setWarehouseId(10L);
|
||||
when(mapper.insertCommand(anyLong(), eq(7L), eq("CREATE"), eq("route-key"), anyString()))
|
||||
second.setWarehouseName("东莞仓");
|
||||
when(mapper.insertCommand(anyLong(), eq(7L), eq("CREATE"), anyString(), anyString()))
|
||||
.thenReturn(1);
|
||||
when(mapper.lockCandidates(List.of(11L, 12L))).thenReturn(List.of(
|
||||
candidate(101L, 11L, 1001L, 30), second));
|
||||
|
||||
assertThatThrownBy(() -> service.create(List.of(11L, 12L), "route-key", 7L, "operator"))
|
||||
.isInstanceOf(BizException.class)
|
||||
.hasMessageContaining("同一国内仓和渠道");
|
||||
.hasMessageContaining("入仓码“IN-1001”(义乌仓)")
|
||||
.hasMessageContaining("入仓码“IN-1002”(东莞仓)")
|
||||
.hasMessageContaining("平台收货仓不同");
|
||||
|
||||
InboundCandidateRow otherChannel = candidate(202L, 12L, 1002L, 50);
|
||||
otherChannel.setChannelCode("EXX"); otherChannel.setChannelName("EXX海卡");
|
||||
when(mapper.lockCandidates(List.of(11L, 12L))).thenReturn(List.of(
|
||||
candidate(101L, 11L, 1001L, 30), otherChannel));
|
||||
assertThatThrownBy(() -> service.create(List.of(11L, 12L), "channel-key", 7L, "operator"))
|
||||
.isInstanceOf(BizException.class)
|
||||
.hasMessageContaining("入仓码“IN-1001”(美森海卡)")
|
||||
.hasMessageContaining("入仓码“IN-1002”(EXX海卡)")
|
||||
.hasMessageContaining("渠道不同");
|
||||
}
|
||||
|
||||
@Test
|
||||
void reportsEveryUnavailableReasonUsingBusinessIdentifiers() {
|
||||
when(mapper.insertCommand(anyLong(), eq(7L), eq("CREATE"), anyString(), anyString()))
|
||||
.thenReturn(1);
|
||||
InboundCandidateRow status = candidate(101L, 11L, 1001L, 30);
|
||||
status.setProcessStatus("LOADING");
|
||||
assertUnavailable(status, "state-key", "状态非待分柜");
|
||||
|
||||
InboundCandidateRow grouped = candidate(101L, 11L, 1001L, 30);
|
||||
grouped.setActiveGroupId(900L);
|
||||
assertUnavailable(grouped, "group-key", "已在其他同柜组");
|
||||
|
||||
InboundCandidateRow boxes = candidate(101L, 11L, 1001L, 0);
|
||||
assertUnavailable(boxes, "boxes-key", "箱数无效");
|
||||
|
||||
InboundCandidateRow warehouse = candidate(101L, 11L, 1001L, 30);
|
||||
warehouse.setWarehouseName(" ");
|
||||
assertUnavailable(warehouse, "warehouse-key", "缺少平台收货仓权威快照");
|
||||
|
||||
InboundCandidateRow channel = candidate(101L, 11L, 1001L, 30);
|
||||
channel.setChannelName(null);
|
||||
assertUnavailable(channel, "channel-key", "缺少渠道权威快照");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -342,12 +388,25 @@ class ColoadGroupServiceTest {
|
||||
|
||||
private static InboundCandidateRow candidate(long tenantId, long orderId, long inboundId, int packages) {
|
||||
InboundCandidateRow value = new InboundCandidateRow();
|
||||
value.setTenantId(tenantId); value.setOrderId(orderId); value.setInboundId(inboundId);
|
||||
value.setProcessStatus("WAIT_SPLIT"); value.setWarehouseId(9L); value.setChannelCode("CH");
|
||||
value.setTenantId(tenantId); value.setOrderId(orderId); value.setOrderNo("FO-" + orderId);
|
||||
value.setInboundId(inboundId); value.setInboundCode("IN-" + inboundId);
|
||||
value.setProcessStatus("WAIT_SPLIT"); value.setWarehouseId(9L); value.setWarehouseName("义乌仓");
|
||||
value.setChannelCode("CH"); value.setChannelName("美森海卡");
|
||||
value.setFullPackageCount(packages); value.setActiveAllocationCount(0);
|
||||
return value;
|
||||
}
|
||||
|
||||
private void assertUnavailable(InboundCandidateRow row, String key, String reason) {
|
||||
when(mapper.lockCandidates(List.of(11L, 12L))).thenReturn(List.of(
|
||||
row, candidate(202L, 12L, 1002L, 50)));
|
||||
assertThatThrownBy(() -> service.create(List.of(11L, 12L), key, 7L, "operator"))
|
||||
.isInstanceOf(BizException.class)
|
||||
.hasMessageContaining("订单“FO-11”", "入仓码“IN-1001”", reason)
|
||||
.hasMessageNotContaining("订单 11")
|
||||
.hasMessageNotContaining("groupId")
|
||||
.hasMessageNotContaining("inboundId");
|
||||
}
|
||||
|
||||
private static GroupRow group(long id, String status, Long planId, int version) {
|
||||
GroupRow value = new GroupRow();
|
||||
value.setId(id); value.setGroupNo("CLG-" + id); value.setGroupStatus(status);
|
||||
|
||||
+2
@@ -42,6 +42,8 @@ class ColoadGroupSqlContractTest {
|
||||
String sql = String.join(" ", method.getAnnotation(Select.class).value());
|
||||
assertThat(sql)
|
||||
.contains("FROM fl_inbound_order o")
|
||||
.contains("o.order_no orderNo", "o.inbound_code inboundCode")
|
||||
.contains("o.warehouse_name warehouseName", "o.channel_name channelName")
|
||||
.contains("FROM fl_loading_plan_item item")
|
||||
.contains("item.deleted=0")
|
||||
.contains("member.active_flag=1")
|
||||
|
||||
Reference in New Issue
Block a user