- 浏览: 429137 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
man1900:
想部署及学习了解,可参考本人新的博客获得下载源代码。http: ...
JOffice 中的JBPM4在线流程设计器--初览(Applet版) -
atgoingguoat:
哎。假的。
JOffice 中的JBPM4在线流程设计器--初览(Applet版) -
电竞杀神张无忌:
这是主流程调用子流程报的错大神指导原因吗? ...
JBPM4的子流程与父流程的设计及开发 -
贝塔ZQ:
pageoffice也是office在线编辑的吧,J.Offi ...
J.Office另一种在线Office编辑器整合 -
Mybonnie1:
你好,想问下,串行的多实例任务能做到回退么
Activiti 多个并发子流程的应用
会签任务是工作流里一个比较觉见的任务方式,意思是一个处理任务需要多个人同时处理,然后汇总多个人的意见,决定流程下一步该如何执行。在JBPM4里,并没有会签这个概念,其只有并行任务的处理方式,如下所示:
这种方式会签的任务数量是固定的,并且任务名称也不一样,不能由用户来动态决定有多少人参与会签的任务。当然我们可以让中间那部分只有一个节点,然后根据用户在后台设置了多少人参与或在流程运行过程中,动态知道有多少人参与这个任务,动态创建并发的任务(不过这样实现上有一点困难,需要扩展jbpm的api相对多一些)
而另一种相对比较完善的解决方案是可以用一个任务来代表会签任务,而在流程运行至该任务节点的时候,根据当前有多少人参与这流程,动态生成该任务下的会签子任务,这样可以使得每个会签的参与人都可以在待办事项中看到该任务。这种办法实现上相对容易得多,因为jbpm4本身对子任务的动态创建支持得比较好。
joffice2就是基于这种方式来解决会签的配置及处理。那么,如何汇总会签任务的投票意见呢?我们知道,日常的会签常见的方式有:一票否决,一票通过,全票通过,半数通过等。其实现无非是分为两种,按投票数的绝对票数,另一种是按投票占的百份比数,投票决策又分为两种:通过或拒绝(反对),投票过程中会有通过,反对或弃权的动作。因此,在后台上我们设置某个节点若为会签时,其会签的投票决策方式信息包括如下:
并且我们希望在执行会签任务的时候,会签的参与人员均可以填写意见及选择投票的类型(如同意,反对,弃权),如:
那么投票的情况如何处理,以下为投票的决策处理方式:
为什么要在后面加上流程变量decisionType呢,这里就是为了下一任务可以根据上一任务的会签结果来决定如何往下执行的,我们可以在后续的任务或条件结点中,通过这个变量的值,来决定其如何往下执行。若该变量的值为“pass"表示上一步会签的结果是同意,否则为反对。
如我们有一流程:
那么在分支节点上,我们插入我们需要流程执行的分支决定代码,并且根据这个分支决定代码决定往下一步时执行的路径。于是我们在分支上加上干预的代码如下所示:
根据上面的逻辑判断,我们把完成会签任务的代码展示部分如下:
/** * 完成会签子任务 * @param parentTask 父任务 * @param subTask 子任务 * @param variables 任务中的流程变量 */ private void completeSignSubTask(TaskImpl parentTask,TaskImpl subTask,String signalName,Map variables){ //看目前还有多少子任务 int subTasksSize=parentTask.getSubTasks().size(); //检查会签的配置情况 ProcessInstance pi=((TaskImpl)parentTask).getProcessInstance(); ProcessDefinition pd=repositoryService.createProcessDefinitionQuery().processDefinitionId(pi.getProcessDefinitionId()).uniqueResult(); //取得该任务的后台人员配置 ProUserAssign assignSetting=proUserAssignService.getByDeployIdActivityName(pd.getDeploymentId(), parentTask.getActivityName()); evict(subTask); evict(parentTask); if(assignSetting!=null){ //取得会签配置 TaskSign taskSign=taskSignService.findByAssignId(assignSetting.getAssignId()); if(taskSign!=null){//按照配置执行任务跳转 //是否完成父任务 boolean isFinishSupTask=false; //查看用户投的是哪一种票(同意还是不同意还是弃权) Short isAgree=(Short)variables.get(FlowConstants.SIGN_VOTE_TYPE); if(isAgree==null){//若为空,则认为是投通过票 isAgree=TaskSign.DECIDE_TYPE_PASS; } //1.保存投票信息 taskSignDataService.addVote(parentTask.getId(),isAgree); //加上子任务的流程变量 taskService.setVariables(subTask.getId(),variables); //2.完成子任务 taskService.completeTask(subTask.getId()); //3.检查其投票数是否已满足后台会签配置条件 //3.1根据后台配置的投票类型,取得投票的总数 Long voteCounts=taskSignDataService.getVoteCounts(parentTask.getId(),taskSign.getDecideType()); if(taskSign.getVoteCounts()!=null){//按绝对投票数来进行 if(voteCounts>=taskSign.getVoteCounts()){ isFinishSupTask=true; } }else if(taskSign.getVotePercents()!=null){//按投票百分比来进行 //取到动态有多少子任务 Integer taskSignCounts=(Integer)taskService.getVariable(parentTask.getId(), "taskSignCounts"); if(taskSignCounts==null || taskSignCounts==0){ taskSignCounts=1; } BigDecimal totalSubTasks=new BigDecimal(taskSignCounts); //当前投票后占的百分比 BigDecimal tempPercent=new BigDecimal(voteCounts).divide(totalSubTasks); Integer curPercent=new Integer(tempPercent.multiply(new BigDecimal(100)).intValue()); if(curPercent>=taskSign.getVotePercents()){ isFinishSupTask=true; } } //若投票完成后,把投票结果存在decisionType变量里,方便在后台通过脚本根据投票的结果进行跳转 Map varsMap=new HashMap(); //当前会签子任务完成后,若投票的情况已经满足后台的会签设置条件 //或没有满足会签设置的情况,并且会签所有子任务均已经完成 if(isFinishSupTask || (!isFinishSupTask && subTasksSize==1) ){ String passRefuse=null; if(isFinishSupTask){//所有子任务完成,满足会签条件设置 passRefuse=TaskSign.DECIDE_TYPE_PASS==taskSign.getDecideType()?"pass":"refuse"; }else{//所有子任务完成,不满足会签条件设置 passRefuse=taskSign.getDecideType()==TaskSign.DECIDE_TYPE_PASS?"refuse":"pass"; } logger.debug("会签投票结果:"+ passRefuse); varsMap.put("decisionType",passRefuse); taskService.setVariables(parentTask.getId(),varsMap); //完成父任务 taskService.completeTask(parentTask.getId(),signalName); } }else{//没有设置对应的会签配置,则认为会签是全部完成后才能往下执行 logger.error("Task "+parentTask.getActivityName()+" is not config right sign config in process admin console."); if(((TaskImpl)parentTask).getSubTasks().size()==1){//若只有当前子任务,则表示可以结束目前这个任务 taskService.setVariables(subTask.getId(),variables); //完成子任务 taskService.completeTask(subTask.getId()); //完成父任务 taskService.completeTask(parentTask.getId(),signalName); }else{ taskService.setVariables(subTask.getId(), variables); //完成子任务后,直接返回则可 taskService.completeTask(subTask.getId()); return ; } } }else{ //TODO logger.error("Task "+parentTask.getActivityName()+"is not config the setting in process admin console."); } }
产生会签的任务代码如下:
/** * 创建新的任务 * @param parentTaskId 父任务 ID * @param assignIds 任务执行人IDs */ public void newSubTask(String parentTaskId,Long[]userIds){ TaskServiceImpl taskServiceImpl=(TaskServiceImpl) taskService; Task parentTask=taskServiceImpl.getTask(parentTaskId); //为该父任务加上会签的人员数,方便后面对会签的投票进行统计 Map vars=new HashMap(); vars.put("taskSignCounts", new Integer(userIds.length)); taskServiceImpl.setVariables(parentTaskId, vars); for(int i=0;i<userIds.length;i++){ String userId=userIds[i].toString(); TaskImpl task=(TaskImpl)taskServiceImpl.newTask(parentTaskId); task.setAssignee(userId); task.setName(parentTask.getName() + "-" + (i+1)); task.setActivityName(parentTask.getName() ); task.setDescription(parentTask.getDescription()); //保存 taskServiceImpl.saveTask(task); } }
其最终的实现效果如下flash演示。
http://bbs.jee-soft.cn/swf/signTask.html
或
http://bbs.jee-soft.cn/posts/list/288.page
评论
我想问创建的子任务是并发执行的吗?如果不是,那会签岂不是要一个一个进行?
有个问题想请教下,你们有没有碰到过环节这个概念?
也就是说一个环节里面会有多个任务,然后每个任务可以指派给任何人。
对应到Jbpm里也就是task-node的概念,不过到了4之后,就没有这个概念了
有没有想过怎么去实现类似的东西?
发表评论
-
Activiti 工作流会签开发设计思路
2012-07-26 12:12 28356Activiti 工作流会签开 ... -
基于开源流程引擎Activiti5的工作流开发平台
2012-05-17 11:28 7175http://www.redxun.cn:8 ... -
Jbpm4或Activiti5的流程任务分发与汇总
2012-03-20 18:28 6203应用场景:在企业或事业单位,经常需要把一个任务分派给多条线去 ... -
关于Activiti或JBPM流程的回退的讨论之一
2011-12-30 12:08 8844需求: ... -
Activiti 5 在线流程设计器开发
2011-11-30 08:56 23695jbpm4的开发成员to ... -
基于标签方式的工作流启动及任务执行开发说明
2011-09-25 21:21 2266基于现在的系统的整 ... -
JOffice2 发布了开源的开发者体验版本啦!
2011-08-09 23:42 7262JOffice的爱好者有福音了,经公司决定,现在发布 ... -
关于JOffice的业务表单与流程的整合问题
2011-07-26 23:55 3272关于 JOffice 的业务表 ... -
JBPM4的子流程与父流程的设计及开发
2011-07-14 11:23 5614【JBPM4的子流程 ... -
jbpm4.4在线设计分支跳转
2011-05-02 14:30 4354我们知道jbpm4.4提供了三种比较方便的分支跳转方式 ... -
J.Office 2 JBPM4.4 工作流增强版特性
2011-04-27 16:00 36352.0主要在工作流方面提供了很强的改进,jbpm升级至jbpm ... -
JOffice2的在线表单设计示例(JBPM4.4)
2011-03-16 13:52 5952JOffice2目前升级至jbpm ... -
JOffice2中的JBPM4的任务回退实现
2010-12-07 15:27 3524任务回退的工作可以有两种实现方式: 1. 完成当前 ... -
利用JBPM4.4的AssignmentHandler实现用户角色整合另一种构思
2010-11-26 17:05 6167Jbpm4提供的IdentitySession ... -
分享宏天免费的JBPM4流程设计器(Applet)
2010-07-07 11:56 312JBPM4一直没有一个很好的在线流程设计器,基于这种方式,跟大 ... -
JOffice中的自定义发文流程与运行模板设计
2010-07-05 22:59 3136开发与设计公文流程在所有的政府oa项目上都少不了此需求,而能灵 ... -
JBPM4中的任务回退、补签、自由流程实现
2010-04-22 16:12 10396最近在实施政府办公项 ... -
OA JBPM中的公文(发文、收文)流程
2010-03-25 00:10 11398公文管理主要包括两大模块,其一是发文管理,其二是收文管理,非常 ... -
JBPM在线流程设计器的分析与实现部分构想
2010-03-10 13:54 7310在发表文章之前,先 ... -
取得任务节点的对外所有跳转Transition对象
2010-03-09 11:32 2367在流程的任务里,我们需要把当前的任务节点的下一步的跳转选择显示 ...
相关推荐
内含jbpm4.4的会签实例,使用customactivity实现,并且内含有使用的丰富工具类,有兴趣的朋友下载学习~
会签源文件 博文链接:https://yy666.iteye.com/blog/660701
jBPM4.4 会签(带加签、减签功能),通过查找资料,个人摸索,利用custom节点实现了会签功能,加签、减签功能是我自己摸索出来的,是不是能满足大家的需求,仅供参考。
JBPM4.3与Spring会签 实例,欢迎交流ningjinlin@gmail.com
jbpm4源码jbpm4源码jbpm4源码
extjs jbpm4 流程设计器,希望对你有所帮助!
jbpm分支fork & 聚合join 操作例子,可应用于会签操作。
5.1表JBPM4_DEPLOYMENT 7 5.2 表JBPM4_DEPLOYPROP 7 5.3 表JBPM4_EXECUTION 8 5.4 表JBPM4_HIST_ACTINST 9 5.5 表JBPM4_HIST_DETAIL 9 5.6 表JBPM4_HIST_PROCINST 10 5.7 表JBPM4_HIST_TASK 11 5.8 表JBPM4_HIST_VAR...
jbpm4整合流程例子及附代web流程设计器可以进行流程设计
jbpm会签.zip;jbpm会签.zip
jbpm-3_2_2-Api jbpm 著名工作流引擎
jBPM4的PVM实现解析
jBPM4.4 会签(带加签、减签功能),通过查找资料,个人摸索,利用task节点实现了会签功能,加签、减签功能是我自己摸索出来的,是不是能满足大家的需求,仅供参考。
JOffice2中的JBPM4的任务回退实现
jbpm的流程部署 流程开始 任务提交 查询已办,待办
jbpm应用开发指面(胡奇) jbpm4.3表结构和表字段说明 [jBPM开发指南].高杰.文字版 jBPM5_用户手册-中文版
,jbpm4的源码,分支,会签等一些中国特色建立下载《jBPM4工作流应用开发指南.pdf》这本书
jbpm4。4中表之间的关系,jbpm4 表关系