Activiti会签功能

1、会签是什么?
会签功能指多个人员针对同一个事务进行协商处理,共同签署决定一件事情。
在工作流中会签,是指多个人员在同一个环节进行处理,同一环节的有多个处理人并行处理,按照配置规则,固定比例的人员办理完成后即可继续流转至下一环节。

2、会签的种类
a) 按数量通过:达到一定数量的通过表决后,会签通过。
b) 按比例通过:达到一定比例的通过表决后,会签通过。
c) 一票否决:只要有一个表决时否定的,会签通过。
d) 一票通过:只要有一个表决通过的,会签通过。

3、Activiti实现会签
Activiti实现会签是基于多实例任务,将节点设置成多实例,主要通过在UserTask节点的属性上配置

4、完整代码
4.1流程图xml代码

<?xml version="1.0" encoding="UTF-8"?> ${pass == false} <![CDATA[${result == "Y"}]]> <![CDATA[${result == "N"}]]>

(如需项目DEMO源码同学可发送主题“springboot-activiti”至1829003685@qq.com)

4.2会签监听代码
package cn.com.xu.applyHoliday;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.task.Task;
/**

  • 会签监听
  • @author 1829003685@qq.com 2019年5月7日 上午11:12:42

*/
public class SignListener implements TaskListener {

private static final long serialVersionUID = 1L;@Override
public void notify(DelegateTask delegateTask) {System.out.println("会签监听");//获取流程idString exId = delegateTask.getExecutionId();//获取流程参数pass,会签人员完成自己的审批任务时会添加流程参数pass,false为拒绝,true为同意ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();RuntimeService runtimeService = engine.getRuntimeService();TaskService taskService = engine.getTaskService();boolean pass = (Boolean) runtimeService.getVariable(exId, "pass");/** false:有一个人拒绝,整个流程就结束了,*  因为Complete condition的值为pass == false,即,当流程参数为pass时会签就结束开始下一个任务*     所以,当pass == false时,直接设置下一个流程跳转需要的参数* true:审批人同意,同时要判断是不是所有的人都已经完成了,而不是由一个人同意该会签就结束*    值得注意的是如果一个审批人完成了审批进入到该监听时nrOfCompletedInstances的值还没有更新,因此需要+1*/if(pass == false){//会签结束,设置参数result为N,下个任务为申请runtimeService.setVariable(exId, "result", "N");//下个任务String processInstanceId = delegateTask.getProcessInstanceId();Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();System.out.println("下个任务编码:" + task.getId() + ",下个任务名称:" + task.getName());}else{Integer complete = (Integer) runtimeService.getVariable(exId, "nrOfCompletedInstances");Integer all = (Integer) runtimeService.getVariable(exId, "nrOfInstances");//说明都完成了并且没有人拒绝if((complete + 1) / all == 1){runtimeService.setVariable(exId, "result", "Y");//下个任务String processInstanceId = delegateTask.getProcessInstanceId();Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();System.out.println("下个任务编码:" + task.getId() + ",下个任务名称:" + task.getName());}}
}

}


4.3流程图部署以及启动
package cn.com.xu.applyHoliday;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.IdentityService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import cn.com.xu.bean.Emp;

