有一个需求是这个样子的:员工请假,填写好请假单后,提交申请.上级主管会有一个审核请假的任务,同时申请人有一个撤回的任务.这这两个任务互斥,也就是说两个任务有一个先执行.另一个任务取消.
曾经看过网上一篇文章使用分支节点创建两个任务节点.当一个任务节点执行后写一个action类负责结束另一个任务节点.达到互斥撤回的效果.本人试验过确实可以完成.
不过这不符合我们常规的流程定义方式(需要增加一对分支,联合节点).并且不符合jbpm关于节点描述.
jbpm认为一个节点代表流程中的一个等待状态.显然领导审核和员工撤销请假处于同一个等待状态,也应该处于一个节点中.使用一对分支,联合节点的方式虽然形式上处于一个等待状态.但这样的流程设计是不合适的.
可以这样设计这个互斥回撤节点
<task-node name="审核" signal="first" end-tasks="true"><task name="审核员工请假" swimlane="boss" template="apply_2.ftl"><controller><variable name="reason" access="read" mapped-name="reason"><variable name="day" access="read,write" mapped-name="day"><variable name="applyman" access="read" mapped-name="applyman"> </variable></variable></variable></controller></task></task-node>
<task name="撤回请假单" swimlane="applyman" template="apply_3_new.ftl"><controller><variable name="reason" access="read" mapped-name="reason"><task-node name="审核"><task template="apply_2.ftl" swimlane="boss" name="审核员工请假"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><task template="apply_3_new.ftl" swimlane="applyman" name="撤回请假单"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day">
这个节点包含了我们刚才说的两个任务.我们知道当流传到这个节点的时候.这两个任务会同时创建并分配给各自的人员.有一个人完成任务后 节点向指定的节点转向.同时结束另一个任务. signal="first" 有一个任务结束节点就流转. end-tasks="true" 结束该节点的时候自动结束其他没有完成的任务.
这是个小例子没什么特别.可能早有高人知晓.在这我只是感觉到jbpm对节点是流程的一个等待状态这个含义,对我们设计流程有重要的意义.欢迎大家指正批评
完整的xml流程定义.如果你要部署这个流程.这里需要说明的是</variable></variable></controller></task></variable></variable></controller></task></task-node></variable></controller></task><variable name="reason" access="read" mapped-name="reason"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day"> com.jbpmexample.jbpm.Assignment类是我自己的授权类.你自己写一个代替就好了,</variable></variable></variable></variable></variable><variable name="reason" access="read" mapped-name="reason"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day"> template="apply_1.ftl" 这样的属性是我自己加的 为了实现显示页面的定制.需要去掉.否则部署的时候会报错</variable></variable></variable></variable></variable><task name="撤回请假单" swimlane="applyman" template="apply_3_new.ftl"><controller><variable name="reason" access="read" mapped-name="reason"><task-node name="审核"><task template="apply_2.ftl" swimlane="boss" name="审核员工请假"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><task template="apply_3_new.ftl" swimlane="applyman" name="撤回请假单"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day">
曾经看过网上一篇文章使用分支节点创建两个任务节点.当一个任务节点执行后写一个action类负责结束另一个任务节点.达到互斥撤回的效果.本人试验过确实可以完成.
不过这不符合我们常规的流程定义方式(需要增加一对分支,联合节点).并且不符合jbpm关于节点描述.
jbpm认为一个节点代表流程中的一个等待状态.显然领导审核和员工撤销请假处于同一个等待状态,也应该处于一个节点中.使用一对分支,联合节点的方式虽然形式上处于一个等待状态.但这样的流程设计是不合适的.
可以这样设计这个互斥回撤节点
<task-node name="审核" signal="first" end-tasks="true"><task name="审核员工请假" swimlane="boss" template="apply_2.ftl"><controller><variable name="reason" access="read" mapped-name="reason"><variable name="day" access="read,write" mapped-name="day"><variable name="applyman" access="read" mapped-name="applyman"> </variable></variable></variable></controller></task></task-node>
xml 代码
- <task-node name="审核" signal="first" end-tasks="true">
- <task name="审核员工请假" swimlane="boss" template="apply_2.ftl">
- <controller>
- <variable name="reason" access="read" mapped-name="reason"/>
- <variable name="day" access="read,write" mapped-name="day"/>
- <variable name="applyman" access="read" mapped-name="applyman"/>
- <variable name="decision" access="read,write" mapped-name="decision"/>
- controller>
- task>
- <task name="撤回请假单" swimlane="applyman" template="apply_3_new.ftl">
- <controller>
- <variable name="reason" access="read" mapped-name="reason"/>
- <variable name="day" access="read" mapped-name="day"/>
- <variable name="applyman" access="read" mapped-name="applyman"/>
- <variable name="decision" access="read,write" mapped-name="decision"/>
- controller>
- task>
- <transition name="结束" to="归档">transition>
- <transition name="撤销" to="请假结束">transition>
- <transition name="修改" to="修改">transition>
- task-node>
这个节点包含了我们刚才说的两个任务.我们知道当流传到这个节点的时候.这两个任务会同时创建并分配给各自的人员.有一个人完成任务后 节点向指定的节点转向.同时结束另一个任务. signal="first" 有一个任务结束节点就流转. end-tasks="true" 结束该节点的时候自动结束其他没有完成的任务.
这是个小例子没什么特别.可能早有高人知晓.在这我只是感觉到jbpm对节点是流程的一个等待状态这个含义,对我们设计流程有重要的意义.欢迎大家指正批评
完整的xml流程定义.如果你要部署这个流程.这里需要说明的是</variable></variable></controller></task></variable></variable></controller></task></task-node></variable></controller></task><variable name="reason" access="read" mapped-name="reason"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day"> com.jbpmexample.jbpm.Assignment类是我自己的授权类.你自己写一个代替就好了,</variable></variable></variable></variable></variable><variable name="reason" access="read" mapped-name="reason"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day"> template="apply_1.ftl" 这样的属性是我自己加的 为了实现显示页面的定制.需要去掉.否则部署的时候会报错</variable></variable></variable></variable></variable><task name="撤回请假单" swimlane="applyman" template="apply_3_new.ftl"><controller><variable name="reason" access="read" mapped-name="reason"><task-node name="审核"><task template="apply_2.ftl" swimlane="boss" name="审核员工请假"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><task template="apply_3_new.ftl" swimlane="applyman" name="撤回请假单"><controller><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day">
xml 代码
<?xml version="1.0" encoding="UTF-8"?> <process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="新请假流程"> <swimlane name="applyman" /> <swimlane name="boss"> <assignment class="com.jbpmexample.jbpm.Assignment"> <swimlaneName>boss</swimlaneName> </assignment> </swimlane> <start-state name="请假开始"> <task name="填写请假单" swimlane="applyman" <variable name="reason" access="read" mapped-name="reason"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read,write" name="day"><variable mapped-name="reason" access="read" name="reason"><variable mapped-name="day" access="read" name="day">template="apply_1.ftl"</variable></variable></variable></variable></variable>> <controller> <variable name="reason" access="read,write" mapped-name="reason"/> <variable name="day" access="read,write" mapped-name="day"/> <variable name="applyman" access="read,write" mapped-name="applyman"/> </controller> </task> <transition name="结束" to="审核"></transition> </start-state> <task-node name="审核" signal="first" end-tasks="true"> <task name="审核员工请假" swimlane="boss" template="apply_2.ftl"> <controller> <variable name="reason" access="read" mapped-name="reason"/> <variable name="day" access="read,write" mapped-name="day"/> <variable name="applyman" access="read" mapped-name="applyman"/> <variable name="decision" access="read,write" mapped-name="decision"/> </controller> </task> <task name="撤回请假单" swimlane="applyman" template="apply_3_new.ftl"> <controller> <variable name="reason" access="read" mapped-name="reason"/> <variable name="day" access="read" mapped-name="day"/> <variable name="applyman" access="read" mapped-name="applyman"/> <variable name="decision" access="read,write" mapped-name="decision"/> </controller> </task> <transition name="结束" to="归档"></transition> <transition name="撤销" to="请假结束"></transition> <transition name="修改" to="修改"></transition> </task-node> <task-node name="归档"> <task name="请假归档" swimlane="applyman" template="apply_4.ftl"> <controller> <variable name="reason" access="read" mapped-name="reason"/> <variable name="day" access="read" mapped-name="day"/> <variable name="applyman" access="read" mapped-name="applyman"/> <variable name="decision" access="read" mapped-name="decision"/> </controller> </task> <transition name="结束" to="请假结束"></transition> </task-node> <end-state name="请假结束"></end-state> <task-node name="修改"> <task name="修改" swimlane="applyman" template="apply_1.ftl"> <controller> <variable name="reason" access="read,write" mapped-name="reason"/> <variable name="day" access="read,write" mapped-name="day"/> <variable name="applyman" access="read" mapped-name="applyman"/> </controller> </task> <transition name="结束" to="审核"></transition> </task-node> </process-definition>
</variable></variable></controller></task></variable></variable></controller></task></task-node></variable></controller></task>