Activiti多人会签,1/3的人同意则审批通过的实现

  • 第一步:配置流程
    • 1. 配置审批通过的条件,如下,
    • 2. 申请节点添加结束监听器
    • 3. 配置该审批节点结束的条件
    • 4. 为该审批节点添加创建时的监听器
  • 二:代码部分
    • 1、JAVA代码
    • 2. 流程配置xml如下:

第一步:配置流程

1. 配置审批通过的条件,如下,

线条上配置审批通过条件:${passCount/totalCount >=1/3}


线条上配置审批退回条件:${passCount/totalCount < 1/3}

2. 申请节点添加结束监听器

3. 配置该审批节点结束的条件

Sequential:false,false为并行执行,true为串行执行,此处要设置为并行
Collection: ${partyList},用于执行该会签环节的参与人,此处使用partyList的流程变量
Element variable: party,此处表示的是每一个分支都有一个叫party的流程变量,和上方的assignee结合使用就可以决定该分支应该由谁执行
Completion condition:该节点的结束条件(该条件一定要配置,否则要等所有人都执行完才会结束该节点)

4. 为该审批节点添加创建时的监听器

二:代码部分

  1. 申请节点结束时,设置下个审批节点的参与人

监听器内容如下,主要用于设置下个审批节点的参与人

1、JAVA代码

