diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java new file mode 100644 index 000000000..287c3b7d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WorkflowUserController.java @@ -0,0 +1,49 @@ +package org.dromara.workflow.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.workflow.domain.bo.SysUserMultiBo; +import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.service.IWorkflowUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +/** + * 工作流用户选人管理 控制层 + * + * @author may + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/workflow/user") +public class WorkflowUserController extends BaseController { + + private final IWorkflowUserService iWorkflowUserService; + + /** + * 分页查询工作流选择加签人员 + * + * @param sysUserMultiBo 参数 + */ + @GetMapping("/getWorkflowAddMultiListByPage") + public TableDataInfo getWorkflowAddMultiInstanceByPage(SysUserMultiBo sysUserMultiBo) { + return iWorkflowUserService.getWorkflowAddMultiInstanceByPage(sysUserMultiBo); + } + + /** + * 查询工作流选择减签人员 + * + * @param taskId 任务id + */ + @GetMapping("/getWorkflowDeleteMultiInstanceList/{taskId}") + public R> getWorkflowDeleteMultiInstanceList(@PathVariable String taskId) { + return R.ok(iWorkflowUserService.getWorkflowDeleteMultiInstanceList(taskId)); + } +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java new file mode 100644 index 000000000..b54f481ce --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/SysUserMultiBo.java @@ -0,0 +1,34 @@ +package org.dromara.workflow.domain.bo; + +import lombok.Data; +import org.dromara.workflow.common.PageEntity; + + +/** + * 用户加签查询 + * + * @author may + */ +@Data + +public class SysUserMultiBo extends PageEntity { + /** + * 人员名称 + */ + private String userName; + + /** + * 人员名称 + */ + private String nickName; + + /** + * 部门id + */ + private String deptId; + + /** + * 任务id + */ + private String taskId; +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java new file mode 100644 index 000000000..c70be04d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWorkflowUserService.java @@ -0,0 +1,32 @@ +package org.dromara.workflow.service; + +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.workflow.domain.bo.SysUserMultiBo; +import org.dromara.workflow.domain.vo.TaskVo; + +import java.util.List; + +/** + * 工作流用户选人管理 服务层 + * + * @author may + */ +public interface IWorkflowUserService { + + /** + * 分页查询工作流选择加签人员 + * + * @param sysUserMultiBo 参数 + * @return 结果 + */ + TableDataInfo getWorkflowAddMultiInstanceByPage(SysUserMultiBo sysUserMultiBo); + + /** + * 查询工作流选择减签人员 + * + * @param taskId 任务id + * @return 结果 + */ + List getWorkflowDeleteMultiInstanceList(String taskId); +} diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java new file mode 100644 index 000000000..a2e888f2b --- /dev/null +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WorkflowUserServiceImpl.java @@ -0,0 +1,175 @@ +package org.dromara.workflow.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.enums.UserStatus; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysDeptVo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysUserMapper; +import org.dromara.workflow.domain.bo.SysUserMultiBo; +import org.dromara.workflow.domain.vo.MultiInstanceVo; +import org.dromara.workflow.domain.vo.TaskVo; +import org.dromara.workflow.service.IWorkflowUserService; +import org.dromara.workflow.utils.WorkflowUtils; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavior; +import org.flowable.engine.impl.bpmn.behavior.SequentialMultiInstanceBehavior; +import org.flowable.task.api.Task; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 工作流用户选人管理 业务处理层 + * + * @author may + */ +@RequiredArgsConstructor +@Service +public class WorkflowUserServiceImpl implements IWorkflowUserService { + + private final SysUserMapper sysUserMapper; + private final SysDeptMapper sysDeptMapper; + private final TaskService taskService; + private final RuntimeService runtimeService; + + /** + * 分页查询工作流选择加签人员 + * + * @param sysUserMultiBo 参数 + */ + @Override + public TableDataInfo getWorkflowAddMultiInstanceByPage(SysUserMultiBo sysUserMultiBo) { + Task task = taskService.createTaskQuery().taskId(sysUserMultiBo.getTaskId()).singleResult(); + if (task == null) { + throw new ServiceException("任务不存在"); + } + MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + //检索条件 + queryWrapper.eq(StringUtils.isNotEmpty(sysUserMultiBo.getDeptId()), SysUser::getDeptId, sysUserMultiBo.getDeptId()); + queryWrapper.eq(SysUser::getStatus, UserStatus.OK.getCode()); + if (multiInstance != null) { + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + List assigneeList = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + queryWrapper.notIn(CollectionUtil.isNotEmpty(assigneeList), SysUser::getUserId, assigneeList); + } else { + List list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list(); + List userIds = StreamUtils.toList(list, e -> Long.valueOf(e.getAssignee())); + queryWrapper.notIn(CollectionUtil.isNotEmpty(userIds), SysUser::getUserId, userIds); + } + } + queryWrapper.like(StringUtils.isNotEmpty(sysUserMultiBo.getUserName()), SysUser::getUserName, sysUserMultiBo.getUserName()); + queryWrapper.like(StringUtils.isNotEmpty(sysUserMultiBo.getNickName()), SysUser::getNickName, sysUserMultiBo.getNickName()); + Page page = new Page<>(sysUserMultiBo.getPageNum(), sysUserMultiBo.getPageSize()); + Page userPage = sysUserMapper.selectVoPage(page, queryWrapper); + return TableDataInfo.build(recordPage(userPage)); + } + + /** + * 查询工作流选择减签人员 + * + * @param taskId 任务id 任务id + */ + @Override + public List getWorkflowDeleteMultiInstanceList(String taskId) { + Task task = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()).taskId(taskId).singleResult(); + List taskList = taskService.createTaskQuery().taskTenantId(TenantHelper.getTenantId()) + .processInstanceId(task.getProcessInstanceId()).list(); + MultiInstanceVo multiInstance = WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + List taskListVo = new ArrayList<>(); + if (multiInstance == null) { + return Collections.emptyList(); + } + List assigneeList = null; + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + assigneeList = (List) runtimeService.getVariable(task.getExecutionId(), multiInstance.getAssigneeList()); + } + + if (multiInstance.getType() instanceof SequentialMultiInstanceBehavior) { + List userIds = StreamUtils.filter(assigneeList, e -> !e.toString().equals(task.getAssignee())); + List sysUsers = null; + if (CollectionUtil.isNotEmpty(userIds)) { + sysUsers = sysUserMapper.selectVoBatchIds(userIds); + } + for (Long userId : userIds) { + TaskVo taskVo = new TaskVo(); + taskVo.setId("串行会签"); + taskVo.setExecutionId("串行会签"); + taskVo.setProcessInstanceId(task.getProcessInstanceId()); + taskVo.setName(task.getName()); + taskVo.setAssignee(userId); + if (CollectionUtil.isNotEmpty(sysUsers)) { + sysUsers.stream().filter(u -> u.getUserId().toString().equals(userId.toString())).findFirst().ifPresent(u -> { + taskVo.setAssigneeName(u.getNickName()); + }); + } + taskListVo.add(taskVo); + } + return taskListVo; + } else if (multiInstance.getType() instanceof ParallelMultiInstanceBehavior) { + List tasks = StreamUtils.filter(taskList, e -> StringUtils.isBlank(e.getParentTaskId()) && !e.getExecutionId().equals(task.getExecutionId()) + && e.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())); + if (CollectionUtil.isNotEmpty(tasks)) { + List userIds = StreamUtils.toList(tasks, e -> Long.valueOf(e.getAssignee())); + List sysUsers = null; + if (CollectionUtil.isNotEmpty(userIds)) { + sysUsers = sysUserMapper.selectVoBatchIds(userIds); + } + for (Task t : tasks) { + TaskVo taskVo = new TaskVo(); + taskVo.setId(t.getId()); + taskVo.setExecutionId(t.getExecutionId()); + taskVo.setProcessInstanceId(t.getProcessInstanceId()); + taskVo.setName(t.getName()); + taskVo.setAssignee(Long.valueOf(t.getAssignee())); + if (CollectionUtil.isNotEmpty(sysUsers)) { + sysUsers.stream().filter(u -> u.getUserId().toString().equals(t.getAssignee())).findFirst().ifPresent(e -> { + taskVo.setAssigneeName(e.getNickName()); + }); + } + taskListVo.add(taskVo); + } + return taskListVo; + } + } + return Collections.emptyList(); + } + + /** + * 翻译部门 + * + * @param page 用户分页数据 + */ + private Page recordPage(Page page) { + List records = page.getRecords(); + if (CollectionUtil.isEmpty(records)) { + return page; + } + List collectDeptId = records.stream().map(SysUserVo::getDeptId).filter(Objects::nonNull).collect(Collectors.toList()); + if (CollectionUtil.isEmpty(collectDeptId)) { + return page; + } + List sysDeptList = sysDeptMapper.selectVoBatchIds(collectDeptId); + records.forEach(e -> { + sysDeptList.stream().filter(d -> d.getDeptId().equals(e.getDeptId())).findFirst().ifPresent(e::setDept); + }); + page.setRecords(records); + return page; + } +}