mirror of
https://github.com/dromara/RuoYi-Vue-Plus.git
synced 2025-09-29 22:56:40 +08:00
add 添加获取当前任务参与者,优化任务待办,已办
This commit is contained in:
parent
a953008087
commit
c3326403c0
@ -27,4 +27,9 @@ public interface FlowConstant {
|
|||||||
*/
|
*/
|
||||||
String PENDING = "PENDING";
|
String PENDING = "PENDING";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 候选人标识
|
||||||
|
*/
|
||||||
|
String CANDIDATE = "candidate";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -106,4 +106,9 @@ public class TaskVo {
|
|||||||
* 流程状态
|
* 流程状态
|
||||||
*/
|
*/
|
||||||
private String businessStatusName;
|
private String businessStatusName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参与者
|
||||||
|
*/
|
||||||
|
private ParticipantVo participantVo;
|
||||||
}
|
}
|
||||||
|
@ -174,10 +174,13 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
List<TaskVo> list = new ArrayList<>();
|
List<TaskVo> list = new ArrayList<>();
|
||||||
for (Task task : taskList) {
|
for (Task task : taskList) {
|
||||||
TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
|
TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
|
||||||
processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
|
if (CollUtil.isNotEmpty(processInstanceList)) {
|
||||||
taskVo.setBusinessStatus(e.getBusinessStatus());
|
processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
|
||||||
taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus()));
|
taskVo.setBusinessStatus(e.getBusinessStatus());
|
||||||
});
|
taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus()));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
|
||||||
list.add(taskVo);
|
list.add(taskVo);
|
||||||
}
|
}
|
||||||
long count = query.count();
|
long count = query.count();
|
||||||
@ -206,10 +209,12 @@ public class ActTaskServiceImpl implements IActTaskService {
|
|||||||
List<TaskVo> list = new ArrayList<>();
|
List<TaskVo> list = new ArrayList<>();
|
||||||
for (HistoricTaskInstance task : taskInstanceList) {
|
for (HistoricTaskInstance task : taskInstanceList) {
|
||||||
TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
|
TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
|
||||||
historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
|
if (CollUtil.isNotEmpty(historicProcessInstanceList)) {
|
||||||
taskVo.setBusinessStatus(e.getBusinessStatus());
|
historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
|
||||||
taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus()));
|
taskVo.setBusinessStatus(e.getBusinessStatus());
|
||||||
});
|
taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus()));
|
||||||
|
});
|
||||||
|
}
|
||||||
list.add(taskVo);
|
list.add(taskVo);
|
||||||
}
|
}
|
||||||
long count = query.count();
|
long count = query.count();
|
||||||
|
@ -3,16 +3,27 @@ package org.dromara.workflow.utils;
|
|||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.io.IoUtil;
|
import cn.hutool.core.io.IoUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
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.JsonNode;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
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.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.json.utils.JsonUtils;
|
||||||
import org.dromara.common.tenant.helper.TenantHelper;
|
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.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd;
|
||||||
import org.flowable.bpmn.converter.BpmnXMLConverter;
|
import org.flowable.bpmn.converter.BpmnXMLConverter;
|
||||||
import org.flowable.bpmn.model.*;
|
import org.flowable.bpmn.model.*;
|
||||||
import org.flowable.editor.language.json.converter.BpmnJsonConverter;
|
import org.flowable.editor.language.json.converter.BpmnJsonConverter;
|
||||||
import org.flowable.engine.ProcessEngine;
|
import org.flowable.engine.ProcessEngine;
|
||||||
|
import org.flowable.identitylink.api.history.HistoricIdentityLink;
|
||||||
import org.flowable.task.api.Task;
|
import org.flowable.task.api.Task;
|
||||||
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
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.ByteArrayInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.rmi.ServerException;
|
import java.rmi.ServerException;
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
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 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
|
* bpmnModel转为xml
|
||||||
@ -158,4 +168,60 @@ public class WorkflowUtils {
|
|||||||
}
|
}
|
||||||
return task;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user