jbpm4.4之待处理任务
2011-08-31 17:35
148 查看
jbpm4中已有获取待指定用户处理的任务的方法,如下:
也可以自己写HQL通过hibernate来将个人任务和分组任务一起查询:
其中用户ID和分组等参数可以通过?方式来传入。
然而如果系统中有多种业务用到jbpm工作流的话(比如OA中有请假、出差、公文收发等),jbpm4自带的两个方法是获取到的是所有业务的任务,而无法获得每个任务对应的是哪个业务,当然也有偏门的方法,比如通过task中的getExecutionId来判断对应的哪个业务(可以看下附加信息)。
这样任务对应的业务还是好获取到,系统中一般会将不同业务的任务设置成不同的模块,并且一般获取任务时还需要附带一些对应的业务信息,比如请假任务能看到请假人、请假天数等信息,这些信息在我们通过上面的方法中获取到的任务List中是获取不到的,我们得想办法将这些信息同任务一起展现出来。
对于这个问题我之前用了一个很别扭的方法,就是先获取到待处理的任务,然后循环去查询每个任务对应的业务信息,最后把任务和业务信息封装在一起,存入List中返回,这样每一次要经过很多的查询,性能大大下降,如果要通过条件查询或者分页等需求就又很麻烦了。
后来无意间又想到一个方法(知道用HQL查询任务的方法后),何不在这个HQL上再改一下,把业务的表也关联进来,那样不就一次查询就将任务和业务记录绑定起来了,这样通过业务信息进行条件查询、分页查询都很好解决了。
另外在最近做的一个功能中接触到了优先级这个东东,用于在任务列表中按优先级排序,jbpm4的表中本来有PRIORITY_这个字段,但我没找到合适的方法给它设值,所以我就直接将优先级直接放入业务表中了,正好这个优先级的问题也解决了。
由于我这项目本身用的框架没用hibernate,所以最终还是直接用SQL来获取待处理任务了,最终的SQL大致如下:
附:
executionService().startProcessInstanceByKey(流程KEY,业务KEY);
在启动流程时可以指定一个业务的KEY,比如:
executionService().startProcessInstanceByKey('INCIDENT','IN0001');
'INCIDENT'是流程定义的KEY,'IN0001'是业务的KEY,这样启动流程创建的Execution的ID则为'INCIDENT-IN0001',如果没有指定业务KEY,则jbpm会默认将Execution的主键(DBID_字段)作为业务KEY。
processEngine.getTaskService().findPersonalTasks(用户ID); //获取个人任务 processEngine.getTaskService().findGroupTasks(用户ID); //获取所在组任务
也可以自己写HQL通过hibernate来将个人任务和分组任务一起查询:
select task from org.jbpm.pvm.internal.task.TaskImpl task left join task.participations pt where (task.assignee='用户ID' or ( task.assignee is null and pt.type = 'candidate' and ((pt.userId='用户ID') or (pt.groupId in ('分组1','分组2','分组3')))))
其中用户ID和分组等参数可以通过?方式来传入。
然而如果系统中有多种业务用到jbpm工作流的话(比如OA中有请假、出差、公文收发等),jbpm4自带的两个方法是获取到的是所有业务的任务,而无法获得每个任务对应的是哪个业务,当然也有偏门的方法,比如通过task中的getExecutionId来判断对应的哪个业务(可以看下附加信息)。
这样任务对应的业务还是好获取到,系统中一般会将不同业务的任务设置成不同的模块,并且一般获取任务时还需要附带一些对应的业务信息,比如请假任务能看到请假人、请假天数等信息,这些信息在我们通过上面的方法中获取到的任务List中是获取不到的,我们得想办法将这些信息同任务一起展现出来。
对于这个问题我之前用了一个很别扭的方法,就是先获取到待处理的任务,然后循环去查询每个任务对应的业务信息,最后把任务和业务信息封装在一起,存入List中返回,这样每一次要经过很多的查询,性能大大下降,如果要通过条件查询或者分页等需求就又很麻烦了。
后来无意间又想到一个方法(知道用HQL查询任务的方法后),何不在这个HQL上再改一下,把业务的表也关联进来,那样不就一次查询就将任务和业务记录绑定起来了,这样通过业务信息进行条件查询、分页查询都很好解决了。
另外在最近做的一个功能中接触到了优先级这个东东,用于在任务列表中按优先级排序,jbpm4的表中本来有PRIORITY_这个字段,但我没找到合适的方法给它设值,所以我就直接将优先级直接放入业务表中了,正好这个优先级的问题也解决了。
由于我这项目本身用的框架没用hibernate,所以最终还是直接用SQL来获取待处理任务了,最终的SQL大致如下:
select it.*,jt.DBID_ as task_id,jt.NAME_ as task_name from itsm_task it left join jbpm4_task jt on it.execution_id = jt.EXECUTION_ID_ left join jbpm4_participation jp on jt.DBID_ = jp.TASK_ where it.status<3 and (jt.ASSIGNEE_ = 'admin' or (jt.ASSIGNEE_ is null and jp.TYPE_ = 'candidate' and ((jp.USERID_ = 'admin') or (jp.GROUPID_ in('TECH_UNCERTAIN','UNCERTAIN_EMPLOYEE','TECH_EMPLOYEE','admin'))))) group by jt.DBID_
附:
executionService().startProcessInstanceByKey(流程KEY,业务KEY);
在启动流程时可以指定一个业务的KEY,比如:
executionService().startProcessInstanceByKey('INCIDENT','IN0001');
'INCIDENT'是流程定义的KEY,'IN0001'是业务的KEY,这样启动流程创建的Execution的ID则为'INCIDENT-IN0001',如果没有指定业务KEY,则jbpm会默认将Execution的主键(DBID_字段)作为业务KEY。
相关文章推荐
- jBPM4.4:分配任务的几种方式
- 文章标题JBPM4.4:执行流程实例(启动、向后一步、查询任务、拾取任务、完成任务、设置获取流程变量)
- jbpm4.4 启动,查询任务,做任务,参数
- 写jbpm4.4执行完成最后一个任务遇到如下问题。
- JBPM4.4 使用泳道动态指定下一个任务节点任务人的两种方式之一 (assignment-handler)
- JBPM4.4 使用泳道动态指定下一个任务节点任务人的两种方式之方法二
- jBPM4.4开发(三)-----------task任务节点
- [转]jBPM4.4之(Task)任务分配
- JBPM4.4 撤除任务/回退任务/自由流
- jBPM4.4之(Task)任务分配
- jBPM4.4:查找任务完成过程
- jBPM4.4之(Task)任务分配
- JBPM4.4:执行流程实例(启动、向后一步、查询任务、拾取任务、完成任务、设置获取流程变量)
- Volley源码阅读详解(一)---网络任务分发,处理和交付的核心流程
- crontab处理java定时任务
- 工作流之任务处理人更改
- Eclipse JEE 安装JBPM 4.4 GPD
- 继承和多态在流式任务处理中的两种设计对比
- 多线程处理多个任务
- jbpm4.4根据.jpdl.xml流程定义文件,得到流程图.png