關于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));
}
}
}