工作流中的会签、或签、加签区别

一、会签

会签是一种常见的流程审批模式,通常用于需要多方共同审批的场景。在会签流程中,任务会被分配给多个审批人,每个审批人都需要进行审批,只有满足特定条件(如所有人同意或达到一定比例同意)后,流程才能继续向下一个节点流转。

会签的核心特点

1. 多个审批人
•	一个任务分配给多个用户,每个用户都需要完成审批任务。
2. 并行或串行
•	并行会签:多个审批人可以同时处理任务,互不干扰。
•	串行会签:多个审批人按顺序依次审批,上一位审批人完成后,任务才会转到下一位审批人。
3. 审批规则
•	全员通过:所有审批人必须同意,流程才能继续。
•	一票否决:任何一个审批人否决,流程直接结束或流转到其他分支。
•	比例通过:达到设定比例的同意人数,流程继续(例如 70% 以上同意)。
•	指定审批人数:达到一定人数的审批后任务继续(例如 3 人同意即可)。

会签在流程中的应用

1. 场景举例
•	公司招聘需要多个部门负责人审批。
•	合同审批需要法律、财务和业务部门共同确认。
•	项目立项需要多个团队的负责人会签同意。
2. Flowable中的会签实现
•	在 Flowable 中,会签可以通过多实例任务(Multi-instance Task)实现。关键配置如下:
•	并行会签:在任务节点配置中,设置为多实例并行模式。
•	串行会签:在任务节点配置中,设置为多实例串行模式。
•	审批条件:通过流程变量(如 nrOfCompletedInstances 和 nrOfInstances)控制会签通过规则。

会签的技术实现(Flowable 示例)

配置会签任务(BPMN XML)
<userTask id="task1" name="会签任务" flowable:assignee="${assignee}">
    <multiInstanceLoopCharacteristics isSequential="false">
        <loopCardinality>${nrOfInstances}</loopCardinality>
        <completionCondition>${nrOfCompletedInstances / nrOfInstances >= 0.7}</completionCondition>
        <flowable:collection>assigneeList</flowable:collection>
        <flowable:elementVariable>assignee</flowable:elementVariable>
    </multiInstanceLoopCharacteristics>
</userTask>

关键点解析

  1. isSequential:设置为 false 表示并行会签,设置为 true 表示串行会签。
  2. loopCardinality:会签的总任务数,可以用固定值或动态变量(如 ${nrOfInstances})。
  3. completionCondition:会签完成条件,例如 70% 以上的任务完成。
  4. collection 和 elementVariable:指定审批人列表(assigneeList)和当前任务的审批人(assignee)。

会签场景的扩展

1. 动态审批人列表
• 审批人列表可以通过流程变量动态传递,适应复杂业务需求。
2. 任务监听器
• 可以监听任务完成事件,记录审批意见,或根据审批结果动态调整后续流程。
3. 异常处理
• 如果某个审批人超时未审批,可以自动跳过或提醒其他用户。
• 如果审批人拒绝,可以立即结束或转到异常处理流程。

二、或签

或签是一种与会签相对的审批模式。在或签流程中,任务会分配给多个审批人,但只需要其中一个审批人完成审批,任务即可完成,流程进入下一个节点。

或签的核心特点

1. 多个审批人
•	一个任务分配给多个用户,但只需其中一人完成任务即可。
2. 审批逻辑简单
•	任务一旦被任何一个审批人完成,其他审批人不需要再操作,该任务会自动从他们的待办列表中移除。
3. 典型规则
•	一人审批通过即完成:只要一个审批人同意,流程继续。
•	支持快速流转:适合紧急流程或无需多方共同决策的场景。

或签在流程中的应用

1. 场景举例
•	公司报销流程:直接领导或部门主管中的任何一人审批即可。
•	客户投诉处理:客服团队中任何一名成员都可以处理投诉。
•	应急审批:紧急情况下,只需一人快速审批即可。
2. 实现方式

在 Flowable 或类似的工作流引擎中,或签通过单任务多候选人实现。

技术实现:Flowable 中的或签

配置或签任务(BPMN XML)
<userTask id="task1" name="或签任务" flowable:candidateUsers="${candidateUsers}" />
关键点解析
1. candidateUsers:候选用户列表,指定多个用户(如 ${candidateUsers})。
•	示例值:user1, user2, user3。
•	任务会分配给这些用户,待办任务列表中都会显示该任务。
2. 审批逻辑
•	任务只需要由任意一个候选用户完成,即标记为完成,流程继续。
•	其他候选用户的待办任务会自动清理。

