五、flowable操作、查询相关

1、依赖

        <dependency>
            <groupId>com.ikaiyong.score</groupId>
            <artifactId>score-spring-boot-starter-flowable</artifactId>
        </dependency>

2、流程部署相关 

 如下建立对应文件和文件夹

 2.1 流程部署

    /**
     * 部署流程
     * @param name
     */
    @GetMapping("/deployPc")
    public CommonResult<String> deployPc(@NotBlank(message = "流程部署文件不能为空") String name) {
        String id = myProcessService.deployPc(name);
        // String id = myProcessService.deployPc("process/mjAddi.bpmn20.xml");
        return CommonResult.success(id);
    }

2.2 部署流程列表查询

    // 根据名字查流程定义列表,不传则查所有
public List<MyProcessDefinitionVo> processDefList(String procName) {
        ProcessDefinitionQuery pdq = repositoryService.createProcessDefinitionQuery();
        if(StringUtils.isNotBlank(procName)) {
            pdq.processDefinitionName(procName);
        }
        List<ProcessDefinition> pdList = pdq.active().latestVersion().list();
        return beanUtils.copyList(pdList, MyProcessDefinitionVo.class);
    }

3、流程实例

3.1 发起流程

要点一个是可以指定发起人,二是将processId和自定义表单绑定

    @Transactional(rollbackFor = Exception.class)
    public String startMjProc(PoliceAddiscoreFlowVo policeAddiscoreFlowVo) {
        // 发起流程
        // 指定发起人
        identityService.setAuthenticatedUserId(policeAddiscoreFlowVo.getPoliceNum());
        Map<String, Object> var = new HashMap<>();
        var.put("mjNum", policeAddiscoreFlowVo.getPoliceNum());
        String procInsId  = runtimeService.startProcessInstanceById(policeAddiscoreFlowVo.getProcessId(), var).getId();
        policeAddiscoreFlowVo.setProcessId(procInsId);

        // 保存表单
        policeAddiscoreFlowVo.setId(IdUtil.fastUUID());
        policeAddiscoreFlowVo.setState(ApproveStateEnum.APVING.getValue());
        policeAddiscoreFlowVo.setCreateTime(new Date());
        TPoliceAddiscoreFlow addiscoreFlow = new TPoliceAddiscoreFlow();
        BeanUtils.copyProperties(policeAddiscoreFlowVo, addiscoreFlow);
        addiscoreFlow.setId(IdUtil.fastUUID());
        tPoliceAddiscoreFlowMapper.insert(addiscoreFlow);

    }

3.2 审批 

可以有参数一起传入,也可以没有,具体看API就行

taskService.complete(task.getId(), variables);

 3.3 候选人认领

// 认领任务
taskService.claim(approveVo.getTaskId(), approveVo.getPoliceNum());

 3.4 删除/撤销任务

需要添加删除原因,在查询时可以查到

runtimeService.deleteProcessInstance(processId, deleteReason);

3.5回退

回退操作需要用到activityId,所以回退前要先查询这个id

    @Transactional(rollbackFor = Exception.class)
    public void backProc(PoliceAddiscoreFlowVo policeAddiscoreFlowVo) {
        String processId = policeAddiscoreFlowVo.getProcessId();
        Execution actExecution = runtimeService.createExecutionQuery()
                .processInstanceId(processId)
                .list()
                .get(0);
        HistoricActivityInstance hisActIns = historyService.createHistoricActivityInstanceQuery()
                .processInstanceId(processId)
                .taskAssignee(policeAddiscoreFlowVo.getPoliceNum())
                .orderByHistoricActivityInstanceStartTime()
                .desc()
                .list()
                .get(0);

        runtimeService.createChangeActivityStateBuilder()
                .processInstanceId(processId)
                .moveActivityIdTo(actExecution.getActivityId(), hisActIns.getActivityId())
                .changeState();
    }

 回退相对比较复杂,重点记录一下

