package com.highdatas.mdm.service.act.impl; import com.highdatas.mdm.entity.TUser; import com.highdatas.mdm.pojo.NextTaskUserInfo; import com.highdatas.mdm.util.DbUtils; import lombok.extern.slf4j.Slf4j; import org.activiti.engine.*; import org.activiti.engine.delegate.Expression; import org.activiti.engine.identity.Group; import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; import org.activiti.engine.impl.pvm.process.ActivityImpl; import org.activiti.engine.impl.task.TaskDefinition; import org.activiti.engine.task.Task; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service public class TaskServiceImpl extends BaseServiceImpl implements com.highdatas.mdm.service.act.TaskService{ @Autowired TaskService taskService; @Autowired RepositoryService repositoryService; @Autowired HistoryService historyService; @Autowired RuntimeService runtimeService; @Autowired IdentityService identityService; /** * * @description: 检验节点是否已经被接收 * @param workflowId 流程id * @return: 是否已被接收 * */ public boolean checkClaim(String workflowId) { Task task = getTask(workflowId); if (task == null) { return true; } // 判断任务是否已经被签收 if (task.getAssignee() == null) { return true; } else { return false; } } /** * * @description: 接收任务 * @param workflowId 流程id * @return: 任务id * */ public String claimTask(String workflowId) { Task task = getTask(workflowId); if (task == null) { return null; } TUser onlineUser = getOnlineUser(); //resultPool = serviceCaller.getResultPool(); if (onlineUser == null) { return null; } try { taskService.claim(task.getId(), onlineUser.getUserId()); //resultPool.setMessage("Task is claimed"); return task.getId(); } catch (Exception e) { e.printStackTrace(); return null; } } /** * * @description: 完成节点任务 * @param taskId 任务id * @param pass 是否通过 true,false * @param reason 原因 * @param other 其他参数 * @return: 是否完成成功 * */ public boolean completeTask(String taskId, Object pass, String reason, Map other) { Map variables = new LinkedHashMap(); if(other != null){ variables.putAll(other); } variables.put("pass", pass); variables.put("reason", reason); try { taskService.setVariables(taskId, variables); taskService.complete(taskId,variables); return true; } catch (Exception e) { e.printStackTrace(); log.debug("can not complete task(" + taskId + "): " + e.getMessage()); return false; } } /** * * @description: 完成节点任务 * @param taskId 任务id * @param pass 是否通过 true,false * @param reason 原因 * @return: 是否完成成功 * */ public boolean completeTask(String taskId, Object pass, String reason) { return completeTask(taskId,pass,reason,null); } /** * * @description: 获取待审批任务列表 * @return: 待审批任务列表 * */ public List getTodoTask() { TUser onlineUser = getOnlineUser(); Set result = new HashSet<>(); //List list1 = TimeTaskService.createTaskQuery().active().list(); List list = taskService.createTaskQuery().taskAssignee(onlineUser.getUserId()).active().list(); result.addAll(list.stream().map(task -> task.getProcessInstanceId()).collect(Collectors.toList())); List toClaimList = taskService.createTaskQuery().taskCandidateUser(onlineUser.getUserId()).active().list(); result.addAll(toClaimList.stream().map(task -> task.getProcessInstanceId()).collect(Collectors.toList())); List groups = identityService.createGroupQuery().groupMember(onlineUser.getUserId()).list(); if (groups.size() == 0) { return new ArrayList<>(result); } List groupIds = groups.stream().map(Group::getId).collect(Collectors.toList()); toClaimList = taskService.createTaskQuery().taskCandidateGroupIn(groupIds).active().list(); result.addAll(toClaimList.stream().map(task -> task.getProcessInstanceId()).collect(Collectors.toList())); return new ArrayList<>(result); } /** * * @description: 通过流程获取当前任务节点 * @param processId 流程id * @return: 当前任务节点 * */ public Task geTask(String processId) { Task task = taskService.createTaskQuery().processInstanceId(processId).singleResult(); return task; } @Override public NextTaskUserInfo getNestTaskAssignee(String workflowId) { NextTaskUserInfo nextTaskUserInfo = new NextTaskUserInfo(); Task nextTask = geTask(workflowId); if (nextTask == null) { return null; } String nextTaskAssignee = nextTask.getAssignee(); if (!StringUtils.isEmpty(nextTaskAssignee)) { nextTaskUserInfo.addOneUser(nextTaskAssignee); return nextTaskUserInfo; } String processDefinitionId=nextTask.getProcessDefinitionId(); // 获取流程定义id ProcessDefinitionEntity processDefinitionEntity= (ProcessDefinitionEntity) repositoryService.getProcessDefinition(processDefinitionId); ActivityImpl activityImpl=processDefinitionEntity.findActivity(nextTask.getTaskDefinitionKey()); // 根据活动id获取活动实例 TaskDefinition taskDef = (TaskDefinition)activityImpl.getProperties().get("taskDefinition"); Set userCodes = taskDef.getCandidateUserIdExpressions();//候选人 Set roleCodes = taskDef.getCandidateGroupIdExpressions();//候选组 if (roleCodes != null) { Set roleList = roleCodes.stream().map(expression -> expression.getExpressionText()).collect(Collectors.toSet()); nextTaskUserInfo.addRoleList(roleList); } Set userList = new HashSet<>(); if (userCodes != null) { Set userSet = userCodes.stream().map(expression -> expression.getExpressionText()).collect(Collectors.toSet()); userList.addAll(userSet); } List roleIdList = nextTaskUserInfo.getRoleIdList(); if (roleIdList == null || roleIdList.isEmpty()) { nextTaskUserInfo.addUserList(userList); return nextTaskUserInfo; } for (String roleId : roleIdList) { Set userByRole = DbUtils.getUserByRole(roleId); userList.addAll(userByRole); } nextTaskUserInfo.addUserList(userList); return nextTaskUserInfo; } }