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));
|
}
|
}
|