package com.ylkj.base.flow.listener;import java.util.ArrayList;import java.util.List;import org.activiti.engine.delegate.DelegateTask;import org.activiti.engine.delegate.TaskListener;public class MyCompeteistener implements TaskListener {@Overridepublic void notify(DelegateTask arg0) {List<String> userList = new ArrayList<String>();userList.add("111");userList.add("222");userList.add("333");arg0.setVariable("partyList", userList);}}2. 审批节点创建时的监听器,主要用于分配任务执行人监听器内容如下:package com.ylkj.base.flow.listener;import org.activiti.engine.delegate.DelegateTask;import org.activiti.engine.delegate.TaskListener;/*** 节点创建监听器* 为节点设置处理人*/public class MutiGroupsListener implements TaskListener {//节点完成的时候调用此监听器@Overridepublic void notify(DelegateTask arg0) {//将通过人数,未通过人数,总数,重新置为0,退回的时候才能重新计算arg0.setVariable("passCount", "0");arg0.setVariable("totalCount", "0");arg0.setVariable("noPassCount", "0");//为每一个任务设置处理人String party = (String)arg0.getVariable("party");arg0.setAssignee(party);}}3. 审批节点有人执行任务时,需要统计执行情况/* (非 Javadoc)* <p>Title: completeTask1</p>* <p>Description: </p>* @param procInstId 流程实例id* @param taskId     任务id* @param variables  流程变量* @param passflag   审批同意标志(yes/no)* @see com.ylkj.base.activiti.service.ActivitiService#completeTask1(java.lang.String, java.lang.String, java.util.Map, java.lang.String)*/public void completeTask1(String procInstId,String taskId, Map<String, Object> variables,String passflag) {//获取当前节点的task_def_key_,此段代码主要用于区分多个节点时,审批通过记录数与总数Task taskQuery = processEngine.getTaskService().createTaskQuery().taskId(taskId).singleResult();List<Task> tasks = processEngine.getTaskService().createTaskQuery().taskName(taskQuery.getName()).processInstanceId(procInstId).list();int passCount = 0;//审批同意人数int noPassCount = 0;//审批不同意人数int totalCount = 0;//任务总人数//当前的执行情况String tmpPassCount = processEngine.getRuntimeService().getVariable(procInstId, taskQuery.getTaskDefinitionKey()+"#passCount")+"";String tmpNoPassCount = processEngine.getRuntimeService().getVariable(procInstId, taskQuery.getTaskDefinitionKey()+"#noPassCount")+"";String tmpTotal = processEngine.getRuntimeService().getVariable(procInstId, taskQuery.getTaskDefinitionKey()+"#totalCount")+"";if(!tmpPassCount.equals("null") && !tmpPassCount.trim().equals("")){passCount = Integer.parseInt(tmpPassCount);}if(!tmpNoPassCount.equals("null") && !tmpNoPassCount.trim().equals("")){noPassCount = Integer.parseInt(tmpNoPassCount);}if(tmpTotal.equals("null") || tmpTotal.trim().equals("")){totalCount = tasks.size();} else if(!tmpTotal.equals("null") && !tmpTotal.trim().equals("")){totalCount = Integer.parseInt(tmpTotal);}for (Task tmp:tasks) {if(passflag.equals("yes") && tmp.getId().equals(taskId)){//选择通过则通过人数+1passCount++;}if(passflag.equals("no") && tmp.getId().equals(taskId)){//选择不通过则不通过人数+1noPassCount++;}}//变量回写记录variables.put("passCount", passCount);variables.put("noPassCount", noPassCount);variables.put("totalCount", totalCount);variables.put(taskQuery.getTaskDefinitionKey()+"#passCount", passCount);variables.put(taskQuery.getTaskDefinitionKey()+"#noPassCount", noPassCount);variables.put(taskQuery.getTaskDefinitionKey()+"#totalCount", totalCount);    processEngine.getTaskService().complete(taskId,variables);}

2. 流程配置xml如下:

<?xml version="1.0" encoding="UTF-8"?><definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"><process id="myProcess090301" name="My process090301" isExecutable="true"><startEvent id="startevent1" name="开始节点"></startEvent><userTask id="usertask1" name="申请节点1"><extensionElements><activiti:taskListener event="complete" class="com.ylkj.base.flow.listener.MyCompeteistener"></activiti:taskListener></extensionElements></userTask><userTask id="usertask2" name="审批节点1" activiti:candidateGroups="role1"><extensionElements><activiti:taskListener event="create" class="com.ylkj.base.flow.listener.MutiGroupsListener"></activiti:taskListener></extensionElements><multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${partyList}" activiti:elementVariable="party"><completionCondition>${passCount/totalCount >=1/3}</completionCondition></multiInstanceLoopCharacteristics></userTask><exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway><sequenceFlow id="flow1" name="所有人都不同意" sourceRef="exclusivegateway1" targetRef="usertask1"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${passCount/totalCount < 1/3}]]></conditionExpression></sequenceFlow><sequenceFlow id="flow2" name="链接1" sourceRef="usertask2" targetRef="exclusivegateway1"></sequenceFlow><sequenceFlow id="flow7" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow><sequenceFlow id="flow8" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow><endEvent id="endevent1" name="End"></endEvent><sequenceFlow id="flow9" name="1/3同意" sourceRef="exclusivegateway1" targetRef="endevent1"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${passCount/totalCount >=1/3}]]></conditionExpression></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_myProcess090301"><bpmndi:BPMNPlane bpmnElement="myProcess090301" id="BPMNPlane_myProcess090301"><bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"><omgdc:Bounds height="35.0" width="35.0" x="60.0" y="140.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"><omgdc:Bounds height="55.0" width="105.0" x="200.0" y="130.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"><omgdc:Bounds height="55.0" width="105.0" x="440.0" y="130.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1"><omgdc:Bounds height="40.0" width="40.0" x="472.0" y="290.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><omgdc:Bounds height="35.0" width="35.0" x="670.0" y="293.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"><omgdi:waypoint x="472.0" y="310.0"></omgdi:waypoint><omgdi:waypoint x="252.0" y="310.0"></omgdi:waypoint><omgdi:waypoint x="252.0" y="185.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="14.0" width="100.0" x="331.0" y="317.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"><omgdi:waypoint x="492.0" y="185.0"></omgdi:waypoint><omgdi:waypoint x="492.0" y="290.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="14.0" width="30.0" x="492.0" y="185.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow7" id="BPMNEdge_flow7"><omgdi:waypoint x="95.0" y="157.0"></omgdi:waypoint><omgdi:waypoint x="200.0" y="157.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8"><omgdi:waypoint x="305.0" y="157.0"></omgdi:waypoint><omgdi:waypoint x="440.0" y="157.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9"><omgdi:waypoint x="512.0" y="310.0"></omgdi:waypoint><omgdi:waypoint x="670.0" y="310.0"></omgdi:waypoint><bpmndi:BPMNLabel><omgdc:Bounds height="14.0" width="39.0" x="520.0" y="317.0"></omgdc:Bounds></bpmndi:BPMNLabel></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram></definitions>

