gaoluyang
2 天以前 8c65f898ed6e5b0c7a94c792c4562f6ec831dccd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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);
    }
}