SpringBoot整合Activiti7——实战之出差流程(分支)

news2025/2/22 19:53:24

文章目录

    • 代码实现
      • 部署流程
      • 启动流程
      • 查询任务
      • 填写出差审批单
      • 经理审批
      • xml文件


出差流程:开始 - 填写出差表单 - 判断(出差天数大于等于5)- 副经理审批 - 否则总经理审批 - 完成

代码实现

在这里插入图片描述

部署流程

	@Test
    public void testDeployProcess() throws IOException {
        ClassPathResource classPathResource = new ClassPathResource("/processes/businessTrip.bpmn20.xml");

        // 部署流程 act_re_procdef
        Deployment deploy = repositoryService.createDeployment()
                .addInputStream(classPathResource.getPath(), classPathResource.getInputStream())
                .deploy();
        System.out.println("deploy = " + deploy);
    }

启动流程

	@Test
    public void testStartProcess() {
        //启动流程时传递的参数列表 这里根据实际情况 也可以选择不传
        Map<String, Object> variables = new HashMap<>();
        variables.put("userId", "654321");

        // 获取流程定义的Key
        String processDefinitionKey = "businessTrip";
        // 定义businessKey
        String businessKey = processDefinitionKey + ":" + "10001"; // 假设模拟出差业务id为1001

        // 设置启动流程的人
        Authentication.setAuthenticatedUserId("admin");

        // 启动流程 act_hi_procinst act_ru_variable act_ru_task
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
        System.out.println("processInstance = " + processInstance);
        System.out.println("流程实例ID:" + processInstance.getId());
    }

查询任务

将启动流程后的流程实例ID更换到下面

	@Test
    public void queryTaskList() {
        // 查询任务 act_ru_task
        TaskQuery taskQuery = taskService.createTaskQuery()
                .processInstanceId("eb12004e-35cc-11ee-86ca-18c04dcd4aee") // 流程实例ID
                .orderByTaskCreateTime().asc();

        List<Task> taskList = taskQuery.list();
        System.out.println("taskList = " + taskList);
    }

填写出差审批单

将任务ID更换到下面,businessTripDay天数决定是副经理还是总经理审批,这里演示副经理审批

	@Test
    public void completeBusinessTripFormTask() {
        // 根据id查询任务 act_ru_task
        Task task = taskService.createTaskQuery().taskId("eb1534a5-35cc-11ee-86ca-18c04dcd4aee").singleResult();

        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("userId", "654321");
        hashMap.put("businessTripDay", 6);
        hashMap.put("businessTripReason", "工作要求");
        hashMap.put("businessTripTime", new Date());

        // 完成任务,填写任务则更新为审核任务,任务ID改变
        taskService.complete(task.getId(), hashMap);
    }

经理审批

