当前位置: 首页 > news >正文

springboot 下 activiti 7会签配置与实现

流程图配置

在这里插入图片描述
会签实现须在 userTask 节点下的 multi instance 中配置 collection 及 completion condition;

  • collection 会签人员列表;
  • element variable 当前会签变量名称,类似循环中的 item;
  • completion condition: 完成条件。

${taskExecutionServiceImpl.findProcessUsers(‘applicant’)} : spring 代理下的 activiti 项目可使用
bean 下配置方法。

${countersignComponent.isComplete(taskId)} 会签实现方法,省略监听类。括号中的字符加单引号就是传递字符串,不加引号就是取当前任务中的变量。

在这里插入图片描述
会签配置图中的 user 变量需在此处使用。

实现代码

会签实现代码

@Component
@RequiredArgsConstructor
public class CountersignComponent {private final TaskService taskService;public boolean isComplete(String taskId) {// 1、参数验证if(StringUtils.isAnyEmpty(taskId)){return false;}// 2、获取当前任务节点参数及会签判断后重新设置// 获取流程参数 var,会签人员完成自己的审批任务时会添加流程参数 var,2 为拒绝,1 为同意String variable = BeanUtil.nullOrUndefinedToEmptyStr(taskService.getVariableLocal(taskId, ActivitiCommonConstant.VAR.getValue()));// 当值为 2 证明已有人拒绝,返回 trueif(DefaultConstant.TWO_CODE.getKey().equals(variable)){//会签结束,设置参数 execType 为 4 进行下一步操作。taskService.setVariableLocal(taskId, ActivitiCommonConstant.EXEC_TYPE.getValue(), DefaultConstant.FIVE_CODE.getKey());return true;}// 当值为 1,判断会签是否结束Integer complete = (Integer) taskService.getVariable(taskId, ActivitiCommonConstant.NR_OF_COMPLETED_INSTANCES.getValue());if(complete == 0){// 会签未结束,后续处理}return false;}}

用户动态获取代码

