package cn.iocoder.yudao.module.mes.dal.mysql.pro.task; import cn.hutool.core.collection.ListUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskPageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.route.MesProRouteProcessMapper; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import java.math.BigDecimal; import java.util.List; import java.util.function.Consumer; import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static org.junit.jupiter.api.Assertions.assertEquals; /** * {@link MesProTaskMapper#selectPage(MesProTaskPageReqVO)} 的单元测试 * * @author 芋道源码 */ public class MesProTaskMapperTest extends BaseDbUnitTest { @Resource private MesProTaskMapper taskMapper; @Resource private MesProRouteProcessMapper routeProcessMapper; /** * 创建 Task 时统一设置 BigDecimal 字段为 2 位小数,避免 H2 decimal(14,2) 精度不匹配 */ private MesProTaskDO createTaskPojo(Consumer consumer) { return randomPojo(MesProTaskDO.class, o -> { o.setQuantity(new BigDecimal("10.00")); o.setProducedQuantity(new BigDecimal("5.00")); o.setQualifyQuantity(new BigDecimal("4.00")); o.setUnqualifyQuantity(new BigDecimal("1.00")); o.setChangedQuantity(new BigDecimal("0.00")); consumer.accept(o); }); } // ==================== selectPage 基础过滤 ==================== @Test public void testSelectPage_byCode() { MesProTaskDO matchTask = createTaskPojo(o -> { o.setCode("PT202501010001"); o.setStatus(0); }); taskMapper.insert(matchTask); taskMapper.insert(cloneIgnoreId(matchTask, o -> o.setCode("OTHER_CODE"))); MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); reqVO.setCode("PT2025"); PageResult result = taskMapper.selectPage(reqVO); assertEquals(1, result.getTotal()); assertPojoEquals(matchTask, result.getList().get(0)); } @Test public void testSelectPage_byName() { MesProTaskDO matchTask = createTaskPojo(o -> { o.setName("注塑任务-A"); o.setStatus(0); }); taskMapper.insert(matchTask); taskMapper.insert(cloneIgnoreId(matchTask, o -> o.setName("OTHER_NAME"))); MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); reqVO.setName("注塑"); PageResult result = taskMapper.selectPage(reqVO); assertEquals(1, result.getTotal()); assertPojoEquals(matchTask, result.getList().get(0)); } @Test public void testSelectPage_byWorkOrderId() { MesProTaskDO matchTask = createTaskPojo(o -> { o.setWorkOrderId(100L); o.setStatus(0); }); taskMapper.insert(matchTask); taskMapper.insert(cloneIgnoreId(matchTask, o -> o.setWorkOrderId(999L))); MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); reqVO.setWorkOrderId(100L); PageResult result = taskMapper.selectPage(reqVO); assertEquals(1, result.getTotal()); assertPojoEquals(matchTask, result.getList().get(0)); } @Test public void testSelectPage_byStatus() { MesProTaskDO matchTask = createTaskPojo(o -> o.setStatus(1)); taskMapper.insert(matchTask); taskMapper.insert(cloneIgnoreId(matchTask, o -> o.setStatus(2))); MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); reqVO.setStatus(1); PageResult result = taskMapper.selectPage(reqVO); assertEquals(1, result.getTotal()); assertPojoEquals(matchTask, result.getList().get(0)); } @Test public void testSelectPage_byStatuses() { MesProTaskDO task1 = createTaskPojo(o -> o.setStatus(1)); MesProTaskDO task2 = createTaskPojo(o -> o.setStatus(2)); MesProTaskDO task3 = createTaskPojo(o -> o.setStatus(3)); taskMapper.insert(task1); taskMapper.insert(task2); taskMapper.insert(task3); MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); reqVO.setStatuses(ListUtil.of(1, 2)); PageResult result = taskMapper.selectPage(reqVO); assertEquals(2, result.getTotal()); } @Test public void testSelectPage_noFilter() { MesProTaskDO task1 = createTaskPojo(o -> o.setStatus(0)); MesProTaskDO task2 = createTaskPojo(o -> o.setStatus(1)); taskMapper.insert(task1); taskMapper.insert(task2); MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); PageResult result = taskMapper.selectPage(reqVO); assertEquals(2, result.getTotal()); } // ==================== selectPage + checkFlag (MPJ LEFT JOIN) ==================== @Test public void testSelectPage_checkFlagTrue() { Long routeId = 10L; Long processId1 = 100L; Long processId2 = 200L; MesProTaskDO task1 = createTaskPojo(o -> { o.setRouteId(routeId); o.setProcessId(processId1); o.setStatus(0); }); MesProTaskDO task2 = createTaskPojo(o -> { o.setRouteId(routeId); o.setProcessId(processId2); o.setStatus(0); }); taskMapper.insert(task1); taskMapper.insert(task2); routeProcessMapper.insert(randomPojo(MesProRouteProcessDO.class, o -> { o.setRouteId(routeId); o.setProcessId(processId1); o.setCheckFlag(true); })); routeProcessMapper.insert(randomPojo(MesProRouteProcessDO.class, o -> { o.setRouteId(routeId); o.setProcessId(processId2); o.setCheckFlag(false); })); // 查询:checkFlag = true,只返回 task1 MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); reqVO.setCheckFlag(true); PageResult result = taskMapper.selectPage(reqVO); assertEquals(1, result.getTotal()); assertPojoEquals(task1, result.getList().get(0)); } @Test public void testSelectPage_checkFlagFalse() { Long routeId = 20L; Long processId1 = 300L; Long processId2 = 400L; MesProTaskDO task1 = createTaskPojo(o -> { o.setRouteId(routeId); o.setProcessId(processId1); o.setStatus(0); }); MesProTaskDO task2 = createTaskPojo(o -> { o.setRouteId(routeId); o.setProcessId(processId2); o.setStatus(0); }); taskMapper.insert(task1); taskMapper.insert(task2); routeProcessMapper.insert(randomPojo(MesProRouteProcessDO.class, o -> { o.setRouteId(routeId); o.setProcessId(processId1); o.setCheckFlag(true); })); routeProcessMapper.insert(randomPojo(MesProRouteProcessDO.class, o -> { o.setRouteId(routeId); o.setProcessId(processId2); o.setCheckFlag(false); })); // 查询:checkFlag = false,只返回 task2 MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); reqVO.setCheckFlag(false); PageResult result = taskMapper.selectPage(reqVO); assertEquals(1, result.getTotal()); assertPojoEquals(task2, result.getList().get(0)); } @Test public void testSelectPage_checkFlagWithOtherFilter() { Long routeId = 30L; Long processId = 500L; MesProTaskDO taskMatch = createTaskPojo(o -> { o.setRouteId(routeId); o.setProcessId(processId); o.setCode("PT-MATCH-001"); o.setStatus(0); }); MesProTaskDO taskNoMatch = createTaskPojo(o -> { o.setRouteId(routeId); o.setProcessId(processId); o.setCode("OTHER-CODE"); o.setStatus(0); }); taskMapper.insert(taskMatch); taskMapper.insert(taskNoMatch); routeProcessMapper.insert(randomPojo(MesProRouteProcessDO.class, o -> { o.setRouteId(routeId); o.setProcessId(processId); o.setCheckFlag(true); })); // 查询:checkFlag=true 且 code like 'PT-MATCH' MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); reqVO.setCheckFlag(true); reqVO.setCode("PT-MATCH"); PageResult result = taskMapper.selectPage(reqVO); assertEquals(1, result.getTotal()); assertPojoEquals(taskMatch, result.getList().get(0)); } @Test public void testSelectPage_checkFlagNull_noJoin() { Long routeId = 40L; Long processId = 600L; MesProTaskDO task = createTaskPojo(o -> { o.setRouteId(routeId); o.setProcessId(processId); o.setStatus(0); }); taskMapper.insert(task); MesProTaskPageReqVO reqVO = new MesProTaskPageReqVO(); PageResult result = taskMapper.selectPage(reqVO); assertEquals(1, result.getTotal()); assertPojoEquals(task, result.getList().get(0)); } }