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