1.串行路线上的退回:流程中没有任何网关(排他网关/并行网关)和会签多实例。

2.退回到并行网关分支中的某一个节点上:

3.并行网关中的某一个分支节点上发起退回,退回到并行网关前面的某一个节点上

4.子流程中退回到主干流程中某一个节点/主干流程退回到子流程中某一个节点。

如下图:

1.普通串行路线上的退回(此流程中没有并行网关的退回时),此方法支持普通串行节点/会签多实例节点/排他网关节点:

runtimeService.createChangeActivityStateBuilder()
.processInstanceId(proInstanceId)
.moveActivityIdsToSingleActivityId(curTaskKeys, targetTaskKey)
.changeState();

或者

moveActivityIdTo(String currentActivityId,String newActivityId);

2.并行网关中发起退回(即撤销当前的网关),这个地方不能用
​​​moveActivityIdTo(String currentActivityId,String newActivityId);​​是因为当某一个分支完成,它的is_active为0,另一条分支没有完成时。这时候这个方法是取不到所的分支的key的,它只有is_active为1的key能取到,不然就会造成多一条垃圾数据,同时再走并行时,任何一个分支不会等另一个分支就完走到分支的合并节点上,这就是bug,所以要改为以下方法:

// 并行网关的退回

List currentExecutionIds = new ArrayList<>();
List executions = runtimeService.createExecutionQuery().parentId(proInstanceId).list();
for (Execution execution : executions) {
System.out.println("并行网关节点数:"+execution.getActivityId());
currentExecutionIds.add(execution.getId());
}
runtimeService.createChangeActivityStateBuilder()
.moveExecutionsToSingleActivityId(currentExecutionIds, targetTaskKey)
.changeState();

3.退回到并行网关中的某一个节点:经试验退回时必须同时退回并行网关中的所有分支。

List targetTaskKeys = new ArrayList<>();
targetTaskKeys.add("sid-CA74ADED-7E70-451D-951C-95988BFC3F07");
targetTaskKeys.add("sid-7922C598-74FD-4848-95AC-D9790AF68432");

runtimeService.createChangeActivityStateBuilder()
.processInstanceId(proInstanceId)
.moveSingleActivityIdToActivityIds("sid-CAD50E6F-7E0C-437D-816B-DDBA1A976A79", targetTaskKeys)
.changeState();

4.主干流程和子流程的退回(没有试验过),官方提供了以下方法:

moveActivityIdToParentActivityId(String currentActivityId, String newActivityId)

moveActivityIdToSubProcessInstanceActivityId(String currentActivityId, String newActivityId, String callActivityId)

3.6 根据流程id查询所有节点

List<HistoricTaskInstance> res = historyService.createHistoricTaskInstanceQuery()
                .processInstanceId(processInsId)
                .includeProcessVariables()
                .orderByHistoricTaskInstanceStartTime().asc()
                .list();

3.7 查询我申请的列表

List<HistoricProcessInstance> res = historyService.createHistoricProcessInstanceQuery()
                .startedBy(userId)
                .orderByProcessInstanceStartTime()
                .desc()
                .list();

3.8 查询我的待办

List<Task> tasks = taskService.createTaskQuery()
                .active()
                .taskCandidateOrAssigned(searchForm.getUserId())
                .orderByTaskCreateTime().desc()
                .list();

3.9 查询我的已办

List<HistoricTaskInstance> res = historyService.createHistoricTaskInstanceQuery()
                .taskAssignee(searchForm.getUserId())
                .finished()
                .orderByHistoricTaskInstanceEndTime().desc()
                .list();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3d导模型赋予材质方法---模大狮模型网

给3D模型赋予材质的方法可以根据您使用的软件和工作流程而有所不同。以下是一般的步骤&#xff0c;您可以根据自己的情况进行调整&#xff1a; 准备模型&#xff1a;首先&#xff0c;确保您的模型已经完全建模并进行了UV映射。UV映射是将2D纹理坐标应用到3D模型表面的过程&…

