spring boot flowable多人前加签
1、前加签插件
package com.xxx.flowable.cmd;import com.xxx.auth.security.user.SecurityUser;
import com.xxx.commons.ApplicationContextHolder;
import com.google.common.collect.Lists;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.TaskService;
import org.flowable.engine.impl.cmd.NeedsActiveTaskCmd;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl;import java.util.*;/**** @author HanKeQi* @date 2023/9/25*/
public class BeforeDelegateTaskCmd extends NeedsActiveTaskCmd<Void> {private List<String> assignees;public BeforeDelegateTaskCmd(String taskId, Set<String> assignees) {super(taskId);this.assignees = Lists.newArrayList(assignees);}@Overrideprotected Void execute(CommandContext commandContext, TaskEntity taskEntity) {if (CollectionUtils.isNotEmpty(this.assignees)){// 根据自己方法回去beanTaskService taskService = ApplicationContextHolder.getBean(TaskService.class);assert taskService != null;TaskEntityImpl currentTask = (TaskEntityImpl)taskEntity;String parentTaskId = currentTask.getParentTaskId();//获取当前操作人,也可以传入String userId = SecurityUser.getUserId();if (StringUtils.isEmpty(parentTaskId)){currentTask.setOwner(userId);currentTask.setAssignee(null);currentTask.setCountEnabled(true);currentTask.setScopeType("before");taskService.saveTask(taskEntity);parentTaskId = taskEntity.getId();}for (String assignee: this.assignees) {String uuid = UUID.randomUUID().toString();TaskEntity task = (TaskEntity)taskService.newTask(uuid);task.setCategory(currentTask.getCategory());task.setDescription(currentTask.getDescription());task.setTenantId(currentTask.getTenantId());task.setOwner(userId);task.setAssignee(assignee);
// task.setExecutionId(currentTask.getExecutionId());task.setName(String.format("加签%s", currentTask.getName()));task.setParentTaskId(currentTask.getId());task.setProcessDefinitionId(currentTask.getProcessDefinitionId());task.setProcessInstanceId(currentTask.getProcessInstanceId());task.setTaskDefinitionKey(String.format("dy_%s", currentTask.getTaskDefinitionKey()));
// task.setPriority(currentTask.getPriority());task.setCreateTime(new Date());task.setStatus(currentTask.getStatus());task.setItemCode(currentTask.getItemCode());task.setApproveType(currentTask.getApproveType());task.setBussId(currentTask.getBussId());task.setBussName(currentTask.getBussName());taskService.saveTask(task);}//如果是候选人,需要删除运行时候选表种的数据。long candidateCount = taskService.createTaskQuery().taskId(parentTaskId).taskCandidateUser(userId).count();if (candidateCount > 0) {taskService.deleteCandidateUser(parentTaskId, userId);}}return null;}}
2、Controller 处理
package com.xxx.flowable.controller;import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.Set;/*** @author HanKeQi* @date 2023/9/28*/
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("flowable/test")
public class Test001Controller {private final TaskService taskService;@PostMappingpublic String submit(String taskId, Set<String> assignees){Task task = taskService.createTaskQuery().taskId(taskId).singleResult();Task parentTask = null;String parentTaskId = task.getParentTaskId();if (StringUtils.isNotEmpty(parentTaskId)){parentTask = taskService.createTaskQuery().taskId(parentTaskId).singleResult();List<Task> subTasks = taskService.getSubTasks(parentTaskId);//处理最后一个的时候,一定要把任务返还给加签人if (!CollectionUtils.isEmpty(subTasks) && subTasks.size() == 1) {taskService.resolveTask(parentTaskId);}}//如果要获取变量请使用parentTask 获取传输变量return "ok";}
}相关文章:
spring boot flowable多人前加签
1、前加签插件 package com.xxx.flowable.cmd;import com.xxx.auth.security.user.SecurityUser; import com.xxx.commons.ApplicationContextHolder; import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; import org.apache.co…...
结构体运算符重载
1.降序 struct Point{int x, y;//重载比较符bool operator < (const Point &a) const{return x > a.x;//当前元素大时,是降序} };2.升序 struct Point{int x, y;//重载比较符 // bool operator < (const Point &a) const{ // return x…...
幽默直观的文档作者注释
注释是程序中非常重要的一部分,在不同的编程语言中,注释的风格和语言描述会有所不同。以下是一些常用的注释风格和语言描述: 直观注释:这种注释使用简洁、明了的语言,帮助读者快速地理解代码。例如,代码中…...
前端开发网站推荐
每个人都会遇见那么一个人,永远无法忘却,也永远不能拥有。 以下是一些可以用来查找和比较前端框架的推荐网站: JavaScript框架比较: 这些网站提供了对不同JavaScript框架和库的详细比较和评估。 JavaScripting: 提供了大量的JavaS…...
【C语言】通讯录管理系统(保姆级教程+内含源码)
C系列文章目录 目录 C系列文章目录 前言 一,模块化编程 二,系统框架构建 1.成员信息的创建 2.菜单实现 3.系统功能声明 三、系统功能实现 1.初始化通讯录 2.增加联系人 3.显示所有联系人 4.根据姓名查找位置 5.删除指定联系人 6.查找指定联…...
python自动解析301、302重定向链接
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 使用模块requests 方式代码如下: import requests url_string"http://******" r requests.head(url_string, streamTrue) print r.h…...
【未解决问题】opencv 交叉编译 ffmpeg选项始终为NO
opencv 打不开视频的原因 在交叉编译时候,发现在 pc 端能用 opencv 打开的视频,但是在 rv1126 上打不开。在网上查了很久,原因可能是 ffmpeg 造成的。 解决opencv源代码编译找不到ffmpeg-CSDN博客 交叉编译 ffmpeg 尝试了一天还是第二个博客…...
Python实用技术二:数据分析和可视化(2)
目录 一,多维数组库numpy 1,操作函数: 2,numpy数组元素增删 1)添加数组元素 2)numpy删除数组元素 3)在numpy数组中查找元素 4)numpy数组的数学运算 3,numpy数…...
24Hibench
1. Hibench 官网 HiBench is a big data benchmark suite that helps evaluate different big data frameworks in terms of speed, throughput and system resource utilizations. It contains a set of Hadoop, Spark and streaming workloads, including Sort, WordCou…...
VC++父进程交互式操作子进程标准输入输出
父进程接管子进程的标准输入输出和错误,实现对子进程的交互操作。比如子进程是一个类似mysql这种可以交互的命令,执行操作后输出结果,父进程根据结果分析决定执行下一步的命令,从而替代人工的输入。 通过父进程创建子进程,使用管道重定向子进程的输入输出错误可以实现 在 …...
一步一招,教你如何制作出成功的优惠促销微传单
在当今的数字化时代,几乎所有的事情都可以在互联网上完成,包括制作宣传单。有很多在线工具可以帮助我们轻松制作出精美的商场促销宣传单。下面就以乔拓云为例,详细介绍如何简单几步制作出让人眼前一亮的商场促销宣传单。 1. 注册并登录乔拓云…...
27、Flink 的SQL之SELECT (Pattern Recognition 模式检测)介绍及详细示例(7)
Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...
Git使用【上】
欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析3 前言 先前有些git命令我在我的其它文章里面已经写过,若要查看可参考【Linu…...
flink的序列化基准测试
背景: flink提供了在本地环境使用jmh测试不同序列化方法的性能差异,本文就是基于这个https://github.com/apache/flink-benchmarks这个性能测试,总结几个结论,以便后面使用时避免掉坑 基准测试 我们本次运行的是SerializationF…...
Error: node: unknown or unsupported macOS version: :dunno 错误解决
一、原因 今天安装 brew install node报错了,错误信息如下: 二、解决方案 1)查找homebrew-cask安装位置 echo $(brew --repo homebrew/homebrew-cask) // 输出 /opt/homebrew/Library/Taps/homebrew/homebrew-cask2)使用 gi…...
嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理②
嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理② 第十八章 Linux系统对中断的处理 ②18.3 Linux中断系统中的重要数据结构18.3.1 irq_desc数组18.3.2 irqaction结构体18.3.3 irq_data结构体18.3.4 irq_domain结构体18.3.5 irq_chip结构体 18.4 在设备树中指定中断_在…...
Kolmogorov-Smirnov正态性检验
Kolmogorov-Smirnov正态性检验是一种统计方法,用于检验数据集是否服从正态分布。其基本原理和用途如下: 基本原理: 假设检验:Kolmogorov-Smirnov检验基于一个假设,即待检验的数据集服从特定的理论正态分布。计算累积…...
BI神器Power Query(25)-- 使用PQ实现表格多列转换(1/3)
实例需求:原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中,att1、att3、att5为一组,att2、att3、att6为另一组,数据如下所示。 更新表格数据 原始数据表: Col1Col2Att1Att2Att3Att4Att5Att6AAADD…...
windows系统一键开启和关闭虚拟化
说明 跟虚拟化相关的三个程序 一键开启脚本 REM 开启 Hyper-V 服务 pushd "%~dp0"dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txtfor /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /norestart /add-package:"%Sy…...
NSSCTF做题(5)
[NSSCTF 2022 Spring Recruit]babyphp 代码审计 if(isset($_POST[a])&&!preg_match(/[0-9]/,$_POST[a])&&intval($_POST[a])){ if(isset($_POST[b1])&&$_POST[b2]){ if($_POST[b1]!$_POST[b2]&&md5($_POST[b1])md5($_POST[b2])){…...
ElementUI Transfer穿梭框数据回填全攻略:编辑时如何优雅地还原选中状态?
ElementUI Transfer穿梭框数据回填实战:编辑场景下的状态还原艺术 在后台管理系统开发中,权限配置、内容关联等场景频繁使用穿梭框组件。ElementUI的Transfer组件凭借直观的双栏设计和丰富的API,成为这类需求的首选解决方案。但许多开发者在编…...
AI驱动的网络安全:深度学习与LLM在威胁检测与教育中的应用
1. 项目概述:AI赋能的网络安全新范式在网络安全领域,我们正面临着一个日益严峻的悖论:一方面,攻击手段正变得前所未有的复杂和自动化;另一方面,74%的安全事件仍然源于人为因素。这种技术与人的双重挑战催生…...
构建现代化图片编辑器的Vue与Fabric.js实践指南
构建现代化图片编辑器的Vue与Fabric.js实践指南 【免费下载链接】vue-fabric-editor 快图设计-基于fabric.js和Vue的开源图片编辑器,可自定义字体、素材、设计模板。fabric.js and Vue based image editor, can customize fonts, materials, design templates. 项…...
阴阳师御魂自动刷脚本:5分钟快速上手的智能挂机指南
阴阳师御魂自动刷脚本:5分钟快速上手的智能挂机指南 【免费下载链接】yysScript 阴阳师脚本 支持御魂副本 双开 项目地址: https://gitcode.com/gh_mirrors/yy/yysScript 还在为重复刷御魂副本而感到疲惫吗?yysScript智能挂机脚本是专为《阴阳师》…...
5分钟免费解锁iPhone激活锁:applera1n实用指南
5分钟免费解锁iPhone激活锁:applera1n实用指南 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 面对二手iPhone的激活锁界面,你是否感到束手无策?applera1n是一款专为…...
2026最权威的六大降AI率助手实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在把学术成果提交到知网平台以前,针对借助生成式AI辅助而产出的内容去进行合规化…...
别再只调包了!用PyTorch和DGL从零实现一个GCN层(附Cora节点分类实战代码)
从零构建图卷积网络:PyTorch与DGL实战中的底层逻辑拆解 当你第一次调用g.update_all()时,是否好奇过DGL框架背后究竟发生了什么?那些看似简单的消息传递和聚合操作,实际上隐藏着图卷积网络最精妙的设计思想。本文将带你深入GCN的数…...
如何在无GPU群晖设备上开启完整AI相册功能:Synology Photos面部识别终极指南
如何在无GPU群晖设备上开启完整AI相册功能:Synology Photos面部识别终极指南 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch 还在为DS918…...
从零构建轻量级AI智能体:核心原理、架构与实战指南
1. 项目概述:当“瘦身”的AI代理遇见开源协作 最近在GitHub上闲逛,发现一个挺有意思的项目: nvtien547/lean-agentic 。光看名字,就透着一股“务实”和“高效”的味道。“Lean”这个词,在软件开发领域,尤…...
25GbE以太网:数据中心服务器接入的技术革命与演进逻辑
1. 项目概述:25GbE的诞生与数据中心变革如果你在2014年前后关注数据中心网络,可能会觉得以太网速率的发展路径有点“拧巴”。我们刚刚习惯了从1G到10G的十倍跨越,紧接着迎来的却是40G和100G。对于服务器接入来说,40G(4…...
