diff --git a/firstleg/src/main/java/com/baiyue/firstleg/mapper/DropshipPalletizationMapper.java b/firstleg/src/main/java/com/baiyue/firstleg/mapper/DropshipPalletizationMapper.java index f98a64041..36ef0b81f 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/mapper/DropshipPalletizationMapper.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/mapper/DropshipPalletizationMapper.java @@ -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 pallets(@Param("taskId") long taskId); - @Select("SELECT * FROM fl_dropship_pallet WHERE task_id=#{taskId} ORDER BY id") - List generatedPallets(@Param("taskId") long taskId); + @Select("SELECT * FROM fl_dropship_pallet WHERE tenant_id=#{tenantId} AND inbound_id=#{inboundId} ORDER BY id") + List 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}) diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/DropshipPalletizationService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/DropshipPalletizationService.java index e57c853bc..80f6409f7 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/DropshipPalletizationService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/DropshipPalletizationService.java @@ -191,7 +191,8 @@ public class DropshipPalletizationService { public List 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 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; } diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/DropshipPalletizationServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/DropshipPalletizationServiceTest.java index 1920dd6be..33b31b3e7 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/DropshipPalletizationServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/DropshipPalletizationServiceTest.java @@ -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);