或、票、会签
或、票、会签
提示
- 审批过程中可能存在,一人或者多人审批的情况,不同情况对应不同协作类型(会签、票签和或签)
1、流程协作规则
或签:一名办理人审批通过,审批节点才会通过
票签:满足设定的通过策略,部分审批人审批通过,审批节点才会通过
会签:所有审批人审批通过,审批节点才会通过
协作类型一览
引擎 CooperateType 枚举共 7 种协作方式(flow_his_task.cooperate_type 存对应 key):
| key | 枚举 | 含义 |
|---|---|---|
| 1 | APPROVAL | 无(普通审批) |
| 2 | TRANSFER | 转办:任务转给其他人办理 |
| 3 | DEPUTE | 委派:求助他人审批,再参照其意见决定是否通过 |
| 4 | COUNTERSIGN | 会签:所有审批人通过才算通过 |
| 5 | VOTE | 票签:达到设定通过率即通过 |
| 6 | ADD_SIGNATURE | 加签:办理中途增加办理人 |
| 7 | REDUCTION_SIGNATURE | 减签:办理中途移除办理人 |
或签/票签/会签的区分靠
flow_node.node_ratio:0=或签,0~100=票签,100=会签。
2、注意事项
票签和会签会会根据用户数量计算通过率或者通过策略等,如果节点配置的是角色,这种情况不好统计,要解决这种问题,请把角色全部转成用户id-转换办理人
3、使用演示
3.1、或签

3.2、票签
- 票签策略
- 通过率:通过率在(0.001-100)这之间,也就是审批通过人数占比总人数比例大于这个通过率,审批流程才往下执行,反之提前不满足通过率,直接驳回
- 固定通过人数:类型为正整数,审批通过人数大于等于这个人数,审批流程才往下执行,反之提前不满足通过人数,直接驳回
- 固定驳回人数:类型为正整数,审批驳回人数大于等于这个人数,审批流程才往下执行,反之提前不满足驳回人数,直接驳回
- 默认表达式:格式如:
${flag > 4},如果${}内部返回的结果为true,则通过,否则驳回。实际上是基于spring的spel表达式简化使用,会把flag替换成#flag,然后由spel执行#flag == 5 && #flag > 4 - spel(Spring Expression Language)表达式:格式如:
#{@user.eval(#flag)},如果#{}内部返回的结果为true,则通过,否则驳回
![]() |
![]() |
![]() |
![]() |
![]() |
3.3、会签

4、票签策略注意事项
通过策略特别需要讲一下默认表达式和spel表达,因为不管通过什么方式,通常需要知道已通过的 人数和总人数等,才能在自己的表达式中判断是否满足条件,那么如何获取已通过和总人数呢?
- 组件在执行表达式的时候会注入内置变量,如下:
- skipType:跳过类型
- passNum:通过数量
- rejectNum:拒绝数量
- todoNum:待处理数量
- allNum:总人数
- passList:通过历史任务列表
- rejectList:拒绝历史任务列表
- todoList:待处理用户列表
- 在表达式中获取对应的变量,可以获取部分变量,spel表达式只是示例,实际使用中按需设置参数,参数可以以上变量之外的,只要自己在流程变量中设置了就行
- 默认表达式:
${passNum * 1.0 / allNum > 0.5},加上这个* 1.0,防止大于号左边0.x变成0去比较 - spel表达式:
#{@voteSignService.eval(#skipType, #passNum, #rejectNum, #todoNum, #allNum, #passList, #rejectList, #todoList)}
- 默认表达式:
@Component("voteSignService")
public class VoteSignService {
/**
* 票签通过率计算
*
* @param skipType 跳转类型
* @param passNum 审批通过人数
* @param rejectNum 审批驳回人数
* @param todoNum 待处理人数
* @param allNum 总人数
* @param passList List<HisTask> 通过历史任务列表,HisTask中approver字段是审批人的唯一标识
* @param rejectList List<HisTask> 拒绝历史任务列表,HisTask中approver字段是审批人的唯一标识
* @param todoList 待处理用户列表
* @return boolean
*/
public boolean eval(String skipType, Integer passNum, Integer rejectNum, Integer todoNum, Integer allNum
, List<HisTask> passList, List<HisTask> rejectList, List<User> todoList ) {
log.info("跳过类型: {}", skipType);
log.info("通过数量: {}", passNum);
log.info("拒绝数量: {}", rejectNum);
log.info("待处理数量: {}", todoNum);
log.info("总人数: {}", allNum);
log.info("通过历史任务列表: {}", passList);
log.info("拒绝历史任务列表: {}", rejectList);
log.info("待处理用户列表: {}", todoList);
log.info("开始票签通过率计算......");
return true;
}
}5、入库值
- 他们都是保存在flow_node表的node_ratio字段中
- 0就是或签,0-100就是票签,100就是会签