17 位社区大咖寄语,Seata 进入 Apache 孵化器

北京时间 2023 年 10 月 29 日&#xff0c;分布式事务开源项目 Seata 正式通过 Apache 基金会的投票决议&#xff0c;以全票通过的优秀表现正式成为 Apache 孵化器项目&#xff01; 根据 Apache 基金会邮件列表显示&#xff0c;在包含 13 个约束性投票 (binding votes) 和 6 个…

MVC模式

Model-View-Controller : 模型-视图-控制器模式&#xff0c;用于应用程序的分层开发。 Model(模型)&#xff1a;代表一个存取数据的对象。也可以带有逻辑&#xff0c;在数据变化时更新控制器。 View(视图)&#xff1a;代表模型包含的数据的可视化。 Controller(控制器)&#xf…

提取视频中的某一帧画面,留住视频中的美好瞬间

你是否曾经被视频中的某一帧画面深深吸引&#xff0c;却又惋惜于无法将其永久保存&#xff1f;现在&#xff0c;有了我们【媒体梦工厂】&#xff0c;这一遗憾将成为过去&#xff0c;这个软件可以提取视频中的某一帧保存为图片&#xff0c;为你留住那些稍纵即逝的美好。 所需工…

《数字电子电路》 课程设计:十字路口红绿灯自动控制系统(上)(multisim仿真及PCB实现)

&#xff08;一&#xff09;前言 本系列文章就笔者在大二下学期进行《数字电子线路》课程设计的题目&#xff1a;十字路口红绿灯自动控制系统 进行详细的讲解&#xff0c;希望对读者有所帮助。 &#xff08;二&#xff09;目录 一、主要指标及要求 二、电路工作原理 1、工作原…

uniapp组件库Modal 模态框 的使用方法

目录 #平台差异说明 #基本使用 #传入富文本内容 #异步关闭 #点击遮罩关闭 #控制模态框宽度 #自定义样式 #缩放效果 #API #Props #Event #Method #Slots 弹出模态框&#xff0c;常用于消息提示、消息确认、在当前页面内完成特定的交互操作。 #平台差异说明 AppH5微…

基于SpringBoot + vue 的旅游景区网站系统设计与实现

目录 一、需求分析 二、技术分析 三、功能分析 四、数据设计 五、界面展示 六、资源获取 一、需求分析 旅游推荐网站是指提供旅游相关信息、服务和建议的在线平台。这些网站旨在帮助用户规划和安排旅行&#xff0c;提供目的地信息、酒店预订、机票预订、租车服务、旅行建…

力扣题目训练(1)

2024年1月25日力扣题目训练 2024年1月25日力扣题目训练225. 用队列实现栈257. 二叉树的所有路径258. 各位相加81. 搜索旋转排序数组 II82. 删除排序链表中的重复元素 II30. 串联所有单词的子串 2024年1月25日力扣题目训练 2024年1月25日开始进行编程训练&#xff0c;今天主要是…

C++入门【33-C++ 类 对象】

C 在 C 语言的基础上增加了面向对象编程&#xff0c;C 支持面向对象程序设计。类是 C 的核心特性&#xff0c;通常被称为用户定义的类型。 类用于指定对象的形式&#xff0c;是一种用户自定义的数据类型&#xff0c;它是一种封装了数据和函数的组合。类中的数据称为成员变量&a…

大模型竞速下半场,探索大模型应用的奥秘

8年前&#xff0c;我与朋友联合创立了对话式RPA开源框架Wechaty。如今&#xff0c;Wechaty已成为GitHub上Star最多的对话式RPA开源框架。 5年前&#xff0c;我为百度制作了《对话式AI》系列视频课程。至今&#xff0c;该课程仍在百度AI官网开放&#xff0c;帮助百万名对话式AI…

shell 脚本4

