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

文章目录

    • 代码实现
      • 部署流程
      • 启动流程
      • 查询任务
      • 填写出差审批单
      • 经理审批
      • 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>

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

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

相关文章

物联网实战--入门篇之(九)安卓QT--开发框架

目录 一、QT简介 二、开发环境 三、编码风格 四、设计框架 五、总结 一、QT简介 QT是一款以C为基础的开发工具&#xff0c;已经包含了很多常用的库&#xff0c;除了基本的GUI以外&#xff0c;还有网络、数据库、多媒体、进程通信、串口、蓝牙等常用库&#xff0c;开发起来…

mysql 正则表达式查询

学习了mysql 连接查询和子查询和myql join连接&#xff0c;接下来学习下正则表达式查询。正则表达式的规则都是相似的。 8&#xff0c;使用正则表达式查询 正则表达式通常被用来检索或替换那些符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。例如从…

绿色wordpress外贸建站模板

绿色wordpress外贸建站模板 https://www.mymoban.com/wordpress/6.html

PAC下的ROP问题

Armv8.3-A引入了pointer authentication选项。 pointer authentication可以减轻ROP攻击。 为了防止ROP攻击&#xff0c;在函数开始时&#xff0c;LR寄存器中的返回地址被签名。这意味着在寄存器的高位添加了一个PAC。在返回之前&#xff0c;使用PAC对返回地址进行验证。如果检查…

Linux 环境下 Redis基础配置及开机自启

Linux 环境下 Redis基础配置及开机自启 linux环境安装redis<redis-6.0.5.tar.gz> 1-redis基本安装配置 解压 获取到tar包后&#xff0c;解压到相关目录&#xff0c;一般是将redis目录放在usr/local/redis目录下&#xff0c;可以使用-C指定到解压下目录 tar -zvxf re…

HCIA-RS基础-以太网设备工作原理

目录 以太网设备工作原理1. HUB 的工作原理2. L2 交换机的工作原理3. L3 交换机的工作原理 总结 以太网设备工作原理 以太网是一种常用的局域网技术&#xff0c;用于在计算机网络中传输数据。在以太网中&#xff0c;有几种常见的设备&#xff0c;包括 HUB、L2 交换机和 L3 交换…

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

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

BIM转Power BI数据集

在本博客中&#xff0c;我们将了解如何使用从 SSAS 表格、Power BI Desktop 或 Power BI 服务数据集中提取的 Model.bim 文件在本地或 PBI 服务上生成新数据集。 1、设置&#xff08;SSAS 表格和 PBI 服务通用&#xff09; 我建议你创建一个专门用于此任务的新 Python 环境&a…

hibernate session接口

hibernate session接口 Session接口是hibernate向应用程序提供的操纵数据库的最主要的接口&#xff0c;提供了保存、更新、删除和加载Java对象的方法。 session具有一个缓存&#xff0c;位于缓存中的对象成为持久化对象&#xff0c;和数据库中的相关记录对应。session能够在某些…

vue3中怎么点击按钮就上传文件

<el-button text type"primary" click"importBillExcel(row)">导入账单</el-button> // 导入客户账单Excel表 const importBillExcel (row) > {let input document.createElement(input)input.type fileinput.accept .pdf, .png, .zip…

摸鱼123

摸鱼https://toyaml.com/windowsupdate.html

3D模型格式转换工具HOOPS Exchange如何将3D文件加载到PRC数据结构中?

HOOPS Exchange是一款高效的数据访问工具&#xff0c;专为开发人员设计&#xff0c;用于在不同的CAD&#xff08;计算机辅助设计&#xff09;系统之间进行高保真的数据转换和交换。由Tech Soft 3D公司开发&#xff0c;它支持广泛的CAD文件格式&#xff0c;包括但不限于AutoCAD的…

js手持小风扇

文章目录 1. 演示效果2. 分析思路3. 代码实现 1. 演示效果 2. 分析思路 先编写动画&#xff0c;让风扇先转起来。使用 js 控制动画的持续时间。监听按钮的点击事件&#xff0c;在事件中修改元素的animation-duration属性。 3. 代码实现 <!DOCTYPE html> <html lang…

Spring IOC控制反转、DI注入以及配置

1.使用xml的方式进行配置IOC容器&#xff0c;首先引入依赖 在Resource资源下配置&#xff0c;applicationContext.xml ,刷新mevan后可以直接选择配置spring.xml文件 <!-- spring核心用来管理bean --><dependency><groupId>org.springframework</g…

代码随想录算法训练营Day42|LC416 分割等和子集

一句话总结&#xff1a;背包问题。 原题链接&#xff1a;416 分割等和子集 拿到题先明确这是动态规划的题&#xff0c;具体类型是01背包问题。到了题目解法这里&#xff0c;首先判断数组加和是否为偶数&#xff0c;否则return false。然后就是01背包问题的解题思路了。具体地&…

InterliJ IDEA基本设置

安装好idea后&#xff0c;将软件打开&#xff0c;可以进行基础设置 1.打开软件&#xff0c;先安装插件-汉化包&#xff08;不推荐&#xff0c;最好使用英文版&#xff09;&#xff0c;本次我们使用汉化版本完成基本设置&#xff0c;后期希望大家适应英文版的开发环境。&#x…

【Vue3源码学习】— CH2.7 Computed: Vue 3 计算属性深入解析

Computed: Vue 3 计算属性深入解析 1.计算属性的基本用法2. ComputedRefImpl 类深入解析JavaScript 中的 getter 函数 3. 计算属性的创建&#xff1a;computed 方法解析3.1 源码解析3.2 使用示例 4. 计算属性的工作原理5. 手动实现简化的计算属性6. 结语 在 Vue 3 的响应式系统…

蓝桥杯-dfs搜索模板题(一)

蓝桥杯-dfs搜索模板题&#xff08;一&#xff09; P2089 烤鸡P1088 火星人P1149 火柴棒等式P2036 PERKETP1135 奇怪的电梯结语 P2089 烤鸡 对于每个位置枚举数字 #include<bits/stdc.h>using namespace std;const int N1010;int n;int arr[N];//临时方案 int res0;//方案…

【闲聊】-网页划词翻译插件

英文之痛 作为程序猿&#xff0c;常常需要接触外文网站&#xff0c;以前很痛苦&#xff0c;现在大模型时代有很多智能工具可以直接翻译&#xff0c;翻译的虽然越来越好&#xff0c;但是还是不如直接看英文能理解本义&#xff0c;相信我&#xff0c;看翻译的理解和看原文的理解…

AJAX —— 学习(二)

目录 一、利用 JSON 字符串 返回数据 &#xff08;一&#xff09;基础代码 &#xff08;二&#xff09;原理及实现 二、nodmon 工具 自动重启服务 &#xff08;一&#xff09;用途 &#xff08;二&#xff09;下载 &#xff08;三&#xff09;使用 三、IE 缓存问题 &a…