关于iMatrix平台流程引擎之办理人设置进一步观点
1
学习了几天iMatrix平台的功能,自己有几分见解,在这里跟大家分享下。
1) 流程设计器设置:
可以有四种配置:文档创建人、上一环节办理人指定、文档字段中指定的人员、按条件筛选。
2) 办理人设置的监听类:
xml中配置监听类,如下:
<task name="填单"g="251,75,80,40">
<assignment-handlerclass="com.norteksoft.wf.engine.core.AssignmentHandler"/>
… … … …
</task>
监听类AssignmentHandler实现jbpm的org.jbpm.api.task.AssignmentHandler接口
public classAssignmentHandler implements org.jbpm.api.task.AssignmentHandler
{
… … … …
//根据流程设计器配置的办理人,获得办理人列表:
candidates = TransactorConditionHandler.processCondition(conditions,execution,paramMap);
… … … …
if(candidates.size() == 1){
//将获得的办理人设置到jbpm任务中
assignable.setAssignee(candidates.iterator().next());
}else if(candidates.size() == 0){
//没有办理人时抛出异常信息
throw newWorkflowException(WorkflowException.NO_TRANSACTOR);
}else{
for(String candidate :candidates){
//将获得的办理人设置到jbpm任务的办理人候选人列表中
assignable.addCandidateUser(candidate);
}
}
… … … …
}
我们再来看看TransactorConditionHandler.processCondition的实现:
publicstatic Set<String>processCondition(Map<TaskTransactorCondition, String> conditions,OpenExecution execution,Map<String,String> param){
… … … …
if("${documentCreator}".equals(userCondition)){
//文档创建人,即为发起实例的人的登录名
candidates.add(param.get(DOCUMENT_CREATOR));
}else if("${previousTransactorAssignment}".equals(userCondition)){
//上一环节办理人指定,当是这种情况时,需要弹出选人界面让上一环节办理人选择该环节的办理人
candidates.add(CommonStrings.TRANSACTOR_ASSIGNMENT);
}else if(userCondition.startsWith("${field[")){
//文档字段中指定//${field[name_zn[name_en]]}
… … … …
}else{
//按条件筛选
… … … …
}
}
生成任务时的处理方式是,根据jbpm任务生成imatrix的任务实体:
TaskService.java的generateTask方法:
public void generateTask(WorkflowInstance instance, StringexecutionId, String parentExecutionId){
… … … …
for(org.jbpm.api.task.Tasktask : jbpmTasks){
… … … …
if(task.getAssignee()== null){//任务有多个办理人
//获得jbpm任务的候选人列表,此处获得的人员列表为监听类AssignmentHandler中addCandidateUser中的人员
Iterator<ParticipationImpl> it =((TaskImpl)task).getParticipations().iterator();
… … … …
while(it.hasNext()){
//创建imatrix的任务实体
wfTask = createTask(instanceId, task.getExecutionId(),it.next().getUserId(), task.getActivityName(),groupNum);
//审批任务有多个办理人,且流程设计器中设置为多人办理时,将imatrix的认为设置为待领取
if(!wfTask.getMoreTransactor()){ wfTask.setActive(TaskState.DRAW_WAIT.getIndex());
}
… … … …
}else{//任务只有一个办理人
tasks.add(createTask(instanceId, task.getExecutionId(),task.getAssignee(), task.getActivityName(),groupNum));
}
}
}