将启动流程后的流程实例ID更换到下面

	@Test
    public void managerAudit() {
        Task task = taskService.createTaskQuery().processInstanceId("eb12004e-35cc-11ee-86ca-18c04dcd4aee").singleResult();

        // 添加备注
        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("remark", "好的好的");

        // 部门审批完成任务,任务列表为空
        taskService.complete(task.getId(), hashMap);
    }

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:activiti="http://activiti.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.activiti.org/processdef">
  <process id="businessTrip" name="出差审批流程" isExecutable="true">
    <documentation>模拟出差审批流程</documentation>
    <startEvent id="sid-40bbaa52-1762-4d02-bc33-de0711df52b1"/>
    <userTask id="sid-705c697a-da0a-4f03-be4e-bb5e004d8e84" name="填写出差申请表" activiti:assignee="${userId}"/>
    <sequenceFlow id="sid-d2004ccc-e090-4a88-810b-ae9c242f86c1" sourceRef="sid-40bbaa52-1762-4d02-bc33-de0711df52b1" targetRef="sid-705c697a-da0a-4f03-be4e-bb5e004d8e84"/>
    <userTask id="sid-1b84b348-d685-4f5b-956b-7f9b141a033b" name="副经理审批" activiti:assignee="assistantManager"/>
    <userTask id="sid-081f1339-30af-4a73-a635-cef4c7df443f" name="总经理审批" activiti:assignee="generalManager"/>
    <sequenceFlow id="sid-bcb30913-26c8-425b-9e12-a5eb837135ea" sourceRef="sid-963c7b54-0d9e-4ad7-8196-b042da146972" targetRef="sid-081f1339-30af-4a73-a635-cef4c7df443f" name="出差天数大于5">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${businessTripDay>5}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="sid-fd792f97-88a7-4ec9-a6f9-d59dbaff36e5" sourceRef="sid-963c7b54-0d9e-4ad7-8196-b042da146972" targetRef="sid-1b84b348-d685-4f5b-956b-7f9b141a033b" name="出差天数小于等于5">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${businessTripDay<=5}]]></conditionExpression>
    </sequenceFlow>
    <exclusiveGateway id="sid-963c7b54-0d9e-4ad7-8196-b042da146972"/>
    <sequenceFlow id="sid-15d3c29e-8a8e-4e16-8f0b-c412a744a55d" sourceRef="sid-705c697a-da0a-4f03-be4e-bb5e004d8e84" targetRef="sid-963c7b54-0d9e-4ad7-8196-b042da146972"/>
    <endEvent id="sid-1edf278b-8514-4508-b021-febf84e20aa6"/>
    <sequenceFlow id="sid-eba388e8-e36e-4287-afbd-4d1cefa9b7e2" sourceRef="sid-1b84b348-d685-4f5b-956b-7f9b141a033b" targetRef="sid-1edf278b-8514-4508-b021-febf84e20aa6"/>
    <sequenceFlow id="sid-58e34e3b-9930-41e1-88fa-ff9ac2d6ae43" sourceRef="sid-081f1339-30af-4a73-a635-cef4c7df443f" targetRef="sid-1edf278b-8514-4508-b021-febf84e20aa6"/>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_businessTrip">
    <bpmndi:BPMNPlane bpmnElement="businessTrip" id="BPMNPlane_businessTrip">
      <bpmndi:BPMNShape id="shape-6889163e-5924-4958-9630-5aef6a1407d2" bpmnElement="sid-40bbaa52-1762-4d02-bc33-de0711df52b1">
        <omgdc:Bounds x="-359.90002" y="14.450001" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-120fece5-c27c-41dc-839d-3515b392d9c5" bpmnElement="sid-705c697a-da0a-4f03-be4e-bb5e004d8e84">
        <omgdc:Bounds x="-282.8" y="-10.550003" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-00ed7b82-f499-41ea-95b4-a6d114b81e8b" bpmnElement="sid-d2004ccc-e090-4a88-810b-ae9c242f86c1">
        <omgdi:waypoint x="-329.90002" y="29.45"/>
        <omgdi:waypoint x="-282.8" y="29.449997"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-a89b21c1-09a8-4380-b241-1552764b67f3" bpmnElement="sid-1b84b348-d685-4f5b-956b-7f9b141a033b">
        <omgdc:Bounds x="-46.51999" y="-84.67001" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-6fce5208-d3c8-4ba6-8f5b-1a9cb4531677" bpmnElement="sid-081f1339-30af-4a73-a635-cef4c7df443f">
        <omgdc:Bounds x="-46.51999" y="59.827385" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-3cd10768-0633-41fe-ae15-5ffe61dbb41e" bpmnElement="sid-bcb30913-26c8-425b-9e12-a5eb837135ea">
        <omgdi:waypoint x="-120.71713" y="49.45"/>
        <omgdi:waypoint x="-46.51999" y="79.827385"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="edge-d2964b44-96a8-4450-82fe-b30e3b6468a9" bpmnElement="sid-fd792f97-88a7-4ec9-a6f9-d59dbaff36e5">
        <omgdi:waypoint x="-120.71713" y="9.449995"/>
        <omgdi:waypoint x="-46.51999" y="-24.670013"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-8a0a6467-da96-406e-8b05-3f5594d16616" bpmnElement="sid-963c7b54-0d9e-4ad7-8196-b042da146972">
        <omgdc:Bounds x="-140.71713" y="9.449995" width="40.0" height="40.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-c7511b2f-cfc6-4d42-95d4-fe10114b5585" bpmnElement="sid-15d3c29e-8a8e-4e16-8f0b-c412a744a55d">
        <omgdi:waypoint x="-182.79999" y="29.449997"/>
        <omgdi:waypoint x="-140.71713" y="29.449995"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="shape-86d2ca12-5f5b-4924-ac7e-19b22661721e" bpmnElement="sid-1edf278b-8514-4508-b021-febf84e20aa6">
        <omgdc:Bounds x="132.9632" y="14.449997" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-f3516bc6-ee13-40f3-9901-5a25b58c933f" bpmnElement="sid-eba388e8-e36e-4287-afbd-4d1cefa9b7e2">
        <omgdi:waypoint x="53.48001" y="-24.670013"/>
        <omgdi:waypoint x="132.9632" y="21.949997"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="edge-98f0c74a-cbe7-4eda-b223-d82ee7c34b89" bpmnElement="sid-58e34e3b-9930-41e1-88fa-ff9ac2d6ae43">
        <omgdi:waypoint x="53.48001" y="99.827385"/>
        <omgdi:waypoint x="132.9632" y="29.449997"/>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

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

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