或签的业务扩展

1. 动态候选人

候选用户列表可以通过流程变量动态传递,适应不同的业务场景。例如:

Map<String, Object> variables = new HashMap<>();
variables.put("candidateUsers", Arrays.asList("user1", "user2", "user3"));
runtimeService.startProcessInstanceByKey("processKey", variables);
2. 任务监听器

可以为任务添加监听器(Task Listener),记录第一个完成审批的用户信息,或在任务完成后触发后续业务逻辑。

3. 异常处理
•	如果所有候选用户都没有操作,可以配置超时自动提醒或转交任务。
•	如果任务被错误完成,可以支持撤回功能。

三、加签

加签是一种动态调整审批流程的功能,允许在流程运行中,根据实际情况临时增加新的审批人。加签通常用于处理流程中未预见的特殊情况,比如某个节点需要额外审批或增加领导确认。

加签的核心特点

1. 动态性
•	在流程运行过程中,可以临时添加审批人,而不需要修改流程定义。
2. 审批链扩展
•	当前任务在原审批流程基础上新增审批节点或审批人,审批完成后再回到原流程。
3. 典型规则
•	前加签:在当前任务审批之前,新增审批人,只有加签审批完成后,当前审批人才能操作。
•	后加签:当前任务审批完成后,新增审批人,需完成加签审批才能继续流程。

加签的应用场景

1. 场景举例
•	某个合同金额较高,审批过程中需要临时添加公司领导审批。
•	在项目审批时,审批人认为需要某个部门的额外意见,添加该部门负责人为审批人。
•	临时需要其他专家会签意见,再继续审批流程。
2. 业务需求

加签通常是由当前任务的审批人或流程管理员发起的,具体操作包括:

•	添加审批人。
•	设置加签类型(前加签或后加签)。
•	确保加签完成后流程能够正常返回主流程。

加签的技术实现

在 Flowable 中,加签的实现可以通过动态任务分配和流程变量来完成。

前加签实现:通过任务监听器

在任务完成前,临时增加新的审批任务。

@PostMapping("/addBeforeSign")
public ResponseEntity<String> addBeforeSign(@RequestParam String taskId, @RequestParam String newAssignee) {
    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    if (task == null) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("任务不存在");
    }

    // 创建一个新的任务
    Task newTask = taskService.newTask();
    newTask.setName("加签任务");
    newTask.setAssignee(newAssignee);
    newTask.setParentTaskId(taskId); // 关联到原任务
    newTask.setProcessInstanceId(task.getProcessInstanceId());
    newTask.setProcessDefinitionId(task.getProcessDefinitionId());
    taskService.saveTask(newTask);

    return ResponseEntity.ok("加签任务已创建");
}
后加签实现:动态修改流程

通过修改流程变量或直接使用多实例任务,在当前任务完成后新增一个加签任务。

@PostMapping("/addAfterSign")
public ResponseEntity<String> addAfterSign(@RequestParam String taskId, @RequestParam String newAssignee) {
    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
    if (task == null) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("任务不存在");
    }

    // 设置一个标记变量,通知流程需要加签
    runtimeService.setVariable(task.getProcessInstanceId(), "isAddSign", true);
    runtimeService.setVariable(task.getProcessInstanceId(), "newAssignee", newAssignee);

    return ResponseEntity.ok("加签任务已添加,将在当前任务后执行");
}
流程模型中的条件判断

在流程模型中可以通过条件判断来决定是否执行加签任务。

<exclusiveGateway id="gateway1" name="加签判断">
    <sequenceFlow id="flow1" sourceRef="gateway1" targetRef="taskAddSign" flowable:conditionExpression="${isAddSign == true}" />
    <sequenceFlow id="flow2" sourceRef="gateway1" targetRef="nextTask" flowable:conditionExpression="${isAddSign == false}" />
</exclusiveGateway>
特性会签或签加签
任务完成条件所有人都需参与审批(部分条件)只需一人审批即可完成新增审批人完成后继续流程
任务分配方式分配给多个用户分配给多个候选用户动态新增审批人
适用场景多方共同决策的复杂场景单方快速决策的简单场景临时增加审批人或节点
动态性通常在流程设计时确定通常在流程设计时确定运行中动态调整
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值