在流程业务管理中,任务是通常都是由一个人去处理的,而多个人同时处理一个任务,这种任务我们称之为会签任务。这种业务需求也很常见,如一个请款单,领导审批环节中,就需要多个部门领导签字。在流程业务中,我们可以把每个领导签字的环节都定义为任务,但若这样,这个流程业务有一点是固定的,就是签批人是固定的。而任务是由一个领导签完再到另一领导,当然也可以由多个领导同时签字。

传统的用流程业务来解决可以采用以下的做法:

串行会签

并行会签

前者在流程业务中,叫串行会签,也即是由一个领导签完再至另一领导签。后者我们称之为并行会签,表示几个领导同时进行签发,而不清楚最终是谁先签。

以上的解决方式有两大业务需求下是不能满足的,若会签的领导不是固定的,即可以由上一任务审批人提交前随意进行选择,另一种是对于会签业务中,要求若其中一部分领导审批通过,即直接往下走,不需要全部领导进行审批。另外,对于这种情况下,统计最终领导会签的结果也是比较困难的,即对审批单的意见是同意还是否决没有办法清楚。以上两种业务需求也是很常见的日常需求,但我们若采用了固定的流程节点,则不能实现。在这里,可以采用Activiti的节点多实例来处理,以上流程则可以简化为下:

何谓多任务实例节点?在Activiti5上的解析则为动态的多任务节点,可以根据传入的动态人员数进行动态生成任务。生成的任务数则不固定,可以进行并行会签,也可以进行串行会签。会签任务最终是否需要往下执行,由会签设置的规则来进行约束。如我们可以常规去设置“一票通过”、“一票否决”、“少数服务多数”等会签规则。因此,我们需要在会签节点上绑定我们的设计规则。会签规则设置界面如下:

通过会签设计规则,可以清楚最终会签人员的投票结果。其数据结构如下所示:

会签任务的定义本身已经由Activiti来实现了,但需要动态传入动态的人员数

<userTask activiti:assignee="${assignee}" id="SignTask1" name="领导会签">
<extensionElements>
<activiti:taskListener class="com.hotent.platform.service.bpm.listener.TaskSignCreateListener" event="create"/>
<activiti:taskListener class="com.hotent.platform.service.bpm.listener.TaskAssignListener" event="assignment"/>
<activiti:taskListener class="com.hotent.platform.service.bpm.listener.TaskCompleteListener" event="complete"/>
</extensionElements>
<multiInstanceLoopCharacteristics activiti:elementVariable="assignee" isSequential="false" activiti:collection="${taskUserAssignService.getSignUser(execution)}">
<completionCondition>${signComplete.isComplete(execution)}</completionCondition>
</multiInstanceLoopCharacteristics>
</userTask> 

其中,isSequential为true则为串行会签,若为false则为并行会签,而activiti:collection可以来自我们Spring容器中的接口及方法,表示获取会签用户集合,taskUserAssignService.getSignUser(execution)。其获取会签的用户值来自两个方面,一个在界面中指定的会签人员,另一个在后台会签节点上配置的人员。

后台会签节点人员设置

任务审批面上选择下一任务会签人员

<completeCondition>为完成会签的条件signComplete.isComplete(execution),可以在这里根据我们的会签规则及目前的会签情况,决定会签是否完成。其实现如下所示:

最终实现逻辑:

