云
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
package cn.iocoder.yudao.module.mes.service.qc.ncr;
 
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.qc.ipqc.MesQcIpqcDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ncr.MesQcNcrDO;
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.qc.ipqc.MesQcIpqcMapper;
import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum;
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.MesBizTypeConstants;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceLineDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productproduce.MesWmProductProduceDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transaction.MesWmTransactionDO;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceLineMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.productproduce.MesWmProductProduceMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.wm.transaction.MesWmTransactionMapper;
import cn.iocoder.yudao.module.mes.dal.mysql.qc.ncr.MesQcNcrMapper;
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.time.LocalDateTime;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
 
class MesQcNcrReinspectionValidatorTest {
    @Test void onlyExplicitPostCompletionWholeLotInspectionCanClose() {
        var validator = new MesQcNcrReinspectionValidator();
        var orders = mock(MesProWorkOrderMapper.class);
        var items = mock(MesMdItemMapper.class);
        var inspections = mock(MesQcIpqcMapper.class);
        var lines = mock(MesWmProductProduceLineMapper.class);
        var produces = mock(MesWmProductProduceMapper.class);
        var transactions = mock(MesWmTransactionMapper.class);
        var ncrs = mock(MesQcNcrMapper.class);
        ReflectionTestUtils.setField(validator, "workOrderMapper", orders);
        ReflectionTestUtils.setField(validator, "itemMapper", items);
        ReflectionTestUtils.setField(validator, "ipqcMapper", inspections);
        ReflectionTestUtils.setField(validator, "produceLineMapper", lines);
        ReflectionTestUtils.setField(validator, "produceMapper", produces);
        ReflectionTestUtils.setField(validator, "transactionMapper", transactions);
        ReflectionTestUtils.setField(validator, "ncrMapper", ncrs);
        var finishedAt = LocalDateTime.of(2026, 1, 1, 10, 0);
        var order = new MesProWorkOrderDO().setId(1L).setProductId(2L)
                .setStatus(MesProWorkOrderStatusEnum.FINISHED.getStatus()).setFinishDate(finishedAt);
        var product = new MesMdItemDO().setId(2L).setMdmItemId(3L);
        var ncr = new MesQcNcrDO().setCode("NCR1").setQcType(MesQcTypeEnum.IPQC.getType()).setItemId(3L).setUnqualifiedQuantity(BigDecimal.TEN)
                .setHandleDate(finishedAt);
        var qc = new MesQcIpqcDO().setId(4L).setWorkOrderId(1L).setItemId(2L)
                .setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK).setSourceDocId(7L).setSourceLineId(8L)
                .setInspectDate(finishedAt.plusMinutes(1)).setStatus(MesQcStatusEnum.FINISHED.getStatus())
                .setCheckResult(1).setCheckQuantity(BigDecimal.TEN).setQualifiedQuantity(BigDecimal.TEN)
                .setUnqualifiedQuantity(BigDecimal.ZERO);
        qc.setCreateTime(finishedAt.plusMinutes(1));
        when(orders.selectList(any(Wrapper.class))).thenReturn(List.of(order));
        when(items.selectById(2L)).thenReturn(product);
        when(inspections.selectById(4L)).thenReturn(qc);
        var line = new MesWmProductProduceLineDO().setId(8L).setProduceId(9L)
                .setFeedbackId(7L).setItemId(2L).setQuantity(BigDecimal.TEN).setQualityStatus(MesWmQualityStatusEnum.PASS.getStatus());
        when(lines.selectById(8L)).thenReturn(line);
        when(produces.selectById(9L)).thenReturn(new MesWmProductProduceDO().setId(9L).setWorkOrderId(1L));
        when(transactions.selectList(any(Wrapper.class))).thenReturn(List.of(new MesWmTransactionDO().setQuantity(BigDecimal.TEN)));
        assertThrows(RuntimeException.class, () -> validator.validate(ncr, null));
        assertDoesNotThrow(() -> validator.validate(ncr, 4L));
        qc.setCheckResult(2).setQualifiedQuantity(BigDecimal.valueOf(6)).setUnqualifiedQuantity(BigDecimal.valueOf(4));
        line.setQuantity(BigDecimal.valueOf(6));
        when(transactions.selectList(any(Wrapper.class))).thenReturn(List.of(new MesWmTransactionDO().setQuantity(BigDecimal.valueOf(6))));
        when(ncrs.selectList(any(Wrapper.class))).thenReturn(List.of());
        assertThrows(RuntimeException.class, () -> validator.validate(ncr, 4L));
        when(ncrs.selectList(any(Wrapper.class))).thenReturn(List.of(new MesQcNcrDO().setItemId(3L).setUnqualifiedQuantity(BigDecimal.valueOf(4))));
        assertDoesNotThrow(() -> validator.validate(ncr, 4L));
        qc.setQualifiedQuantity(BigDecimal.ZERO).setUnqualifiedQuantity(BigDecimal.TEN);
        line.setQuantity(BigDecimal.ZERO);
        when(transactions.selectList(any(Wrapper.class))).thenReturn(List.of());
        when(ncrs.selectList(any(Wrapper.class))).thenReturn(List.of(new MesQcNcrDO().setItemId(3L).setUnqualifiedQuantity(BigDecimal.TEN)));
        assertDoesNotThrow(() -> validator.validate(ncr, 4L));
        qc.setCheckResult(1).setQualifiedQuantity(BigDecimal.TEN).setUnqualifiedQuantity(BigDecimal.ZERO);
        line.setQuantity(BigDecimal.TEN);
        when(transactions.selectList(any(Wrapper.class))).thenReturn(List.of());
        assertThrows(RuntimeException.class, () -> validator.validate(ncr, 4L));
        when(transactions.selectList(any(Wrapper.class))).thenReturn(List.of(new MesWmTransactionDO().setQuantity(BigDecimal.TEN)));
        qc.setInspectDate(finishedAt.minusMinutes(1));
        assertThrows(RuntimeException.class, () -> validator.validate(ncr, 4L));
        qc.setInspectDate(finishedAt.plusMinutes(1)).setQualifiedQuantity(BigDecimal.ONE);
        assertThrows(RuntimeException.class, () -> validator.validate(ncr, 4L));
        qc.setQualifiedQuantity(BigDecimal.TEN).setCheckResult(2).setUnqualifiedQuantity(BigDecimal.ONE);
        assertThrows(RuntimeException.class, () -> validator.validate(ncr, 4L));
        qc.setCheckResult(1).setUnqualifiedQuantity(BigDecimal.ZERO);
        qc.setQualifiedQuantity(BigDecimal.TEN).setWorkOrderId(5L);
        assertThrows(RuntimeException.class, () -> validator.validate(ncr, 4L));
        qc.setWorkOrderId(1L);
        // 出货返工同样走报工产出复检(严格分支),不再放行独立过程检验单
        ncr.setQcType(MesQcTypeEnum.OQC.getType());
        qc.setSourceDocType(null).setSourceDocId(null).setSourceLineId(null);
        assertThrows(RuntimeException.class, () -> validator.validate(ncr, 4L));
        qc.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK).setSourceDocId(7L).setSourceLineId(8L);
        assertDoesNotThrow(() -> validator.validate(ncr, 4L));
        ncr.setQcType(MesQcTypeEnum.IPQC.getType());
        qc.setSourceDocType(MesBizTypeConstants.PRO_FEEDBACK).setSourceDocId(7L).setSourceLineId(8L);
        order.setFinishDate(null);
        assertThrows(RuntimeException.class, () -> validator.validate(ncr, 4L));
        order.setFinishDate(finishedAt);
        when(orders.selectList(any(Wrapper.class))).thenReturn(List.of(order, order));
        assertThrows(RuntimeException.class, () -> validator.validate(ncr, 4L));
    }
}