gaoluyang
7 天以前 6b8585fc452ecdcaa82d86fab79a9f27bb442851
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 enablingInspectionKeepsSalesItemAndDefersOqcToLink() {
        var req = request();
        req.setId(6L);
        req.setOqcCheckFlag(true);
        when(mapper.selectById(6L)).thenReturn(MesWmProductSalesLineDO.builder()
                .id(6L).salesId(1L).oqcCheckFlag(false).build());
        service.updateProductSalesLine(req);
        var line = ArgumentCaptor.forClass(MesWmProductSalesLineDO.class);
        verify(mapper).updateById(line.capture());
        assertEquals(5L, line.getValue().getSaleOrderItemId());
        // 检验单由质检人员录入后通过盘号关联,行保存时不再自动创建 OQC。
        verifyNoInteractions(oqcService);
    }
}