update 优化任务待办,排除非待办任务

This commit is contained in:
songgaoshuai 2023-10-19 18:12:11 +08:00
parent 661b07c19f
commit 7d6d1ade4f
3 changed files with 122 additions and 32 deletions

View File

@ -0,0 +1,30 @@
package org.dromara.workflow.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.workflow.domain.vo.TaskVo;
import java.util.List;
/**
* 运行时任务Mapper接口
*
* @author may
* @date 2023-10-19
*/
public interface ActTaskMapper extends BaseMapperPlus<TaskVo, TaskVo> {
/**
* 获取待办信息
*
* @param page 分页
* @param queryWrapper 条件
* @param userId 用户id
* @param groupIds 用户角色id
* @return 结果
*/
Page<TaskVo> getTaskWaitByPage(@Param("page") Page<TaskVo> page, @Param(Constants.WRAPPER) Wrapper<TaskVo> queryWrapper, @Param("userId") String userId, @Param("groupIds") List<String> groupIds);
}

View File

@ -5,11 +5,14 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.tenant.helper.TenantHelper;
@ -20,6 +23,7 @@ import org.dromara.workflow.domain.bo.*;
import org.dromara.workflow.domain.vo.MultiInstanceVo; import org.dromara.workflow.domain.vo.MultiInstanceVo;
import org.dromara.workflow.domain.vo.TaskVo; import org.dromara.workflow.domain.vo.TaskVo;
import org.dromara.workflow.flowable.cmd.*; import org.dromara.workflow.flowable.cmd.*;
import org.dromara.workflow.mapper.ActTaskMapper;
import org.dromara.workflow.service.IActTaskService; import org.dromara.workflow.service.IActTaskService;
import org.dromara.workflow.utils.WorkflowUtils; import org.dromara.workflow.utils.WorkflowUtils;
import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.identity.Authentication;
@ -57,6 +61,7 @@ public class ActTaskServiceImpl implements IActTaskService {
private final HistoryService historyService; private final HistoryService historyService;
private final IdentityService identityService; private final IdentityService identityService;
private final ManagementService managementService; private final ManagementService managementService;
private final ActTaskMapper actTaskMapper;
/** /**
* 启动任务 * 启动任务
@ -168,47 +173,33 @@ public class ActTaskServiceImpl implements IActTaskService {
*/ */
@Override @Override
public TableDataInfo<TaskVo> getTaskWaitByPage(TaskBo taskBo) { public TableDataInfo<TaskVo> getTaskWaitByPage(TaskBo taskBo) {
PageQuery pageQuery = new PageQuery();
pageQuery.setPageNum(taskBo.getPageNum());
pageQuery.setPageSize(taskBo.getPageSize());
QueryWrapper<TaskVo> queryWrapper = new QueryWrapper<>();
List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles(); List<RoleDTO> roles = LoginHelper.getLoginUser().getRoles();
String userId = String.valueOf(LoginHelper.getUserId()); String userId = String.valueOf(LoginHelper.getUserId());
TaskQuery query = taskService.createTaskQuery(); queryWrapper.eq("t.business_status_", BusinessStatusEnum.WAITING.getStatus());
query.taskTenantId(TenantHelper.getTenantId()).taskCandidateOrAssigned(userId); queryWrapper.eq("t.tenant_id_", TenantHelper.getTenantId());
if (CollUtil.isNotEmpty(roles)) {
List<String> groupIds = StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId()));
query.taskCandidateGroupIn(groupIds);
}
if (StringUtils.isNotBlank(taskBo.getName())) { if (StringUtils.isNotBlank(taskBo.getName())) {
query.taskNameLike("%" + taskBo.getName() + "%"); queryWrapper.like("t.name_", taskBo.getName());
} }
if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) { if (StringUtils.isNotBlank(taskBo.getProcessDefinitionName())) {
query.processDefinitionNameLike("%" + taskBo.getProcessDefinitionName() + "%"); queryWrapper.like("t.processDefinitionName", taskBo.getProcessDefinitionName());
} }
if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) { if (StringUtils.isNotBlank(taskBo.getProcessDefinitionKey())) {
query.processDefinitionKey(taskBo.getProcessDefinitionKey()); queryWrapper.eq("t.processDefinitionKey", taskBo.getProcessDefinitionKey());
} }
List<Task> taskList = query.listPage(taskBo.getPageNum(), taskBo.getPageSize()); Page<TaskVo> page = TenantHelper.ignore(() ->
List<ProcessInstance> processInstanceList = null; actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper, userId, StreamUtils.toList(roles, e -> String.valueOf(e.getRoleId())))
if (CollUtil.isNotEmpty(taskList)) { );
Set<String> processInstanceIds = StreamUtils.toSet(taskList, Task::getProcessInstanceId); List<TaskVo> taskList = page.getRecords();
processInstanceList = runtimeService.createProcessInstanceQuery().processInstanceIds(processInstanceIds).list(); for (TaskVo task : taskList) {
task.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(task.getBusinessStatus()));
task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
} }
List<TaskVo> list = new ArrayList<>(); return new TableDataInfo<>(taskList, page.getTotal());
for (Task task : taskList) {
TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
if (CollUtil.isNotEmpty(processInstanceList)) {
processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
taskVo.setBusinessStatus(e.getBusinessStatus());
taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus()));
taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey());
taskVo.setProcessDefinitionName(e.getProcessDefinitionName());
});
}
taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null);
taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
list.add(taskVo);
}
long count = query.count();
return new TableDataInfo<>(list, count);
} }
/** /**

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.workflow.mapper.ActTaskMapper">
<resultMap type="org.dromara.workflow.domain.vo.TaskVo" id="TaskWaitingVoResult">
<result property="id" column="ID_"/>
<result property="name" column="NAME_"/>
<result property="description" column="DESCRIPTION_"/>
<result property="priority" column="PRIORITY_"/>
<result property="owner" column="OWNER_"/>
<result property="assignee" column="ASSIGNEE_"/>
<result property="processInstanceId" column="PROC_INST_ID_"/>
<result property="executionId" column="EXECUTION_ID_"/>
<result property="taskDefinitionId" column="TASK_DEF_ID_"/>
<result property="processDefinitionId" column="PROC_DEF_ID_"/>
<result property="createTime" column="CREATE_TIME_"/>
<result property="endTime" column="END_TIME_"/>
<result property="taskDefinitionKey" column="TASK_DEF_KEY_"/>
<result property="dueDate" column="DUE_DATE_"/>
<result property="processDefinitionKey" column="key_"/>
<result property="category" column="CATEGORY_"/>
<result property="parentTaskId" column="PARENT_TASK_ID_"/>
<result property="tenantId" column="TENANT_ID_"/>
<result property="claimTime" column="CLAIM_TIME"/>
<result property="businessStatus" column="BUSINESS_STATUS_"/>
<result property="processDefinitionName" column="processDefinitionName"/>
<result property="processDefinitionKey" column="processDefinitionName"/>
</resultMap>
<select id="getTaskWaitByPage" resultMap="TaskWaitingVoResult">
select * from (SELECT
RES.*,AHP.business_status_ ,ARP.name_ as processDefinitionName,ARP.key_ as processDefinitionKey
FROM
ACT_RU_TASK RES
inner join ACT_HI_PROCINST AHP ON RES.PROC_INST_ID_ = AHP.PROC_INST_ID_
inner join ACT_RE_PROCDEF ARP ON ARP.ID_ = RES.PROC_DEF_ID_
WHERE (
RES.ASSIGNEE_ = #{userId}
OR (
RES.ASSIGNEE_ IS NULL
AND EXISTS (
SELECT
LINK.ID_
FROM
ACT_RU_IDENTITYLINK LINK
WHERE
LINK.TASK_ID_ = RES.ID_
AND LINK.TYPE_ = 'candidate'
AND (
LINK.USER_ID_ = #{userId}
<if test="groupIds != null and groupIds.size() > 0">
OR (
LINK.GROUP_ID_ IN
<foreach collection="groupIds" item="groupId" index="index" open="(" close=")" separator=",">
#{groupId}
</foreach>
)
</if>
)
)
)
)
ORDER BY
RES.CREATE_TIME_ DESC) t
${ew.getCustomSqlSegment}
</select>
</mapper>