2026-06-25 a26b31cc9f3ee9b21b1a754e80fa7359e8a7a8f8
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package cn.iocoder.yudao.module.mes.service.wm.arrivalnotice;
 
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.bean.override.mockito.MockitoBean;
 
import jakarta.annotation.Resource;
 
import java.math.BigDecimal;
import java.util.Arrays;
 
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.*;
 
/**
 * {@link MesWmArrivalNoticeServiceImpl} 的单元测试
 *
 * @author 芋道源码
 */
@Import(MesWmArrivalNoticeServiceImpl.class)
public class MesWmArrivalNoticeServiceImplTest extends BaseDbUnitTest {
 
    @Resource
    private MesWmArrivalNoticeServiceImpl arrivalNoticeService;
 
    @Resource
    private MesWmArrivalNoticeMapper arrivalNoticeMapper;
 
    @MockitoBean
    private MesWmArrivalNoticeLineService arrivalNoticeLineService;
    @MockitoBean
    private MesMdVendorService vendorService;
 
    @Test
    public void testUpdateArrivalNoticeWhenIqcFinish_success_allLinesChecked() {
        // mock 数据:插入一条待质检的到货通知单
        MesWmArrivalNoticeDO notice = randomPojo(MesWmArrivalNoticeDO.class, o -> {
            o.setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus());
        });
        arrivalNoticeMapper.insert(notice);
        // 准备参数
        Long noticeId = notice.getId();
        Long lineId = randomLongId();
        Long iqcId = randomLongId();
        BigDecimal qualifiedQuantity = BigDecimal.valueOf(100);
 
        // mock 行服务方法:所有需检行都已完成(iqcId 不为空)
        MesWmArrivalNoticeLineDO line1 = randomPojo(MesWmArrivalNoticeLineDO.class, o -> {
            o.setNoticeId(noticeId);
            o.setIqcCheckFlag(true);
            o.setIqcId(iqcId); // 已检完
        });
        MesWmArrivalNoticeLineDO line2 = randomPojo(MesWmArrivalNoticeLineDO.class, o -> {
            o.setNoticeId(noticeId);
            o.setIqcCheckFlag(false); // 不需要检验
            o.setIqcId(null);
        });
        when(arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(eq(noticeId)))
                .thenReturn(Arrays.asList(line1, line2));
 
        // 调用
        arrivalNoticeService.updateArrivalNoticeWhenIqcFinish(noticeId, lineId, iqcId, qualifiedQuantity);
 
        // 断言:行回写被调用
        verify(arrivalNoticeLineService).updateArrivalNoticeLineWhenIqcFinish(eq(lineId), eq(iqcId), eq(qualifiedQuantity));
        // 断言:主表状态更新为待入库
        MesWmArrivalNoticeDO updatedNotice = arrivalNoticeMapper.selectById(noticeId);
        assertEquals(MesWmArrivalNoticeStatusEnum.PENDING_RECEIPT.getStatus(), updatedNotice.getStatus());
    }
 
    @Test
    public void testUpdateArrivalNoticeWhenIqcFinish_success_hasUncheckedLines() {
        // mock 数据:插入一条待质检的到货通知单
        MesWmArrivalNoticeDO notice = randomPojo(MesWmArrivalNoticeDO.class, o -> {
            o.setStatus(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus());
        });
        arrivalNoticeMapper.insert(notice);
        // 准备参数
        Long noticeId = notice.getId();
        Long lineId = randomLongId();
        Long iqcId = randomLongId();
        BigDecimal qualifiedQuantity = BigDecimal.valueOf(50);
 
        // mock 行服务方法:还有未完成的需检行
        MesWmArrivalNoticeLineDO line1 = randomPojo(MesWmArrivalNoticeLineDO.class, o -> {
            o.setNoticeId(noticeId);
            o.setIqcCheckFlag(true);
            o.setIqcId(iqcId); // 已检完
        });
        MesWmArrivalNoticeLineDO line2 = randomPojo(MesWmArrivalNoticeLineDO.class, o -> {
            o.setNoticeId(noticeId);
            o.setIqcCheckFlag(true);
            o.setIqcId(null); // 还未检验
        });
        when(arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(eq(noticeId)))
                .thenReturn(Arrays.asList(line1, line2));
 
        // 调用
        arrivalNoticeService.updateArrivalNoticeWhenIqcFinish(noticeId, lineId, iqcId, qualifiedQuantity);
 
        // 断言:行回写被调用
        verify(arrivalNoticeLineService).updateArrivalNoticeLineWhenIqcFinish(eq(lineId), eq(iqcId), eq(qualifiedQuantity));
        // 断言:主表状态不变,仍然是待质检
        MesWmArrivalNoticeDO updatedNotice = arrivalNoticeMapper.selectById(noticeId);
        assertEquals(MesWmArrivalNoticeStatusEnum.PENDING_QC.getStatus(), updatedNotice.getStatus());
    }
 
    @Test
    public void testUpdateArrivalNoticeWhenIqcFinish_noticeNotExists() {
        // 准备参数
        Long noticeId = randomLongId();
        Long lineId = randomLongId();
        Long iqcId = randomLongId();
        BigDecimal qualifiedQuantity = BigDecimal.valueOf(100);
 
        // 调用,并断言异常
        assertServiceException(
                () -> arrivalNoticeService.updateArrivalNoticeWhenIqcFinish(noticeId, lineId, iqcId, qualifiedQuantity),
                WM_ARRIVAL_NOTICE_NOT_EXISTS);
    }
 
    @Test
    public void testUpdateArrivalNoticeWhenIqcFinish_statusNotPendingQc() {
        // mock 数据:插入一条草稿状态的到货通知单(非待质检)
        MesWmArrivalNoticeDO notice = randomPojo(MesWmArrivalNoticeDO.class, o -> {
            o.setStatus(MesWmArrivalNoticeStatusEnum.PREPARE.getStatus());
        });
        arrivalNoticeMapper.insert(notice);
        // 准备参数
        Long noticeId = notice.getId();
        Long lineId = randomLongId();
        Long iqcId = randomLongId();
        BigDecimal qualifiedQuantity = BigDecimal.valueOf(100);
 
        // 调用,并断言异常
        assertServiceException(
                () -> arrivalNoticeService.updateArrivalNoticeWhenIqcFinish(noticeId, lineId, iqcId, qualifiedQuantity),
                WM_ARRIVAL_NOTICE_STATUS_NOT_PENDING_QC);
    }
 
}