kimi
2020-05-27 2893347bf72477c4d108e8589a0f61e3e97a990c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
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<String,Object> other) {
        Map<String, Object> variables = new LinkedHashMap<String, Object>();
        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<String> getTodoTask()  {
        TUser onlineUser = getOnlineUser();
        Set<String> result = new HashSet<>();
        //List<Task> list1 = TimeTaskService.createTaskQuery().active().list();
        List<Task> list = taskService.createTaskQuery().taskAssignee(onlineUser.getUserId()).active().list();
 
        result.addAll(list.stream().map(task -> task.getProcessInstanceId()).collect(Collectors.toList()));
 
        List<Task> toClaimList = taskService.createTaskQuery().taskCandidateUser(onlineUser.getUserId()).active().list();
 
        result.addAll(toClaimList.stream().map(task -> task.getProcessInstanceId()).collect(Collectors.toList()));
 
 
        List<Group> groups = identityService.createGroupQuery().groupMember(onlineUser.getUserId()).list();
        if (groups.size() == 0)  {
            return new ArrayList<>(result);
        }
        List<String> 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<Expression> userCodes = taskDef.getCandidateUserIdExpressions();//候选人
        Set<Expression> roleCodes = taskDef.getCandidateGroupIdExpressions();//候选组
        if (roleCodes != null) {
            Set<String> roleList = roleCodes.stream().map(expression -> expression.getExpressionText()).collect(Collectors.toSet());
            nextTaskUserInfo.addRoleList(roleList);
        }
        Set<String> userList = new HashSet<>();
        if (userCodes != null) {
            Set userSet = userCodes.stream().map(expression -> expression.getExpressionText()).collect(Collectors.toSet());
            userList.addAll(userSet);
        }
        List<String> roleIdList = nextTaskUserInfo.getRoleIdList();
        if (roleIdList == null || roleIdList.isEmpty()) {
            nextTaskUserInfo.addUserList(userList);
            return nextTaskUserInfo;
        }
        for (String roleId : roleIdList) {
            Set<String> userByRole = DbUtils.getUserByRole(roleId);
            userList.addAll(userByRole);
        }
        nextTaskUserInfo.addUserList(userList);
        return nextTaskUserInfo;
 
    }
 
}