Activiti 会签

Activiti 会签

在流程业务管理中,任务是通常都是由一个人去处理的,而多个人同时处理一个任务,这种任务我们称之为会签任务。这种业务需求很常见,如一个请款单领导审批环节中就需要多个部门领导签字。在流程业务中,我们可以把每个领导签字的环节都定义为任务,并且这个会签的人员是不固定的,若固定的我们可以通过Activiti的并行任务或串行任务来处理。会签的引入说明,无非就是为了流程流转至某一环节点,其审批的人员是动态的,并且需要根据会签审批的结果实现流程的不同流转。

利用activiti实现会签功能

实现步骤:首先在画流程图时,userTask 节点中有 多实例类型(multiinstance_type) 属性(此属性有两个选项(默认空):parallel(会签,没顺序)、sequential(串签,顺序执行)),选择parallel以后设置集合(多实例)

image.png

生成的xml文件代码:

<userTask id="s3" name="会签">
   <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${userList}"/>
</userTask>

然后userList设置流程变量,或者监听器设置value

userTask节点配置核心属性说明

  1. isSequential指定多实例是按照并行或者串行的方式进行,当isSequential=true时,表示的串行执行,即虽然该节点有多条任务,但只有上一条执行完,才可以执行下一条。当isSequential=false时,表示的并行执行,即该节点下的多条任务可以同时执行,如三个人参与会签,是三个人同时收到待办,任务实例是同时产生的。

  2. activiti:collection:用于执行该会签环节的参与参与的人,可以用形如实例中的${leaderList}获取,也可以用户可以通过定义自身的服务类来获取

  3. activiti:elementVariable:此处表示的是每一个分支都有一个名叫leader的流程变量和userTask节点属性中的activiti:assignee="${leader}"一致

  4. completionCondition:指定会签环节的结束条件,表示是任务往下跳转的完成条件,返回true是,表示条件成立,流程会跳至下一审批环节

会签的种类:

  • 按数量通过: 达到一定数量的通过表决后,会签通过。

  • 按比例通过: 达到一定比例的通过表决后,会签通过。

  • 一票否决: 只要有一个表决时否定的,会签通过。

  • 一票通过: 只要有一个表决通过的,会签通过。

每个实例有以下变量:

  • nrOfInstances: 实例总数

  • nrOfActiveInstances: 当前激活的(未完成的)实例总数。 如果串行执行,则改值永远是1

  • nrOfCompletedInstances: 已完成的实例总数 条件nrOfInstances == nrOfCompletedInstances表示所有人员审批完成后会签结束。 条件${ nrOfCompletedInstances == 1 }表示一个人完成审批,该会签就结束。

其他条件依次类推,同时这里也可以写自己添加的流程变量。

会签(多实例节点)环节中涉及的几个默认的流程变量

  1. nrOfInstances 该会签环节中总共有多少个实例

  2. nrOfActiveInstances 当前活动的实例的数量,即还没有 完成的实例数量。

  3. nrOfCompletedInstances 已经完成的实例的数量

会签人员部分示例代码

  1. 分配会签人员
Map<String, Object> vars = new HashMap<>();
 List<String> leaderList = new ArrayList<>();
 leaderList.add("zhangsan");
 leaderList.add("lisi");
 leaderList.add("wangwu");

 vars.put("leaderList", leaderList);

 ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), vars);
  1. 会签人员审批
Map<String, Object> leaderOneAudit = new HashMap<>();
 Scanner scanner = new Scanner(System.in);
 System.out.println("请输入领导审批意见。。。。");
 String auditOne = scanner.nextLine();
 leaderOneAudit.put("audit", auditOne);
 System.out.println("张三的审批意见为:" + (auditOne.equals("yes") ? "同意" : "不同意"));
 task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).taskAssignee("zhangsan").singleResult();
 taskService.complete(task.getId(), leaderOneAudit);
  1. 示例代码控制台结果输出
