云
2026-10-29 a1a94ab39a3ac9cc28601e3381b3b4fbc0cda02a
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
package cn.iocoder.yudao.module.mes.service.wm.productsales;
 
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLineSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.service.qc.oqc.MesQcOqcService;
import cn.iocoder.yudao.module.erp.api.sale.ErpSaleOrderApi;
import cn.iocoder.yudao.module.erp.api.sale.dto.ErpSaleOrderItemRespDTO;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.mes.service.wm.salesnotice.MesWmSalesNoticeLineService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
 
import java.math.BigDecimal;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
 
@ExtendWith(MockitoExtension.class)
class MesWmProductSalesLineReelTest {
    @InjectMocks private MesWmProductSalesLineServiceImpl service;
    @Mock private MesWmProductSalesLineMapper mapper;
    @Mock private MesWmProductSalesService salesService;
    @Mock private MesWmSalesNoticeLineService noticeService;
    @Mock private MesMdmItemService itemService;
    @Mock private MesQcOqcService oqcService;
    @Mock private ErpSaleOrderApi saleOrderApi;
 
    @Test
    void directSaleRetainsSelectedOrderItem() {
        var req = new MesWmProductSalesLineSaveReqVO();
        req.setSalesId(1L);
        req.setSaleOrderItemId(5L);
        req.setItemId(3L);
        req.setQuantity(BigDecimal.ONE);
        when(salesService.validateProductSalesExistsAndDraft(1L))
                .thenReturn(MesWmProductSalesDO.builder().id(1L).saleOrderId(4L).build());
        var item = new ErpSaleOrderItemRespDTO();
        item.setId(5L);
        item.setOrderId(4L);
        item.setProductId(3L);
        when(saleOrderApi.getSaleOrderItem(5L)).thenReturn(CommonResult.success(item));
        service.createProductSalesLine(req);
        var line = ArgumentCaptor.forClass(MesWmProductSalesLineDO.class);
        verify(mapper).insert(line.capture());
        assertEquals(5L, line.getValue().getSaleOrderItemId());
    }
 
    @Test
    void directSaleRejectsItemFromAnotherOrder() {
        var req = new MesWmProductSalesLineSaveReqVO();
        req.setSalesId(1L);
        req.setSaleOrderItemId(5L);
        req.setItemId(3L);
        req.setQuantity(BigDecimal.ONE);
        when(salesService.validateProductSalesExistsAndDraft(1L))
                .thenReturn(MesWmProductSalesDO.builder().id(1L).saleOrderId(4L).build());
        var item = new ErpSaleOrderItemRespDTO();
        item.setOrderId(99L);
        item.setProductId(3L);
        when(saleOrderApi.getSaleOrderItem(5L)).thenReturn(CommonResult.success(item));
        assertThrows(RuntimeException.class, () -> service.createProductSalesLine(req));
        verify(mapper, never()).insert(any(MesWmProductSalesLineDO.class));
    }
 
    private MesWmProductSalesLineSaveReqVO request() {
        var req = new MesWmProductSalesLineSaveReqVO();
        req.setSalesId(1L);
        req.setNoticeLineId(2L);
        req.setItemId(3L);
        req.setQuantity(BigDecimal.ONE);
        when(salesService.validateProductSalesExistsAndDraft(1L))
                .thenReturn(MesWmProductSalesDO.builder().id(1L).noticeId(4L).build());
        when(noticeService.validateSalesNoticeLineExists(2L, 4L))
                .thenReturn(MesWmSalesNoticeLineDO.builder().id(2L).itemId(3L)
                        .quantity(BigDecimal.ONE).saleOrderItemId(5L).build());
        return req;
    }
 
    @Test
    void createRetainsSalesItemForReelGuard() {
        service.createProductSalesLine(request());
        var line = ArgumentCaptor.forClass(MesWmProductSalesLineDO.class);
        verify(mapper).insert(line.capture());
        assertEquals(5L, line.getValue().getSaleOrderItemId());
    }
 
    @Test
    void enablingInspectionRetainsSalesItemForOqc() {
        var req = request();
        req.setId(6L);
        req.setOqcCheckFlag(true);
        when(mapper.selectById(6L)).thenReturn(MesWmProductSalesLineDO.builder()
                .id(6L).salesId(1L).oqcCheckFlag(false).build());
        when(salesService.getProductSales(1L)).thenReturn(MesWmProductSalesDO.builder().id(1L).build());
        when(oqcService.createOqcFromProductSales(eq(1L), any(), any(), any())).thenReturn(7L);
        service.updateProductSalesLine(req);
        var line = ArgumentCaptor.forClass(MesWmProductSalesLineDO.class);
        verify(oqcService).createOqcFromProductSales(eq(1L), line.capture(), any(), any());
        assertEquals(5L, line.getValue().getSaleOrderItemId());
    }
}