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.MesWmStockTakingTaskLineDO;
|
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.Mock;
|
import org.mockito.junit.jupiter.MockitoExtension;
|
import org.springframework.test.util.ReflectionTestUtils;
|
|
import java.math.BigDecimal;
|
import java.util.List;
|
|
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
|
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_STOCK_TAKING_TASK_INCOMPLETE;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.mockito.Mockito.*;
|
|
@ExtendWith(MockitoExtension.class)
|
class MesWmStockTakingCompletionTest {
|
|
private final MesWmStockTakingTaskServiceImpl service = new MesWmStockTakingTaskServiceImpl();
|
@Mock private MesWmStockTakingTaskMapper taskMapper;
|
@Mock private MesWmStockTakingTaskLineService lineService;
|
@Mock private MesWmStockTakingTaskResultService resultService;
|
@Mock private MesWmTransactionService transactionService;
|
|
@BeforeEach
|
void setUp() {
|
ReflectionTestUtils.setField(service, "stockTakingTaskMapper", taskMapper);
|
ReflectionTestUtils.setField(service, "stockTakingTaskLineService", lineService);
|
ReflectionTestUtils.setField(service, "stockTakingTaskResultService", resultService);
|
ReflectionTestUtils.setField(service, "wmTransactionService", transactionService);
|
}
|
|
@Test
|
void missingResultBlocksCompletion() {
|
when(taskMapper.selectById(1L)).thenReturn(task(2));
|
when(lineService.getStockTakingTaskLineListByTaskId(1L)).thenReturn(List.of(line(11L), line(12L)));
|
when(resultService.getStockTakingTaskResultListByTaskId(1L)).thenReturn(List.of(result(11L, BigDecimal.ONE)));
|
|
assertServiceException(() -> service.finishStockTakingTask(1L),
|
WM_STOCK_TAKING_TASK_INCOMPLETE, List.of(12L));
|
verify(taskMapper, never()).updateById(any(MesWmStockTakingTaskDO.class));
|
verifyNoInteractions(transactionService);
|
}
|
|
@Test
|
void countedZeroIsValidAndPostsLoss() {
|
when(taskMapper.selectById(1L)).thenReturn(task(2), task(4));
|
when(taskMapper.claimDifferenceProcessing(1L)).thenReturn(1);
|
when(lineService.getStockTakingTaskLineListByTaskId(1L)).thenReturn(List.of(line(11L)));
|
when(resultService.getStockTakingTaskResultListByTaskId(1L))
|
.thenReturn(List.of(result(11L, BigDecimal.ZERO)));
|
|
service.finishStockTakingTask(1L);
|
|
verify(taskMapper).updateById(argThat((MesWmStockTakingTaskDO value) -> value.getStatus() == 4));
|
verify(transactionService).createTransaction(argThat((MesWmTransactionSaveReqDTO value) -> {
|
assertEquals(2, value.getType());
|
assertEquals(BigDecimal.ONE.negate(), value.getQuantity());
|
return true;
|
}));
|
}
|
|
private MesWmStockTakingTaskDO task(int status) {
|
return new MesWmStockTakingTaskDO().setId(1L).setCode("ST-1").setStatus(status).setFrozen(false);
|
}
|
|
private MesWmStockTakingTaskLineDO line(Long id) {
|
return new MesWmStockTakingTaskLineDO().setId(id).setTaskId(1L)
|
.setMaterialStockId(1039L).setItemId(1996L).setQuantity(BigDecimal.ONE);
|
}
|
|
private MesWmStockTakingTaskResultDO result(Long lineId, BigDecimal actual) {
|
return new MesWmStockTakingTaskResultDO().setTaskId(1L).setLineId(lineId)
|
.setMaterialStockId(1039L).setItemId(1996L)
|
.setQuantity(BigDecimal.ONE).setTakingQuantity(actual);
|
}
|
}
|