activiti多人会签相关推荐

  1. Activiti多人会签的实现 Activiti

    https://www.zybuluo.com/ruoli/note/479483 https://www.iteye.com/blog/huan1993-2249764 https://cloud. ...

  2. Activiti多人会签例子

    Activiti中提供了多实例任务(for-each)将多实例应到到UserTask中可以实现会签功能. Multi-instance (for each) Description A multi-i ...

  3. java代码制作activiti会签_工作流 activiti 自定义下一审批人和多人会签的简单实现...

    1.动态指定下一审批人 在这里我使用的是监听器模式 首先看整体的流程图 在需要动态指定审批人的节点上添加一个任务监听器 这是已经添加好的监听器 选择create  然后将需要使用的监听器路径写上. j ...

  4. 工作流 activiti 自定义下一审批人和多人会签的简单实现

    1.动态指定下一审批人 在这里我使用的是监听器模式 首先看整体的流程图 在需要动态指定审批人的节点上添加一个任务监听器 这是已经添加好的监听器 选择create  然后将需要使用的监听器路径写上. j ...

  5. 【第十八篇】Flowable之多人会签

    一.多人会签 1.流程图绘制   多人会签是指一个任务需要多个人来处理,案例讲解 完整的xml内容 <?xml version="1.0" encoding="UT ...

  6. flowable的多人会签和一票否决

    首先直接上案例! 项目结构: 接下来代码: Duorenhuiqian.bpmn20.xml: <?xml version="1.0" encoding="UTF- ...

  7. 学习记录556@flowable多人会签

    前言 实际业务中的会签,代表一个任务节点由多个人进行审批,可能会衍生出多种情况: 只要一个人审批后,就到下一个节点 全部审批后,才能到下一个节点 审批人数占比多少,就到下一个节点,本案例就选择这个最麻 ...

  8. activitiy学习 (动态加签,动态流程图,指定节点跳转,指定多人节点跳转)

    activitiy学习 动态加签,动态流程图,指定节点跳转,指定多人节点跳转 POM.XML 部署流程 启动流程 查询待执行任务 查询任务历史 完成任务 多人会签节点的退回指定节点 退回到指定多人会签 ...

  9. activiti学习01

    工作流实操 idea 安装工具 1 pom.xml <dependencies><!-- 日志依赖--><!-- 日志接口api--><dependency& ...

  10. Activiti实战--书籍阅读导读

    Activiti实战 - 2015年机械工业出版社出版社出版闫洪磊编著图书 <Activiti实战 >立足于实践,不仅让读者知其然,全面掌握Activiti架构.功能.用法.技巧和最佳实践 ...

最新文章

  1. ActivityRouter 框架简单实用
  2. mysql group by 天_MySQL group by语句如何优化
  3. ASP.NET Web API Model-ModelBinder
  4. java删除指定的文件夹_java脚本删除指定目录下的所有指定名称的文件夹
  5. [蓝桥杯][2016年第七届真题]冰雹数(暴力打表找规律)
  6. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四)实现2D人物动画①
  7. BootstrapTable组件冻结列
  8. 优化了MYSQL大量写入问题,老板奖励了1000块给我
  9. 【原创】pads2007 Layout 电气连接性检查过孔显示错误
  10. cocosbuilder入门
  11. labelimg的使用
  12. vue图片裁剪:使用vue-cropper做图片裁剪
  13. 判定树与判定表的定义与相关练习
  14. 提高排名的 15 个基本 SEO 技巧
  15. 如何实现通过本地远程来连接OpenStack中的windows虚机
  16. Java初学者的学习路线建议
  17. Vitalik:协议设计中的“封装复杂性” vs. “系统复杂性”
  18. 关于Oculus无法下载应用:(OVR40779122) 的解决方案
  19. markdown设置字体颜色、大小、背景
  20. http状态码有哪些 ,表示了什么

热门文章

  1. 迷你计算机笔记本,世界上最小的笔记本电脑,机身小巧仅有7英寸
  2. All clients has disconnected from. You can graceful shutdown now., dubbo version: , current host
  3. 魅族16t无法点击计算机传输,魅族16T如何打开USB调试模式连接电脑 魅族16T一键开启游戏模式方法教程...
  4. Windows启动配置数据(BCD)存储文件包含一些无效信息
  5. Android Studio第九课(学习打卡Day11)
  6. C++中重载和重写的区别
  7. JS 应用篇(一):Underfined与Null的区别
  8. ArcGIS校园3D展示图制作详细教程
  9. 贪心 + 优先队列:程序员PIPI
  10. git lab提交记录中有 merge branch ‘xxx‘ of of http:xxx into xxx