循环语句 echo命令 1.标准输出 2.用来调整脚本里面的格式 echo -e \b 删除b前面的数字 echo -e \t &#xff08;横向制表符 横向tab键&#xff09; echo -e \c 删除c后面的字符&#xff0c;并且不换行 echo -e \n 换行 自动硬盘分区 新建一块磁盘/dev/sdb 可以…

22款奔驰GLS450升级中规主机 激活九大功能

平行进口奔驰GLS450 语音小助手要说英语 十分的麻烦 而且也没有导航&#xff0c;原厂记录仪也减少了 很不方便 那要怎么解决呢 往下看&#xff0c;星骏汇小许Xjh15863 其实很简单&#xff0c;我们只需要更换一台中规的新主机就可以实现以下功能&#xff1a; ①中国地图 ②语…

计算机设计大赛 医学大数据分析 - 心血管疾病分析

文章目录 1 前言1 课题背景2 数据处理3 数据可视化4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的心血管疾病分析 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9…

雷盛537威士忌:特别的味蕾与风格

雷盛537威士忌&#xff0c;一款源自英国苏格兰的好蒸馏酒&#xff0c;以其特别的味蕾和风格赢得了全球品鉴者的赞誉。这款威士忌在酿造过程中充分体现了苏格兰威士忌的传统工艺与精神&#xff0c;同时又融入了现代的创新元素&#xff0c;使其成为威士忌爱好者不容错过的佳品。 …

muduo网络库剖析——事件循环与线程EventLoopThread接口类

muduo网络库剖析——事件循环与线程EventLoopThread接口类 前情从muduo到my_muduo 概要bindunique_lock< mutex > 与 condition_variable 框架与细节成员函数使用方法 源码结尾 前情 从muduo到my_muduo 作为一个宏大的、功能健全的muduo库&#xff0c;考虑的肯定是众多…

还在纠结怎么选随身WiFi的,看看这个!随身WiFi靠谱榜第一名推荐!哪个随身WiFi最好用

你是不是还在头疼如何挑选一个靠谱好用的随身WiFi呢&#xff1f;市场上的随身WiFi产品五花八门&#xff0c;每次购买随身WiFi都会被坑&#xff0c;差点就失去购买的信心了~别灰心&#xff0c;一篇文章教你如何挑选一个靠谱好用的随身WiFi&#xff01; 一、5大购买原则&#xff…

使用GtkSharp下载zip包过慢问题解决方案

背景 安装GtkSharp这个包准备使用C#进行跨平台窗体应用程序开发&#xff0c;运行时发现其需要从github上下载【https://github.com/GtkSharp/Dependencies/raw/master/gtk-3.24.24.zip】这个依赖包&#xff0c;不知道是被墙了还是咋的&#xff0c;下载超时导致运行失败。 解决…

【java面试】Spring

目录 1. Spring 介绍1.1 Spring 的优点1.2 Spring 的缺点1.3 详细讲解一下核心容器&#xff08;spring context应用上下文) 模块 2. Spring俩大核心概念IOC&#xff0c;Inversion of Control&#xff0c;控制反转AOP(Aspect-OrientedProgramming)&#xff0c;面向切面编程Sprin…

【第十六课】哈希表(acwing-841字符串哈希 / 详解 / 优秀的文章推荐 / c++代码)

目录 思想 代码如下 一些解释 1.基数P的选择 2.unsigned long long类型 可能需要看的文章博客 思想 咳咳&#xff0c;感觉这个刚开始第一遍接触的时候很抽象&#xff0c;&#xff0c;&#xff0c;还好网友们很强&#xff0c;有很通俗的解释办法hh。 字符串的哈希核心思…

3.7V升5V 12V 24V 30V 24V/5A升压恒压芯片-H6922

升压恒压芯片是一种电源管理集成电路&#xff0c;其主要功能是将输入电压提升到稳定的输出电压。以下是升压恒压芯片的一些优点&#xff1a; 稳定输出电压&#xff1a;升压恒压芯片能够确保输出电压维持在一个恒定的水平&#xff0c;不受输入电压波动的影响。这有助于提供稳定的…