/**

  • 流程部署以及启动
  • @author 1829003685@qq.com 2019年5月7日 上午11:07:36

/
public class ActivitiDeploy {
public static void main(String[] args) {
//获取流程引擎
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//获取流程存储服务组件
RepositoryService repositoryService = engine.getRepositoryService();
//部署流程描述文件
DeploymentBuilder builder = repositoryService.createDeployment();
builder.addClasspathResource(“bpmn/applyHoliday.bpmn”).deploy();
//获取运行时服务组件
RuntimeService runtimeService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
//启动流程引擎
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(“applyHoliday2”);
//获取身份服务组件
IdentityService identityService = engine.getIdentityService();
System.out.println(“启动成功,流程id为:” + processInstance.getId());
//创建模拟用户
createUser(identityService);
//启动任务
startTask(taskService, processInstance.getId());
}
/
*
* 设置会签人员并启动任务
* @param taskService
* @param proId
/
public static void startTask(TaskService taskService, String proId){
Task task = taskService.createTaskQuery().processInstanceId(proId).singleResult();
System.out.println(“当前任务编码:” + task.getId() + “,当前任务名称:” + task.getName());
//设置会签人员
Map<String, Object> var = new HashMap<String, Object>();
List signList = new ArrayList();
signList.add(“zhangSan”);
signList.add(“liSi”);
var.put(“signList”, signList);
taskService.complete(task.getId(), var);
}
/
*
* 新增员工,模拟流程
* @param identityService
*/
public static void createUser(IdentityService identityService){
Emp.createUser(identityService, “zhangSan”, “张”, “三”);
Emp.createUser(identityService, “liSi”, “李”, “四”);
Emp.createUser(identityService, “wangWu”, “王”, “五”);
System.out.println(“新建员工成功”);
}
}


4.4会签人员任务处理代码
package cn.com.xu.applyHoliday;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;

/**

  • 会签处理
  • @author 1829003685@qq.com2019年5月7日 上午11:07:12

/
public class SignHandle {
public static void main(String[] args) {
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
handleWaitWork(taskService, “liSi”, true);
}
/
*
* 处理代办任务
* @param taskService
* @param empCode
* @param result 审批结果;true:同意;false:拒绝
*/
public static void handleWaitWork(TaskService taskService, String empCode, boolean result){
List tasks = taskService.createTaskQuery().taskAssignee(empCode).orderByTaskId().desc().list();
if(tasks != null && tasks.size() != 0){
for(Task tempTask : tasks){
//处理代办
Map<String, Object> map = new HashMap<String, Object>();
map.put(“pass”, result);
taskService.complete(tempTask.getId(), map);
}
}else{
System.out.println(“没有代办任务”);
}
}
}


4.5 用户实体类
package cn.com.xu.bean;

import java.util.ArrayList;
import java.util.List;

import org.activiti.engine.IdentityService;
import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;

/**

  • 创建用户
  • @author 1829003685@qq.com 2019年2月18日 下午3:32:15

/
public class Emp {
/
*
* 创建用户信息
* @param service 身份组件
* @param empCode 员工编码
* @return
/
public static User createUser(IdentityService service, String empCode, String firstName, String lastName){
User user = service.newUser(empCode);
user.setFirstName(firstName);//姓
user.setLastName(lastName);//名
user.setPassword(“123456”);//密码
service.saveUser(user);
return service.createUserQuery().userId(empCode).singleResult();
}
/
*
* 根据用户编码查询用户信息
* @param service
* @param empCode
* @return
/
public static User getUserByUserCode(IdentityService service, String empCode){
return service.createUserQuery().userLastName(empCode).singleResult();
}
/
*
* 根据用户编码查询所属角色
* @param service
* @param empCode
* @return
*/
public static List getGroupList(IdentityService service, String empCode){
List rstList = new ArrayList();
List groups = service.createGroupQuery().groupMember(getUserByUserCode(service, empCode).getId()).list();
if(groups != null && groups.size() != 0){
for(Group g : groups){
rstList.add(g.getType());
}
}
return rstList;
}
}

