package com.mossle.humantask.listener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.annotation.Resource;
import com.mossle.humantask.persistence.domain.TaskInfo;
import com.mossle.humantask.persistence.domain.TaskParticipant;
import com.mossle.humantask.persistence.manager.TaskInfoManager;
import com.mossle.spi.humantask.TaskDefinitionConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AssignStrategyHumanTaskListener implements HumanTaskListener {
private static Logger logger = LoggerFactory
.getLogger(AssignStrategyHumanTaskListener.class);
private TaskDefinitionConnector taskDefinitionConnector;
private TaskInfoManager taskInfoManager;
public void onCreate(TaskInfo taskInfo) {
if (taskInfo.getAssignee() != null) {
return;
}
String taskDefinitionKey = taskInfo.getCode();
logger.debug("taskDefinitionKey : {}", taskDefinitionKey);
String processDefinitionId = taskInfo.getProcessDefinitionId();
logger.debug("processDefinitionId : {}", processDefinitionId);
String strategy = taskDefinitionConnector.findTaskAssignStrategy(
taskDefinitionKey, processDefinitionId);
logger.debug("strategy : {}", strategy);
if (strategy == null) {
return;
}
if ("无".equals(strategy)) {
return;
}
if ("当只有一人时采用独占策略".equals(strategy)) {
List<String> candidateUsers = this.findCandidateUsers(taskInfo);
if (candidateUsers.size() != 1) {
logger.info("candidateUsers size is {}", candidateUsers.size());
return;
}
String userId = candidateUsers.get(0);
logger.info("assign : {}", userId);
taskInfo.setAssignee(userId);
} else if ("资源中任务最少者".equals(strategy)) {
List<String> candidateUsers = this.findCandidateUsers(taskInfo);
if (candidateUsers.isEmpty()) {
logger.info("candidateUsers is empty");
return;
}
String userId = candidateUsers.get(0);
int taskCount = 0;
for (String candidateUser : candidateUsers) {
int currentTaskCount = taskInfoManager
.getCount(
"select count(*) from TaskInfo where assignee=? and status='active'",
candidateUser);
if ((taskCount == 0) || (currentTaskCount < taskCount)) {
taskCount = currentTaskCount;
userId = candidateUser;
}
}
logger.info("taskCount : {}", taskCount);
logger.info("assign : {}", userId);
taskInfo.setAssignee(userId);
} else if ("资源中随机分配".equals(strategy)) {
List<String> candidateUsers = this.findCandidateUsers(taskInfo);
if (candidateUsers.isEmpty()) {
logger.info("candidateUsers is empty");
return;
}
Collections.shuffle(candidateUsers);
String userId = candidateUsers.get(0);
logger.info("assign : {}", userId);
taskInfo.setAssignee(userId);
} else {
logger.warn("unsupport strategy : {}", strategy);
}
}
@Override
public void onComplete(TaskInfo taskInfo) throws Exception {
}
public List<String> findCandidateUsers(TaskInfo taskInfo) {
List<String> candidateUsers = new ArrayList<String>();
Set<TaskParticipant> taskParticipants = taskInfo.getTaskParticipants();
for (TaskParticipant taskParticipant : taskParticipants) {
if (!"user".equals(taskParticipant.getType())) {
logger.info("unsupport type : {}", taskParticipant.getType());
continue;
}
candidateUsers.add(taskParticipant.getRef());
}
return candidateUsers;
}
@Resource
public void setTaskDefinitionConnector(
TaskDefinitionConnector taskDefinitionConnector) {
this.taskDefinitionConnector = taskDefinitionConnector;
}
@Resource
public void setTaskInfoManager(TaskInfoManager taskInfoManager) {
this.taskInfoManager = taskInfoManager;
}
}