Flowable工作流之加签(委派)、转签(转办)

article/2025/10/7 13:28:38

目录

  • 1. 加签
    • 1.1. 向前加签
    • 1.2. 向后加签
  • 2. 或签
  • 3. 委派和转办的区别
    • 2.1. 委派
    • 2.2. 转办
  • 4. 向前加签
    • 4.1. 流程图
    • 4.2. 部署并启动
    • 4.3. 完成任务
    • 4.4. 向前加签实现
      • 4.4.1. 添加加签(委派)功能任务
      • 4.4.1. 加签(委派)任务的完成
  • 5. 转签(转办)

1. 加签

顾名思义就是增加一道审批签名,这道审批往往是临时增加的,标准流程没有规定要走的

在现实工作流程中,加签功能使用率颇高;有时,审批人对内容不太确定,不太敢做主,就会找更高层的领导进行加签;这样就可以规避个人风险;出问题大家一起担。有时为了表示对领导尊重,或者让领导知道这回事,也需要使用加签功能

1.1. 向前加签

任务在 A 这里,A 这个时候需要 B 核对一下,等 B 核对之后又回到 A 这里,这时 A 才能继续自己的任务

1.2. 向后加签

任务在 A 这里,A 这个时候需要 B 处理这个事情,处理完毕之后就不用管了,继续后面的审批环节

2. 或签

或签:指同一个任务审批节点设置多个人,如 A、B、C 三人,三人会同时收到审批,只要其中任意一人审批即可流转到下一审批节点

3. 委派和转办的区别

2.1. 委派

委派:是将任务节点分给其他人处理,等其他人处理好之后,委派任务还会 自动回到委派人的任务中

在这里插入图片描述

2.2. 转办

直接将办理人assignee 换成别人,这时任务的拥有着不再是转办人,而是为空,相当与将任务转出

直接将 assignee =” zhuanban” taskService.setAssignee(taskId, userId);

在这里插入图片描述

4. 向前加签

4.1. 流程图

完成后的流程图如下

在这里插入图片描述
XML 文件内容

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn"xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler"exporterVersion="6.7.2"><process id="Countersign" name="Countersign" isExecutable="true"><documentation>flowable的加签</documentation><startEvent id="sid-D7D95537-998F-4DC4-B951-78708D6DBB98" flowable:formFieldValidation="true"></startEvent><userTask id="qjsqId" name="请假申请单" flowable:assignee="${user}" flowable:formFieldValidation="true"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements></userTask><sequenceFlow id="sid-6B6AF669-F0E8-4D59-892A-162228D0510D" sourceRef="sid-D7D95537-998F-4DC4-B951-78708D6DBB98"targetRef="qjsqId"></sequenceFlow><userTask id="zjlId" name="总经理审批" flowable:assignee="${Boss}" flowable:formFieldValidation="true"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements></userTask><sequenceFlow id="sid-A5F5DC0C-5E0B-4A14-B748-CBCFFB98696D" sourceRef="qjsqId" targetRef="zjlId"></sequenceFlow><endEvent id="sid-2C1AB747-3343-41FC-954C-70B992D32D14"></endEvent><sequenceFlow id="sid-8B64D6FD-A229-4E53-B4EB-C86449387AE6" sourceRef="zjlId"targetRef="sid-2C1AB747-3343-41FC-954C-70B992D32D14"></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_Countersign"><bpmndi:BPMNPlane bpmnElement="Countersign" id="BPMNPlane_Countersign"><bpmndi:BPMNShape bpmnElement="sid-D7D95537-998F-4DC4-B951-78708D6DBB98"id="BPMNShape_sid-D7D95537-998F-4DC4-B951-78708D6DBB98"><omgdc:Bounds height="30.0" width="30.0" x="74.0" y="117.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="qjsqId" id="BPMNShape_qjsqId"><omgdc:Bounds height="80.0" width="100.0" x="225.0" y="92.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="zjlId" id="BPMNShape_zjlId"><omgdc:Bounds height="80.0" width="100.0" x="450.0" y="92.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="sid-2C1AB747-3343-41FC-954C-70B992D32D14"id="BPMNShape_sid-2C1AB747-3343-41FC-954C-70B992D32D14"><omgdc:Bounds height="28.0" width="28.0" x="660.0" y="118.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="sid-6B6AF669-F0E8-4D59-892A-162228D0510D"id="BPMNEdge_sid-6B6AF669-F0E8-4D59-892A-162228D0510D" flowable:sourceDockerX="15.0"flowable:sourceDockerY="15.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0"><omgdi:waypoint x="103.94999947166039" y="132.0"></omgdi:waypoint><omgdi:waypoint x="225.0" y="132.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-A5F5DC0C-5E0B-4A14-B748-CBCFFB98696D"id="BPMNEdge_sid-A5F5DC0C-5E0B-4A14-B748-CBCFFB98696D" flowable:sourceDockerX="50.0"flowable:sourceDockerY="40.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0"><omgdi:waypoint x="324.94999999996566" y="132.0"></omgdi:waypoint><omgdi:waypoint x="449.9999999998968" y="132.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="sid-8B64D6FD-A229-4E53-B4EB-C86449387AE6"id="BPMNEdge_sid-8B64D6FD-A229-4E53-B4EB-C86449387AE6" flowable:sourceDockerX="50.0"flowable:sourceDockerY="40.0" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0"><omgdi:waypoint x="549.95" y="132.0"></omgdi:waypoint><omgdi:waypoint x="660.0" y="132.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

