一个简单的会签实例
一个简单的会签实例
作者:tomkoo
以下例子中 采用了jbpm console 的几个实例用户
项目提交人 : ernie .
主管审批 : bert
会签 : ernie , bert , grover
老板审批 : grover
?
正常流程: 项目金额 >= 500W RMB
提交项目 --> 主管审批 --> 会签 --> 老板审批 --> 审批通过(结束)
正常流程: 项目金额 < 500W RMB
提交项目 --> 主管审批 --> 会签 --> 审批通过(结束)
其中主管审批, 会签, 老板审批 , 不通过, 全部退回给项目提交人修改.
会签中: 所有人全通过, 则通过. 任何一人不通过, 停止其他会签任务.退回给提交人.
流程定义如下:
?
- <?xml?version="1.0"?encoding="UTF-8"?>?? ??
- <process-definition?xmlns="urn:jbpm.org:jpdl-3.1"?? ????name="tc_prj_approval">??
- ?? ????<swimlane?name="initiator"?/>??
- ?? ????<!项目提交人?>??
- ????<swimlane?name="requester">?? ????????<assignment?expression="user(ernie)"?/>??
- ????</swimlane>?? ??
- ????<!?主管?>?? ????<swimlane?name="chief">??
- ????????<assignment?expression="user(bert)"?/>?? ????</swimlane>??
- ?? ????<!老板?>??
- ????<swimlane?name="boss">?? ????????<assignment?expression="user(grover)"?/>??
- ????</swimlane>?? ??
- ????<!会签人?>?? ????<swimlane?name="cosinger">??
- ????????<assignment?class="net.chenj.jbpm.sample.CosingerAssiHandler">?? ????????</assignment>??
- ????</swimlane>?? ????<start-state?name="start">??
- ????????<task?name="tc_prj_newprj"?swimlane="initiator"></task>?? ????????<transition?name="to_submit"?to="tc_prj_submit"></transition>??
- ????</start-state>?? ????<task-node?name="tc_prj_submit">??
- ????????<task?name="tc_prj_submit"></task>?? ????????<transition?name="to_chiefapprove"?to="tc_prj_chiefapprove"></transition>??
- ????</task-node>?? ????<task-node?name="tc_prj_chiefapprove">??
- ????????<task?name="tc_prj_chiefapprove"></task>?? ????????<transition?name="approve"?to="tc_prj_countersign"></transition>??
- ????????<transition?name="disapprove"?to="tc_prj_submit"></transition>?? ????</task-node>??
- ????<task-node?name="tc_prj_countersign"?signal="last-wait"?? ????????create-tasks="false">??
- ????????<task?name="tc_prj_countersign">?? ????????????<event?type="task-end">??
- ????????????????<action?? ????????????????????class="net.chenj.jbpm.sample.TaskEndCountersign">??
- ????????????????</action>?? ????????????</event>??
- ?? ????????</task>??
- ?? ????????<event?type="node-enter">??
- ????????????<action?name="createInstance"?? ????????????????class="net.chenj.jbpm.sample.CreateTaskInstanceCountersign">??
- ????????????</action>?? ????????</event>??
- ?? ????????<transition?name="approve"?to="amount_decision"></transition>??
- ????????<transition?name="disapprove"?to="tc_prj_submit"></transition>?? ????</task-node>??
- ????<decision?name="amount_decision">?? ????????<transition?name="to_bossapprove"?to="tc_prj_bossapprove"></transition>??
- ????????<transition?name="to_end"?to="end1"></transition>?? ????</decision>??
- ????<task-node?name="tc_prj_bossapprove">?? ????????<task?name="tc_prj_bossapprove"></task>??
- ????????<transition?name="approve"?to="end1"></transition>?? ????????<transition?name="disapprove"?to="tc_prj_submit">??
- ????????????<condition>#{amount?>=?500}</condition>?? ????????</transition>??
- ????</task-node>?? ????<end-state?name="end1"></end-state>??
- </process-definition>?? ??
<script></script>
?
会签swimlane class
?
- package?net.chenj.jbpm.sample; ?? ??
- import?org.jbpm.graph.exe.*; ?? import?org.jbpm.taskmgmt.def.*; ??
- import?org.jbpm.taskmgmt.exe.Assignable; ?? ??
- public?class?CosingerAssiHandler?implements?AssignmentHandler?{ ?? ??
- ????private?static?final?long?serialVersionUID?=?1L; ?? ??
- ????public?void?assign(Assignable?assignable,?ExecutionContext?executionContext)?{ ?? ????????//?从数据库或者ldap?读取会签人设置 ??
- ????????String[]?a?=?{?"ernie",?"bert",?"grover"?}; ?? ????????assignable.setPooledActors(a); ??
- ????} ?? ??
- } ?? ??
<script></script>
创建会签任务实现类
?
?
- package?net.chenj.jbpm.sample; ?? ??
- 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?CreateTaskInstanceCountersign?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("tc_prj_countersign"); ?? ????????//?从数据库或者ldap?读取会签人设置创建任务实例 ??
- ????????tmi.createTaskInstance(task,?token).setActorId("ernie"); ?? ????????tmi.createTaskInstance(task,?token).setActorId("bert"); ??
- ????????tmi.createTaskInstance(task,?token).setActorId("grover"); ?? ??
- ????} ?? ??
- } ??
<script></script>
?
结束不通过时结束其他会签任务实现
- package?net.chenj.jbpm.sample; ?? ??
- import?java.util.Collection; ?? import?java.util.Iterator; ??
- import?org.jbpm.graph.def.ActionHandler; ?? import?org.jbpm.graph.exe.ExecutionContext; ??
- import?org.jbpm.taskmgmt.exe.TaskInstance; ?? import?org.jbpm.taskmgmt.exe.TaskMgmtInstance; ??
- ?? public?class?TaskEndCountersign?implements?ActionHandler?{ ??
- ?? ????private?static?final?long?serialVersionUID?=?1L; ??
- ?? ????public?void?execute(ExecutionContext?executionContext)?throws?Exception?{ ??
- ?? ???? ??
- ????????boolean?isDisapprove?=?Boolean.valueOf((String)?executionContext ?? ????????????????.getVariable("isDisapprove")); ??
- ????????//?如果有一个任务实例拒绝通过则结束除当前任务实例外其他任务实例 ?? ????????if?(isDisapprove)?{ ??
- ????????????TaskMgmtInstance?tmi?=?executionContext.getTaskMgmtInstance(); ?? ????????????TaskInstance?ti?=?executionContext.getTaskInstance(); ??
- ????????????final?String?actorId?=?ti.getActorId(); ?? ????????????Collection?c?=?tmi.getSignallingTasks(executionContext); ??
- ????????????for?(Iterator?it?=?c.iterator();?it.hasNext();)?{ ?? ????????????????TaskInstance?task?=?(TaskInstance)?it.next(); ??
- ????????????????if?(!(actorId.equals(task.getActorId()))?&&?(!task.hasEnded()))?{ ?? ????????????????????task.end("disapprove"); ??
- ????????????????} ?? ????????????} ??
- ????????} ?? ??
- ????} ?? ??
- } ??