相关文章

Vue2(完结):replace属性、编程式路由导航、缓存路由组件、两个新钩子、路由守卫、history与hash

一、router-link的replace属性 1、作用&#xff1a;控制路由跳转时操作浏览器历史记录的模式 2、浏览器的历史记录有两种写入方式&#xff1a;分别为push和replace&#xff0c;push是追加历史记录&#xff0c;replace是替换当前记录。路由跳转时候默认为push 3、如何开启repla…

golang语言系列:Web框架+路由 之 Echo

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是golang语言系列文章&#xff0c;本篇主要对 Echo 框架 的基本使用方法 进行学习 1.Echo是什么 Go 有众多Web框架&#xff0c;Echo 是其中的一个&#xff0c;官网介绍Echo有高性能、可扩展性、极简的特点。使用E…

spark3.x新特性

Adaptive Query Execution自适应查询(SparkSQL) 由于缺乏或者不准确的数据统计信息&#xff08;元数据&#xff09;和对成本的错误估算&#xff08;执行计划调度&#xff09;导致生成的初始执行计划不理想 在Spark3.x版本提供Adaptive Query Execution自适应查询技术 通过在”…

[计算机效率] 文本编辑工具:Notepad++

3.12 文本编辑工具&#xff1a;Notepad Notepad是一款免费的文本编辑器&#xff0c;适用于Windows操作系统。它具有轻量级、高效、可定制性强等特点&#xff0c;并且支持多种语言。以下是关于Notepad的详细介绍&#xff1a; 功能特点&#xff1a; 多语言支持&#xff1a;Note…

JVM 组成

文章目录 概要JVM 是 Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09;JVM 的主要组成部分运行流程&#xff1a;程序计数器堆元空间方法区常量池运行时常量池 概要 JVM 是 Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&…

DHCP工具分配IDRAC IP

环境&#xff1a; 使用windows 笔记本网线直连R440 IDRAC管理口&#xff1b; 服务器保持关机状态&#xff1b;主板有供电。 DHCP工具下载链接&#xff1a; https://www.dhcpserver.de/cms/download/ 以下为具体测试使用方法&#xff1a; 1&#xff0e;给自己的本地网卡配置一…

idea快速找到maven中冲突的依赖,解决依赖冲突

红色实线&#xff1a;冲突&#xff0c;红色虚线&#xff1a;依赖于同一个包的多版本 选择包&#xff0c;右键Excluede&#xff0c;排除 问题原因: 一个项目中需要jar包A和jar包B,而jar包A和jar包B都需要依赖jar包C,但A需要1.2.16版本的C,B需要1.2.17版本的C,这时候就可能会产…

debian的使用笔记

1. XP风格任务栏 安装 debian-live-12.5.0-amd64-xfce.iso 后&#xff0c;把下面的任务栏删除&#xff0c;把上面的任务栏移到下面&#xff0c;然后设置如下选项 2. 命令自动补全 sudo apt install bash-completion 3. 找不到命令 sudo apt install command-not-found sudo…

