package cn.iocoder.yudao.module.mes.service.wm.stocktaking.task; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.stocktaking.task.MesWmStockTakingTaskResultDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.stocktaking.task.MesWmStockTakingTaskMapper; import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; import java.math.BigDecimal; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class MesWmStockTakingDifferenceTest { private final MesWmStockTakingTaskServiceImpl service = new MesWmStockTakingTaskServiceImpl(); @Mock private MesWmStockTakingTaskMapper taskMapper; @Mock private MesWmStockTakingTaskResultService resultService; @Mock private MesWmTransactionService transactionService; @BeforeEach void setUp() { ReflectionTestUtils.setField(service, "stockTakingTaskMapper", taskMapper); ReflectionTestUtils.setField(service, "stockTakingTaskResultService", resultService); ReflectionTestUtils.setField(service, "wmTransactionService", transactionService); } @Test void completedTaskPostsGainAndLossOnce() { when(taskMapper.selectById(1L)).thenReturn(new MesWmStockTakingTaskDO() .setId(1L).setCode("ST-1").setStatus(4)); when(taskMapper.claimDifferenceProcessing(1L)).thenReturn(1, 0); when(resultService.getStockTakingTaskResultListByTaskId(1L)).thenReturn(List.of( result(11L, BigDecimal.ONE, BigDecimal.valueOf(2)), result(12L, BigDecimal.valueOf(3), BigDecimal.ONE))); service.processStockTakingDifference(1L); service.processStockTakingDifference(1L); ArgumentCaptor captor = ArgumentCaptor.forClass(MesWmTransactionSaveReqDTO.class); verify(transactionService, times(2)).createTransaction(captor.capture()); List transactions = captor.getAllValues(); assertEquals(1, transactions.get(0).getType()); assertEquals(BigDecimal.ONE, transactions.get(0).getQuantity()); assertEquals(11L, transactions.get(0).getMaterialStockId()); assertEquals(2, transactions.get(1).getType()); assertEquals(BigDecimal.valueOf(-2), transactions.get(1).getQuantity()); assertEquals(12L, transactions.get(1).getMaterialStockId()); } private MesWmStockTakingTaskResultDO result(Long stockId, BigDecimal book, BigDecimal actual) { return new MesWmStockTakingTaskResultDO().setTaskId(1L).setLineId(stockId) .setMaterialStockId(stockId).setItemId(1996L).setQuantity(book) .setTakingQuantity(actual).setWarehouseId(21L).setLocationId(6L).setAreaId(6L); } }