add 添加获取当前任务参与者,优化任务待办,已办

This commit is contained in:
songgaoshuai 2023-06-25 15:37:14 +08:00
parent a953008087
commit c3326403c0
5 changed files with 136 additions and 12 deletions

View File

@ -27,4 +27,9 @@ public interface FlowConstant {
*/
String PENDING = "PENDING";
/**
* 候选人标识
*/
String CANDIDATE = "candidate";
}

View File

@ -0,0 +1,43 @@
package org.dromara.workflow.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
* 参与者
*
* @author may
*/
@Data
public class ParticipantVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 组id角色id
*/
private List<Long> groupIds;
/**
* 候选人id用户id 当组id不为空时将组内人员查出放入candidate
*/
private List<Long> candidate;
/**
* 候选人名称用户名称 当组id不为空时将组内人员查出放入candidateName
*/
private List<String> candidateName;
/**
* 是否认领标识
* 当为空时默认当前任务不需要认领
* 当为true时当前任务说明为候选模式并且有人已经认领了任务可以归还
* 当为false时当前任务说明为候选模式该任务未认领
*/
private Boolean claim;
}

View File

@ -106,4 +106,9 @@ public class TaskVo {
* 流程状态
*/
private String businessStatusName;
/**
* 参与者
*/
private ParticipantVo participantVo;
}

View File

@ -174,10 +174,13 @@ public class ActTaskServiceImpl implements IActTaskService {
List<TaskVo> list = new ArrayList<>();
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.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
list.add(taskVo);
}
long count = query.count();
@ -206,10 +209,12 @@ public class ActTaskServiceImpl implements IActTaskService {
List<TaskVo> list = new ArrayList<>();
for (HistoricTaskInstance task : taskInstanceList) {
TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
if (CollUtil.isNotEmpty(historicProcessInstanceList)) {
historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
taskVo.setBusinessStatus(e.getBusinessStatus());
taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus()));
});
}
list.add(taskVo);
}
long count = query.count();

View File

@ -3,16 +3,27 @@ package org.dromara.workflow.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.dromara.common.core.enums.UserStatus;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.SysUserRole;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.mapper.SysUserRoleMapper;
import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.domain.vo.ParticipantVo;
import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.*;
import org.flowable.editor.language.json.converter.BpmnJsonConverter;
import org.flowable.engine.ProcessEngine;
import org.flowable.identitylink.api.history.HistoricIdentityLink;
import org.flowable.task.api.Task;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
@ -22,10 +33,7 @@ import javax.xml.stream.XMLStreamReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.rmi.ServerException;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -39,6 +47,8 @@ public class WorkflowUtils {
}
private static final ProcessEngine PROCESS_ENGINE = SpringUtils.getBean(ProcessEngine.class);
private static final SysUserMapper SYS_USER_MAPPER = SpringUtils.getBean(SysUserMapper.class);
private static final SysUserRoleMapper SYS_USER_ROLE_MAPPER = SpringUtils.getBean(SysUserRoleMapper.class);
/**
* bpmnModel转为xml
@ -158,4 +168,60 @@ public class WorkflowUtils {
}
return task;
}
/**
* 获取当前任务参与者
*
* @param taskId 任务id
*/
public static ParticipantVo getCurrentTaskParticipant(String taskId) {
ParticipantVo participantVo = new ParticipantVo();
List<HistoricIdentityLink> linksForTask = PROCESS_ENGINE.getHistoryService().getHistoricIdentityLinksForTask(taskId);
Task task = PROCESS_ENGINE.getTaskService().createTaskQuery().taskTenantId(TenantHelper.getTenantId()).taskId(taskId).singleResult();
if (task != null && CollUtil.isNotEmpty(linksForTask)) {
List<HistoricIdentityLink> groupList = StreamUtils.filter(linksForTask, e -> StringUtils.isNotBlank(e.getGroupId()));
if (CollUtil.isNotEmpty(groupList)) {
List<Long> groupIds = StreamUtils.toList(groupList, e -> Long.valueOf(e.getGroupId()));
List<SysUserRole> sysUserRoles = SYS_USER_ROLE_MAPPER.selectList(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getRoleId, groupIds));
if (CollUtil.isNotEmpty(sysUserRoles)) {
participantVo.setGroupIds(groupIds);
List<Long> userIdList = StreamUtils.toList(sysUserRoles, SysUserRole::getUserId);
List<SysUser> sysUsers = SYS_USER_MAPPER.selectList(
new LambdaQueryWrapper<SysUser>().in(SysUser::getUserId, userIdList).eq(SysUser::getStatus, UserStatus.OK.getCode()));
if (CollUtil.isNotEmpty(sysUsers)) {
List<Long> userIds = StreamUtils.toList(sysUsers, SysUser::getUserId);
List<String> nickNames = StreamUtils.toList(sysUsers, SysUser::getNickName);
participantVo.setCandidate(userIds);
participantVo.setCandidateName(nickNames);
participantVo.setClaim(!StringUtils.isBlank(task.getAssignee()));
}
}
} else {
List<HistoricIdentityLink> candidateList = StreamUtils.filter(linksForTask, e -> FlowConstant.CANDIDATE.equals(e.getType()));
List<Long> userIdList = new ArrayList<>();
for (HistoricIdentityLink historicIdentityLink : linksForTask) {
try {
userIdList.add(Long.valueOf(historicIdentityLink.getUserId()));
} catch (NumberFormatException ignored) {
}
}
List<SysUser> sysUsers = SYS_USER_MAPPER.selectList(
new LambdaQueryWrapper<SysUser>().in(SysUser::getUserId, userIdList).eq(SysUser::getStatus, UserStatus.OK.getCode()));
if (CollUtil.isNotEmpty(sysUsers)) {
List<Long> userIds = StreamUtils.toList(sysUsers, SysUser::getUserId);
List<String> nickNames = StreamUtils.toList(sysUsers, SysUser::getNickName);
participantVo.setCandidate(userIds);
participantVo.setCandidateName(nickNames);
if (StringUtils.isBlank(task.getAssignee()) && CollUtil.isNotEmpty(candidateList)) {
participantVo.setClaim(false);
}
if (!StringUtils.isBlank(task.getAssignee()) && CollUtil.isNotEmpty(candidateList)) {
participantVo.setClaim(true);
}
}
}
}
return participantVo;
}
}