手写简易操作系统(二十一)--硬盘驱动

前情提要 上面一节我们实现了 malloc 和 free 的系统调用&#xff0c;这一节我们来实现硬盘驱动。 一、硬盘分区 我们的文件系统安装在一块全新的硬盘中&#xff0c;我们先创建它&#xff0c;然后在给他分区。 1.1、创建硬盘 首先是创建&#xff0c;这个之前我们已经干过一…

coooooode

1.局部变量在栈上初始化&#xff1a;.stack .const 2.未初始化的全局变量在.bss区 3.初始化的全局变量在.data和.const区

PyQt ui2py 使用PowerShell将ui文件转为py文件并且将导入模块PyQt或PySide转换为qtpy模块开箱即用

前言 由于需要使用不同的qt环境&#xff08;PySide&#xff0c;PyQt&#xff09;所以写了这个脚本&#xff0c;使用找到的随便一个uic命令去转换ui文件&#xff0c;然后将导入模块换成qtpy这个通用库(支持pyside2-6&#xff0c;pyqt5-6)&#xff0c;老版本的是Qt.py(支持pysid…

顶顶通呼叫中心中间件-话术编辑器机器人转人工坐席配置(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-话术编辑器机器人转人工座席配置(mod_cti基于FreeSWITCH) 配置方法 一、ACD排队转接 二、伴随转接 比如你设置的通知规则是任意满足一个就通知那么通话时间设置为10 秒那样他只要通话时间到10秒他就会转坐席。 如果要转人工的时侯转手机可以这样配置 把…

JVM垃圾收集——相关概念

本贴讲解的内容包括System.gc()、内存溢出、内存泄漏、STW机制以及垃圾收集的串行、并行、并发三种情况&#xff0c;还有强引用、软引用、弱引用、虚引用四种引用。 1、System.gc()的理解 在默认情况下&#xff0c;通过System.gc()或者Runtime.getRuntime().gc()的调用&#…

深度学习500问——Chapter05: 卷积神经网络(CNN)(4)

文章目录 5.18 卷积神经网络凸显共性的方法 5.18.1 局部连接 5.18.2 权值共享 5.18.3 池化操作 5.19 全连接、局部连接、全卷积与局部卷积 5.20 局部卷积的应用 5.21 NetVLAD池化 参考文献 5.18 卷积神经网络凸显共性的方法 5.18.1 局部连接 我们首先了解一个概念&#xff0c…

牛客NC181 单词拆分(一)【中等 动态规划,前缀树 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/c0d32c1ce5744472a01b2351a2c2767f 思路 前缀树动态规划参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规…

Flutter Don‘t use ‘BuildContext‘s across async gaps.

Flutter提示Don‘t use ‘BuildContext‘s across async gaps.的解决办法—flutter里state的mounted属性

基于Pytorch+昇腾NPU部署baichuan2-7B大模型

一、模型介绍 Baichuan 2 是百川智能推出的新一代开源大语言模型&#xff0c;采用 2.6 万亿 Tokens 的高质量语料训练。Baichuan 2 在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。 它基于 Transformer 结构&#xff0c;在大约1.2万亿 tokens…

EasyExcel 模板导出excel、合并单元格及单元格样式设置。 Freemarker导出word 合并单元格

xls文件&#xff1a; 后端代码&#xff1a; InputStream filePath this.getClass().getClassLoader().getResourceAsStream(templateFile);// 根据模板文件生成目标文件ExcelWriter excelWriter EasyExcel.write(orgInfo.getFilename()).excelType(ExcelTypeEnum.XLS).withTe…

NIO基础知识

在学习Netty之前先要学习一下NIO相关的知识&#xff0c;因为Netty是基于NIO搭建的一套网络编程框架。 一. NIO 基础 non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从…

01-​JVM学习记录-类加载器

一、类加载器子系统 1. 作用-运输工具&#xff08;快递员&#xff09; 负责从文件系统或者网络中加载Class文件&#xff08;DNA元数据模板&#xff09;&#xff0c;Class文件开头有特定标识&#xff0c;魔术&#xff0c;咖啡杯壁&#xff08;class文件存于本地硬盘&#xff0c…