JBPM流程通过Aciton动态创建TaskInstance来实现“会签” 博客分类: JBPM JBPMQQXMLBlog
程序员文章站
2024-02-13 10:28:34
...
昨天在Jbpm-inside群里面和大家讨论了在Jbpm流程中,如何实现“会签”的问题,最后得出了两种方案。今天就这两种思想中的一种:通过Aciton动态创建TaskInstance来实现“会签”,自己实现了一把,成功了!
1. 创建processDefinition.xml流程定义文件,如下:
task-node"主管会计复核"则是我们需要进行会签的节点。在这个节点我们设置了几个重要的属性:
2. 编写Action代码
当然,在实际情况中.setPooledActors(new String[]{"100"})中设置的actor应该是动态指定的,这里为了简单方便就直接写入的固定值。
3.部署运行,OK!
注意:如果在给TaskInstance指定Actor的时候是使用.setActor()方法的话,那么在获取用户任务列表的时候用.findTaskInstances();如果是用.setPooledActors(),则需要使用.findPolledTaskInstance()方法。[list][/list]
1. 创建processDefinition.xml流程定义文件,如下:
<?xml version="1.0" encoding="UTF-8"?> <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="webPay"> <swimlane name="PooledActors"> <assignment class="com.sky.plugin.jbpm.ActorHandel"></assignment> </swimlane> <start-state name="网上支付审批流程"> <transition name="开始" to="财务人员录入"></transition> </start-state> <task-node name="财务人员录入"> <task name="财务人员录入申报数据" swimlane="PooledActors"></task> <transition name="主管会计复核" to="主管会计复核"></transition> </task-node> <task-node name="主管会计复核" signal="last-wait" create-tasks="false"> <task name="主管会计复核" swimlane="PooledActors"></task> <event type="node-enter"> <action name="createInstance" class="com.sky.plugin.jbpm.CreateTaskInstance"> </action> </event> <transition name="复核通过" to="领导审批"></transition> <transition name="复核不通过" to="异常结束"></transition> </task-node> <task-node name="领导审批"> <task name="领导审批" swimlane="PooledActors"></task> <transition name="同意" to="结束"></transition> <transition name="不同意" to="异常结束"></transition> </task-node> <end-state name="结束"></end-state> <end-state name="异常结束"></end-state> </process-definition>
task-node"主管会计复核"则是我们需要进行会签的节点。在这个节点我们设置了几个重要的属性:
- 1) signal="last-wait",这个属性决定了该节点将在完成该节点内的所有Task的TaskInstance以后才会进入下一个节点。)
- 2) create-tasks="false",这个属性决定了在进入该节点的时候,不会自动为该节点的任何Task创建任何的TaskInstance。因为我们需要根据会签的人员来自己创建TaskInstance。
- 3) action,action的设定是为了,在Action中根据实际的情况来创建TaskInstance
2. 编写Action代码
import org.jbpm.graph.def.ActionHandler; import org.jbpm.graph.exe.ExecutionContext; import org.jbpm.graph.exe.Token; import org.jbpm.graph.node.TaskNode; import org.jbpm.taskmgmt.def.Task; import org.jbpm.taskmgmt.exe.TaskMgmtInstance; public class CreateTaskInstance implements ActionHandler { private static final long serialVersionUID = 1L; public void execute(ExecutionContext executionContext) throws Exception { Token token = executionContext.getToken(); TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance(); TaskNode taskNode = (TaskNode) executionContext.getNode(); Task task= taskNode.getTask("主管会计复核"); tmi.createTaskInstance(task, token) .setPooledActors(new String[]{"1000"}); tmi.createTaskInstance(task, token) .setPooledActors(new String[]{"1001"}); } }
当然,在实际情况中.setPooledActors(new String[]{"100"})中设置的actor应该是动态指定的,这里为了简单方便就直接写入的固定值。
3.部署运行,OK!
注意:如果在给TaskInstance指定Actor的时候是使用.setActor()方法的话,那么在获取用户任务列表的时候用.findTaskInstances();如果是用.setPooledActors(),则需要使用.findPolledTaskInstance()方法。[list][/list]