public boolean isComplete(ActivityExecution execution) {  logger.debug("entert the SignComplete isComplete method...");  String nodeId=execution.getActivity().getId();  String actInstId=execution.getProcessInstanceId();  ProcessDefinition processDefinition=bpmService.getProcessDefinitionByProcessInanceId(actInstId);  //取得会签设置的规则  BpmNodeSign bpmNodeSign=bpmNodeSignService.getByDefIdAndNodeId(processDefinition.getId(), nodeId);  //完成会签的次数  Integer completeCounter=(Integer)execution.getVariable("nrOfCompletedInstances");  //总循环次数  Integer instanceOfNumbers=(Integer)execution.getVariable("nrOfInstances");  //计算投票结果。  VoteResult voteResult=calcResult(bpmNodeSign, actInstId, nodeId, completeCounter,instanceOfNumbers);  String signResult=voteResult.getSignResult();  boolean isCompleted=voteResult.getIsComplete();  /** * 会签完成做的动作。 * 1.删除会签的流程变量。 * 2.将会签数据更新为完成。 * 3.设置会签结果变量。 * 4.更新会签节点结果。 * 5.清除会签用户。 */  if(isCompleted){  //删除会签的变量。  //删除 assignee,loopCounter变量。  bpmService.delLoopAssigneeVars(execution.getId());  logger.debug("set the sign result + " + signResult);  //将会签数据更新为完成。  taskSignDataService.batchUpdateCompleted(actInstId, nodeId);  //设置会签的结果  execution.setVariable("signResult_" + nodeId , signResult);  //更新会签节点的状态。  Short status=TaskOpinion.STATUS_PASSED;  if(signResult.equals(SIGN_RESULT_REFUSE)){  status=TaskOpinion.STATUS_NOT_PASSED;  }  //更新会签节点的状态。  bpmProStatusDao.updStatus(actInstId, nodeId,status);  //清除会签用户。  taskUserAssignService.clearSignUser();  }  return isCompleted;
}  **  * 根据会签规则计算投票结果。  * <pre>  * 1.如果会签规则为空,那么需要所有的人同意通过会签,否则不通过。  * 2.否则按照规则计算投票结果。  * </pre>  * @param bpmNodeSign       会签规则  * @param actInstId         流程实例ID  * @param nodeId            节点id名称  * @param completeCounter       循环次数  * @param instanceOfNumbers     总的会签次数。  * @return  */
private VoteResult calcResult(BpmNodeSign bpmNodeSign,String actInstId,String nodeId,Integer completeCounter,Integer instanceOfNumbers){  VoteResult voteResult=new VoteResult();  //没有会签实例  if(instanceOfNumbers==0){  return voteResult;  }  //投同意票数  Integer agreeVotesCounts=taskSignDataService.getAgreeVoteCount(actInstId, nodeId);  //没有设置会签规则  //(那么得全部会签通过才通过,否则不通过)  if(bpmNodeSign==null){  //还没有完成可以退出。  if(completeCounter<instanceOfNumbers){  return voteResult;  }  else{  //完成了 (全部同意才通过)  if(agreeVotesCounts.equals(instanceOfNumbers)){  return new VoteResult(SIGN_RESULT_PASS,true);  }  else{  return new VoteResult(SIGN_RESULT_REFUSE,true);  }  }  }  //投反对票数  Integer refuseVotesCounts=taskSignDataService.getRefuseVoteCount(actInstId, nodeId);  //检查投票是否完成  if(BpmNodeSign.VOTE_TYPE_PERCENT.equals(bpmNodeSign.getVoteType())){  float percents=0;  //按同意票数进行决定  if(BpmNodeSign.DECIDE_TYPE_PASS.equals(bpmNodeSign.getDecideType())){  percents=agreeVotesCounts/instanceOfNumbers;  //投票同意票符合条件  if(percents>=bpmNodeSign.getVoteAmount()){  voteResult=new VoteResult(SIGN_RESULT_PASS, true);  }  //投票已经全部完成  else if(completeCounter.equals(instanceOfNumbers)){  voteResult=new VoteResult(SIGN_RESULT_REFUSE, true);  }  }  //按反对票数进行决定  else{  percents=refuseVotesCounts/instanceOfNumbers;  //投票  if(percents>=bpmNodeSign.getVoteAmount()){  voteResult=new VoteResult(SIGN_RESULT_REFUSE, true);  }  //投票已经全部完成  else if(completeCounter.equals(instanceOfNumbers)){  voteResult=new VoteResult(SIGN_RESULT_PASS, true);  }  }  }  //按绝对票数投票  else{  //按同意票数进行决定  if(BpmNodeSign.DECIDE_TYPE_PASS.equals(bpmNodeSign.getDecideType())){  //投票同意票符合条件  if(agreeVotesCounts>=bpmNodeSign.getVoteAmount()){  voteResult=new VoteResult(SIGN_RESULT_PASS, true);  }  //投票已经全部完成  else if(completeCounter.equals(instanceOfNumbers)){  voteResult=new VoteResult(SIGN_RESULT_REFUSE, true);  }  }  //按反对票数进行决定  else{  //投票  if(refuseVotesCounts>=bpmNodeSign.getVoteAmount()){  voteResult=new VoteResult(SIGN_RESULT_REFUSE, true);  }  //投票已经全部完成  else if(completeCounter.equals(instanceOfNumbers)){  voteResult=new VoteResult(SIGN_RESULT_PASS, true);  }  }  }  return voteResult;
}  