Activiti实现会签功能程序Demo相关推荐

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

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

  2. 微信小程序Demo之电影评分功能

    实现步骤 一.准备工序 二.新建项目 一.准备工序   具体代码开源到github,欢迎star 参考微信官方文档. 微信社区交流(有问题时可以在此网站搜索一哈) 官网注册账号 2.1 注册[微信小程 ...

  3. java小程序贪吃蛇代码_微信小程序Demo之贪食蛇

    原标题:微信小程序Demo之贪食蛇 差不多大半年前,笔者发布了一篇关于OC版贪食蛇开发的文章,时隔多月,微信小程序横空出世,于是闲来无事的我又写了一个小程序版. 01页面布局 关于小程序笔者就不做介绍 ...

  4. 最常用的小程序demo

    wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...

  5. 小程序-demo:小熊の日记

    ylbtech-小程序-demo:小熊の日记 1.CHANGELOG.md # 2016-10-12* 更新开发者工具至`v0.10.101100` * 修改`new`页的数据绑定方式 & 修 ...

  6. 小程序开发教程、小程序资讯、小程序demo、小程序实战等合揖(7月19日更新)

    7月19日微信小程序联盟更新的小程序开发教程.小程序资讯.小程序demo.小程序实战内容合揖如下: 小程序资讯与小程序教程 一张图带你看懂小程序发展蓝皮书 2017-07-19 微信小程序开发问答&l ...

  7. 小程序开发教程、小程序资讯、小程序demo、小程序实战等合揖(7月19日更新)...

    2019独角兽企业重金招聘Python工程师标准>>> 7月19日微信小程序联盟更新的小程序开发教程.小程序资讯.小程序demo.小程序实战内容合揖如下: #小程序资讯与小程序教程 ...

  8. 微信分享功能android,Android微信分享功能实例+demo

    Android微信分享功能实例 1 微信开放平台注册 2 获得appId,添加到程序中,并运行程序 3 使用应用签名apk生成签名,添加到微信开放平台应用签名,完成注册 4 测试分享功能. 有问题请留 ...

  9. 最全微信小程序demo

    wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...

最新文章

  1. Xamarin Essentials教程获取路径文件系统FileSystem
  2. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库到 Android Studio 工程 | 配置 build.gradle 构建脚本 )
  3. 输出链表倒数第K个节点
  4. PyTorch基础(13)-- torch.nn.Unfold()方法
  5. three.js之性能监视器
  6. 图论--二分图最大匹配(匈牙利算法)--模板
  7. ping cat.flag.php,关于2020年强网杯-强网先锋-主动的赛题解析
  8. 单片机学c语言还是python好_单片机开发用哪种语言最好?
  9. Windows10 VS2017 C++模拟点击按键
  10. MySQL无中心化集群_MySQL Plus 如何做到无中心化、数据强一致性、秒级切换?
  11. IOS开发之手势——UIGestureRecognizer 共存
  12. Lettuce替换Jedis操作Redis缓存
  13. Atitit git 使用法v2 目录 1. Git客户端工具 1 1.1. Tortoisegit git gui 图形化工具。。 1 1.2. Ide中的git插件(eclipse idea
  14. 中山一院:华南第一综合性三甲医院的 IT 基础架构转型实践
  15. matlab傅里叶反变换举例,matlab傅里叶正逆变换详细说明+图例
  16. C. Dominant Character
  17. SFUD | 一款串行 Flash 通用驱动库
  18. EC-R3588SPC八核8K人工智能工业主机
  19. catia批量转stp文件格式_CATIA,UG,PROE等等格式批量转成stp,step,igs,iges
  20. JAVA实现链接生成二维码

热门文章

  1. IDEA MAVEN 项目 打包文件到指定目录
  2. “野蛮人”姚振华是如何炼成的?
  3. 如何为戴尔灵越15 5559加装内存条和固态硬盘
  4. 实用技巧 | Chrome浏览器如何对标签页进行分组整理?
  5. C# 关于WinForm界面在触摸屏上显示点触型按钮会引发右键导航栏功能
  6. pika详解 (一)
  7. 【音视频基础】(三):俗称照片的彩色数字图像一
  8. 移动端大规模草渲染的实现(精简版)
  9. 书法拓片matlab,拓墨书法作品(拓片)的具体操作方法和步骤?
  10. 机器人的弊议论文_机器人的利弊作文800字