| | |
| | | package com.ycl.service.impl; |
| | | |
| | | import cn.hutool.core.collection.CollectionUtil; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.JSONObject; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | |
| | | import com.ycl.common.core.domain.entity.SysRole; |
| | | import com.ycl.common.core.domain.entity.SysUser; |
| | | import com.ycl.common.enums.FlowComment; |
| | | import com.ycl.common.enums.business.HandlerTypeEnum; |
| | | import com.ycl.common.enums.business.TaskStatusEnum; |
| | | import com.ycl.common.utils.SecurityUtils; |
| | | import com.ycl.constant.TaskTypeConstant; |
| | |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.flowable.bpmn.model.*; |
| | | import org.flowable.bpmn.model.Process; |
| | | import org.flowable.common.engine.impl.util.CollectionUtil; |
| | | import org.flowable.engine.*; |
| | | import org.flowable.engine.history.HistoricProcessInstance; |
| | | import org.flowable.engine.repository.ProcessDefinition; |
| | |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.Assert; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | |
| | | |
| | | /** |
| | | * 分页查询 |
| | | * |
| | | * @param query |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 获取流程详情 |
| | | * |
| | | * @param projectId |
| | | * @return |
| | | */ |
| | |
| | | taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId())); |
| | | taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(processDefId, projectProcess.getProcessInsId())); |
| | | // taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId())); |
| | | taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInsId())); |
| | | taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(projectProcess.getProcessDefId(), projectProcess.getProcessInsId())); |
| | | detail.setStatistics(taskStatistics); |
| | | |
| | | Result result = Result.ok(); |
| | | |
| | | // 代办任务 |
| | | this.getTodoTaskList(projectProcess.getProcessInsId(),"", 5, 1, result); |
| | | this.getTodoTaskList(projectProcess.getProcessInsId(), "", 5, 1, result); |
| | | return result.data(detail); |
| | | } |
| | | |
| | |
| | | Result ok = Result.ok(); |
| | | switch (query.getTaskType()) { |
| | | case TaskTypeConstant.ALL: |
| | | this.getAllUserTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName (), (int)query.getCurrentPage(), (int)query.getPageSize(), ok); |
| | | this.getAllUserTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok); |
| | | break; |
| | | case TaskTypeConstant.TODO: |
| | | this.getTodoTaskList(projectProcess.getProcessInsId(), query.getTaskName(), (int)query.getPageSize(), (int)query.getCurrentPage(), ok); |
| | | this.getTodoTaskList(projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getPageSize(), (int) query.getCurrentPage(), ok); |
| | | ok.data(ok.get("taskList")); |
| | | break; |
| | | case TaskTypeConstant.CURRENT: |
| | | break; |
| | | case TaskTypeConstant.REMAINING: |
| | | this.getRemainingTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName (), (int)query.getCurrentPage(), (int)query.getPageSize(), ok); |
| | | this.getRemainingTask(query.getProcessDefId(), projectProcess.getProcessInsId(), query.getTaskName(), (int) query.getCurrentPage(), (int) query.getPageSize(), ok); |
| | | break; |
| | | default: |
| | | break; |
| | |
| | | for (IdentityLink identityLink : identityLinksForTask) { |
| | | // 绑定的是用户,查出用户姓名、部门 |
| | | if (StringUtils.isNotBlank(identityLink.getUserId())) { |
| | | taskVO.setHandlerType(HandlerTypeEnum.USER); |
| | | SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); |
| | | if (Objects.nonNull(sysUser)) { |
| | | taskVO.setHandlerId(sysUser.getUserId()); |
| | |
| | | } |
| | | taskVO.setHandlerName(sysUser.getNickName()); |
| | | } |
| | | // 绑定的是角色,查出角色名称 |
| | | // 绑定的是角色或者部门 |
| | | } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { |
| | | SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); |
| | | if (Objects.nonNull(role)) { |
| | | taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); |
| | | taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理"); |
| | | taskVO.setHandlerName("暂未处理"); |
| | | taskVO.setHandlerId(null); |
| | | if (identityLink.getGroupId().startsWith("dept")) { // 部门的id是加了前缀的如:dept:1 |
| | | taskVO.setHandlerType(HandlerTypeEnum.DEPT); |
| | | String[] split = identityLink.getGroupId().split(":"); |
| | | if (split.length > 1) { |
| | | // 部门 |
| | | SysDept dept = sysDeptService.selectDeptById(Long.parseLong(split[1])); |
| | | if (Objects.nonNull(dept)) { |
| | | taskVO.setHandlerUnitId(dept.getDeptId()); |
| | | taskVO.setHandlerUnitName(dept.getDeptName()); |
| | | taskVO.setHandlerName("暂未处理"); |
| | | taskVO.setHandlerId(null); |
| | | } |
| | | } |
| | | } else { |
| | | taskVO.setHandlerType(HandlerTypeEnum.ROLE); |
| | | SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); |
| | | if (Objects.nonNull(role)) { |
| | | taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); |
| | | taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理"); |
| | | taskVO.setHandlerName("暂未处理"); |
| | | taskVO.setHandlerId(null); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | vos.add(taskVO); |
| | | } |
| | | result.put("taskList", vos); |
| | | } |
| | | |
| | | @Override |
| | | public Result detailByProcessInsId(com.ycl.domain.query.TaskQuery query) { |
| | | List<ProjectProcess> list = new LambdaQueryChainWrapper<>(baseMapper) |
| | | .eq(ProjectProcess::getProcessInsId, query.getProcessInsId()) |
| | | .eq(ProjectProcess::getProcessDefId, query.getProcessDefId()) |
| | | .list(); |
| | | return Result.ok().data(list); |
| | | } |
| | | |
| | | @Override |
| | | public Result taskIsAuditing(String processDefinitionId, String taskId) { |
| | | BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); |
| | | Collection<Process> processes = bpmnModel.getProcesses(); |
| | | for (Process process : processes) { |
| | | Collection<FlowElement> flowElements = process.getFlowElements(); |
| | | for (FlowElement flowElement : flowElements) { |
| | | if (flowElement instanceof UserTask) { |
| | | UserTask userTask = (UserTask) flowElement; |
| | | List<ExtensionElement> extensionElements = userTask.getExtensionElements().get("flowable:properties"); |
| | | if (! CollectionUtils.isEmpty(extensionElements)) { |
| | | for (ExtensionElement extensionElement : extensionElements) { |
| | | String fieldName = extensionElement.getAttributeValue(taskId,"name"); |
| | | String fieldValue = extensionElement.getAttributeValue(taskId,"value"); |
| | | System.out.println("Field Name: " + fieldName + ", Field Value: " + fieldValue); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | |
| | | for (IdentityLink identityLink : identityLinksForTask) { |
| | | // 绑定的是用户,查出用户姓名、部门 |
| | | if (StringUtils.isNotBlank(identityLink.getUserId())) { |
| | | taskVO.setHandlerType(HandlerTypeEnum.USER); |
| | | SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); |
| | | if (Objects.nonNull(sysUser)) { |
| | | taskVO.setHandlerId(sysUser.getUserId()); |
| | |
| | | // 绑定的是角色或者部门 |
| | | } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { |
| | | if (identityLink.getGroupId().startsWith("dept")) { // 部门的id是加了前缀的如:dept:1 |
| | | taskVO.setHandlerType(HandlerTypeEnum.DEPT); |
| | | String[] split = identityLink.getGroupId().split(":"); |
| | | if (split.length > 1) { |
| | | // 部门 |
| | |
| | | } |
| | | } |
| | | } else { |
| | | taskVO.setHandlerType(HandlerTypeEnum.ROLE); |
| | | SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); |
| | | if (Objects.nonNull(role)) { |
| | | taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); |
| | |
| | | * 获取所有任务 |
| | | * |
| | | * @param processDefinitionId 流程运行id |
| | | * @param processInsId 流程实例id |
| | | * @param processInsId 流程实例id |
| | | * @param pageNum |
| | | * @param pageSize |
| | | * @param result |
| | |
| | | int startNum = pageSize * (pageNum - 1); |
| | | int endNum = startNum + pageSize; |
| | | List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId); |
| | | result.total(allUserTaskElement.size()); |
| | | if (startNum >= allUserTaskElement.size()) { |
| | | // 如果起始索引超出了列表的大小,返回一个空列表 |
| | | return new ArrayList<>(); |
| | |
| | | // 模拟模糊查询 |
| | | allUserTaskElement = allUserTaskElement.stream().filter(taskEl -> taskEl.getName().contains(taskName)).collect(Collectors.toList()); |
| | | } |
| | | result.total(allUserTaskElement.size()); |
| | | int end = Math.min(endNum, allUserTaskElement.size()); |
| | | List<UserTask> userTasks = allUserTaskElement.subList(startNum, end); |
| | | // 查出流程 |
| | |
| | | if (Objects.isNull(historicTask)) { |
| | | // 未开始的任务,其关联的用户组这些都可以从UserTask中拿到,因为本身未开始的任务是没有task的,所以这里直接查 |
| | | if (StringUtils.isNotBlank(userTask.getAssignee())) { |
| | | vo.setHandlerType(HandlerTypeEnum.USER); |
| | | SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); |
| | | if (Objects.nonNull(sysUser)) { |
| | | vo.setHandlerId(sysUser.getUserId()); |
| | |
| | | } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) { |
| | | String groupId = userTask.getCandidateGroups().get(0); |
| | | if (groupId.startsWith("dept")) { // 部门的id是加了前缀的如:dept:1 |
| | | vo.setHandlerType(HandlerTypeEnum.DEPT); |
| | | String[] split = groupId.split(":"); |
| | | if (split.length > 1) { |
| | | // 部门 |
| | |
| | | } |
| | | } |
| | | } else { |
| | | vo.setHandlerType(HandlerTypeEnum.ROLE); |
| | | SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId)); |
| | | if (Objects.nonNull(role)) { |
| | | vo.setHandlerUnitId(Long.parseLong(groupId)); |
| | |
| | | int startNum = pageSize * (pageNum - 1); |
| | | int endNum = startNum + pageSize; |
| | | List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId); |
| | | result.total(allUserTaskElement.size()); |
| | | |
| | | if (startNum >= allUserTaskElement.size()) { |
| | | // 如果起始索引超出了列表的大小,返回一个空列表 |
| | | return new ArrayList<>(); |
| | |
| | | // 模拟模糊查询 |
| | | allUserTaskElement = allUserTaskElement.stream().filter(taskEl -> taskEl.getName().contains(taskName)).collect(Collectors.toList()); |
| | | } |
| | | result.total(allUserTaskElement.size()); |
| | | int end = Math.min(endNum, allUserTaskElement.size()); |
| | | List<UserTask> userTasks = allUserTaskElement.subList(startNum, end); |
| | | // 查出流程 |
| | |
| | | if (Objects.isNull(historicTask)) { |
| | | // 未开始的任务,其关联的用户组这些都可以从UserTask中拿到,因为本身未开始的任务是没有task的,所以这里直接查 |
| | | if (StringUtils.isNotBlank(userTask.getAssignee())) { |
| | | vo.setHandlerType(HandlerTypeEnum.USER); |
| | | SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee())); |
| | | if (Objects.nonNull(sysUser)) { |
| | | vo.setHandlerId(sysUser.getUserId()); |
| | |
| | | } else if (CollectionUtil.isNotEmpty(userTask.getCandidateGroups())) { |
| | | String groupId = userTask.getCandidateGroups().get(0); |
| | | if (groupId.startsWith("dept")) { // 部门的id是加了前缀的如:dept:1 |
| | | vo.setHandlerType(HandlerTypeEnum.DEPT); |
| | | String[] split = groupId.split(":"); |
| | | if (split.length > 1) { |
| | | // 部门 |
| | |
| | | } |
| | | } |
| | | } else { |
| | | vo.setHandlerType(HandlerTypeEnum.ROLE); |
| | | SysRole role = sysRoleService.selectRoleById(Long.parseLong(groupId)); |
| | | if (Objects.nonNull(role)) { |
| | | vo.setHandlerUnitId(Long.parseLong(groupId)); |
| | |
| | | * 查询剩余事项(未开始的任务)数量 |
| | | * |
| | | * @param processDefinitionId 流程定义id |
| | | * @param processInsId 流程实例id |
| | | * @param processInsId 流程实例id |
| | | * @return |
| | | */ |
| | | private Long getRemainingTaskNum(String processDefinitionId, String processInsId) { |
| | |
| | | if (StringUtils.isNotBlank(identityLink.getUserId())) { |
| | | SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); |
| | | if (Objects.nonNull(sysUser)) { |
| | | taskVO.setHandlerType(HandlerTypeEnum.USER); |
| | | taskVO.setHandlerId(sysUser.getUserId()); |
| | | if (Objects.nonNull(sysUser.getDept())) { |
| | | taskVO.setHandlerUnitId(sysUser.getDept().getDeptId()); |
| | |
| | | // 绑定的是角色或者是部门,需要根据id判断 |
| | | } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { |
| | | if (identityLink.getGroupId().startsWith("dept")) { // 部门的id是加了前缀的如:dept:1 |
| | | taskVO.setHandlerType(HandlerTypeEnum.DEPT); |
| | | String[] split = identityLink.getGroupId().split(":"); |
| | | if (split.length > 1) { |
| | | // 部门 |
| | |
| | | } |
| | | } |
| | | } else { |
| | | taskVO.setHandlerType(HandlerTypeEnum.ROLE); |
| | | SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); |
| | | if (Objects.nonNull(role)) { |
| | | taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); |
| | |
| | | } |
| | | } |
| | | } |
| | | } else if (TaskStatusEnum.FINISHED.equals(taskVO.getTaskStatus())){ |
| | | } else if (TaskStatusEnum.FINISHED.equals(taskVO.getTaskStatus())) { |
| | | for (IdentityLinkInfo identityLink : identityLinkInfos) { |
| | | // 绑定的是用户,查出用户姓名、部门 |
| | | if (StringUtils.isNotBlank(identityLink.getUserId())) { |
| | | taskVO.setHandlerType(HandlerTypeEnum.USER); |
| | | SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId())); |
| | | if (Objects.nonNull(sysUser)) { |
| | | // taskVO.setHandlerId(sysUser.getUserId()); |
| | |
| | | // 绑定的是角色,查出角色名称 |
| | | } else if (StringUtils.isNotBlank(identityLink.getGroupId())) { |
| | | if (identityLink.getGroupId().startsWith("dept")) { |
| | | taskVO.setHandlerType(HandlerTypeEnum.DEPT); |
| | | String[] split = identityLink.getGroupId().split(":"); |
| | | if (split.length > 1) { |
| | | // 部门 |
| | |
| | | taskVO.setHandlerUnitName(dept.getDeptName()); |
| | | } |
| | | } |
| | | } |
| | | SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); |
| | | if (Objects.nonNull(role)) { |
| | | taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); |
| | | taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理"); |
| | | } else { |
| | | taskVO.setHandlerType(HandlerTypeEnum.ROLE); |
| | | SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId())); |
| | | if (Objects.nonNull(role)) { |
| | | taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId())); |
| | | taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理"); |
| | | // taskVO.setHandlerName(role.getRoleName()); |
| | | // taskVO.setHandlerId(null); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | /** |
| | | * 获取流程节点数(总任务数,不包含开始、结束等特殊的,只统计UserTask类型的) |
| | | * |
| | | * @param processDefinitionId 流程定义id |
| | | * @param processDefinitionId 流程定义id |
| | | * @return |
| | | */ |
| | | private Long getTotalTaskNum(String processDefinitionId) { |
| | | return Long.valueOf(this.getAllUserTaskElement(processDefinitionId).size()); |
| | | } |
| | | |
| | | /** |
| | | * 获取流程剩余未完成的任务数 |
| | | * |
| | | * @param processInstanceId |
| | | * @return |
| | | */ |
| | | private Long getNotFinishedTaskNum(String processInstanceId) { |
| | | return historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).processUnfinished().count(); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @return |
| | | */ |
| | | private List<Task> getCurrentNodeTaskList(String processInstanceId) { |
| | | return taskService.createTaskQuery().processDefinitionId(processInstanceId).list(); |
| | | return taskService.createTaskQuery().processDefinitionId(processInstanceId).list(); |
| | | } |
| | | } |