云
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
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
package cn.iocoder.yudao.module.mes.service.qc.ncr;
 
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.process.MesProWorkOrderProcessSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderProcessDO;
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.batch.MesWmBatchDO;
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.productproduce.MesWmProductProduceLineDO;
import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.workorder.MesProWorkOrderBomMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.qc.oqc.MesQcOqcMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.batch.MesWmBatchMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceLineMapper;
import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcStatusEnum;
import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderProcessService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
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.*;
 
@ExtendWith(MockitoExtension.class)
class MesQcNcrOqcReproductionServiceTest {
    @InjectMocks MesQcNcrOqcReproductionService service;
    @Mock MesQcOqcMapper oqcMapper;
    @Mock MesWmProductSalesLineMapper lineMapper;
    @Mock MesWmProductSalesMapper salesMapper;
    @Mock MesWmProductProduceLineMapper produceLineMapper;
    @Mock MesQcNcrScrapService sourceService;
    @Mock MesWmBatchMapper batchMapper;
    @Mock MesProWorkOrderMapper orderMapper;
    @Mock MesProWorkOrderBomMapper bomMapper;
    @Mock MesMdItemMapper itemMapper;
    @Mock MesProWorkOrderService orderService;
    @Mock MesProWorkOrderProcessService processService;
    @Mock MesProTaskService taskService;
    @Mock MesMdAutoCodeRecordService autoCodeService;
    private MesQcNcrDO ncr() { return new MesQcNcrDO().setId(1L).setCode("NCR1").setQcType(MesQcTypeEnum.OQC.getType()).setQcId(2L).setItemId(3L).setUnqualifiedQuantity(BigDecimal.ONE); }
    private MesQcOqcDO qc() { return new MesQcOqcDO().setId(2L).setSourceDocType(MesBizTypeConstants.WM_PRODUCT_SALES)
            .setSourceDocId(4L).setSourceLineId(5L).setStatus(MesQcStatusEnum.FINISHED.getStatus()).setItemId(3L)
            .setClientId(8L).setBatchCode("B1").setOutQuantity(BigDecimal.TEN).setUnqualifiedQuantity(BigDecimal.ONE); }
    private MesWmProductSalesLineDO line() { return new MesWmProductSalesLineDO().setId(5L).setSalesId(4L).setOqcId(2L).setItemId(3L)
            .setBatchId(6L).setBatchCode("B1").setQuantity(BigDecimal.TEN).setQualityStatus(MesWmQualityStatusEnum.FAIL.getStatus()); }
 
    @Test void refusesClientMismatchBeforeCreatingOrder() {
        when(oqcMapper.selectById(2L)).thenReturn(qc());
        when(lineMapper.selectById(5L)).thenReturn(line());
        when(salesMapper.selectById(4L)).thenReturn(new MesWmProductSalesDO().setId(4L).setClientId(9L));
        assertThrows(ServiceException.class, () -> service.reproduce(ncr(), 7));
        verify(orderService, never()).createWorkOrder(any());
    }
 
    @Test void ipqcReproductionRequiresClaimedSourceAndCreatesTasks() {
        var item = ncr().setQcType(MesQcTypeEnum.IPQC.getType());
        var source = new MesQcNcrScrapService.IpqcSource(10L, "OLD", 12L, 6L, "B1");
        when(sourceService.validateIpqcSource(item)).thenReturn(source);
        var line = new MesWmProductProduceLineDO().setId(12L).setNcrDispositionId(99L);
        when(produceLineMapper.selectById(12L)).thenReturn(line);
        assertThrows(ServiceException.class, () -> service.reproduceIpqc(item, 7, source));
        verify(orderService, never()).createWorkOrder(any());
        line.setNcrDispositionId(1L);
        when(orderMapper.selectById(10L)).thenReturn(new MesProWorkOrderDO().setId(10L).setCode("OLD")
                .setProductId(11L).setRouteId(40L));
        when(itemMapper.selectById(11L)).thenReturn(new MesMdItemDO().setId(11L).setMdmItemId(3L));
        when(processService.getWorkOrderProcessListByWorkOrderId(10L)).thenReturn(List.of(
                new MesProWorkOrderProcessDO().setProcessId(21L).setSort(1)));
        when(bomMapper.selectListByWorkOrderId(10L)).thenReturn(List.of());
        when(autoCodeService.generateAutoCode(anyString())).thenReturn("NEW");
        when(orderService.createWorkOrder(any())).thenReturn(30L);
        when(taskService.autoGenerateTasks(any())).thenReturn(List.of(50L));
        assertEquals(30L, service.reproduceIpqc(item, 7, source).getDocId());
        verify(taskService).autoGenerateTasks(argThat(r -> r.getWorkOrderId().equals(30L)));
    }
 
    @Test void copiesOrderProcessThenConfirms() {
        when(oqcMapper.selectById(2L)).thenReturn(qc());
        when(lineMapper.selectById(5L)).thenReturn(line());
        when(salesMapper.selectById(4L)).thenReturn(new MesWmProductSalesDO().setId(4L).setClientId(8L));
        when(batchMapper.selectById(6L)).thenReturn(new MesWmBatchDO().setId(6L).setCode("B1").setItemId(3L).setClientId(8L).setWorkOrderId(10L));
        when(orderMapper.selectById(10L)).thenReturn(new MesProWorkOrderDO().setId(10L).setCode("OLD").setProductId(11L).setClientId(8L).setRouteId(40L));
        when(itemMapper.selectById(11L)).thenReturn(new MesMdItemDO().setId(11L).setMdmItemId(3L));
        when(processService.getWorkOrderProcessListByWorkOrderId(10L)).thenReturn(List.of(new MesProWorkOrderProcessDO().setId(20L)
                .setProcessId(21L).setSort(1).setOutputItemId("3,4")));
        when(bomMapper.selectListByWorkOrderId(10L)).thenReturn(List.of(new MesProWorkOrderBomDO()
                .setProcessId(21L).setItemId(22L).setQuantity(new BigDecimal("1.25"))));
        when(autoCodeService.generateAutoCode(anyString())).thenReturn("NEW");
        when(orderService.createWorkOrder(any())).thenReturn(30L);
        when(taskService.autoGenerateTasks(any())).thenReturn(List.of(50L));
        var result = service.reproduce(ncr(), 7);
        assertEquals(30L, result.getDocId());
        verify(processService).createWorkOrderProcess(argThat(p -> p.getId() == null && p.getWorkOrderId().equals(30L)
                && p.getProcessId().equals(21L) && p.getOutputItemIds().equals(List.of(3L, 4L))));
        verify(bomMapper).deleteByWorkOrderId(30L);
        verify(bomMapper).insert(argThat((MesProWorkOrderBomDO b) -> b.getWorkOrderId().equals(30L)
                && b.getProcessId().equals(21L) && b.getQuantity().compareTo(new BigDecimal("1.25")) == 0));
        var inOrder = inOrder(processService, orderService);
        inOrder.verify(processService).getWorkOrderProcessListByWorkOrderId(10L);
        inOrder.verify(orderService).createWorkOrder(any());
        inOrder.verify(processService).createWorkOrderProcess(any(MesProWorkOrderProcessSaveReqVO.class));
        inOrder.verify(orderService).confirmWorkOrder(30L);
        verify(taskService).autoGenerateTasks(argThat(r -> r.getWorkOrderId().equals(30L) && r.getRouteId().equals(40L)));
    }
}