一、会签
会签是一种常见的流程审批模式,通常用于需要多方共同审批的场景。在会签流程中,任务会被分配给多个审批人,每个审批人都需要进行审批,只有满足特定条件(如所有人同意或达到一定比例同意)后,流程才能继续向下一个节点流转。
会签的核心特点
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>
关键点解析
- isSequential:设置为 false 表示并行会签,设置为 true 表示串行会签。
- loopCardinality:会签的总任务数,可以用固定值或动态变量(如 ${nrOfInstances})。
- completionCondition:会签完成条件,例如 70% 以上的任务完成。
- 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>
特性 | 会签 | 或签 | 加签 |
---|---|---|---|
任务完成条件 | 所有人都需参与审批(部分条件) | 只需一人审批即可完成 | 新增审批人完成后继续流程 |
任务分配方式 | 分配给多个用户 | 分配给多个候选用户 | 动态新增审批人 |
适用场景 | 多方共同决策的复杂场景 | 单方快速决策的简单场景 | 临时增加审批人或节点 |
动态性 | 通常在流程设计时确定 | 通常在流程设计时确定 | 运行中动态调整 |