    @Overridepublic List<String> findProcessUsers(String code) {// 1、参数验证if(StringUtils.isEmpty(code)){throw new BusinessException(ActivitiConstant.PROCESS_USER_NULL);}// 2、查询对应流程人员(具体取人逻辑,根据个人业务变更)ProcessParameterQuery processParameterQuery = new ProcessParameterQuery();processParameterQuery.setCode(code);GostopResponseVo<ProcessParameterVo> processParameter = dev.findProcessParameter(processParameterQuery);ProcessParameterVo processParameterVo = processParameter.getResult();if(Objects.isNull(processParameterVo)){throw new BusinessException(ActivitiConstant.PROCESS_USER_NULL);}List<HospitalUserVo> userInfos = processParameterVo.getUserInfos();if(CollectionUtils.isEmpty(userInfos)){throw new BusinessException(ActivitiConstant.PROCESS_USER_NULL);}return userInfos.stream().map(HospitalUserVo::getId).distinct().collect(Collectors.toList());}

开启流程

    @Overridepublic String startProcess(CommonTaskParamVo param) {// 1、参数验证if(Objects.isNull(param) || StringUtils.isAnyEmpty(param.getProcessKey())){throw new BusinessException(ActivitiConstant.EXEC_ERROR_PARAMS_NULL);}// 2、启动流程定义,返回流程实例ProcessInstance pi;try {CustomParamVo customParamVo = param.getCustomParamVo();String paramJson = JSONObject.toJSONString(customParamVo);Map paramMap = JSONObject.parseObject(paramJson, Map.class);pi = runtimeService.startProcessInstanceByKey(param.getProcessKey(), paramMap);} catch (Exception e) {log.error(e.getMessage());throw new BusinessException(ActivitiConstant.PROCESS_NOT_DEPLOYED);}return pi.getId();}

任务执行

    @Overridepublic String complete(CommonTaskParamVo param) {// 1、参数验证if(Objects.isNull(param) || StringUtils.isAnyEmpty(param.getProcessId(), param.getUserId())){throw new BusinessException(ActivitiConstant.EXEC_ERROR_PARAMS_NULL);}// 2、查询当前人任务信息String userId = param.getUserId();//与正在执行的任务管理相关的ServiceTask task = taskService.createTaskQuery()//指定个人任务查询,指定办理人.taskCandidateUser(userId)//使用流程实例ID查询.processInstanceId(param.getProcessId())//排序.orderByTaskCreateTime().asc()//返回列表.singleResult();if (Objects.isNull(task)) {throw new BusinessException(ActivitiConstant.TASK_NULL_ERROR);}task.setDescription(param.getDescription());task.setAssignee(userId);taskService.saveTask(task);// 2.1 设置执行人信息HospitalUserCacheVo userInfo = activitComponent.getUserInfo();CustomParamVo customParamVo = param.getCustomParamVo();customParamVo.setExecUserId(userInfo.getId());customParamVo.setExecUserName(userInfo.getDepartmentName());customParamVo.setExecTime(DateUtil.date2String(LocalDateTime.now()));customParamVo.setTaskId(task.getId());// 2.2 将自定义参数转为 mapString paramJson = JSONObject.toJSONString(customParamVo);Map paramMap = JSONObject.parseObject(paramJson, Map.class);taskService.setVariablesLocal(task.getId(), paramMap);// 3、执行当前节点信息taskService.complete(task.getId());return task.getId();}

参数接收对象

@Data
public class CommonTaskParamVo {/*** 用户 ID*/private String userId;/**** 流程图定义 KEY*/private String processKey;/*** 流程 ID*/private String processId;/*** 描述*/private String description;/*** 自定义参数类*/private CustomParamVo customParamVo;}
@Data
public class CustomParamVo {/*** 操作类型 (1 同意, 2 回退, 3 驳回, 4 提交 5 删除)*/private String execType;/*** 节点类型 (1 申请节点 2 审批节点)*/private String nodeType;/*** 预留参数*/private String var;/*** 执行人 ID*/private String execUserId;/*** 执行人名称*/private String execUserName;/*** 执行时间*/private String execTime;/*** 任务 ID*/private String taskId;}

使用上述参数类及流程配置后,查询任务流水就变得非常简单。

流水查询

@Overridepublic List<FlowDataVo> flowQueryProcess(FlowQuery param) {// 1、参数验证if(Objects.isNull(param) || StringUtils.isAnyEmpty(param.getProcessId())){return new ArrayList<>();}// 2、查询任务执行节点信息HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery();List<HistoricTaskInstance> taskInfoArr = historicTaskInstanceQuery.processInstanceId(param.getProcessId()).orderByTaskCreateTime().asc().list();if(CollectionUtils.isEmpty(taskInfoArr)){return new ArrayList<>();}// 3、查询任务执行参数信息HistoricVariableInstanceQuery historicVariableInstanceQuery = historyService.createHistoricVariableInstanceQuery();List<HistoricVariableInstance> variableInstanceList = historicVariableInstanceQuery.processInstanceId(param.getProcessId()).list();// 4、构建返回信息对象List<FlowDataVo> resultArr = taskInfoArr.stream().map(taskInfo -> {FlowDataVo flowDataVo = new FlowDataVo();flowDataVo.setNodeName(taskInfo.getName());flowDataVo.setDescription(taskInfo.getDescription());List<HistoricVariableInstance> variableArr = variableInstanceList.stream().filter(e -> taskInfo.getId().equals(e.getTaskId())).collect(Collectors.toList());if (CollectionUtils.isEmpty(variableArr)) {flowDataVo.setStatus(DefaultConstant.ONE_CODE.getKey());return flowDataVo;}JSONObject flowDataJson = (JSONObject) JSONObject.toJSON(flowDataVo);variableArr.stream().forEach(var -> {String variableName = var.getVariableName();String value = BeanUtil.nullOrUndefinedToEmptyStr(var.getValue());flowDataJson.put(variableName, value);});String flowDataJsonString = flowDataJson.toJSONString();FlowDataVo afterFlowData = JSONObject.parseObject(flowDataJsonString, FlowDataVo.class);afterFlowData.setStatus(DefaultConstant.TWO_CODE.getKey());return afterFlowData;}).collect(Collectors.toList());return resultArr;}

流水查询使用 bean 对象

@Data
public class FlowQuery {/*** 流程 ID*/private String processId;/*** 用户 ID*/private String userId;
}
@Data
public class FlowDataVo {/*** 操作类型 (1 同意, 2 回退, 3 驳回, 4 提交 5 删除)*/private String execType;/*** 节点类型 (1 申请节点 2 审批节点)*/private String nodeType;/*** 预留参数*/private String var;/*** 节点名称*/private String nodeName;/*** 执行状态 1 未执行 2 已执行*/private String status;/*** 执行人 ID*/private String execUserId;/*** 执行人名称*/private String execUserName;/*** 执行时间*/private String execTime;/**** 描述*/private String description;}

相关文章:

springboot 下 activiti 7会签配置与实现

流程图配置 会签实现须在 userTask 节点下的 multi instance 中配置 collection 及 completion condition; collection 会签人员列表&#xff1b;element variable 当前会签变量名称&#xff0c;类似循环中的 item;completion condition: 完成条件。 ${taskExecutionServiceIm…...

RK3399平台开发系列讲解(内核调试篇)spidev_test工具使用

🚀返回专栏总目录 文章目录 一、环境二、执行测试三、回环测试四、字节发送测试五、32位数据发送测试沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 在 Linux 系统上,“spidev_test” 是一个用于测试和配置 SPI(Serial Peripheral Interface)设备的命令行工具。…...

点云从入门到精通技术详解100篇-自适应点云局部邻域特征的特征提取与配准(续)

目录 3.4 深度相机误差建模 3.5 实验结果及分析 3.5.1 TOF 相机平面畸变校正 3.5.2 TOF 相机深度误差校正...

VBA技术资料MF52:VBA_在Excel中突出显示前 10 个值

【分享成果&#xff0c;随喜正能量】一言之善&#xff0c;重于千金。善良不分大小&#xff0c;有时候你以为的一句话&#xff0c;小小的举手之劳&#xff0c;也可能就是别人的救赎&#xff01;不要吝啬你的善良&#xff0c;因为你永远不知道那小小的善良能给多少人带来光明。。…...

leetcode做题笔记134. 加油站

在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 给定两个整数数组 gas 和 cost &…...

Allegro166版本如何在颜色管理器中实时显示层面操作指导

Allegro166版本如何在颜色管理器中实时显示层面操作指导 在用Allegro166进行PCB设计的时候,需要在颜色管理器中频繁的开关层面。但是166不像172一样在颜色管理器中可以实时的开关层面,如下图 需要打开Board Geometry/Soldermask_top层,首先需要勾选这个层面,再点击Apply即…...

纷享销客入选中国信通院《高质量数字化转型产品及服务全景图》

近期&#xff0c;在中国信息通信研究院主办的“2023数字生态发展大会”暨中国信通院“铸基计划”年中上&#xff0c;重磅发布了《高质量数字化转型产品及服务全景图&#xff08;2023&#xff09;》&#xff0c;纷享销客凭借先进的技术能力和十余年客户业务场景应用理解&#xf…...

C高级 DAY4

一、分支语句 case ...in语句 shell中的switch语句 case $变量名 in常量1)语句;; ------->类似于C中break的作用&#xff0c;;;除了最后一条分之外&#xff0c;都不能省略常量2)语句;; 常量n)语句;;*) ------->类似于C中default&#xff0c;但…...

C高级day4

作业 实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使用变量接收结果 思维导图...

Java8-17 --- idea2022

目录 一、idea官网 二、使用idea编写hello world 三、查看工程中的JDK配置信息 四、详细设置 4.1、显示工具栏 4.2、默认启动项目配置 4.3、取消自动更新 4.4、选择整体主体与背景图 4.5、设置编辑器主题样式 4.5.1、编辑器主题 4.5.2、字体大小 4.5.3、修改注…...

Mybatis---增删改查

目录 一、添加用户 &#xff08;1&#xff09;持久层接口方法 &#xff08;2&#xff09;映射文件 &#xff08;3&#xff09;测试方法 二、修改用户 &#xff08;1&#xff09;持久层接口方法 &#xff08;2&#xff09;映射文件 &#xff08;3&#xff09;测试方法 …...

开机性能-如何抓取开机systrace

一、理论 1.背景 抓取开机 trace 需要使用 userdebug 版本&#xff0c;而我们测试开机性能问题时都要求使用 user 版本&#xff0c;否则会有性能损耗问题。因此想要在抓取开机性能trace 时&#xff0c;需要在 user 版本上打开 atrace 功能之后才能抓取 trace&#xff0c;默认 …...

VBA技术资料MF54:VBA_EXCEL实时获取鼠标位置

【分享成果&#xff0c;随喜正能量】若人散乱心&#xff0c;乃至以一花&#xff0c;供养于画像&#xff0c;渐见无数佛。所以发一幅释迦牟尼佛像&#xff0c;与同修善友一起每日在微博上供养&#xff0c;只要有供养之心&#xff0c;便可积累功德。以此回向&#xff0c;愿求者如…...

模电课程设计

主要内容跟本科实验关系很大&#xff0c;可以用来借鉴。 包含文件有&#xff1a;实验报告、Multisim仿真文件&#xff0c;资料很全&#xff0c;有问题可以私信 目录 1、模电课设&#xff1a;用Multisim简单了解二极管 2、模电课设&#xff1a;用Multisim简析三极管与场效应…...

【2023研电赛】兆易创新命题三等奖: 低成本单母线电流永磁同步无感驱动器

本文为2023年第十八届中国研究生电子设计竞赛兆易创新企业命题三等奖以及决赛最佳论文奖分享&#xff0c;参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01;&#xff0c;分享2023研电赛作品扩大影响力&#xff0c;更有…...

原生Js 提取视频中的音频

Js提取视频中的音频 将视频中的音频轨道分离出来&#xff0c;生成 wav 文件播放或下载&#xff08; Vue3 setup &#xff09; 代码实现 template <button><label for"file" id"filename">选择视频文件</label><input type"fi…...

设计模式-备忘录模式(Memento Pattern)

文章目录 前言一、备忘录模式的概念二、备忘录模式的实现三、备忘录优缺点优点&#xff1a;缺点&#xff1a;总结 前言 备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于捕获和存储对象的内部状态&#xff0c;以便在以后可以恢复到先…...

PHP对接阿里云虚拟号的实现(号码隐私保护)

fastadmin 封装框架 实现功能&#xff1a;AXN隐私号绑定、解绑&#xff1b; 场景&#xff1a;为店铺手机号开通虚拟号&#xff0c;用户联系店铺展示虚拟号码&#xff1b; 官方开放文档地址&#xff1a;https://help.aliyun.com/document_detail/59655.html?spma2c4g.111742…...

刷新单年发射纪录:SpaceX成功发射62次猎鹰9号火箭

SpaceX一直都致力于推进航天领域的发展。近日&#xff0c;该公司的猎鹰9号火箭再次刷新了单年发射纪录&#xff0c;目前已经成功发射了62次。除此之外&#xff0c;今年SpaceX还发射了一枚猎鹰火箭和一枚巨型火箭。马斯克表示&#xff0c;他的目标是实现每月10次猎鹰飞行&#x…...

项目打包docker镜像 | 上传nexus | jenkins一键构建

文章目录 前言准备实操1、打开docker的远程访问2、编写dockerfile文件3、指定nexus环境4、配置jenkins5、使用jenkins构建 总结 前言 Docker部署项目是指使用Docker容器化技术将应用程序及其依赖项打包成一个独立的、可移植的运行环境&#xff0c;并在各种操作系统和平台上进行…...

ios 运行ipa包 日志查看方式

方法一&#xff1a; 使用ideviceinstaller工具 # 安装ipa命令 brew install ideviceinstaller ideviceinstaller -i xxx.ipa# 查看运行日志 idevicesyslog# idevicesyslog 查找命令 idevicesyslog | grep test -A 3 -B 2 # 输出关键字所在行后3行&#xff0c;前2行) idevic…...

AUTOSARCAN-Tp协议

目录 一.单帧、首帧、连续帧、流控帧 单帧传输 SF单帧&#xff1a; 多帧传输 FF&#xff08;首帧&#xff09;&#xff1a; CF&#xff08;连续帧&#xff09;&#xff1a; FC&#xff08;流控帧&#xff09;&#xff1a; 一.单帧、首帧、连续帧、流控帧 CAN诊断由发送端…...

【设计模式】组合模式实现部门树实践

1.前言 几乎在每一个系统的开发过程中&#xff0c;都会遇到一些树状结构的开发需求&#xff0c;例如&#xff1a;组织机构树&#xff0c;部门树&#xff0c;菜单树等。只要是需要开发这种树状结构的需求&#xff0c;我们都可以使用组合模式来完成。 本篇将结合组合模式与Mysq…...

恒林家居引入纷享销客CRM系统,领跑家居行业营销数字化进程

近日&#xff0c;恒林家居股份有限公司&#xff08;&#xff08;股票代码&#xff1a;603661以下简称为“恒林家居”&#xff09;携手纷享销客在湖州召开了CRM项目启动会。双方领导及核心项目人员齐聚一堂&#xff0c;展开了深度交流并达成了重要共识。 作为家居行业的领军企业…...

多线程-锁的种类

1 作用 Java中的锁主要用于保障多并发线程情况下数据的一致性。在多线程编程中为了保障数据的一致性&#xff0c;我们通常需要在使用对象或者方法之前加锁&#xff0c;这时如果有其他线程也需要使用该对象或者该方法,则首先要获得锁,如果某个线程发现锁正在被其他线程使用,就会…...

Hive 和 HDFS、MySQL 之间的关系

文章目录 HiveHDFSMySQL三者的关系 Hive、MySQL 和 HDFS 是三个不同的数据存储和处理系统&#xff0c;它们在大数据生态系统中扮演不同的角色&#xff0c;但可以协同工作以支持数据管理和分析任务。 Hive Hive 是一个基于 Hadoop 生态系统的数据仓库工具&#xff0c;用于管理和…...

【面试题】如何实现数组去重的?有几种方式?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 【国庆头像】- 国庆爱国 程序员头像&#xff01;总有一款适合你&#xff01; 1. 方法一&#xff1a;利用两层循环数组的splice方法 通过两层循环对数组…...

使用TCP方式拉取Canal数据

1 Canal对接Kafka联调 1.1 配置修改 canal.properties 修改 zk&#xff1a; canal.zkServers 10.51.50.219:2181instance.properties 开启配置项&#xff1a; canal.mq.dynamicTopic 是 Canal 的 MQ 动态 Topic 配置项&#xff1a; test_javaedge_01 是kafka 的 topicte…...

Docker安装mysql实战说明

安装前准备 在安装MySQL之前&#xff0c;你需要确保已经正确安装和配置了Docker&#xff0c;可以通过以下命令检查Docker是否已正确安装&#xff1a; docker --version如果Docker已经成功安装&#xff0c;你将看到Docker的版本信息。 下载mysql的镜像 Docker Hub是一个存储…...

前端DOM操作精解:基础概念、方法与最佳实践

引言 本文将深入探讨前端开发中的DOM操作&#xff0c;包括基础概念、常用方法和最佳实践。通过清晰易懂的解释和实际案例分析&#xff0c;我们将一起了解如何最有效地使用DOM操作来提升前端应用的用户体验。 一、DOM操作入门 在深入探讨DOM操作之前&#xff0c;我们先要理解…...

用dw做网站的视频/百度seo快速排名优化软件

中国武术有句名言&#xff1a;“内练一口气&#xff0c;外练筋骨皮”&#xff0c;修炼内功可以让自己比变得更强&#xff01;本文将全面的带领大家了解一下G1这款垃圾收集器&#xff0c;在正式了解G1之前&#xff0c;我们先来回顾一下垃圾回收的相关基础知识。 如何定位内存中…...

wordpress建设下载网站/seo关键词排名优化联系方式

原文&#xff1a;http://my.oschina.net/leejun2005/blog/343353 目录[-] 1、问题&#xff1a;mysql 遇到某些中文插入异常2、原因&#xff1a;此 utf8 非彼 utf83、解决方案3.1 升级 mysql 版本&#xff0c;并将utf8字符集升级到utf8mb43.1.1 直接修改表结构3.1.2 修改数据库默…...

wordpress 多店铺/北京seo网站开发

步骤&#xff1a; 1&#xff0c;客户端向yarn的RM提交作业请求&#xff0c;RM进行权限等验证&#xff0c;生成jobid、资源上传路径&#xff0c;将jobId和资源上传路径返回给客户端&#xff1b; 2&#xff0c;客户端将jar包、配置文件、第三方包等文件上传到指定的hdfs路径后&…...

昆明做网站建设的公司哪家好/php搭建一个简单的网站

原理&#xff1a; 用数组存储数字&#xff0c;按照计算法则进行运算。 代码&#xff1a; package com.hdwang;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 大数四则运算&#xff08;超出long型的大数&#xff08;64位&#xff1a;184467440737095516…...

贵阳市 网站建设/网络营销师证书怎么考

配置执行 选择测试用例 机器人框架提供了几个选择的命令行选项 执行测试用例。 也工作在相同的选项 后处理输出与 Rebot 。 通过测试套件和测试用例的名称 测试套件和测试用例可以选择通过他们的名字的命令 行选项 ——套件(- s) 和 ——测试(- t) , 分别。 这两个选项可以多次…...

网站开发设计思想报告/站长工具精品

SELECT DISTINCT 语句用于返回唯一不同的值。 SQL SELECT DISTINCT 语句 在表中&#xff0c;一个列可能会包含多个重复值&#xff0c;有时您也许希望仅仅列出不同&#xff08;distinct&#xff09;的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 …...