4.2. 部署并启动

// 部署流程
@Test
public void test1() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deploy = repositoryService.createDeployment().addClasspathResource("processes/Countersign.bpmn20.xml").name("加签流程").deploy();System.out.println("deploy.getId() = " + deploy.getId());System.out.println("deploy.getName() = " + deploy.getName());
}// 启动流程
@Test
public void test2() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RuntimeService runtimeService = processEngine.getRuntimeService();// 给请假申请单分配用户Map<String, Object> variables = new HashMap<>();variables.put("user", "张三");ProcessInstance processInstance = runtimeService.startProcessInstanceById("Countersign:2:bf2eeed9-58f1-11ed-8017-005056c00001", variables);System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());System.out.println("流程实例的ID:" + processInstance.getId());
}

4.3. 完成任务

张三 完成请假申请单任务

// 张三完成请假申请单
@Test
public void test3() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery().processInstanceId("57c743b9-58f2-11ed-9a6d-005056c00001").taskAssignee("张三").singleResult();// 给总经理审批分配用户Map<String, Object> variables = new HashMap<>();variables.put("Boss", "周经理");if (task != null) {taskService.complete(task.getId(), variables);}
}

查看 ACT_RU_TASK 表数据如下,任务节点发生了流转;到了总经理审批节点了

在这里插入图片描述

4.4. 向前加签实现

在实际中会出现特殊情况,如还需要 董事长 审批,但在流程设计中并没有 董事长 这个流程节点,所以需要用到加签的功能

4.4.1. 添加加签(委派)功能任务

将任务委托给另一个人,修改 ACT_RU_TASK 表记录,硬编码不推荐

  • 如果任务所有者字段 OWNER_null,则将该字段置为任务的当前受理人(如 周经理
  • 委托状态字段 DELEGATION_ 变更为 PENDINGDelegationState 是一个枚举
  • 当前审批人字段 ASSIGNEE_ 变更为被委托人(如 孙董事长

在这里插入图片描述

/*** 假如流程中出现特殊情况,需要特定的人员进行审批后才可以正常的把流程走下去,而这个特定的人员一开始* 并没有在流程设计中体现出来,所以这时候就需要加签这个功能,在某一节点处添加一个新的人员来处理这个流程*/
@Test
public void test4() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery().processInstanceId("57c743b9-58f2-11ed-9a6d-005056c00001").taskAssignee("周经理").singleResult();if (task != null) {taskService.delegateTask(task.getId(), "孙董事长");}
}

4.4.1. 加签(委派)任务的完成

@Test
public void test5() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery().processInstanceId("57c743b9-58f2-11ed-9a6d-005056c00001").taskAssignee("孙董事长").singleResult();if (task != null) {taskService.resolveTask(task.getId());}
}
  • 加签任务不能用 completeTask() 方法来完成,因为这个加签的任务并不属于正常流程中的一个节点任务,加签任务完后,任务还会回到加签前的人员手里

