`

【转】jBPM4:ForEach的使用--动态设置参与人数

 
阅读更多

流程确定的情况下,有时候完成一个步骤人数不确定,在任务发布的时候有领导确定参与完成的人员。

为了完成这样的情况,可以到了这一步,通过配置动态的生成一些subTask,通过subTask给每个人进行分派工作。

其实还可以通过jBPM4.4中的foreach的方式进行完成(注意:这个功能还在孵化器中)。

如:完成一个审核工作,有些工作需要2个人完成,有些工作需要3个人完成,在开启流程的时候,由生成流程的人员进行指定对应的工作人员。

拿jBPM4.4开发指南中的例子来解释:

Xml代码
< process   name = "ForEach"   xmlns = "http://jbpm.org/4.4/jpdl" >         
  < start   g = "28,61,48,48"   name = "start1" >         
  < transition   to = "foreach1" />       
</ start >         
  < foreach   var = "department"   in = "#{departments}"   g = "111,60,48,48"   name = "foreach1" >   
  < transition   to = "Collect reports" />     
  </ foreach >          
< task   candidate-groups = "#{department}"   g = "201,58,92,52"   name = "Collect reports" >          
< transition   to = "join1" />       
</ task >          
< join   g = "343,59,48,48"   multiplicity = "#{quorum}"   name = "join1" >         
  < transition   to = "end1" />     
   </ join >         
  < end   g = "433,60,48,48"   name = "end1" />     
  </ process >   

1. 启动流程后,到达foreach节点:

Xml代码
< foreach   var = "department"   in = "#{departments}"   g = "111,60,48,48"   name = "foreach1" >      
  < transition   to = "Collect reports" />    </ foreach >   

 参数:

in:表示从外面传入的参数,foreach会读取这个参数,这个参数可以是string数组,也可以是通过逗号分隔的字符串

var:这个变量是foreach将in中的内容按照规则进行拆分,拆分的结果放在var定义的变量中,传递给下一步(每一步接收一个值)

进入到foreach,解析完这些参数,会根据join中的multiplicity参数的值,生成task(multiplicity定义为几,就生成几个Executiuon,几个task),这些Task的assignee都是空的

2. 进入到task

Xml代码
< task   candidate-groups = "#{department}"   g = "201,58,92,52"   name = "Collect reports" >     
   < transition   to = "join1" />    </ task >   

<task candidate-groups="#{department}" g="201,58,92,52" name="Collect reports"> <transition to="join1"/> </task>

进入到task,其实现在有多个task,是根据join中的multiplicity来确定的。

这些task任务安排的人员在candidate-groups(或者是candidate-users等)中定义。这个例子#{department},就是在foreach节点中,定义的var="department"中的变量名字;

这些任务不是直接分派到用户的,而是需要用户自己进行take的

(通过TaskService.createTaskQuery().candidate(userId).list 可以获得有哪些任务自己是候选者

   或者通过TaskService.findGroupTasks(userId)获取有哪些任务是自己加入的组需要完成的,

  或者在流程xml文件中,直接用assignee,分配给任务完成的人员

)。

3. foreach自动生成的这些Task都完成了,则流程进入到下一步;

   如果有部分人员完成,部分人员没有完成,还是可以查到foreach自动生成的所有Execution(通过processInstance.getExecutions()),不过根据任务完成的情况有不同的状态:

   如果任务已经完成,则在Task表中已经删除,得到的execution状态是:inactive-join

   没有完成的任务,在task中依旧存在,得到的execution状态是 active-concurrent

 

来源:http://hi.baidu.com/%D2%BB%D6%AA%CA%B6%B7%D6%D7%D3/blog/item/fa5cb3b685178def30add1d4.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics