package com.designhub.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.designhub.entity.TaskItem; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; import java.time.LocalDateTime; import java.util.List; /** * 任务子项 Mapper 接口 */ @Mapper public interface TaskItemMapper extends BaseMapper { /** * 查询可接单的子任务列表(带主任务信息) */ @Select("") IPage selectAvailableItems(Page page, @Param("taskTypeId") Long taskTypeId, @Param("keyword") String keyword); /** * 查询进行中的子任务列表 * @param receiverId 接单人ID,null表示不按接单人过滤 * @param deptId 部门ID,用于部门负责人查看本部门所有任务 */ @Select("") IPage selectInProgressItems(Page page, @Param("receiverId") Long receiverId, @Param("deptId") Long deptId, @Param("keyword") String keyword); /** * 查询已完成的子任务列表 * @param receiverId 接单人ID,null表示不按接单人过滤 * @param deptId 部门ID,用于部门负责人查看本部门所有任务 * @param keyword 搜索关键词 */ @Select("") IPage selectCompletedItems(Page page, @Param("receiverId") Long receiverId, @Param("deptId") Long deptId, @Param("keyword") String keyword); /** * 查询进行中的子任务列表(按多个部门ID过滤,用于部门负责人) */ @Select("") IPage selectInProgressItemsByDeptIds(Page page, @Param("deptIds") List deptIds, @Param("keyword") String keyword); /** * 查询已完成的子任务列表(按多个部门ID过滤,用于部门负责人) */ @Select("") IPage selectCompletedItemsByDeptIds(Page page, @Param("deptIds") List deptIds, @Param("keyword") String keyword); /** * 根据任务ID查询所有子任务 */ @Select("SELECT ti.*, " + " dt.type_name AS taskTypeName " + "FROM task_item ti " + "LEFT JOIN task_type dt ON ti.task_type_id = dt.id " + "WHERE ti.task_id = #{taskId} " + "ORDER BY ti.sort_order ASC") List selectByTaskId(@Param("taskId") Long taskId); /** * 查询下一个待解锁的子任务(顺序流水线) */ @Select("SELECT * FROM task_item " + "WHERE task_id = #{taskId} " + " AND prev_item_id = #{prevItemId} " + " AND status = 'locked' " + " AND is_locked = 1 " + "LIMIT 1") TaskItem selectNextLockedItem(@Param("taskId") Long taskId, @Param("prevItemId") Long prevItemId); /** * 抢单子任务(乐观锁) */ @Update("UPDATE task_item SET " + "receiver_id = #{receiverId}, " + "receiver_name = #{receiverName}, " + "receiver_dept_id = #{receiverDeptId}, " + "status = 'in_progress', " + "update_time = NOW() " + "WHERE id = #{itemId} " + "AND status = 'pending' " + "AND is_locked = 0 " + "AND receiver_id IS NULL") int grabItem(@Param("itemId") Long itemId, @Param("receiverId") Long receiverId, @Param("receiverName") String receiverName, @Param("receiverDeptId") Long receiverDeptId); /** * 解锁子任务 */ @Update("UPDATE task_item SET " + "status = 'pending', " + "is_locked = 0, " + "update_time = NOW() " + "WHERE id = #{itemId}") int unlockItem(@Param("itemId") Long itemId); /** * 统计任务的完成子项数量 */ @Select("SELECT COUNT(*) FROM task_item " + "WHERE task_id = #{taskId} AND status = 'completed'") int countCompletedItems(@Param("taskId") Long taskId); /** * 统计任务的总子项数量 */ @Select("SELECT COUNT(*) FROM task_item WHERE task_id = #{taskId}") int countTotalItems(@Param("taskId") Long taskId); }