Activiti工作流会签设计相关推荐

  1. Activiti工作流会签与获取下一节点任务信息

    2018-03-29 问题描述:会签节点选择2个审核人只能看到一条代办任务. 解决办法: Sequential设置为false即可.(true 串行   false  并行) activiti 工作流 ...

  2. Activiti 工作流会签开发设计思路

    在流程业务管理中,任务是通常都是由一个人去处理的,而多个人同时处理一个任 务,这种任务我们称之为会签任务.这种业务需求也很常见,如一个请款单,领导审批环节中,就需要多个部门领导签字.在流程业务中,我们 ...

  3. activiti 工作流会签 / 多人审批时若一人通过即可

    equenceFlow  流程定义文件leave-formkey.bpmn20.xml: [html]  <?xml version="1.0" encoding=" ...

  4. activiti工作流会签功能的实现

    需求:统计会签部门的审核情况然后决定下一步流程的走向: 逻辑实现: 1.设置一个变量signCount 如果同意,signCount+1 // 如果是会签流程List< Task > ta ...

  5. activiti工作流连接mysql_Activiti工作流 安装myeclipse activiti设计插件并生成数据库表...

    从零开始学习Activiti工作流,记录下学习过程. 关于工作流的简介没什么好介绍了,只能说是个很有用的东西,数据库中23张表分别有什么用网上也有很详细的介绍,这里也不多加说明.activiti开发中 ...

  6. activiti工作流在线表单设计功能(activiti + ueditor + Ueditor Web Form De

    分享一下我老师大神的人工智能教程吧.零基础,通俗易懂!风趣幽默!http://www.captainbed.net/ 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 之前实现了 ...

  7. Activiti工作流引擎进阶【收藏可做笔记系列】

    Activiti工作流引擎进阶 Activiti进阶 一.流程实例 什么是流程实例 启动流程实例 并添加Businesskey(业务标识) 操作数据库表 查询流程实例 关联BusinessKey 挂起 ...

  8. Activiti工作流--并行网关--之九

    流程的业务描述 会议记录会签 并行网关是不需要设置流程变量的,并行网关不在流程变量的范围内 比如: 在开完某个产品设计会以后,需要对会议约定一些事项进行签字画押涉及到两个部门(产品部/研发部)的主管和 ...

  9. 可扩展的工作流引擎设计

    一. 前言 一提到"流程",各位看官就山呼海啸--神啊救救我吧:报销流程太慢了.流程五花八门.流程太不智能了等等."工作流引擎"就是来解决这些问题的! 小生近日 ...

  10. Activiti工作流从入门到入土:工作流简介

    文章源码托管:https://github.com/OUYANGSIHAI/Activiti-learninig 欢迎 star !!! 一.activiti介绍 Activiti5是由Alfresc ...

最新文章

  1. 安徽省公务员计算机专业知识,安徽省公务员考试计算机专业知识编程题
  2. python 测试字符串类型_【教程】如何用Python中的chardet去检测字符编码类型
  3. 感谢有你 | LiveVideoStackCon 2020 北京站优秀出品人、讲师与志愿者
  4. ascll 和gbk,utf-8的简介
  5. 《Python 黑科技》程序员必须会的代理ip小技巧
  6. java 线程数_在虚拟机中是什么限制java线程数量?这方面涉及哪些调优?
  7. ECS中的Entity实体
  8. 极限编程的12个实践原则
  9. 什么是deployment 声明式升级应用
  10. oracle 实现自增序列
  11. bin code led_LED混Bin生控制文件.pdf
  12. java 计算正态分布_统计基本概念 期望 方差 均方差 正态分布 Java统计计算
  13. 【论文】Learning by Abstraction: The Neural State Machine
  14. php 微信授权 跨域,微信公众号支付 请求跳转code跨域
  15. iOS 根据银行卡号判断银行名称
  16. 旅游类APP-Android模块分析
  17. 【哈希】购物券(bday)
  18. 基层管理者项目管理二三事
  19. ogre1.9环境搭建
  20. LabVIEW的万金油框架

热门文章

  1. vue中使用(瀑布流)vue-waterfall-easy插件
  2. torch常用基础函数
  3. USACO CONTEST FEB07 白银莲花池 silvlily 分析
  4. 2021金三银四Java面试突击集锦
  5. mac 外接显示器 发热严重 解决方案
  6. 精密测量仪器的气源维护知识
  7. xcode8 上传app到appStore 遇到 error ITMS90096
  8. 在下拉列表框上添加--请选择--
  9. python新疆自驾旅游推荐系统毕业设计源码111042
  10. 华为移动应用引擎安装第三方apk教程