参考文章:
JBPM流程通过Aciton动态创建TaskInstance来实现“会签”
JBPM通过AssignmentHandler绑定自定义用户模型实现用户授权(1)
第一步还是给出一个新的ProcessDefinition.xml流程定义文件:
这里除了“文章1”说到要注意的地方外,还要注意的两个地方是:
1.
进入流程节点的时候,执行ActionHandler类com.sky.plugin.jbpm.def.DynamicCreateTaskInstance,用来动态生成TaskInstance。
2.
Task结束的时候调用com.sky.plugin.jbpm.def.ConuntersignActionHandler进行会签处理。判断会签路径来决定会签的执行和走向。
com.sky.plugin.jbpm.def.DynamicCreateTaskInstance
public class DynamicCreateTaskInstance implements ActionHandler { private static final long serialVersionUID = 1L; public void execute(ExecutionContext context) throws Exception { ProcessDefinition processDefinition = context.getProcessDefinition(); TaskNode taskNode = (TaskNode) context.getNode(); Task task = (Task)taskNode.getTasks().iterator().next(); Long processDefinitionId = processDefinition.getId(); Long taskId = task.getId(); Token token = context.getToken(); TaskMgmtInstance tmi = context.getTaskMgmtInstance(); //获取自定义的进行会签的人员 ServiceFactory serviceFactory = ServiceFactory.getInstance(); ProcessService ps = serviceFactory.getProcessService(); String[] actors = ps.loadTaskActors(processDefinitionId, taskId); //根据会签人员,每人创建一个TaskInstance for(String actor : actors){ tmi.createTaskInstance(task, token).setActorId(actor); } } }
com.sky.plugin.jbpm.def.ConuntersignActionHandler
public class ConuntersignActionHandler implements ActionHandler { private static final long serialVersionUID = 1L; @SuppressWarnings("unchecked") public void execute(ExecutionContext context) throws Exception { Token token = context.getToken(); TaskMgmtInstance tmi = context.getTaskMgmtInstance(); CollectionunfinishedTasks = tmi .getUnfinishedTasks(token); Object variable = context.getVariable("selectedTransition"); String selectedTransition; if (variable == null) { throw new RuntimeException( "Jbpm transition error: user selected transition is null!"); } else { // 获取当前TaskInstance选择的路径 selectedTransition = variable.toString(); } // 如果用户选择的路径是流程定义中制定的不通过的路径,则自动完成余下所有的会签Task并转到相应路径 if (selectedTransition.equals("拒绝到复核人")) { for (TaskInstance unfinishedTaskInstance : unfinishedTasks) { // 把被结束的没有完成的TaskInstance的ActorId改为automatic complete if (!unfinishedTaskInstance.hasEnded()) { unfinishedTaskInstance.setActorId("automatic complete"); unfinishedTaskInstance.end("拒绝到复核人"); } } } } }
这个类对于会签是至关重要的,要通过这个Action来判断会签的情况。在这个Action中有这样几句代码:
Object variable = context.getVariable("selectedTransition"); String selectedTransition; if (variable == null) { throw new RuntimeException( "Jbpm transition error: user selected transition is null!"); } else { // 获取当前TaskInstance选择的路径 selectedTransition = variable.toString(); }
其中的selectedTransition是用户选择的路径,也就是通过这个来判断会签的用户选择了“同意”或者“拒绝到复核人”,你可以通过流程变量的形式来保存。
如果“同意”,则继续下去,直到该TaskNode中所有的TaskInstance完成以后,通过会签,继续下去,如果选择“拒绝到复核人”,则会自动完成余下的所有TaskInstance,然后转到Transition“拒绝到复核人”,会签不通过。
其中有一句,设置所有自动完成的TaskInstance的Actor为“automatic complete”,这个可以解决在“以办事务”中出现自动完成的任务(TaskInstance)
unfinishedTaskInstance.setActorId("automatic complete");
到这里整个会签的实现都在这里了,行文有点乱。哈哈!