查看 ACT_RU_TASK 表数据如下,任务节点发生了流转;又回到了 总经理审批 节点了

  • 任务所有者字段 OWNER_周经理
  • 当前审批人字段 ASSIGNEE_周经理
  • 委托状态字段 DELEGATION_ 变更为 RESOLVED

在这里插入图片描述

5. 转签(转办)

// 转签:就是把任务转办给他人
@Test
public void transferTask() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();TaskService taskService = processEngine.getTaskService();// 直接setAssignee即可taskService.setAssignee("90002", "总监");
}
  • 关于加签,转签的文章:https://blog.csdn.net/vbirdbest/article/details/122031587
  • Flowable 工作流待签、待办、转办、委派相关功能小结:https://blog.csdn.net/qq_44293888/article/details/107758634

http://chatgpt.dhexx.cn/article/01a26UWV.shtml

相关文章

加密、解密、加签、验签专题

首先明确几个名词&#xff1a; 加密&#xff1a;发送方利用接收方的公钥对要发送的明文进行加密。 解密&#xff1a;接受方利用自己的私钥进行解密。 公钥和私钥配对的&#xff0c;用公钥加密的文件&#xff0c;只有对应的私钥才能解密。当然也可以反过来&#xff0c;用私钥…

@ControllerAdvice 之 @InitBinder和@ModelAttribute

InitBinder 准备 InitBinder 在整个 HandlerAdapter 调用过程中所处的位置 收获&#x1f4a1; RequestMappingHandlerAdapter 初始化时会解析 ControllerAdvice 中的 InitBinder 方法&#xff08;可以定义个性化数据转化器&#xff09;RequestMappingHandlerAdapter 会以类…

SpringBoot @InitBinder注解实现Bean国际化校验

参考资料 参考&#xff1a; 妥当性チェックのエラーメッセージ出力方法 (需翻墙)springMVC之InitBinder的用法1springMVC之InitBinder的用法2springMVC之InitBinder 和 ValidatorSpring MVCにおけるフォームバリデーションの適用事例【後編】 目录 一. 前期准备1.1 自定义校验…

SpringMVC之@InitBinder注解(日期转换)

InitBinder注解的作用&#xff1a; springmvc并不是能对所有类型的参数进行绑定的&#xff0c;如果对日期Date类型参数进行绑定&#xff0c;就会报错IllegalStateException错误。所以需要注册一些类型绑定器用于对参数进行绑定。InitBinder注解就有这个作用。 程序代码示例&am…

initbinder对ajax不起作用,Spring MVC InitBinder验证方法

使用InitBinder做验证的情况一般会在此Controller中提交的数据需要有一些是业务性质的&#xff0c;也即比较复杂的验证情况下才会使用。大部份简单的表单验证&#xff0c;使用annotation验证即可以解决。 这里需要注意的一点&#xff1a;InitBinder和Annotation两种验证只能二选…

SpringMvc @InitBinder

这篇博客记录InitBinder怎么起作用、起什么作用&#xff1f; 首先,该注解被解析的时机&#xff0c;是该匹配Controller的请求执行映射的方法之前; 同时 InitBinder标注的方法执行是多次的&#xff0c;一次请求来就执行一次。 当某个Controller上的第一次请求由SpringMvc前端控制…

java培训之InitBinder注解

InitBinder注解【了解】 InitBinder由 InitBinder 标识的方法&#xff0c;可以对 WebDataBinder 对象进行初始化。WebDataBinder 是 DataBinder 的子类&#xff0c;用于完成由表单字段到 JavaBean 属性的绑定InitBinder方法不能有返回值&#xff0c;它必须声明为void。InitBin…

SpringBoot @InitBinder注解绑定请求参数

参考资料 springMVC之InitBinder 和 ValidatorspringMVC之InitBinder的用法1springMVC之InitBinder的用法2 目录 一. 作用二. 前期准备三. Get请求 URL传值处理3.1 前台-test16.html3.2 Controller层3.3 效果 四. Post请求 表单传值 自定义日期属性绑定器4.1 前台-test16.h…

详细分析@InitBinder注解的使用和原理

前言 由InitBinder注解修饰的方法用于初始化WebDataBinder对象&#xff0c;能够实现&#xff1a;从request获取到handler方法中由RequestParam注解或PathVariable注解修饰的参数后&#xff0c;假如获取到的参数类型与handler方法上的参数类型不匹配&#xff0c;此时可以使用初…