填写申请|assignee:worker
请输入领导审批意见。。。。
yes
张三的审批意见为:同意
流程实例总数:3
当前活动的流程实例总数:3
已经完成实例的数目:0
leader:zhangsan
---------------------------------------分隔线----------------------------------------------------
taskName2:领导审批|assignee:zhangsan
--------------------------------------------
请输入领导审批意见。。。。
yes
李四的审批意见为:同意
流程实例总数:3
当前活动的流程实例总数:2
已经完成实例的数目:1
leader:lisi
---------------------------------------分隔线----------------------------------------------------
taskName3:领导审批|assignee:lisi
--------------------------------------------
请输入领导审批意见。。。。
yes
李四的审批意见为:同意
流程实例总数:3
当前活动的流程实例总数:1
已经完成实例的数目:2
leader:wangwu
---------------------------------------分隔线----------------------------------------------------
taskName4:领导审批|assignee:wangwu
taskName5:人事归档|assignee:hr
----------------------------------流程实例流转-----------------------
任务ID:75014
流程实例ID:75005
任务名称:填写申请
办理人:worker
开始时间:Tue Jul 31 10:12:39 CST 2018
结束时间:Tue Jul 31 10:12:39 CST 2018
=================================
任务ID:75028
流程实例ID:75005
任务名称:领导审批
办理人:zhangsan
开始时间:Tue Jul 31 10:12:39 CST 2018
结束时间:Tue Jul 31 10:12:43 CST 2018
=================================
任务ID:75031
流程实例ID:75005
任务名称:领导审批
办理人:lisi
开始时间:Tue Jul 31 10:12:39 CST 2018
结束时间:Tue Jul 31 10:12:49 CST 2018
=================================
任务ID:75034
流程实例ID:75005
任务名称:领导审批
办理人:wangwu
开始时间:Tue Jul 31 10:12:39 CST 2018
结束时间:Tue Jul 31 10:12:56 CST 2018
=================================
任务ID:75038
流程实例ID:75005
任务名称:人事归档
办理人:hr
开始时间:Tue Jul 31 10:12:56 CST 2018
结束时间:Tue Jul 31 10:12:56 CST 2018
=================================

如何通过代码设置多实例属性

本例中的流程图都是通过ide的插件画出来,而在web开发中,如何通过代码把会签的多实例的属性给实现出来,可能不同人有不同的实现方式。我这边提供一种实现,废话有点多,直接上代码

  1. 设置会签节点属性
public static void setMultiInstance(String modelId, String nodelId) throws Exception {
 // 获取模型
 byte[] mes = repositoryService.getModelEditorSource(modelId);
 // 转换成JsonNode
 JsonNode jsonNode = objectMapper.readTree(mes);
 // 转换成BpmnModel
 BpmnJsonConverter bpmnJsonConverter = new BpmnJsonConverter();
 BpmnModel bpmnModel = bpmnJsonConverter.convertToBpmnModel(jsonNode);
 // 获取物理形态的流程
 Process process = bpmnModel.getProcesses().get(0);
 // 获取节点信息
 FlowElement flowElement = process.getFlowElement(nodelId);
 // 只有人工任务才可以设置会签节点
 UserTask userTask = (UserTask) flowElement;
 // 设置受理人,这里应该和ElementVariable的值是相同的
 userTask.setAssignee("${" + Constant.ACT_MUIT_VAR_NAME + "}");
 // userTask.setOwner("${user}");

 // 获取多实例配置
 MultiInstanceLoopCharacteristics characteristics = new MultiInstanceLoopCharacteristics();
 // 设置集合变量,统一设置成users
 characteristics.setInputDataItem(Constant.ACT_MUIT_LIST_NAME);
 // 设置变量
 characteristics.setElementVariable(Constant.ACT_MUIT_VAR_NAME);
 // 设置为同时接收(false 表示不按顺序执行)
 characteristics.setSequential(false);
 // 设置条件(暂时处理成,全部会签完转下步)
 characteristics.setCompletionCondition("${nrOfCompletedInstances==nrOfInstances}");

 userTask.setLoopCharacteristics(characteristics);
 // 保存
 ObjectNode objectNode = new BpmnJsonConverter().convertToJson(bpmnModel);
 repositoryService.addModelEditorSource(modelId, objectNode.toString().getBytes("utf-8"));
 }
  1. 清空会签属性
public static void clearMultiInstance(String modelId, String nodelId) throws Exception {
 // 获取模型
 byte[] mes = repositoryService.getModelEditorSource(modelId);
 // 转换成JsonNode
 JsonNode jsonNode = new ObjectMapper().readTree(mes);
 // 转换成BpmnModel
 BpmnJsonConverter bpmnJsonConverter = new BpmnJsonConverter();
 BpmnModel bpmnModel = bpmnJsonConverter.convertToBpmnModel(jsonNode);
 // 获取物理形态的流程
 Process process = bpmnModel.getProcesses().get(0);
 // 获取节点信息
 FlowElement flowElement = process.getFlowElement(nodelId);
 // 只有人工任务才可以设置会签节点
 UserTask userTask = (UserTask) flowElement;
 // 清空受理人
 userTask.setAssignee("");
 // 获取多实例配置
 MultiInstanceLoopCharacteristics characteristics = userTask.getLoopCharacteristics();
 if (characteristics != null) {
 // 清空集合
 characteristics.setInputDataItem("");
 // 清空变量
 characteristics.setElementVariable("");
 // 设置为顺序接收(true 表示不按顺序执行)
 characteristics.setSequential(true);
 // 清空条件
 characteristics.setCompletionCondition("");
 }

 // 保存
 ObjectNode objectNode = new BpmnJsonConverter().convertToJson(bpmnModel);
 repositoryService.addModelEditorSource(modelId, objectNode.toString().getBytes("utf-8"));
 }

https://www.jianshu.com/p/bcfd2a31abb4

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容