云
4 天以前 f02d0df2f1dfc7a8b775cf50d45375e57628a5ef
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
package cn.iocoder.yudao.module.mes.service.qc.ncr;
 
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcNcrDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcDO;
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.transaction.MesWmTransactionDO;
import cn.iocoder.yudao.module.mes.dal.mysql.qc.oqc.MesQcOqcMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.transaction.MesWmTransactionMapper;
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesLineService;
import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesDetailService;
import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesService;
import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO;
import cn.iocoder.yudao.module.mes.controller.admin.qc.ncr.vo.MesQcNcrDisposeReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.detail.MesWmProductSalesDetailSaveReqVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
import java.math.BigDecimal;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
 
class MesQcNcrOqcConcessionServiceTest {
    @Test void releaseAndCloseRequireMatchingOriginalLineAndShipment() {
        var service = new MesQcNcrOqcConcessionService();
        var oqcs = mock(MesQcOqcMapper.class);
        var sales = mock(MesWmProductSalesMapper.class);
        var lines = mock(MesWmProductSalesLineMapper.class);
        var flows = mock(MesWmTransactionMapper.class);
        var lineService = mock(MesWmProductSalesLineService.class);
        var details = mock(MesWmProductSalesDetailService.class);
        var salesService = mock(MesWmProductSalesService.class);
        var stockService = mock(MesWmMaterialStockService.class);
        ReflectionTestUtils.setField(service, "oqcMapper", oqcs);
        ReflectionTestUtils.setField(service, "salesMapper", sales);
        ReflectionTestUtils.setField(service, "lineMapper", lines);
        ReflectionTestUtils.setField(service, "transactionMapper", flows);
        ReflectionTestUtils.setField(service, "lineService", lineService);
        ReflectionTestUtils.setField(service, "detailService", details);
        ReflectionTestUtils.setField(service, "salesService", salesService);
        ReflectionTestUtils.setField(service, "stockService", stockService);
        var ncr = new MesQcNcrDO().setQcId(1L).setItemId(2L).setUnqualifiedQuantity(BigDecimal.valueOf(3));
        var qc = new MesQcOqcDO().setId(1L).setSourceDocType(MesBizTypeConstants.WM_PRODUCT_SALES)
                .setSourceDocId(4L).setSourceLineId(5L).setItemId(2L).setBatchCode("B1")
                .setStatus(MesQcStatusEnum.FINISHED.getStatus()).setCheckResult(2)
                .setCheckQuantity(BigDecimal.TEN).setQualifiedQuantity(BigDecimal.valueOf(7)).setUnqualifiedQuantity(BigDecimal.valueOf(3));
        var sale = new MesWmProductSalesDO().setId(4L).setStatus(MesWmProductSalesStatusEnum.CONFIRMED.getStatus());
        var line = new MesWmProductSalesLineDO().setId(5L).setSalesId(4L).setItemId(2L).setOqcId(1L)
                .setQualityStatus(MesWmQualityStatusEnum.FAIL.getStatus()).setQuantity(BigDecimal.TEN);
        when(oqcs.selectById(1L)).thenReturn(qc);
        when(sales.selectOne(any(Wrapper.class))).thenReturn(sale);
        when(lines.selectOne(any(Wrapper.class))).thenReturn(line);
        when(stockService.getMaterialStock(8L)).thenReturn(new MesWmMaterialStockDO().setId(8L).setItemId(2L)
                .setBatchCode("B1").setWarehouseId(11L).setLocationId(12L).setAreaId(13L));
        when(details.getProductSalesDetailListByLineId(5L)).thenReturn(List.of());
        when(lineService.getProductSalesLineListBySalesId(4L)).thenReturn(List.of(line));
        when(salesService.checkProductSalesQuantity(4L)).thenReturn(true);
        var req = new MesQcNcrDisposeReqVO(); req.setMaterialStockId(8L);
        service.release(ncr, req);
        verify(lineService).updateProductSalesLineWhenOqcFinish(5L, 1L, 1);
        verify(details).createProductSalesDetail(any(MesWmProductSalesDetailSaveReqVO.class));
        verify(salesService).stockProductSales(4L);
        verify(salesService).finishProductSales(4L);
        assertThrows(ServiceException.class, () -> service.validateBeforeClose(ncr));
        sale.setStatus(MesWmProductSalesStatusEnum.FINISHED.getStatus());
        when(flows.selectList(any(Wrapper.class))).thenReturn(List.of(new MesWmTransactionDO()
                .setItemId(2L).setBatchCode("B2").setQuantity(BigDecimal.TEN.negate())));
        assertThrows(ServiceException.class, () -> service.validateBeforeClose(ncr));
        when(flows.selectList(any(Wrapper.class))).thenReturn(List.of(new MesWmTransactionDO()
                .setItemId(2L).setBatchCode("B1").setQuantity(BigDecimal.TEN.negate())));
        assertDoesNotThrow(() -> service.validateBeforeClose(ncr));
    }
}