优化
This commit is contained in:
@@ -59,7 +59,8 @@ public interface DropshipPalletizationMapper {
|
||||
@Param("operationId") String operationId,@Param("operatorId") long operatorId,@Param("operatorName") String operatorName);
|
||||
|
||||
@Select("SELECT * FROM fl_dropship_pallet WHERE pallet_no=#{palletNo} FOR UPDATE") PalletRow palletByNo(@Param("palletNo") String palletNo);
|
||||
@Select("SELECT COUNT(*) FROM fl_dropship_pallet WHERE task_id=#{taskId}") int palletCount(@Param("taskId") long taskId);
|
||||
@Select("SELECT COUNT(*) FROM fl_dropship_pallet WHERE tenant_id=#{tenantId} AND inbound_id=#{inboundId}")
|
||||
int palletCountByInbound(@Param("tenantId") long tenantId,@Param("inboundId") long inboundId);
|
||||
@Select("SELECT * FROM fl_dropship_pallet WHERE seal_operation_id=#{operationId}") PalletRow palletBySealOperation(@Param("operationId") String operationId);
|
||||
@Select("""
|
||||
SELECT p.* FROM fl_dropship_pallet p
|
||||
@@ -72,8 +73,8 @@ public interface DropshipPalletizationMapper {
|
||||
WHERE EXISTS(SELECT 1 FROM fl_dropship_pallet_carton c WHERE c.pallet_id=p.id AND c.task_id=#{taskId})
|
||||
ORDER BY p.id
|
||||
""") List<PalletRow> pallets(@Param("taskId") long taskId);
|
||||
@Select("SELECT * FROM fl_dropship_pallet WHERE task_id=#{taskId} ORDER BY id")
|
||||
List<PalletRow> generatedPallets(@Param("taskId") long taskId);
|
||||
@Select("SELECT * FROM fl_dropship_pallet WHERE tenant_id=#{tenantId} AND inbound_id=#{inboundId} ORDER BY id")
|
||||
List<PalletRow> generatedPalletsByInbound(@Param("tenantId") long tenantId,@Param("inboundId") long inboundId);
|
||||
@Select("""
|
||||
SELECT p.* FROM fl_dropship_pallet p
|
||||
WHERE ((p.tenant_id=#{tenantId} AND p.inbound_id=#{inboundId})
|
||||
|
||||
+5
-4
@@ -191,7 +191,8 @@ public class DropshipPalletizationService {
|
||||
public List<Pallet> generatedPallets(long taskId,long warehouseId,long operatorId){
|
||||
TaskRow task=requireTask(taskId,warehouseId);
|
||||
if(task.getAssigneeId()!=null && task.getAssigneeId()!=operatorId) throw conflict("任务已由其他人员领取");
|
||||
return mapper.generatedPallets(taskId).stream().map(p->palletView(p,task.getInboundCode())).toList();
|
||||
return mapper.generatedPalletsByInbound(task.getTenantId(),task.getInboundId()).stream()
|
||||
.map(p->palletView(p,task.getInboundCode())).toList();
|
||||
}
|
||||
|
||||
private PalletRow requireAssignablePallet(TaskRow task,String palletNo){
|
||||
@@ -211,7 +212,7 @@ public class DropshipPalletizationService {
|
||||
private Task view(TaskRow row){
|
||||
List<Pallet> pallets=mapper.pallets(row.getId()).stream().map(p->palletView(p,row.getInboundCode())).toList();
|
||||
int expected=row.getExpectedPalletCount()==null?0:row.getExpectedPalletCount();
|
||||
int generated=mapper.palletCount(row.getId());
|
||||
int generated=mapper.palletCountByInbound(row.getTenantId(),row.getInboundId());
|
||||
boolean palletSetupReady=expected>0 && generated==expected;
|
||||
return new Task(row.getId(),row.getInboundId(),row.getInboundCode(),row.getTenantId(),row.getCustomerName(),row.getWarehouseId(),row.getWarehouseName(),
|
||||
row.getTotalCartons(),row.getCountedCartons(),row.getAllocatedCartons(),row.getCountedCartons()-row.getAllocatedCartons(),row.getDiscrepancyCartons(),
|
||||
@@ -268,8 +269,8 @@ public class DropshipPalletizationService {
|
||||
}
|
||||
private TaskRow requireWorkingTask(long taskId,long warehouseId,long operatorId){ TaskRow task=requireTask(taskId,warehouseId); if(!"CLAIMED".equals(task.getTaskStatus())) throw conflict("请先领取待清点组托任务"); if(!Objects.equals(task.getAssigneeId(),operatorId)) throw conflict("任务不属于当前操作员"); if(!"WAIT_PALLETIZE".equals(task.getProcessStatus())) throw conflict("入仓单已不在待清点组托状态"); requirePalletSetup(task); return task; }
|
||||
private void requirePalletSetup(TaskRow task){ if(!palletSetupReady(task)) throw conflict(palletSetupMessage(task)); }
|
||||
private boolean palletSetupReady(TaskRow task){ return task.getExpectedPalletCount()!=null && task.getExpectedPalletCount()>0 && mapper.palletCount(task.getId())==task.getExpectedPalletCount(); }
|
||||
private String palletSetupMessage(TaskRow task){ int expected=task.getExpectedPalletCount()==null?0:task.getExpectedPalletCount(); return palletSetupMessage(expected,mapper.palletCount(task.getId())); }
|
||||
private boolean palletSetupReady(TaskRow task){ return task.getExpectedPalletCount()!=null && task.getExpectedPalletCount()>0 && mapper.palletCountByInbound(task.getTenantId(),task.getInboundId())==task.getExpectedPalletCount(); }
|
||||
private String palletSetupMessage(TaskRow task){ int expected=task.getExpectedPalletCount()==null?0:task.getExpectedPalletCount(); return palletSetupMessage(expected,mapper.palletCountByInbound(task.getTenantId(),task.getInboundId())); }
|
||||
private static String palletSetupMessage(int expected,int generated){ return "预计 "+expected+" 托,当前仅生成 "+generated+" 个托盘码,请联系后台处理后刷新"; }
|
||||
private TaskRow requireTask(long taskId,long warehouseId){ TaskRow task=mapper.task(taskId,warehouseId); if(task==null) throw new BizException(ResultCode.NOT_FOUND,"未找到当前仓库的一件代发清点组托任务"); return task; }
|
||||
private PalletRow requireOpenPallet(long taskId,long palletId,long warehouseId){ PalletRow p=mapper.pallet(taskId,palletId,warehouseId); if(p==null) throw new BizException(ResultCode.NOT_FOUND,"托盘不存在"); if(!"OPEN".equals(p.getPalletStatus())) throw conflict("托盘已封托,不能修改"); return p; }
|
||||
|
||||
+33
-8
@@ -59,14 +59,39 @@ class DropshipPalletizationServiceTest {
|
||||
verifyNoInteractions(numbers); verify(mapper,never()).insertPallet(anyLong(),anyLong(),anyLong(),anyLong(),anyLong(),anyString(),anyString(),anyLong(),anyString());
|
||||
}
|
||||
|
||||
@Test void taskReadinessCountsGeneratedPalletsByInboundInsteadOfTaskId(){
|
||||
when(mapper.task(10L,100L)).thenReturn(task());
|
||||
when(mapper.palletCountByInbound(1L,30L)).thenReturn(2);
|
||||
when(mapper.pallets(10L)).thenReturn(java.util.List.of());
|
||||
when(mapper.unboundCartons(10L)).thenReturn(java.util.List.of());
|
||||
|
||||
var result=service.task(10L,100L,7L);
|
||||
|
||||
assertThat(result.generatedPalletCount()).isEqualTo(2);
|
||||
assertThat(result.palletSetupReady()).isTrue();
|
||||
verify(mapper).palletCountByInbound(1L,30L);
|
||||
}
|
||||
|
||||
@Test void taskPrintReadsGeneratedPalletsFromTheInboundOrder(){
|
||||
PalletRow generated=pallet(); generated.setTaskId(99L);
|
||||
when(mapper.task(10L,100L)).thenReturn(task());
|
||||
when(mapper.generatedPalletsByInbound(1L,30L)).thenReturn(java.util.List.of(generated));
|
||||
when(mapper.cartons(20L)).thenReturn(java.util.List.of());
|
||||
|
||||
var result=service.generatedPallets(10L,100L,7L);
|
||||
|
||||
assertThat(result).singleElement().extracting("palletNo").isEqualTo("DP-260911-0001");
|
||||
verify(mapper).generatedPalletsByInbound(1L,30L);
|
||||
}
|
||||
|
||||
@Test void resolvesUncountedCartonBeforeQuantityConfirmation(){
|
||||
when(mapper.task(10L,100L)).thenReturn(task()); when(mapper.palletCount(10L)).thenReturn(2); when(mapper.label(10L,"BOX-1")).thenReturn(label());
|
||||
when(mapper.task(10L,100L)).thenReturn(task()); when(mapper.palletCountByInbound(1L,30L)).thenReturn(2); when(mapper.label(10L,"BOX-1")).thenReturn(label());
|
||||
var result=service.resolveCarton(10L,100L,"BOX-1",7L);
|
||||
assertThat(result.inboundCode()).isEqualTo("IN-1"); assertThat(result.skuLines()).extracting("expectedQuantity").containsExactly(12); assertThat(result.canCount()).isTrue();
|
||||
}
|
||||
|
||||
@Test void cartonCanBindDirectlyToAPreGeneratedPallet(){
|
||||
when(mapper.task(10L,100L)).thenReturn(task()); when(mapper.palletCount(10L)).thenReturn(2); when(mapper.label(10L,"BOX-1")).thenReturn(label()); when(mapper.palletByNo("DP-260911-0001")).thenReturn(pallet());
|
||||
when(mapper.task(10L,100L)).thenReturn(task()); when(mapper.palletCountByInbound(1L,30L)).thenReturn(2); when(mapper.label(10L,"BOX-1")).thenReturn(label()); when(mapper.palletByNo("DP-260911-0001")).thenReturn(pallet());
|
||||
when(mapper.addCounted(10L,7L,1,0)).thenReturn(1); when(mapper.carton(eq(10L),anyLong())).thenReturn(carton());
|
||||
when(mapper.pallet(10L,20L,100L)).thenReturn(pallet()); when(mapper.cartons(20L)).thenReturn(java.util.List.of());
|
||||
service.countCarton(10L,countRequest("DP-260911-0001"),7L,"张三");
|
||||
@@ -76,7 +101,7 @@ class DropshipPalletizationServiceTest {
|
||||
|
||||
@Test void cartonCanBindToAnOpenPalletGeneratedForAnotherTaskInTheSameWarehouse(){
|
||||
TaskRow current=task(); PalletRow shared=pallet(); shared.setTaskId(99L); shared.setTenantId(2L); shared.setInboundId(88L);
|
||||
when(mapper.task(10L,100L)).thenReturn(current); when(mapper.palletCount(10L)).thenReturn(2);
|
||||
when(mapper.task(10L,100L)).thenReturn(current); when(mapper.palletCountByInbound(1L,30L)).thenReturn(2);
|
||||
when(mapper.label(10L,"BOX-1")).thenReturn(label()); when(mapper.palletByNo("DP-260911-0001")).thenReturn(shared);
|
||||
when(mapper.addCounted(10L,7L,1,0)).thenReturn(1); when(mapper.carton(eq(10L),anyLong())).thenReturn(carton());
|
||||
when(mapper.pallet(10L,20L,100L)).thenReturn(shared); when(mapper.cartons(20L)).thenReturn(java.util.List.of());
|
||||
@@ -86,14 +111,14 @@ class DropshipPalletizationServiceTest {
|
||||
|
||||
@Test void palletFromAnotherWarehouseCannotBeMixed(){
|
||||
PalletRow other=pallet(); other.setWarehouseId(101L);
|
||||
when(mapper.task(10L,100L)).thenReturn(task()); when(mapper.palletCount(10L)).thenReturn(2);
|
||||
when(mapper.task(10L,100L)).thenReturn(task()); when(mapper.palletCountByInbound(1L,30L)).thenReturn(2);
|
||||
when(mapper.label(10L,"BOX-1")).thenReturn(label()); when(mapper.palletByNo("DP-260911-0001")).thenReturn(other);
|
||||
assertThatThrownBy(()->service.countCarton(10L,countRequest("DP-260911-0001"),7L,"张三"))
|
||||
.isInstanceOf(BizException.class).hasMessageContaining("当前作业仓库");
|
||||
}
|
||||
|
||||
@Test void unknownPalletCodeCannotCreateAnAdHocPallet(){
|
||||
when(mapper.task(10L,100L)).thenReturn(task()); when(mapper.palletCount(10L)).thenReturn(2); when(mapper.label(10L,"BOX-1")).thenReturn(label());
|
||||
when(mapper.task(10L,100L)).thenReturn(task()); when(mapper.palletCountByInbound(1L,30L)).thenReturn(2); when(mapper.label(10L,"BOX-1")).thenReturn(label());
|
||||
var request=countRequest("DP-260911-9999");
|
||||
assertThatThrownBy(()->service.countCarton(10L,request,7L,"张三")).isInstanceOf(BizException.class).hasMessageContaining("测量审核后生成");
|
||||
verify(mapper,never()).insertPallet(anyLong(),anyLong(),anyLong(),anyLong(),anyLong(),anyString(),anyString(),anyLong(),anyString());
|
||||
@@ -101,7 +126,7 @@ class DropshipPalletizationServiceTest {
|
||||
|
||||
private static InboundOrderEntity dropshipInbound(){InboundOrderEntity i=new InboundOrderEntity();i.setId(30L);i.setTenantId(1L);i.setWarehouseId(100L);i.setFulfillmentType("ONE_CLICK_DROPSHIP");i.setTotalPackageCount(8);i.setPalletCount(2);return i;}
|
||||
@Test void incompletePreGeneratedPalletsBlockCounting(){
|
||||
when(mapper.task(10L,100L)).thenReturn(task()); when(mapper.palletCount(10L)).thenReturn(0); when(mapper.label(10L,"BOX-1")).thenReturn(label());
|
||||
when(mapper.task(10L,100L)).thenReturn(task()); when(mapper.palletCountByInbound(1L,30L)).thenReturn(0); when(mapper.label(10L,"BOX-1")).thenReturn(label());
|
||||
var result=service.resolveCarton(10L,100L,"BOX-1",7L);
|
||||
assertThat(result.canCount()).isFalse(); assertThat(result.blockReason()).contains("预计 2 托").contains("当前仅生成 0 个托盘码");
|
||||
assertThatThrownBy(()->service.countCarton(10L,countRequest(null),7L,"张三"))
|
||||
@@ -112,7 +137,7 @@ class DropshipPalletizationServiceTest {
|
||||
TaskRow current=task(); PalletRow sealed=sealedPallet();
|
||||
when(mapper.task(10L,100L)).thenReturn(current); when(mapper.pallet(10L,20L,100L)).thenReturn(sealed);
|
||||
when(mapper.taskIdsByPallet(20L)).thenReturn(java.util.List.of(10L)); when(mapper.unseal(10L,20L,1,100L,"undo-1")).thenReturn(1);
|
||||
when(mapper.palletCount(10L)).thenReturn(2); when(mapper.pallets(10L)).thenReturn(java.util.List.of());
|
||||
when(mapper.palletCountByInbound(1L,30L)).thenReturn(2); when(mapper.pallets(10L)).thenReturn(java.util.List.of());
|
||||
var result=service.unseal(10L,20L,new UnsealPalletRequest(100L,"undo-1",1),7L,"张三");
|
||||
assertThat(result.taskStatus()).isEqualTo("CLAIMED");
|
||||
verify(mapper).activeLoadingAssignmentCount(20L); verify(mapper).unseal(10L,20L,1,100L,"undo-1");
|
||||
@@ -128,7 +153,7 @@ class DropshipPalletizationServiceTest {
|
||||
when(mapper.taskIdsByPallet(20L)).thenReturn(java.util.List.of(10L,11L)); when(mapper.unseal(10L,20L,1,100L,"undo-2")).thenReturn(1);
|
||||
when(mapper.reopenTask(10L)).thenReturn(1); when(mapper.reopenTask(11L)).thenReturn(1);
|
||||
when(mapper.reopenInbound(1L,30L,7L)).thenReturn(1); when(mapper.reopenInbound(2L,31L,7L)).thenReturn(1);
|
||||
when(mapper.palletCount(10L)).thenReturn(2); when(mapper.pallets(10L)).thenReturn(java.util.List.of());
|
||||
when(mapper.palletCountByInbound(1L,30L)).thenReturn(2); when(mapper.pallets(10L)).thenReturn(java.util.List.of());
|
||||
service.unseal(10L,20L,new UnsealPalletRequest(100L,"undo-2",1),7L,"张三");
|
||||
verify(mapper).reopenTask(10L); verify(mapper).reopenTask(11L);
|
||||
verify(mapper).reopenInbound(1L,30L,7L); verify(mapper).reopenInbound(2L,31L,7L);
|
||||
|
||||
Reference in New Issue
Block a user