云
2026-10-29 0a2206a53d5889b6095f4819c263be858d86ca91
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package cn.iocoder.yudao.module.mes.service.wm.returnsales;
 
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
 
import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesDetailMapper;
 
import java.math.BigDecimal;
import java.util.List;
 
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
 
/**
 * {@link MesWmReturnSalesLineServiceImpl} 的单元测试类
 *
 * @author 超级管理员
 */
@Import(MesWmReturnSalesLineServiceImpl.class)
public class MesWmReturnSalesLineServiceImplTest extends BaseDbUnitTest {
 
    @Resource
    private MesWmReturnSalesLineServiceImpl returnSalesLineService;
 
    @Resource
    private MesWmReturnSalesLineMapper returnSalesLineMapper;
 
    @MockitoBean
    private MesWmReturnSalesService returnSalesService;
 
    @MockitoBean
    private MesMdItemService itemService;
 
    @MockitoBean
    private MesWmBatchService batchService;
 
    @MockitoBean
    private MesWmReturnSalesDetailService returnSalesDetailService;
    @MockitoBean
    private MesMdmItemService mdmItemService;
    @MockitoBean
    private ErpSaleOrderApi saleOrderApi;
    @MockitoBean
    private MesWmProductSalesDetailMapper productSalesDetailMapper;
 
    @Test
    public void testUpdateReturnSalesLineWhenRqcFinish_allPass() {
        // 准备参数:全部合格
        Integer checkResult = MesQcCheckResultEnum.QUALIFIED.getType();
        BigDecimal qualifiedQty = new BigDecimal("100");
        BigDecimal unqualifiedQty = BigDecimal.ZERO;
 
        // mock 数据
        MesWmReturnSalesLineDO lineDO = randomPojo(MesWmReturnSalesLineDO.class, o -> o.setQuantity(qualifiedQty));
        returnSalesLineMapper.insert(lineDO);
 
        // 调用(sourceDocId 传 null 不联动主表状态)
        returnSalesLineService.updateReturnSalesLineWhenRqcFinish(
                lineDO.getId(), null, checkResult, qualifiedQty, unqualifiedQty);
 
        // 断言:验证质量状态更新为合格
        MesWmReturnSalesLineDO updateLine = returnSalesLineMapper.selectById(lineDO.getId());
        assertEquals(MesWmQualityStatusEnum.PASS.getStatus(), updateLine.getQualityStatus());
    }
 
    @Test
    public void testUpdateReturnSalesLineWhenRqcFinish_allFail() {
        // 准备参数:全部不合格
        Integer checkResult = MesQcCheckResultEnum.QUALIFIED.getType();
        BigDecimal qualifiedQty = BigDecimal.ZERO;
        BigDecimal unqualifiedQty = new BigDecimal("100");
 
        // mock 数据
        MesWmReturnSalesLineDO lineDO = randomPojo(MesWmReturnSalesLineDO.class, o -> o.setQuantity(unqualifiedQty));
        returnSalesLineMapper.insert(lineDO);
 
        // 调用
        returnSalesLineService.updateReturnSalesLineWhenRqcFinish(
                lineDO.getId(), null, checkResult, qualifiedQty, unqualifiedQty);
 
        // 断言:验证质量状态更新为不合格
        MesWmReturnSalesLineDO updateLine = returnSalesLineMapper.selectById(lineDO.getId());
        assertEquals(MesWmQualityStatusEnum.FAIL.getStatus(), updateLine.getQualityStatus());
    }
 
    @Test
    public void testUpdateReturnSalesLineWhenRqcFinish_partialSplit() {
        // 准备参数:部分合格部分不合格,触发行拆分
        Integer checkResult = MesQcCheckResultEnum.QUALIFIED.getType();
        BigDecimal qualifiedQty = new BigDecimal("70");
        BigDecimal unqualifiedQty = new BigDecimal("30");
 
        // mock 数据
        MesWmReturnSalesLineDO lineDO = randomPojo(MesWmReturnSalesLineDO.class, o ->
                o.setQuantity(new BigDecimal("100")));
        returnSalesLineMapper.insert(lineDO);
 
        // 调用
        returnSalesLineService.updateReturnSalesLineWhenRqcFinish(
                lineDO.getId(), null, checkResult, qualifiedQty, unqualifiedQty);
 
        // 断言:原行变为合格,数量调整为合格数量
        MesWmReturnSalesLineDO originalLine = returnSalesLineMapper.selectById(lineDO.getId());
        assertEquals(MesWmQualityStatusEnum.PASS.getStatus(), originalLine.getQualityStatus());
        assertEquals(0, qualifiedQty.compareTo(originalLine.getQuantity()));
 
        // 断言:新增了一行不合格品
        List<MesWmReturnSalesLineDO> allLines = returnSalesLineMapper.selectListByReturnId(lineDO.getReturnId());
        assertEquals(2, allLines.size());
        MesWmReturnSalesLineDO newLine = allLines.stream()
                .filter(l -> !l.getId().equals(lineDO.getId()))
                .findFirst().orElse(null);
        assertNotNull(newLine);
        assertEquals(MesWmQualityStatusEnum.FAIL.getStatus(), newLine.getQualityStatus());
        assertEquals(0, unqualifiedQty.compareTo(newLine.getQuantity()));
    }
 
}