package cn.iocoder.yudao.module.mes.service.wm.returnsales; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper; import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.context.annotation.Import; import org.springframework.test.context.bean.override.mockito.MockitoBean; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; import java.math.BigDecimal; import java.util.List; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; /** * {@link MesWmReturnSalesLineServiceImpl} 的单元测试类 * * @author 芋道源码 */ @Import(MesWmReturnSalesLineServiceImpl.class) public class MesWmReturnSalesLineServiceImplTest extends BaseDbUnitTest { @Resource private MesWmReturnSalesLineServiceImpl returnSalesLineService; @Resource private MesWmReturnSalesLineMapper returnSalesLineMapper; @MockitoBean private MesWmReturnSalesService returnSalesService; @MockitoBean private MesMdItemService itemService; @MockitoBean private MesWmBatchService batchService; @MockitoBean private MesWmReturnSalesDetailService returnSalesDetailService; @Test public void testUpdateReturnSalesLineWhenRqcFinish_allPass() { // 准备参数:全部合格 Integer checkResult = MesQcCheckResultEnum.QUALIFIED.getType(); BigDecimal qualifiedQty = new BigDecimal("100"); BigDecimal unqualifiedQty = BigDecimal.ZERO; // mock 数据 MesWmReturnSalesLineDO lineDO = randomPojo(MesWmReturnSalesLineDO.class, o -> o.setQuantity(qualifiedQty)); returnSalesLineMapper.insert(lineDO); // 调用(sourceDocId 传 null 不联动主表状态) returnSalesLineService.updateReturnSalesLineWhenRqcFinish( lineDO.getId(), null, checkResult, qualifiedQty, unqualifiedQty); // 断言:验证质量状态更新为合格 MesWmReturnSalesLineDO updateLine = returnSalesLineMapper.selectById(lineDO.getId()); assertEquals(MesWmQualityStatusEnum.PASS.getStatus(), updateLine.getQualityStatus()); } @Test public void testUpdateReturnSalesLineWhenRqcFinish_allFail() { // 准备参数:全部不合格 Integer checkResult = MesQcCheckResultEnum.QUALIFIED.getType(); BigDecimal qualifiedQty = BigDecimal.ZERO; BigDecimal unqualifiedQty = new BigDecimal("100"); // mock 数据 MesWmReturnSalesLineDO lineDO = randomPojo(MesWmReturnSalesLineDO.class, o -> o.setQuantity(unqualifiedQty)); returnSalesLineMapper.insert(lineDO); // 调用 returnSalesLineService.updateReturnSalesLineWhenRqcFinish( lineDO.getId(), null, checkResult, qualifiedQty, unqualifiedQty); // 断言:验证质量状态更新为不合格 MesWmReturnSalesLineDO updateLine = returnSalesLineMapper.selectById(lineDO.getId()); assertEquals(MesWmQualityStatusEnum.FAIL.getStatus(), updateLine.getQualityStatus()); } @Test public void testUpdateReturnSalesLineWhenRqcFinish_partialSplit() { // 准备参数:部分合格部分不合格,触发行拆分 Integer checkResult = MesQcCheckResultEnum.QUALIFIED.getType(); BigDecimal qualifiedQty = new BigDecimal("70"); BigDecimal unqualifiedQty = new BigDecimal("30"); // mock 数据 MesWmReturnSalesLineDO lineDO = randomPojo(MesWmReturnSalesLineDO.class, o -> o.setQuantity(new BigDecimal("100"))); returnSalesLineMapper.insert(lineDO); // 调用 returnSalesLineService.updateReturnSalesLineWhenRqcFinish( lineDO.getId(), null, checkResult, qualifiedQty, unqualifiedQty); // 断言:原行变为合格,数量调整为合格数量 MesWmReturnSalesLineDO originalLine = returnSalesLineMapper.selectById(lineDO.getId()); assertEquals(MesWmQualityStatusEnum.PASS.getStatus(), originalLine.getQualityStatus()); assertEquals(0, qualifiedQty.compareTo(originalLine.getQuantity())); // 断言:新增了一行不合格品 List allLines = returnSalesLineMapper.selectListByReturnId(lineDO.getReturnId()); assertEquals(2, allLines.size()); MesWmReturnSalesLineDO newLine = allLines.stream() .filter(l -> !l.getId().equals(lineDO.getId())) .findFirst().orElse(null); assertNotNull(newLine); assertEquals(MesWmQualityStatusEnum.FAIL.getStatus(), newLine.getQualityStatus()); assertEquals(0, unqualifiedQty.compareTo(newLine.getQuantity())); } }