SpringMVC之@InitBinder注解详解

说明与作用 springmvc并不是能对所有类型的参数进行绑定的&#xff0c;如果对日期Date类型参数进行绑定&#xff0c;就会报错IllegalStateException错误。所以需要注册一些类型绑定器用于对参数进行绑定。InitBinder注解就有这个作用。 Controller public class InitBinderCo…

SpringMVC中的@InitBinder注解【记录】

一、Spring请求参数绑定流程&#xff1a; 1、请求参数绑定流程&#xff1a; 我们在开发的时候&#xff0c;经常会从html&#xff0c;jsp中将请求参数通过request对象传递到后台&#xff0c;可是经常会遇到这么一种情况&#xff0c;那就是传过来的数据到后台后&#xff0c;还要…

springMVC之@InitBinder的用法

目录 一、InitBinder的作用二、数据绑定器三、全局数据绑定器3.1. 方式一&#xff1a;ControllerAdvice3.2. 方式二&#xff1a;RequestMappingHandlerAdapter 四、自定义数据校验器五、参数类型转换器 一、InitBinder的作用 InitBinder从字面意思可以看出这个的作用是给Binder…

JAVA-Switch语句

1、完整的语法结构 该语句为选择分支语句&#xff0c;其语法结构为&#xff1a; switch (值){case:值1 java语句;break;case:值2 java语句;break;case:值3 java语句;break;……default&#xff1a;java语句; } 注意在该语法结构中&#xff0c;“值N"可以表示int型的或者S…

java中的常用语句

Java中的常用语句 一、Java中的语句由3大类的结构 1.顺序结构—自上而下一行一行的有序的执行 2.选择结构 (1)If语句结构 (2)Switch语句结构 3.循环结构 (1)For循环 (2)While循环 (3)Do{}while()循环 二、判断语句中if语句的表现方式和用法 1.if(){} 2.if(){}else{} 3.if(){}e…

4.java中的常见语句

1.顺序结构语句 写好的代码从上往下按照顺序一行一行的执行。 2.选择结构语句 根据判断结果有选择性的执行代码. 2.1 if语句 1.if(判断条件){需要执行的java代码} 首先执行判断条件&#xff0c;如果判断条件的结果为true,就执行“{}”中的java代码&#x…

java基本语法(史上最全)

java基本语法&#xff08;史上最全&#xff09; &#xff08;一&#xff09;关键字和保留字 关键字的定义和特点 定义&#xff1a;被java语言赋予了特殊含义&#xff0c;用作专门用途的字符串。 特点&#xff1a;关键字中所有字母都为小写。关键字不能用作变量名&#xff0…

Linux Makefile ifeq正确使用

今晚和昨晚捣鼓了很久ifeq&#xff0c;怎么也得不出正确结果。当时我是这么用ifeq的 all: ifeq("ad","cd") echo yes else echo no endif 得出的结果是&#xff1a; 后来经仔细对比发现要这样写 all: ifeq ("ad", "cd&q…

关于shiro

shiro ​ shiro处理的两个过程&#xff0c;一个是登录&#xff0c;这个过程完成后产生一个用户jwt&#xff0c;一个是访问接口时&#xff0c;通过jwt来完成验证的过程 登录逻辑&#xff1a; 访问接口逻辑&#xff1a; 认证&#xff08;authentication&#xff09;&#xff1a…

shiro的简单介绍

1.Shiro的简单配置 1&#xff09; 获取ShiroFilterFactoryBean&#xff0c;作用是在执行相关操作前&#xff0c;先进行功能过滤&#xff0c;拦截所有请求&#xff0c;进入到shiro中进行认证与授权 例如&#xff1a;设置一些拦截的请求 // 身份认证失败&#xff0c;则跳转到登录…

Shiro相关基础知识

文章目录 前言一、Shiro相关基础知识1.Shiro是什么2.Shiro具体功能3.Shiro的整体结构与重要组件4.Shiro各模块基础知识1&#xff09;Authentication 认证模块2&#xff09;Authorization 授权模块3&#xff09;Realm 认证模块 5.Shiro集成到web应用 二、Shiro相关漏洞1. Shiro漏…