kimi
2020-03-31 74472c9d22dddcb41383794caf0011043b20f817
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
package com.highdatas.mdm.service.act.impl;
 
import com.highdatas.mdm.entity.TUser;
import com.highdatas.mdm.pojo.NextTaskUserInfo;
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;
    public boolean checkClaim(String workflowId) {
        Task task = getTask(workflowId);
        if (task == null) {
            return true;
        }
        // 判断任务是否已经被签收
        if (task.getAssignee() == null) {
            return true;
        } else {
            return false;
        }
    }
    public String claimTask(String workflowId) {
        Task task = getTask(workflowId);
 
        TUser onlineUser = getOnlineUser();
        //resultPool = serviceCaller.getResultPool();
        
        try {
            taskService.claim(task.getId(), onlineUser.getUserId());
            //resultPool.setMessage("Task is claimed");
            return task.getId();
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
 
    
    public boolean completeTask(String taskId, boolean pass, String reason, Map<String,Object> other) {
        Map<String, Object> variables = new LinkedHashMap<String, Object>();
        if(other != null){
            Set<String> keySet = other.keySet();
            for (String key : keySet) {
                variables.put(key, other.get(key));
            }
        }
        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;
        }
    }    
    
    public boolean completeTask(String taskId, boolean pass, String reason) {
        return completeTask(taskId,pass,reason,null);
    }    
    
    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);
    }
    
    public Task geTask(String processId) {
        Task task = taskService.createTaskQuery().processInstanceId(processId).singleResult();
        return task;
    }
 
    @Override
    public NextTaskUserInfo getNestTaskAssignee(String workflowId) {
        //TODO 需修改
        NextTaskUserInfo nextTaskUserInfo = new NextTaskUserInfo();
        Task nextTask = geTask(workflowId);
        if (nextTask == null) {
            return null;
        }
        String nextTaskAssignee = nextTask.getAssignee();
        if (!StringUtils.isEmpty(nextTaskAssignee)) {
            nextTaskUserInfo.setUserId(nextTaskAssignee);
            nextTaskUserInfo.setRoleId("R001");
            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.size() != 0) {
            String roleId = roleCodes.stream().map(expression -> expression.getExpressionText()).findFirst().get();
            nextTaskUserInfo.setRoleId(roleId);
        }
        return nextTaskUserInfo;
    }
 
}