package com.mossle.humantask.listener;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import com.mossle.humantask.persistence.domain.TaskInfo;
import com.mossle.humantask.persistence.domain.TaskParticipant;
import com.mossle.humantask.persistence.manager.TaskParticipantManager;
import com.mossle.humantask.rule.ActivityAssigneeRule;
import com.mossle.humantask.rule.AssigneeRule;
import com.mossle.humantask.rule.EqualsRuleMatcher;
import com.mossle.humantask.rule.InitiatorAssigneeRule;
import com.mossle.humantask.rule.PositionAssigneeRule;
import com.mossle.humantask.rule.PrefixRuleMatcher;
import com.mossle.humantask.rule.RuleMatcher;
import com.mossle.humantask.rule.SuperiorAssigneeRule;
import com.mossle.spi.process.InternalProcessConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 处理负责人配置的别名.
*/
public class AssigneeAliasHumanTaskListener implements HumanTaskListener {
private static Logger logger = LoggerFactory
.getLogger(AssigneeAliasHumanTaskListener.class);
private InternalProcessConnector internalProcessConnector;
private TaskParticipantManager taskParticipantManager;
private Map<RuleMatcher, AssigneeRule> assigneeRuleMap = new HashMap<RuleMatcher, AssigneeRule>();
public AssigneeAliasHumanTaskListener() {
SuperiorAssigneeRule superiorAssigneeRule = new SuperiorAssigneeRule();
PositionAssigneeRule positionAssigneeRule = new PositionAssigneeRule();
InitiatorAssigneeRule initiatorAssigneeRule = new InitiatorAssigneeRule();
ActivityAssigneeRule activityAssigneeRule = new ActivityAssigneeRule();
assigneeRuleMap.put(new EqualsRuleMatcher("常用语:直接上级"),
superiorAssigneeRule);
assigneeRuleMap.put(new EqualsRuleMatcher("常用语:流程发起人"),
initiatorAssigneeRule);
assigneeRuleMap.put(new PrefixRuleMatcher("岗位"), positionAssigneeRule);
assigneeRuleMap.put(new PrefixRuleMatcher("环节处理人"),
activityAssigneeRule);
}
@Override
public void onCreate(TaskInfo taskInfo) throws Exception {
String assignee = taskInfo.getAssignee();
logger.debug("assignee : {}", assignee);
if (assignee == null) {
return;
}
if (assignee.startsWith("${")) {
assignee = (String) internalProcessConnector.executeExpression(
taskInfo.getTaskId(), assignee);
taskInfo.setAssignee(assignee);
return;
}
for (Map.Entry<RuleMatcher, AssigneeRule> entry : assigneeRuleMap
.entrySet()) {
RuleMatcher ruleMatcher = entry.getKey();
if (!ruleMatcher.matches(assignee)) {
continue;
}
String value = ruleMatcher.getValue(assignee);
AssigneeRule assigneeRule = entry.getValue();
logger.debug("value : {}", value);
logger.debug("assigneeRule : {}", assigneeRule);
if (assigneeRule instanceof SuperiorAssigneeRule) {
this.processSuperior(taskInfo, assigneeRule, value);
} else if (assigneeRule instanceof InitiatorAssigneeRule) {
this.processInitiator(taskInfo, assigneeRule, value);
} else if (assigneeRule instanceof ActivityAssigneeRule) {
this.processActivityAssignee(taskInfo, assigneeRule, value);
} else if (assigneeRule instanceof PositionAssigneeRule) {
this.processPosition(taskInfo, assigneeRule, value);
}
}
}
@Override
public void onComplete(TaskInfo taskInfo) throws Exception {
}
public void processSuperior(TaskInfo taskInfo, AssigneeRule assigneeRule,
String value) {
String processInstanceId = taskInfo.getProcessInstanceId();
String startUserId = internalProcessConnector
.findInitiator(processInstanceId);
String userId = assigneeRule.process(startUserId);
logger.debug("userId : {}", userId);
taskInfo.setAssignee(userId);
}
public void processInitiator(TaskInfo taskInfo, AssigneeRule assigneeRule,
String value) {
String processInstanceId = taskInfo.getProcessInstanceId();
String startUserId = internalProcessConnector
.findInitiator(processInstanceId);
String userId = assigneeRule.process(startUserId);
logger.debug("userId : {}", userId);
taskInfo.setAssignee(userId);
}
public void processActivityAssignee(TaskInfo taskInfo,
AssigneeRule assigneeRule, String value) {
String processInstanceId = taskInfo.getProcessInstanceId();
List<String> userIds = assigneeRule.process(value, processInstanceId);
logger.debug("userIds : {}", userIds);
if (!userIds.isEmpty()) {
taskInfo.setAssignee(userIds.get(0));
}
}
public void processPosition(TaskInfo taskInfo, AssigneeRule assigneeRule,
String value) {
String processInstanceId = taskInfo.getProcessInstanceId();
String startUserId = internalProcessConnector
.findInitiator(processInstanceId);
List<String> userIds = assigneeRule.process(value, startUserId);
logger.debug("userIds : {}", userIds);
if (userIds.isEmpty()) {
logger.info("{} userIds is empty", taskInfo.getCode());
} else if (userIds.size() == 1) {
taskInfo.setAssignee(userIds.get(0));
} else {
for (String userId : userIds) {
TaskParticipant taskParticipant = new TaskParticipant();
taskParticipant.setTaskInfo(taskInfo);
taskParticipant.setCategory("candidate");
taskParticipant.setType("user");
taskParticipant.setRef(userId);
taskParticipantManager.save(taskParticipant);
}
}
}
@Resource
public void setInternalProcessConnector(
InternalProcessConnector internalProcessConnector) {
this.internalProcessConnector = internalProcessConnector;
}
@Resource
public void setTaskParticipantManager(
TaskParticipantManager taskParticipantMaanger) {
this.taskParticipantManager = taskParticipantManager;
}
}