| | |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO; |
| | | 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.mysql.pro.bagcode.MesProBagCodeGenerateTaskMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.bagcode.MesProBagCodeReplaceMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.mysql.pro.batch.MesProBatchMapper; |
| | | import cn.iocoder.yudao.module.mes.dal.redis.MesCodeRedisDAO; |
| | | import cn.iocoder.yudao.module.mes.framework.bagcode.MesProBagCodeGenerateProperties; |
| | | import cn.iocoder.yudao.module.mes.framework.qrcode.MesProQrLabelBuilder; |
| | | import cn.iocoder.yudao.module.mes.framework.qrcode.QrCodeImageUtils; |
| | | import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; |
| | |
| | | import org.junit.jupiter.api.Test; |
| | | import org.mockito.ArgumentCaptor; |
| | | import org.springframework.test.util.ReflectionTestUtils; |
| | | import java.util.ArrayList; |
| | | import java.util.Collection; |
| | | import java.util.HashSet; |
| | | import java.util.List; |
| | |
| | | private final MesProBatchMapper batches = mock(MesProBatchMapper.class); |
| | | private final MesProBagCodeReplaceMapper replacements = mock(MesProBagCodeReplaceMapper.class); |
| | | private final MdmUnitMeasureApi units = mock(MdmUnitMeasureApi.class); |
| | | private final MesProBagCodeChunkWriter writer = mock(MesProBagCodeChunkWriter.class); |
| | | private final MesProBagCodeBatchGenerator generator = new MesProBagCodeBatchGenerator(); |
| | | private final MesProBagCodeGenerateProperties properties = new MesProBagCodeGenerateProperties(); |
| | | |
| | | @BeforeEach void setup() { |
| | | ReflectionTestUtils.setField(service, "bagCodeMapper", bags); |
| | |
| | | ReflectionTestUtils.setField(service, "batchMapper", batches); |
| | | ReflectionTestUtils.setField(service, "replaceMapper", replacements); |
| | | ReflectionTestUtils.setField(service, "unitMeasureApi", units); |
| | | ReflectionTestUtils.setField(service, "batchGenerator", generator); |
| | | ReflectionTestUtils.setField(service, "generateProperties", properties); |
| | | ReflectionTestUtils.setField(service, "generateCleaner", mock(MesProBagCodeGenerateCleaner.class)); |
| | | ReflectionTestUtils.setField(service, "generateTaskService", mock(MesProBagCodeGenerateTaskService.class)); |
| | | // 分段执行器使用真实实现,仅把事务写入器与 Redis 取码替换为 mock |
| | | ReflectionTestUtils.setField(generator, "bagCodeMapper", bags); |
| | | ReflectionTestUtils.setField(generator, "taskMapper", mock(MesProBagCodeGenerateTaskMapper.class)); |
| | | ReflectionTestUtils.setField(generator, "codeRedisDao", codes); |
| | | ReflectionTestUtils.setField(generator, "chunkWriter", writer); |
| | | ReflectionTestUtils.setField(generator, "properties", properties); |
| | | doAnswer(invocation -> { |
| | | bags.insertBatch(invocation.getArgument(0)); |
| | | return null; |
| | | }).when(writer).insertBagCodes(anyList()); |
| | | doAnswer(invocation -> { |
| | | List<MesProPalletDO> pallets = invocation.getArgument(0); |
| | | for (int i = 0; i < pallets.size(); i++) { |
| | | pallets.get(i).setId((long) (i + 1)); |
| | | } |
| | | return null; |
| | | }).when(writer).insertPallets(anyList()); |
| | | |
| | | when(items.validateItemExists(1L)).thenReturn(new MesMdmItemDO().setId(1L).setUnitMeasureId(2L)); |
| | | AtomicLong sequence = new AtomicLong(1000000000000000L); |
| | | when(codes.generate()).thenAnswer(invocation -> String.valueOf(sequence.incrementAndGet())); |
| | | when(codes.generateBatch(anyInt())).thenAnswer(invocation -> { |
| | | int count = invocation.getArgument(0); |
| | | List<String> codes = new ArrayList<>(count); |
| | | for (int i = 0; i < count; i++) { |
| | | codes.add(String.valueOf(sequence.incrementAndGet())); |
| | | } |
| | | return codes; |
| | | }); |
| | | when(codes.allocateBagNoStart(anyInt(), any())).thenReturn(1); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | @Test @SuppressWarnings({"unchecked", "rawtypes"}) void automaticPalletCarriesVariety() { |
| | | var pallets=mock(cn.iocoder.yudao.module.mes.dal.mysql.pro.pallet.MesProPalletMapper.class); |
| | | ReflectionTestUtils.setField(service,"palletMapper",pallets); |
| | | when(units.getUnitMeasure(2L)).thenReturn(CommonResult.success(new MdmUnitMeasureRespDTO().setType("2千克"))); |
| | | when(units.getUnitMeasure(2L)).thenReturn(CommonResult.success(new MdmUnitMeasureRespDTO().setType("48袋"))); |
| | | var req=new MesProBagCodeGenerateReqVO();req.setItemId(1L);req.setPalletCount(1); |
| | | service.generateBagCodes(req); |
| | | ArgumentCaptor<Collection<cn.iocoder.yudao.module.mes.dal.dataobject.pro.pallet.MesProPalletDO>> saved=ArgumentCaptor.forClass((Class)Collection.class); |
| | | verify(pallets).insertBatch(saved.capture());assertEquals(1L,saved.getValue().iterator().next().getItemId()); |
| | | ArgumentCaptor<List<MesProPalletDO>> saved=ArgumentCaptor.forClass((Class)List.class); |
| | | verify(writer).insertPallets(saved.capture());assertEquals(1L,saved.getValue().iterator().next().getItemId()); |
| | | } |
| | | |
| | | @Test void replacementIssuesNewPairInsteadOfReusingOldBusinessCode() { |