From c3326403c009bbfb3452be59e119aaaad79e34b7 Mon Sep 17 00:00:00 2001 From: songgaoshuai <1742057357@qq.com> Date: Sun, 25 Jun 2023 15:37:14 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E4=BB=BB=E5=8A=A1=E5=8F=82=E4=B8=8E=E8=80=85?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=BB=E5=8A=A1=E5=BE=85=E5=8A=9E?= =?UTF-8?q?=EF=BC=8C=E5=B7=B2=E5=8A=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/FlowConstant.java | 5 ++ .../workflow/domain/vo/ParticipantVo.java | 43 +++++++++++ .../dromara/workflow/domain/vo/TaskVo.java | 5 ++ .../service/impl/ActTaskServiceImpl.java | 21 ++++-- .../dromara/workflow/utils/WorkflowUtils.java | 74 ++++++++++++++++++- 5 files changed, 136 insertions(+), 12 deletions(-) create mode 100644 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java index 160f5a60e..6b0d465e3 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java @@ -27,4 +27,9 @@ public interface FlowConstant { */ String PENDING = "PENDING"; + /** + * 候选人标识 + */ + String CANDIDATE = "candidate"; + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java new file mode 100644 index 000000000..c5876f689 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ParticipantVo.java @@ -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 groupIds; + + /** + * 候选人id(用户id) 当组id不为空时,将组内人员查出放入candidate + */ + private List candidate; + + /** + * 候选人名称(用户名称) 当组id不为空时,将组内人员查出放入candidateName + */ + private List candidateName; + + /** + * 是否认领标识 + * 当为空时默认当前任务不需要认领 + * 当为true时当前任务说明为候选模式并且有人已经认领了任务可以归还, + * 当为false时当前任务说明为候选模式该任务未认领, + */ + private Boolean claim; + +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java index 0d4bae364..dce733440 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java @@ -106,4 +106,9 @@ public class TaskVo { * 流程状态 */ private String businessStatusName; + + /** + * 参与者 + */ + private ParticipantVo participantVo; } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java index d47938601..93a7e3226 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java @@ -174,10 +174,13 @@ public class ActTaskServiceImpl implements IActTaskService { List list = new ArrayList<>(); for (Task task : taskList) { TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); - processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { - taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); - }); + 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 list = new ArrayList<>(); for (HistoricTaskInstance task : taskInstanceList) { TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class); - historicProcessInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> { - taskVo.setBusinessStatus(e.getBusinessStatus()); - taskVo.setBusinessStatusName(BusinessStatusEnum.getEumByStatus(taskVo.getBusinessStatus())); - }); + 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(); diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java index bd7a16930..6ca8ed2e8 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java @@ -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 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 groupList = StreamUtils.filter(linksForTask, e -> StringUtils.isNotBlank(e.getGroupId())); + if (CollUtil.isNotEmpty(groupList)) { + List groupIds = StreamUtils.toList(groupList, e -> Long.valueOf(e.getGroupId())); + List sysUserRoles = SYS_USER_ROLE_MAPPER.selectList(new LambdaQueryWrapper().in(SysUserRole::getRoleId, groupIds)); + if (CollUtil.isNotEmpty(sysUserRoles)) { + participantVo.setGroupIds(groupIds); + List userIdList = StreamUtils.toList(sysUserRoles, SysUserRole::getUserId); + List sysUsers = SYS_USER_MAPPER.selectList( + new LambdaQueryWrapper().in(SysUser::getUserId, userIdList).eq(SysUser::getStatus, UserStatus.OK.getCode())); + if (CollUtil.isNotEmpty(sysUsers)) { + List userIds = StreamUtils.toList(sysUsers, SysUser::getUserId); + List nickNames = StreamUtils.toList(sysUsers, SysUser::getNickName); + participantVo.setCandidate(userIds); + participantVo.setCandidateName(nickNames); + participantVo.setClaim(!StringUtils.isBlank(task.getAssignee())); + } + } + } else { + List candidateList = StreamUtils.filter(linksForTask, e -> FlowConstant.CANDIDATE.equals(e.getType())); + List userIdList = new ArrayList<>(); + for (HistoricIdentityLink historicIdentityLink : linksForTask) { + try { + userIdList.add(Long.valueOf(historicIdentityLink.getUserId())); + } catch (NumberFormatException ignored) { + + } + } + List sysUsers = SYS_USER_MAPPER.selectList( + new LambdaQueryWrapper().in(SysUser::getUserId, userIdList).eq(SysUser::getStatus, UserStatus.OK.getCode())); + if (CollUtil.isNotEmpty(sysUsers)) { + List userIds = StreamUtils.toList(sysUsers, SysUser::getUserId); + List 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; + } }