| | |
| | | import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; |
| | | 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.MesProTaskAssigneeDO; |
| | | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; |
| | | import cn.iocoder.yudao.module.mes.enums.pro.MesProTaskStatusEnum; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | import org.apache.ibatis.annotations.Select; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | |
| | | /** |
| | | * MES 生产任务 Mapper |
| | | * |
| | | * @author 芋道源码 |
| | | * @author 超级管理员 |
| | | */ |
| | | @Mapper |
| | | public interface MesProTaskMapper extends BaseMapperX<MesProTaskDO> { |
| | | |
| | | @Select({"<script>", |
| | | "SELECT t.workstation_id AS workstationId, COUNT(*) AS pendingCount FROM mes_pro_task t", |
| | | "WHERE t.deleted = 0 AND t.workstation_id IS NOT NULL AND t.status IN (#{prepare}, #{producing}, #{partial}, #{paused})", |
| | | "<if test='assigneeId != null'>AND EXISTS (SELECT 1 FROM mes_pro_task_assignee a", |
| | | "WHERE a.task_id=t.id AND a.user_id=#{assigneeId} AND a.deleted=0)</if>", |
| | | "GROUP BY t.workstation_id", "</script>"}) |
| | | java.util.List<cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProWorkstationPendingCountVO> selectPendingCounts( |
| | | @Param("assigneeId") Long assigneeId, @Param("prepare") Integer prepare, |
| | | @Param("producing") Integer producing, @Param("partial") Integer partial, @Param("paused") Integer paused); |
| | | |
| | | /** 所有排产写入口以相同顺序锁定工作站;事务提交后释放,跨进程防止资源竞态。 */ |
| | | @org.apache.ibatis.annotations.Select("SELECT id FROM mes_md_workstation WHERE deleted = 0 ORDER BY id FOR UPDATE") |
| | | List<Long> lockSchedulingResources(); |
| | | |
| | | default List<MesProTaskDO> selectSchedulingTasks() { |
| | | return selectList(new LambdaQueryWrapperX<MesProTaskDO>() |
| | | .and(query -> query.isNull(MesProTaskDO::getStatus).or() |
| | | .notIn(MesProTaskDO::getStatus, MesProTaskStatusEnum.CANCELED.getStatus(), MesProTaskStatusEnum.FINISHED.getStatus())) |
| | | .orderByAsc(MesProTaskDO::getId)); |
| | | } |
| | | |
| | | default PageResult<MesProTaskDO> selectPage(MesProTaskPageReqVO reqVO) { |
| | | MPJLambdaWrapperX<MesProTaskDO> query = new MPJLambdaWrapperX<>(); |
| | |
| | | default PageResult<MesProTaskDO> selectPendingFeedbackPage(MesProTaskPageReqVO reqVO) { |
| | | MPJLambdaWrapperX<MesProTaskDO> query = new MPJLambdaWrapperX<>(); |
| | | query.selectAll(MesProTaskDO.class); |
| | | // 当需要按 assigneeUserId 过滤时,INNER JOIN mes_pro_task_assignee |
| | | if (reqVO.getAssigneeUserId() != null) { |
| | | query.innerJoin(MesProTaskAssigneeDO.class, on -> on |
| | | .eq(MesProTaskAssigneeDO::getTaskId, MesProTaskDO::getId)); |
| | | query.eq(MesProTaskAssigneeDO::getUserId, reqVO.getAssigneeUserId()); |
| | | } |
| | | // 待报工台账:进行中的任务(排除已完成/已取消),且仍有待报工量 |
| | | query.eq(MesProTaskDO::getStatus, MesProTaskStatusEnum.PREPARE.getStatus()); |
| | | query.in(MesProTaskDO::getStatus, MesProTaskStatusEnum.PREPARE.getStatus(),MesProTaskStatusEnum.PAUSED.getStatus()); |
| | | query.apply("(quantity - IFNULL(produced_quantity, 0)) > 0"); |
| | | query.likeIfPresent(MesProTaskDO::getCode, reqVO.getCode()) |
| | | .likeIfPresent(MesProTaskDO::getName, reqVO.getName()) |