Activiti多人会签的实现 Activiti

https://www.zybuluo.com/ruoli/note/479483

https://www.iteye.com/blog/huan1993-2249764

https://cloud.tencent.com/developer/article/1187876

1、会签说明

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

2、Activiti会签实现

目前Activiti支持自定义配置完成比例,即 一定比例的人员 办理完成之后 即可扭转至下一步,这样就可以实现 多人处理一人审批即可通过和全部人员审批后才可通过,两种处理形式,配置方式如下:

<userTask id="sid-1D9A88B5-D0DC-4056-A5DF-179D7220B76F" 
          name="生产部领导会签" 
          activiti:assignee="${assignee}" 
         >
     <multiInstanceLoopCharacteristics isSequential="false" 
                                       activiti:collection="${assignees}"                                                           activiti:elementVariable="assignee">
            <completionCondition>
                ${nrOfCompletedInstances/nrOfInstances>0}
            </completionCondition>
     </multiInstanceLoopCharacteristics>
</userTask>

以下是我配置:
 <userTask id="usertask1" name="User Task" activiti:assignee="${username}">
      
      <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${usernamelist}" activiti:elementVariable="username">
        <completionCondition>${taskChianExpress.conditionResult(a1)}</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>

说明:
1:此配置依赖外部传入流程参数 assignees,类型为 List<String>,此为所有参与审批的人员集合。
2:activiti:elementVariable="assignee" 为内部处理参数,工作流引擎循环遍历处理这些人员时使用assignee变量来存储每一个人员信息
3:activiti:assignee="${assignee}",执行审批人,此变量不需外部传入,对应上述第二点的内部变量。
4:${nrOfCompletedInstances/nrOfInstances>0} ,配置完成比例,此处配置为>0,代表任意一人处理后即可扭转。
5:isSequential="false" ,代表并行处理。

 

截图:

${nrOfCompletedInstances/nrOfInstances>0} 的含义:

nrOfInstances 实例总数

nrOfActiveInstances 当前还没有完成的实例

nrOfCompletedInstances 已经完成的实例个数

completion condition  还可以自定义函数方式。入我截图上

代码实例:

a1=12 时候,会签结束。通过函数方法控制会签结束。如果completion condition 不配置,默认是全部会签后才往下面走。

也可以指定会签人数比例 :${nrOfCompletedInstances/nrOfInstances>0} 。只要一人会签就结束

package com.zte.activi.controller;

import com.zte.activi.express.ITaskChinaExpress;
import com.zte.activi.express.impl.CondintionExpress;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

/**
 * @author zcy
 * @version 2019/9/24
 *          Created by zcy on 2019/9/24.
 */

@RestController
@RequestMapping("/huiqian")
@Api("huiqian")
public class HuiQianController {

    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;

    @Autowired
    private HistoryService historyService;
    @Autowired
    private ITaskChinaExpress iTaskChinaExpress;

    private static String processDefindKey= "myFiveProcess";
    @ApiOperation("启动实例")
    @GetMapping("startProcess")
    public void startProcess(){
        System.out.println("启动实例");
        Map paramMap = new HashMap<>();
        //初始化会签人员s
        List<String> usernamelist = new ArrayList<>();
        usernamelist.add("王小宝");
        usernamelist.add("王二宝");
        usernamelist.add("王三宝");
        //条件表达式方法 一定要序列号
        CondintionExpress condintionExpress = new CondintionExpress();
        paramMap.put("usernamelist", usernamelist);
        paramMap.put("taskChianExpress",condintionExpress);
        //条件里面变量a1 
        paramMap.put("a1","123");
        runtimeService.startProcessInstanceByKey(processDefindKey,paramMap);

    }

    @ApiOperation("完成任务")
    @GetMapping("submitTaskProcess")
    public void  submitTaskProcess(){
        System.out.println("完成任务");
        String taskId = "82527";
        //设置变量a1 
        taskService.setVariable(taskId,"a1","12");

        taskService.complete(taskId);

    }


    @ApiOperation("查询任务")
    @GetMapping("queryTask")
    public void  queryTask(){
        System.out.println("查询任务");
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey(processDefindKey).list();
        for (Task task : taskList){
            System.out.println("taskId:"+task.getId()+" execId:"+task.getExecutionId()+" 流程实例id:"+task.getProcessInstanceId()+" 任务key:"+task.getTaskDefinitionKey()+" assign:"+task.getAssignee());
        }

    }
}

 


public class CondintionExpress implements Serializable{
    private static final long serialVersionUID = -2817132794066235704L;

    public boolean conditionResult(String a1) {
        System.out.println("=======a1:"+a1);
        if(a1.equals("12")){
            return true;
        }
        return false;
    }
}

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activiti中,实现多人会签的方式有多种。一种常用的方式是使用并行网关(Parallel Gateway)和多实例任务(Multi-instance Task)结合的方法来实现多人会签。具体步骤如下: 1. 在流程定义中使用并行网关(Parallel Gateway)来创建多个并行的分支,每个分支都代表一个参与者。 2. 在并行网关之后添加一个多实例任务(Multi-instance Task),设置参与者的数量以及完成任务所需的比例或条件。 3. 在多实例任务之后继续流程的下一步。 这样,当流程执行到多实例任务时,系统会自动创建多个任务实例并分配给各个参与者。每个参与者可以同时处理自己的任务,当所有参与者完成任务后,流程会继续执行下一步。 你可以参考中的博文和中的文章,了解更多关于Activiti多人会签的详细说明和实现方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [工作流activiti 实现会签功能:单节点 多角色审批](https://blog.csdn.net/weixin_41643546/article/details/122185961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Activiti多人会签实现 Activiti](https://blog.csdn.net/zhuchunyan_aijia/article/details/101285837)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值