`

JBPM流程通过Aciton动态创建TaskInstance来实现“会签”

阅读更多

1. 创建processDefinition.xml流程定义文件,如下: 




Java代码 
01.<?xml version="1.0" encoding="UTF-8"?>  
02.<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="webPay">  
03.    <swimlane name="PooledActors">  
04.        <assignment class="com.sky.plugin.jbpm.ActorHandel"></assignment>  
05.    </swimlane>  
06.    <start-state name="网上支付审批流程">  
07.        <transition name="开始" to="财务人员录入"></transition>  
08.    </start-state>  
09.    <task-node name="财务人员录入">  
10.        <task name="财务人员录入申报数据" swimlane="PooledActors"></task>  
11.        <transition name="主管会计复核" to="主管会计复核"></transition>  
12.    </task-node>  
13.    <task-node name="主管会计复核" signal="last-wait" create-tasks="false">  
14.        <task name="主管会计复核" swimlane="PooledActors"></task>  
15.        <event type="node-enter">  
16.            <action name="createInstance"  
17.        class="com.sky.plugin.jbpm.CreateTaskInstance">  
18.            </action>  
19.        </event>  
20.        <transition name="复核通过" to="领导审批"></transition>  
21.        <transition name="复核不通过" to="异常结束"></transition>  
22.    </task-node>  
23.    <task-node name="领导审批">  
24.        <task name="领导审批" swimlane="PooledActors"></task>  
25.        <transition name="同意" to="结束"></transition>  
26.        <transition name="不同意" to="异常结束"></transition>  
27.    </task-node>  
28.    <end-state name="结束"></end-state>  
29.    <end-state name="异常结束"></end-state>  
30.</process-definition>  



[java] view plaincopy
01.<?xml version="1.0" encoding="UTF-8"?>  
02.<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="webPay">  
03.    <swimlane name="PooledActors">  
04.        <assignment class="com.sky.plugin.jbpm.ActorHandel"></assignment>  
05.    </swimlane>  
06.    <start-state name="网上支付审批流程">  
07.        <transition name="开始" to="财务人员录入"></transition>  
08.    </start-state>  
09.    <task-node name="财务人员录入">  
10.        <task name="财务人员录入申报数据" swimlane="PooledActors"></task>  
11.        <transition name="主管会计复核" to="主管会计复核"></transition>  
12.    </task-node>  
13.    <task-node name="主管会计复核" signal="last-wait" create-tasks="false">  
14.        <task name="主管会计复核" swimlane="PooledActors"></task>  
15.        <event type="node-enter">  
16.            <action name="createInstance"  
17.        class="com.sky.plugin.jbpm.CreateTaskInstance">  
18.            </action>  
19.        </event>  
20.        <transition name="复核通过" to="领导审批"></transition>  
21.        <transition name="复核不通过" to="异常结束"></transition>  
22.    </task-node>  
23.    <task-node name="领导审批">  
24.        <task name="领导审批" swimlane="PooledActors"></task>  
25.        <transition name="同意" to="结束"></transition>  
26.        <transition name="不同意" to="异常结束"></transition>  
27.    </task-node>  
28.    <end-state name="结束"></end-state>  
29.    <end-state name="异常结束"></end-state>  
30.</process-definition>  
 

task-node"主管会计复核"则是我们需要进行会签的节点。在这个节点我们设置了几个重要的属性: 

1) signal="last-wait",这个属性决定了该节点将在完成该节点内的所有Task的TaskInstance以后才会进入下一个节点。) 
2) create-tasks="false",这个属性决定了在进入该节点的时候,不会自动为该节点的任何Task创建任何的TaskInstance。因为我们需要根据会签的人员来自己创建TaskInstance。
 3) action,action的设定是为了,在Action中根据实际的情况来创建TaskInstance 


2. 编写Action代码 




Java代码 
01.import org.jbpm.graph.def.ActionHandler;  
02.import org.jbpm.graph.exe.ExecutionContext;  
03.import org.jbpm.graph.exe.Token;  
04.import org.jbpm.graph.node.TaskNode;  
05.import org.jbpm.taskmgmt.def.Task;  
06.import org.jbpm.taskmgmt.exe.TaskMgmtInstance;  
07.  
08.public class CreateTaskInstance implements ActionHandler {  
09.  
10.    private static final long serialVersionUID = 1L;  
11.  
12.    public void execute(ExecutionContext executionContext) throws Exception {  
13.        Token token = executionContext.getToken();  
14.        TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();  
15.  
16.        TaskNode taskNode = (TaskNode) executionContext.getNode();  
17.        Task task= taskNode.getTask("主管会计复核");  
18.        tmi.createTaskInstance(task, token)  
19.                      .setPooledActors(new String[]{"1000"});  
20.        tmi.createTaskInstance(task, token)  
21.                      .setPooledActors(new String[]{"1001"});  
22.  
23.    }  
24.  
25.}  



[java] view plaincopy
01.import org.jbpm.graph.def.ActionHandler;  
02.import org.jbpm.graph.exe.ExecutionContext;  
03.import org.jbpm.graph.exe.Token;  
04.import org.jbpm.graph.node.TaskNode;  
05.import org.jbpm.taskmgmt.def.Task;  
06.import org.jbpm.taskmgmt.exe.TaskMgmtInstance;  
07.  
08.public class CreateTaskInstance implements ActionHandler {  
09.  
10.    private static final long serialVersionUID = 1L;  
11.  
12.    public void execute(ExecutionContext executionContext) throws Exception {  
13.        Token token = executionContext.getToken();  
14.        TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance();  
15.  
16.        TaskNode taskNode = (TaskNode) executionContext.getNode();  
17.        Task task= taskNode.getTask("主管会计复核");  
18.        tmi.createTaskInstance(task, token)  
19.                      .setPooledActors(new String[]{"1000"});  
20.        tmi.createTaskInstance(task, token)  
21.                      .setPooledActors(new String[]{"1001"});  
22.  
23.    }  
24.  
25.}  
 

当然,在实际情况中.setPooledActors(new String[]{"100"})中设置的actor应该是动态指定的,这里为了简单方便就直接写入的固定值。
 
3.部署运行,OK! 

注意:如果在给TaskInstance指定Actor的时候是使用.setActor()方法的话,那么在获取用户任务列表的时候用. findTaskInstances();如果是用.setPooledActors(),则需要使用.findPolledTaskInstance ()方法。  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics