Activity7框架使用学习记录

用于记录在项目中使用工作流框架

PROC_DEF_ID: 流程定义的id bpmn文件中对流程图定义的id

TASK_DEF_KEY:任务定义的id bpmn文件中对每个任务定义的id

PROC_INST_ID:流程实例id 启动一个流程时对流程定义的id

PROC_DEF_ID(流程定义的ID):在BPMN(Business Process Model and Notation)文件中,流程定义的ID是对整个流程图定义的唯一标识符。它通常用于区分不同的流程定义,以便系统可以识别和执行相应的流程。

TASK_DEF_KEY(任务定义的ID):在BPMN文件中,每个任务都有一个唯一的任务定义ID。这个ID用于标识流程中的不同任务,例如用户任务、服务任务等。任务定义ID通常与特定任务的执行逻辑相关联。

PROC_INST_ID(流程实例ID):当启动一个流程实例时,会为该实例分配一个唯一的流程实例ID。这个ID用于跟踪和管理特定流程实例的执行过程。通常,流程实例ID与流程定义ID相关联,但每个实例都有自己的唯一ID。

对于一些定制化的流程,可以通过自定义一个唯一的id作为流程id,来串联起多个流程

工作流框架提供的接口:

private RuntimeService runtimeService; 用于启动流程实例、查询正在执行的流程实例、发送信号等。它通常用于在流程执行期间与正在运行的流程实例进行交互private TaskService taskService;用于管理用户任务。它提供了在流程执行期间管理任务的方法,例如创建、完成、分配、查询任务等。通过TaskService,你可以管理流程中的人工任务,以便用户可以参与流程并完成任务。private HistoryService historyService;用于访问已完成的流程实例和任务的历史数据。它提供了查询已完成的流程实例、任务、变量等的方法。HistoryService对于跟踪流程执行的历史记录和生成报告非常有用。private ProcessEngine processEngine;
负	责启动和管理整个流程引擎。通过ProcessEngine,你可以获取其他服务接口(如RuntimeService、TaskService、HistoryService等),并执行与流程引擎相关的各种操作。private RepositoryService repositoryService;提供了对流程定义部署的管理方法。通过RepositoryService,你可以部署、查询、删除流程定义,以及管理流程资源(如流程图、表单等)。RepositoryService对于在运行时访问流程定义和资源非常有用。
import com.alibaba.fastjson2.JSONObject;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.impl.util.json.JSONArray;import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;import java.util.List;public interface FlowDBService {ProcessInstance start(String processDefinitionKey, String businessKey, JSONObject param);void complete(String taskId, JSONObject param);void complete(String taskId, JSONObject param,Boolean localScope);void addComment( String taskId, String comment);String getProcessDefinitionKeyByBusinessKey(String businessKey);List<Task> getNextNodes(String bizId);List<Task> getCurrentNodes(String bizId);//    List<ProcessNodeDTO> listTaskHistory(ProcessHistoryQuery param);/*** 根据流程实例id 和 任务id(task_id) 获取节点的历史数据* @param processId* @return*/List<HistoricVariableInstance> listNodeDataHistoryByTaskId(String processId, String taskId);/*** 根据实例id 和 任务定义key 获取节点的历史数据* @param processId* @param taskDefId* @return*/List<List<HistoricVariableInstance>> listNodeDataHistoryByTaskDefId(String processId, String taskDefId);/*** 根据实例id 和 任务名 获取节点的历史数据* @param processId 实例id* @param taskName  ProcessTaskDefKeyEnum 枚举值* @return*/List<List<HistoricVariableInstance>> listNodeDataHistoryBytaskName(String processId,String taskName);//    /**
//     * 将结果转换为jsonArray
//     * @param lists
//     * @return
//     */
//    JSONArray transformHistoryData(List<List<HistoricVariableInstance>> lists);
//
//    /**
//     * 查询多个流程(重新提交审核)实例id 的 指定任务节点的 历史数据
//     * @param processIds
//     * @param taskName
//     * @return 以jsonArray返回
//     */
//    JSONArray listNodeAllDataHistory(String[] processIds,String taskName);}

import org.activiti.engine.*;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricTaskInstanceQuery;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.history.HistoricVariableInstanceQuery;
import com.alibaba.fastjson2.JSONObject;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;@Component
public class FlowActivitiDBServiceImpl implements FlowDBService {@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;@Autowiredprivate HistoryService historyService;@Autowiredprivate ProcessEngine processEngine;@Autowiredprivate RepositoryService repositoryService;@Overridepublic ProcessInstance start(String processDefinitionKey, String businessKey, JSONObject param) {return runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, param);}@Overridepublic void complete(String taskId, JSONObject param) {complete(taskId,param,true);}@Overridepublic void complete(String taskId, JSONObject param, Boolean localScope) {taskService.complete(taskId,param,localScope);}@Overridepublic void addComment(String taskId, String comment) {
//        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();}@Overridepublic String getProcessDefinitionKeyByBusinessKey(String businessKey) {return null;}@Overridepublic List<Task> getNextNodes(String bizId) {return null;}@Overridepublic List<Task> getCurrentNodes(String bizId) {List<Task> list = processEngine.getTaskService().createTaskQuery().processInstanceBusinessKey(bizId).list();return list;}//    public List<ProcessNodeDTO> listTaskHistory(ProcessHistoryQuery param) {
//        HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery();
//        Boolean conditionAnyOne = false;
//        if(CollectionUtil.isNotEmpty(param.getBizTypes())){
//            historicTaskInstanceQuery.processDefinitionKeyIn(param.getBizTypes());
//            conditionAnyOne = true;
//        }
//        if(CollectionUtil.isNotEmpty(param.getBizActions())){
//            historicTaskInstanceQuery.taskNameIn(param.getBizActions());
//            conditionAnyOne = true;
//        }
//        if(StringUtils.isNotBlank(param.getProcessOrderId())){
//            historicTaskInstanceQuery.processInstanceBusinessKey(param.getProcessOrderId());
//            conditionAnyOne = true;
//        }
//        if(CollectionUtil.isNotEmpty(param.getQuery())){
//            for (String key : param.getQuery().keySet()) {
//                historicTaskInstanceQuery.processVariableValueEquals(key,param.getQuery().get(key));
//            }
//            conditionAnyOne = true;
//        }
//        if(!conditionAnyOne)
//            return new ArrayList<>();
//        List<HistoricTaskInstance> list = historicTaskInstanceQuery
//                .includeProcessVariables()
//                .includeTaskLocalVariables()
//                .finished()
//                .orderByTaskCreateTime().desc().list();
//        return transformHistoryTaskData(list);
//    }@Overridepublic List<HistoricVariableInstance> listNodeDataHistoryByTaskId(String processId, String taskId) {HistoricVariableInstanceQuery historicVariableInstanceQuery = historyService.createHistoricVariableInstanceQuery();List<HistoricVariableInstance> list = historicVariableInstanceQuery.processInstanceId(processId).taskId(taskId).list();return list;}@Overridepublic List<List<HistoricVariableInstance>> listNodeDataHistoryByTaskDefId(String processId, String taskDefId) {HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery().processInstanceId(processId).taskDefinitionKey(taskDefId);List<List<HistoricVariableInstance>> data = new ArrayList<>();List<HistoricTaskInstance> list = historicTaskInstanceQuery.list();list.forEach(task->{List<HistoricVariableInstance> historicVariableInstances = listNodeDataHistoryByTaskId(processId, task.getId());data.add(historicVariableInstances);});return data;}@Overridepublic List<List<HistoricVariableInstance>> listNodeDataHistoryBytaskName(String processId, String taskName) {
//        ProcessTaskDefKeyEnum processTaskDefKeyEnum = ProcessTaskDefKeyEnum.map.get(taskName);
//        String taskDefId = processTaskDefKeyEnum.getTaskDefKey();
//        return listNodeDataHistoryByTaskDefId(processId, taskDefId);return null;}//    @Override
//    public JSONArray transformHistoryData(List<List<HistoricVariableInstance>> lists) {
//        JSONArray jsonArray = new JSONArray();
//        for(List<HistoricVariableInstance> list : lists){
//            JSONObject jsonObject = new JSONObject();
//            for(HistoricVariableInstance instance:list){
//                jsonObject.put(instance.getVariableName(),instance.getValue());
//            }
//            jsonArray.add(jsonObject);
//        }
//        return jsonArray;
//    }
//
//    @Override
//    public JSONArray listNodeAllDataHistory(String[] processIds, String taskName) {
//        JSONArray jsonArray = new JSONArray();
//        for(String processId : processIds){
//            List<List<HistoricVariableInstance>> data = listNodeDataHistoryBytaskName(processId, taskName);
//            jsonArray.add(transformHistoryData(data));
//        }
//        return jsonArray;
//    }
//
//    private List<ProcessNodeDTO> transformHistoryTaskData(List<HistoricTaskInstance> historicTaskInstances) {
//        if(CollectionUtil.isEmpty(historicTaskInstances))
//            return new ArrayList<>();
//        return historicTaskInstances.stream().map(t->{
//            ProcessNodeDTO dto = new ProcessNodeDTO();
//            dto.setParamMap(t.getTaskLocalVariables());
//            dto.setNewestParamMap(t.getProcessVariables());
//            dto.setProcessInstanceId(t.getProcessInstanceId());
//            dto.setTemplate(StringUtils.split(t.getProcessDefinitionId(),":")[0]);
//            dto.setAction(t.getTaskDefinitionKey());
//            dto.setBizId(t.getBusinessKey());
//            dto.setStartTime(t.getStartTime());
//            dto.setEndTime(t.getEndTime());
//            dto.setDescription(t.getDescription());
//            return dto;
//        }).toList();
//    }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/10129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS plist文件增删改查

一. plist简介 plist文件&#xff0c;即属性列表文件&#xff0c;全名是Property List&#xff0c;这种文件的扩展名为.plist&#xff0c;因此&#xff0c;通常被叫做plist文件。它是一种用来存储串行化后的对象的文件&#xff0c;在iOS开发中通常用来存储用户设置&#xff0c…

《自卑与超越》

Ⅰ 内容简介 《自卑与超越》是阿德勒从个体心理学观点出发&#xff0c;阐明人生道路和人生意义的通俗性读物。但通俗中包含着极深的哲理和巨大的学术价值。在《自卑与超越》中&#xff0c;作者提出&#xff1a;每个人都有不同程度的自卑感&#xff0c;因为没有一个人对其现时的…

GaussDB数据库SQL系列-复合查询

目录 一、前言 二、复合查询基础 三、实际应用示例 1、使用UNION合并查询结果 2、使用INTERSECT找出共同元素 3、使用EXCEPT排除特定结果 四、高级技巧 1、子查询实例 2、JOIN的应用 五、总结 一、前言 GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;具…

按键的短按、长按和连续的划分

在实际生活中&#xff0c;我们使用到的按键在短按、长按和按键松开时都会触发不同的功能。按键短按后松开和长按后松开的应用比短按和长按的应用较少&#xff0c;我了解的按键短按后松开和长按后松开的应用是在点动控制和长动控制中。这里主要讨论按键的短按、长按和连续这三种…

postgresql主从复制

用vmware 搭建的两台虚拟机 操作系统&#xff1a;Ubuntu 24.04 Server版 数据库&#xff1a;postgresql 16.2 主库&#xff1a;192.168.2.11 从库&#xff1a;192.168.2.12 如果遇到网络无法上网&#xff0c;可参考一下 Vmware 搭建的Ubuntu 24.04 网络配置-CSDN博客 1.两…

LED显示屏的部件组成及相关知识

LED显示屏作为现代化信息传播的重要载体&#xff0c;在各种场所得到了广泛应用。其功能强大&#xff0c;效果生动&#xff0c;但其背后的部件组成却是复杂而精密的。本文将介绍LED显示屏的主要部件组成及相关知识&#xff0c;以帮助读者更好地理解LED显示屏的工作原理和构造。 …

day07beef-xss之根据beef-xss获取cookies

1.安装 apt-get update apt-get install beef-xss 若报错运行不了尝试 apt remove ruby apt remove beef-xss apt-get install ruby apt-get install ruby-dev libpcap-dev gem install eventmachine apt-get install beef-xss 2.运行 beef-xss 运行成功会自动弹出浏览框。 攻…

提高Rust安装与更新的速度

一、背景 因为rust安装过程中&#xff0c;默认的下载服务器为crates.io&#xff0c;这是一个国外的服务器&#xff0c;国内用户使用时&#xff0c;下载与更新的速度非常慢&#xff0c;因此&#xff0c;我们需要使用一个国内的服务器来提高下载与更新的速度。 本文推荐使用字节…

企业微信集成H5授权登录相关知识(二)

流程&#xff1a; 1.前端请求企业微信获取code&#xff1a;官网网页授权链接 2.企业微信返回的code请求后端判断是否已绑定系统账户 3.后端根据企业微信code&#xff0c;accessToken获得userId 4.userId获取user进行oauth2授权方式进行免密登录 相关知识&#xff1a; 一&a…

SS-PEG-SS可以与多种底物进行反应,生成具有良好稳定性的键合结构

【试剂详情】 英文名称 SS-PEG-SS 中文名称 琥珀酰亚胺丁二酸酯-聚乙二醇-琥珀酰亚胺丁二酸酯 外观性状 由分子量决定&#xff0c;固体或者液体。 分子量 0.4k&#xff0c;0.6k&#xff0c;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff08;可…

初识多线程

1. 前置知识——进程 在学习多线程前需要了解操作系统中的基本知识&#xff0c;这里简单回顾下。 1.1 进程控制块 一个进程对应着一个进程控制块PCB&#xff0c;PCB是一个用于管理和维护进程信息的数据结构&#xff0c;这个数据结构中大致包含下面内容&#xff08;并不完整&…

金仓面对面 | 人大金仓×安硕信息共话金融信用风险管理数字化转型之道

金仓面对面 在数字化浪潮的推动下&#xff0c;人大金仓携手行业先锋&#xff0c;共同开启一场关于创新与转型的思想盛宴——金仓面对面。这不仅是一场对话&#xff0c;更是一次智慧的火花碰撞&#xff0c;一次行业数字化转型洞察的深度挖掘。 行业精英汇聚&#xff1a;我们荣幸…

基于springboot的网上点餐系统源码数据库

基于springboot的网上点餐系统源码数据库 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上点餐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上点餐系统…

云南区块链商户平台:抓包技术自制开票工具(二)

前言 上节我们分析了云南区块链商户平台的登录接口以及数据加密、解密&#xff0c;本节我们将构建一个项目框架&#xff0c;将大致的雏形制作出来 说明 由于我们使用开票软件都是在 云南区块链商户平台上操作&#xff0c;如果再开发电脑端就显得没必要&#xff0c;思考良久&…

阻塞队列与定时器

1.阻塞队列 1.1阻塞队列是什么 阻塞队列是一种特殊的队列. 也遵守 "先进先出" 的原则. 阻塞队列能是一种线程安全的数据结构, 并且具有以下特性: 1.当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素. 2.当队列空的时候, 继续出队列也会阻塞…

在线旅游网站,基于 SpringBoot+Vue+MySQL 开发的前后端分离的在线旅游网站设计实现

目录 一. 前言 二. 功能模块 2.1. 登录界面 2.2. 管理员功能模块 2.3. 用户功能模块 三. 部分代码实现 四. 源码下载 一. 前言 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;旅游网站当然…

分布式与集群的区别

先说区别&#xff1a; 分布式是并联工作的&#xff0c;集群是串联工作的。 分布式中的每一个节点都可以做集群。而集群并不一定就是分布式的。 集群举例&#xff1a;比如新浪网&#xff0c;访问的人很多&#xff0c;他可以做一个集群&#xff0c;前面放一个相应的服务器&…

Covalent Network(CQT)通过 “新曙光” 计划实现重要里程碑,增强以太坊时光机,提供 30% 的年化质押收益率

Covalent Network&#xff08;CQT&#xff09;作为集成超过 280 条区块链&#xff0c;并服务于超过 2.8 亿个钱包的领先结构化数据基础设施层&#xff0c;宣布了其战略计划 “新曙光” 中的一个重要进展。随着网络升级并完成了准备工作的 75%&#xff0c;这将为即将部署的以太坊…

JUC下CountDownLatch详解

详细介绍 CountDownLatch是Java并发包java.util.concurrent中提供的一个同步工具类&#xff0c;它允许一个或多个线程等待其他线程完成操作后再继续执行。这个工具类基于一个计数器&#xff0c;计数器的初始值可以由构造函数设定。线程调用countDown()方法会将计数器减1&#x…

uniapp——弹出键盘遮挡住输入框 textarea,处理方法

案例 在写输入框的时候会遇见 键盘遮挡住部分textarea框的一部分&#xff0c;使用cursor-spacing处理即可 修改后&#xff1a; 其他问题&#xff1a; 调起键盘输入时&#xff0c;不希望上方的内容被顶上去 代码 <view class"commentBox" :style"botto…