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