| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.bagcode.MesProBagCodeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedIndicatorRangeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.MesQcSeedQualityIndicatorDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; |
| | |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.batch.MesWmBatchMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialstock.MesWmMaterialStockMapper; |
| | | import cn.iocoder.yudao.module.mes.enums.wm.MesWmWarehouseTypeEnum; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | | import cn.iocoder.yudao.module.mes.service.pro.batch.MesProBatchService; |
| | | import cn.iocoder.yudao.module.mes.service.qc.approver.MesQcApproverService; |
| | | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| | |
| | | private final MesWmMaterialStockMapper stocks=mock(MesWmMaterialStockMapper.class); |
| | | private final MesWmWarehouseService warehouses=mock(MesWmWarehouseService.class); |
| | | private final MesQcApproverService approvers=mock(MesQcApproverService.class); |
| | | private final MesQcSeedIndicatorRangeService ranges=mock(MesQcSeedIndicatorRangeService.class); |
| | | private final MesMdmItemService items=mock(MesMdmItemService.class); |
| | | private final MesProBagCodeDO first=bag(1L),second=bag(2L),canceled=bag(3L).setStatus(30); |
| | | private MesQcSeedQualityGroupSubmitReqVO req; |
| | | private MesProBagCodeDO bag(Long id) {return new MesProBagCodeDO().setId(id).setCode("B"+id).setBatchId(10L).setPalletId(20L).setStatus(20).setInboundEventId(9L);} |
| | | private List<MesQcSeedQualitySubmitReqVO.Indicator> validIndicators() { |
| | | return List.of(indicator("purity"), indicator("cleanliness"), indicator("germination_rate"), indicator("moisture")); |
| | | } |
| | | private MesQcSeedIndicatorRangeDO range(String code) { |
| | | var range = new MesQcSeedIndicatorRangeDO(); |
| | | range.setIndicatorCode(code); range.setIndicatorName(code); range.setUnit("%"); |
| | | range.setMinValue(java.math.BigDecimal.ZERO); range.setMaxValue(java.math.BigDecimal.TEN); |
| | | return range; |
| | | } |
| | | private MesQcSeedQualitySubmitReqVO.Indicator indicator(String code) { |
| | | var item = new MesQcSeedQualitySubmitReqVO.Indicator(); item.setCode(code); |
| | |
| | | ReflectionTestUtils.setField(service,"proBatchService",batchService);ReflectionTestUtils.setField(service,"mesWmBatchMapper",wmBatches); |
| | | ReflectionTestUtils.setField(service,"materialStockMapper",stocks);ReflectionTestUtils.setField(service,"warehouseService",warehouses); |
| | | ReflectionTestUtils.setField(service,"approverService",approvers); |
| | | ReflectionTestUtils.setField(service,"rangeService",ranges); |
| | | ReflectionTestUtils.setField(service,"mdmItemService",items); |
| | | when(ranges.getEffectiveRanges(any())).thenReturn(List.of(range("purity"),range("cleanliness"),range("germination_rate"),range("moisture"))); |
| | | when(ranges.getEffectiveMap(any())).thenReturn(java.util.Map.of()); |
| | | when(items.getItem(any())).thenReturn(null); |
| | | var batch=new MesProBatchDO().setId(10L).setCode("BATCH").setBusinessCode("BATCH-BUS").setItemId(99L).setStatus(30); |
| | | when(batches.selectByScanCode(anyString())).thenReturn(batch);when(batches.selectByScanCodeForUpdate(anyString())).thenReturn(batch); |
| | | when(batchService.getBatch(10L)).thenReturn(batch); |
| | |
| | | java.util.Collection<Long> ids = invocation.getArgument(0); |
| | | return List.of(first, second).stream().filter(bag -> ids.contains(bag.getId())).toList(); |
| | | }); |
| | | req=new MesQcSeedQualityGroupSubmitReqVO();req.setCode("BATCH-BUS");req.setScanType("BATCH");req.setBagIds(List.of(1L,2L)); |
| | | req=new MesQcSeedQualityGroupSubmitReqVO();req.setCode("BATCH-BUS");req.setQcLine(1);req.setScanType("BATCH");req.setBagIds(List.of(1L,2L)); |
| | | req.setQualifiedWarehouseId(8L);req.setIndicators(validIndicators()); |
| | | } |
| | | @Test void batchPreviewCountsEffectiveInspectedAndPendingBags() { |
| | | when(qualities.selectListByCodes(any())).thenReturn(List.of(MesQcSeedQualityDO.builder().code("B1").build())); |
| | | when(qualities.selectListByCodes(any())).thenReturn(List.of(MesQcSeedQualityDO.builder().code("B1").qcLine(1).build())); |
| | | var result=service.resolveScan("BATCH-BUS","BATCH");assertEquals(2,result.get("totalCount")); |
| | | assertEquals(List.of(1L),result.get("completedBagIds"));assertEquals(List.of(2L),result.get("pendingBagIds")); |
| | | verify(qualities,never()).insertBatch(anyCollection(),anyInt()); |
| | | } |
| | | @Test void palletProcessesOnlyConfirmedUninspectedBags() { |
| | | req.setScanType("PALLET");req.setCode("PALLET-BUS");req.setBagIds(List.of(2L)); |
| | | when(qualities.selectListByCodes(any())).thenReturn(List.of(MesQcSeedQualityDO.builder().code("B1").build())); |
| | | when(qualities.selectListByCodes(any())).thenReturn(List.of(MesQcSeedQualityDO.builder().code("B1").qcLine(1).build())); |
| | | when(qualities.selectListByCodesForUpdate(List.of("B2"))).thenReturn(List.of()); |
| | | assertEquals(1,service.submitGroup(req).get("processedCount")); |
| | | verify(qualities).insertBatch(argThat(rows -> rows.size() == 1 && rows.iterator().next().getCode().equals("B2") |
| | | && rows.iterator().next().getQualifiedWarehouseId().equals(8L)),eq(100)); |
| | | verify(indicators).insertBatch(argThat(rows -> rows.size() == 4),eq(400)); |
| | | verify(actions).insertBatch(argThat(rows -> rows.size() == 1),eq(100)); |
| | | // 一次提交同时生成加工部、销售部两条记录,指标与结论一致。 |
| | | verify(qualities).insertBatch(argThat(rows -> rows.size() == 2 && rows.stream().allMatch(row -> row.getCode().equals("B2") |
| | | && row.getQualifiedWarehouseId().equals(8L)) |
| | | && rows.stream().map(MesQcSeedQualityDO::getQcLine).collect(java.util.stream.Collectors.toSet()) |
| | | .equals(java.util.Set.of(1, 2))),eq(100)); |
| | | verify(indicators).insertBatch(argThat(rows -> rows.size() == 8),eq(400)); |
| | | verify(actions).insertBatch(argThat(rows -> rows.size() == 2),eq(100)); |
| | | } |
| | | @Test void changedConfirmedListDoesNotSubmitAnyBag() { |
| | | req.setBagIds(List.of(1L));assertThrows(IllegalArgumentException.class,()->service.submitGroup(req));verify(qualities,never()).insertBatch(anyCollection(),anyInt()); |
| | |
| | | } |
| | | @Test void retestScopePreviewSeparatesWorkflowStages() { |
| | | when(qualities.selectListByCodes(any())).thenReturn(List.of( |
| | | MesQcSeedQualityDO.builder().id(11L).code("B1").workflowStatus(10).build(), |
| | | MesQcSeedQualityDO.builder().id(12L).code("B2").workflowStatus(50).build())); |
| | | MesQcSeedQualityDO.builder().id(11L).code("B1").qcLine(1).workflowStatus(10).build(), |
| | | MesQcSeedQualityDO.builder().id(12L).code("B2").qcLine(1).workflowStatus(50).build())); |
| | | var result = service.resolveRetestScope("PALLET-BUS", "PALLET"); |
| | | assertEquals(List.of(11L), result.get("retestIds")); |
| | | assertEquals(List.of(12L), result.get("initialRecheckIds")); |
| | |
| | | var third = bag(3L); var fourth = bag(4L); |
| | | when(bags.selectListByPalletId(20L)).thenReturn(List.of(first, second, third, fourth)); |
| | | when(qualities.selectListByCodes(any())).thenReturn(List.of( |
| | | MesQcSeedQualityDO.builder().id(11L).code("B1").workflowStatus(20).build(), |
| | | MesQcSeedQualityDO.builder().id(12L).code("B2").workflowStatus(25).build(), |
| | | MesQcSeedQualityDO.builder().id(13L).code("B3").workflowStatus(30).build(), |
| | | MesQcSeedQualityDO.builder().id(14L).code("B4").workflowStatus(60).build())); |
| | | MesQcSeedQualityDO.builder().id(11L).code("B1").qcLine(1).workflowStatus(20).build(), |
| | | MesQcSeedQualityDO.builder().id(12L).code("B2").qcLine(1).workflowStatus(25).build(), |
| | | MesQcSeedQualityDO.builder().id(13L).code("B3").qcLine(1).workflowStatus(30).build(), |
| | | MesQcSeedQualityDO.builder().id(14L).code("B4").qcLine(1).workflowStatus(60).build())); |
| | | var result = service.resolveRetestScope("PALLET-BUS", "PALLET"); |
| | | assertEquals(List.of(11L), result.get("pendingProcessIds")); |
| | | assertEquals(List.of(12L), result.get("pendingInitialFailIds")); |
| | |
| | | } |
| | | @Test void retestScopeRejectsStaleConfirmedList() { |
| | | when(qualities.selectListByCodes(any())).thenReturn(List.of( |
| | | MesQcSeedQualityDO.builder().id(11L).code("B1").workflowStatus(10).build(), |
| | | MesQcSeedQualityDO.builder().id(12L).code("B2").workflowStatus(10).build())); |
| | | MesQcSeedQualityDO.builder().id(11L).code("B1").qcLine(1).workflowStatus(10).build(), |
| | | MesQcSeedQualityDO.builder().id(12L).code("B2").qcLine(1).workflowStatus(10).build())); |
| | | var request = new MesQcSeedQualityScopeRetestReqVO(); |
| | | request.setCode("BATCH-BUS"); request.setScanType("BATCH"); request.setWorkflowStatus(10); |
| | | request.setCode("BATCH-BUS"); request.setScanType("BATCH"); request.setQcLine(1); request.setWorkflowStatus(10); |
| | | request.setQualityIds(List.of(11L)); request.setIndicators(validIndicators()); |
| | | assertThrows(IllegalArgumentException.class, () -> service.retestScope(request)); |
| | | verify(indicators, never()).updateBatch(anyCollection(), anyInt()); |
| | | } |
| | | @Test void retestScopeProcessesAllConfirmedBags() { |
| | | var pending = List.of(MesQcSeedQualityDO.builder().id(11L).code("B1").workflowStatus(10).build(), |
| | | MesQcSeedQualityDO.builder().id(12L).code("B2").workflowStatus(10).build()); |
| | | var pending = List.of(MesQcSeedQualityDO.builder().id(11L).code("B1").qcLine(1).workflowStatus(10).build(), |
| | | MesQcSeedQualityDO.builder().id(12L).code("B2").qcLine(1).workflowStatus(10).build()); |
| | | when(qualities.selectListByCodes(any())).thenReturn(pending); |
| | | when(qualities.selectListByIdsForUpdate(List.of(11L, 12L))).thenReturn(pending); |
| | | when(indicators.selectListByQualityIds(any())).thenReturn(storedIndicators(11L, 12L)); |
| | | var request = new MesQcSeedQualityScopeRetestReqVO(); |
| | | request.setCode("BATCH-BUS"); request.setScanType("BATCH"); request.setWorkflowStatus(10); |
| | | request.setCode("BATCH-BUS"); request.setScanType("BATCH"); request.setQcLine(1); request.setWorkflowStatus(10); |
| | | request.setQualityIds(List.of(11L, 12L)); request.setIndicators(validIndicators()); |
| | | assertEquals(2, service.retestScope(request).get("processedCount")); |
| | | verify(indicators).selectListByQualityIds(List.of(11L, 12L)); |