SpringBoot整合Activiti7——实战之放假流程(会签)

文章目录

    • 代码实现
      • 部署流程
      • 启动流程
      • 填写放假通知任务
      • 投票审批
      • xml文件


  • 会签场景
    开始 - 填写放假通知单(代理人)- 投票审批(指定多个参与人)- 根据设置的完成条件后,全部参与人必须完成后,自动结束流程
  • 或签场景
    开始 - 填写放假通知单(代理人)- 投票审批(指定多个参与人)- 根据设置的完成条件后,比例数完成,自动结束流程

代码实现

在这里插入图片描述

部署流程

	@Testpublic void deployProcess() throws IOException {ClassPathResource classPathResource = new ClassPathResource("/processes/holiday.bpmn20.xml");Deployment deploy = repositoryService.createDeployment().addInputStream(classPathResource.getPath(), classPathResource.getInputStream()).deploy();System.out.println("deploy = " + deploy);}

启动流程

	@Testpublic void startProcess() {// 设置流程变量Map<String, Object> variables = new HashMap<>();variables.put("applyUserId", APPLY_USER_ID);variables.put("managerList", CollectionUtil.newArrayList("张三", "李四", "王五"));// 获取流程定义的KeyString processDefinitionKey = "holiday";// 定义businessKeyString businessKey = processDefinitionKey + ":" + BUSINESS_ID;// 启动流程ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);System.out.println("processInstance = " + processInstance);// 获取流程变量System.out.println("===================流程变量===================");runtimeService.getVariables(processInstance.getId()).forEach((key, value) -> System.out.println("key:" + key + ",value:" + value));// 输出当前任务列表this.printTaskList(processInstance.getId());}

填写放假通知任务

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

	@Testpublic void fillOutHolidayNotice() {// 查询任务Task task = taskService.createTaskQuery().processInstanceId(PROCESS_INSTANCE_ID).taskAssignee(APPLY_USER_ID).singleResult();// 增加意见taskService.addComment(task.getId(), task.getProcessInstanceId(), "我支持放假的");// 完成任务Map<String, Object> hashMap = new HashMap<>();hashMap.put("days", 10);taskService.complete(task.getId(), hashMap);// 输出当前任务列表this.printTaskList(task.getProcessInstanceId());}

投票审批

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

	@Testpublic void voteAudit() {// 查询任务(代理人分别查询完成)Task task = taskService.createTaskQuery().processInstanceId(PROCESS_INSTANCE_ID).taskAssignee("张三").singleResult();// 增加意见taskService.addComment(task.getId(), task.getProcessInstanceId(), "同意放假");// 完成任务taskService.complete(task.getId());// 输出当前任务列表this.printTaskList(task.getProcessInstanceId());}

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="holiday" name="放假审批流程" isExecutable="true"><documentation>模拟放假审批流程</documentation><startEvent id="sid-f8852670-b815-4f97-84b0-eb11d34d9334" name="开始"/><userTask id="sid-f4101616-870b-45f6-b710-22978eb27828" name="填写放假通知单" activiti:assignee="${applyUserId}"/><userTask id="sid-a6f78e45-6624-4996-869d-ae616b2b78e4" name="投票审批" activiti:assignee="${manager}"><!--  多实例会签  --><multiInstanceLoopCharacteristics isSequential="false" activiti:collection="${managerList}" activiti:elementVariable="manager"><!--isSequential:false表示并行,true串行activiti:collection:多实例人员集合变量activiti:elementVariable:人员集合中的元素变量,这里要UserTask中activiti:assignee的值对应nrOfInstances:总实例数nrOfCompletedInstances:完成数completionCondition:完成条件-->
<!--            <completionCondition><![CDATA[${nrOfCompletedInstances == nrOfInstances}]]></completionCondition>--><completionCondition><![CDATA[${nrOfCompletedInstances/nrOfInstances >= 0.6}]]></completionCondition></multiInstanceLoopCharacteristics></userTask><sequenceFlow id="sid-92f3fd0d-a6ed-45cc-ae12-71adb0d0060b" sourceRef="sid-f8852670-b815-4f97-84b0-eb11d34d9334" targetRef="sid-f4101616-870b-45f6-b710-22978eb27828"/><sequenceFlow id="sid-14fabbf8-263a-4b6b-a8b2-60c494ec52ae" sourceRef="sid-f4101616-870b-45f6-b710-22978eb27828" targetRef="sid-a6f78e45-6624-4996-869d-ae616b2b78e4"/><endEvent id="sid-b9011d2c-1871-49d2-82bb-b521dbd9dfeb" name="结束"/><sequenceFlow id="sid-6aa8c217-001a-43a3-a28b-509edc0100a2" sourceRef="sid-a6f78e45-6624-4996-869d-ae616b2b78e4" targetRef="sid-b9011d2c-1871-49d2-82bb-b521dbd9dfeb"/></process><bpmndi:BPMNDiagram id="BPMNDiagram_holiday"><bpmndi:BPMNPlane bpmnElement="holiday" id="BPMNPlane_holiday"><bpmndi:BPMNShape id="shape-d078e42c-b1e3-4fa1-86fe-6c8f21f5e62e" bpmnElement="sid-f8852670-b815-4f97-84b0-eb11d34d9334"><omgdc:Bounds x="-161.5" y="-32.265995" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-8f198408-3f86-45b6-ab85-4bcf104a9786" bpmnElement="sid-a6f78e45-6624-4996-869d-ae616b2b78e4"><omgdc:Bounds x="64.696" y="-57.265995" width="100.0" height="80.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-6006d1ea-5233-4f69-a21d-c42fb50492aa" bpmnElement="sid-f4101616-870b-45f6-b710-22978eb27828"><omgdc:Bounds x="-93.65202" y="-57.266" width="100.0" height="80.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-a4f60f49-040d-4cae-82db-3502dd77a1ab" bpmnElement="sid-92f3fd0d-a6ed-45cc-ae12-71adb0d0060b"><omgdi:waypoint x="-131.5" y="-17.265995"/><omgdi:waypoint x="-93.65202" y="-17.265999"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="edge-4b34fd90-434d-491d-b1cc-e10431bad198" bpmnElement="sid-14fabbf8-263a-4b6b-a8b2-60c494ec52ae"><omgdi:waypoint x="6.3479767" y="-17.265999"/><omgdi:waypoint x="64.696" y="-17.265995"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-bdb837a7-defc-466a-bfd5-c89d3fac4951" bpmnElement="sid-b9011d2c-1871-49d2-82bb-b521dbd9dfeb"><omgdc:Bounds x="218.34798" y="-32.265995" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-af623160-12e5-40f9-aed5-ee1d597367f3" bpmnElement="sid-6aa8c217-001a-43a3-a28b-509edc0100a2"><omgdi:waypoint x="164.696" y="-17.265995"/><omgdi:waypoint x="218.34798" y="-17.265995"/></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

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

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

相关文章

小米su7全力提高产能,小米su7的这几个问题你都知道吗?车载随身wifi哪款最好用?公认最好的随身wifi格行随身wifi怎么样?

小米汽车官方近日回应网友关切&#xff0c;透露小米SU7非创始版交付进度。工厂正处于生产爬坡阶段&#xff0c;正全力提升产能和物料准备节奏&#xff0c;以加快交付效率。对于锁单后能否调整提车时间&#xff0c;小米汽车表示将与销售沟通协商。 当然关于网友们的问题也进行了…

条码的基础知识

条码的基础知识 条码&#xff1a;条码是由一组按一定编码规则排列的条、空符号组成&#xff0c;用以表示一定的字符、数字及符号组成的信息 一维码 Code 128 Code 128 是一种密度很高的字母数字代码系统&#xff0c;可对其进行双向扫描。此代码系统可编码整个 128 ASCII 字…

Python 类方法注解 @classmethod 作用和意义

classmethod 在Python中&#xff0c;为类的方法使用classmethod装饰器具有以下作用和用途&#xff1a; 访问类属性而不实例化&#xff1a; 类方法能够直接通过cls参数访问类级别的属性、常量或类变量&#xff0c;而无需创建类的实例。这在需要基于类的状态进行操作时非常有用&…

ERROR in [eslint] reorder to top import/first

情景再现&#xff1a;在react开发的时候&#xff0c;导入组件、函数时报错&#xff1a;Import in body of module; reorder to top import/first … 原因&#xff1a;在import语句前有变量声明 解决&#xff1a; 变量的声明&#xff0c;要放在import之后 // 错误示例 import {…

物联网网络传输,STM32和ESP32

2024.4.17 今天主要是记录一下我这个STM32F407和esp8266组成的互联网板子的一些例程运行心得&#xff0c; 下面这个例程是STM32发AT指令给esp8266&#xff0c;使得esp8266作为tcp client连接到我的手机热点&#xff0c;然后我用电脑连接wifi&#xff0c;打开tcp server&#x…

【CDN产品测评-笔记】探索云服务中的安全和性能增强功能

【CDN产品测评-笔记】探索云服务中的安全和性能增强功能 写在最前面1. DNS管理&#xff1a;核心的域名服务功能2. DDoS防护&#xff1a;构筑坚不可摧的防线3. Web防护&#xff1a;智能化的网络攻击防御4. BOT管理&#xff1a;精准识别与流量控制5. 加速服务&#xff1a;提升全球…

【动态规划 区间dp 位运算】3117. 划分数组得到最小的值之和

本文涉及知识点 动态规划 区间dp 位运算 LeetCode3117. 划分数组得到最小的值之和 给你两个数组 nums 和 andValues&#xff0c;长度分别为 n 和 m。 数组的 值 等于该数组的 最后一个 元素。 你需要将 nums 划分为 m 个 不相交的连续 子数组&#xff0c;对于第 ith 个子数组…

【python】ptthon函数自学

print("Hello Python world!") # 变量 message"Hello" print(message) message"Hello Python world!" print(message)# 引号&#xff1a;可以是单&#xff0c;可以是双 messageI told my friend, "Python is my favorite language!" p…

C# 字段和属性的区别

区别 在C#中&#xff0c;字段&#xff08;Field&#xff09;和属性&#xff08;Property&#xff09;都是用来封装对象状态的方式&#xff0c;但它们有以下区别&#xff1a; 访问级别&#xff1a; 字段通常是private&#xff0c;而属性可以有不同级别的访问限制&#xff08;…

JavaScript 实现大数简化,带单位显示

一、场景 在前端展示的数据时&#xff0c;如果数据数值太大&#xff0c;会导致展示的数据非常长&#xff0c;不仅用户不能迅速读出数值大小而且影响美观&#xff0c;此时我们需要将这种大数简化为带单位的数值&#xff0c;如 250000 转为 25.0万。 二、实现函数 // 大数简化函…

各RAID级别的特点以及对应的容量计算方式

RAID&#xff08;Redundant Array of Independent Disks&#xff09;是一种将多个独立的硬盘组合起来以提高数据存储性能、容量或冗余度的技术。在实际项目中&#xff0c;通常采购的磁盘阵列支持设置对应的RAID级别。本人也进行过实战&#xff0c;而现在为了应对软考来总结一下…

【攻防世界】lottery

弱比较代码审计 本题已提供源码&#xff0c;如果没提供&#xff0c;输入/robots.txt&#xff0c;发现/.git function buy($req){require_registered();require_min_money(2);$money $_SESSION[money];//接受用户原有money$numbers $req[numbers];//接受输入的数字$win_num…

【JS】数组去重

方式一&#xff1a;使用 Set const handler (array) > {return [...new Set(array)]; } const array [1, 2, 2, 3, 3, 4, 5, 5]; console.log(handler(array)); // [1, 2, 3, 4, 5]方式二&#xff1a;使用filter const handler (array) > {return array.filter((ite…

pytest的request fixture:实现个性化测试需求

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在前文章中&#xff0c;我们看到pytest_repeat源码中有这…

Android 13 有线以太网静态ip保存逻辑梳理分析

源码环境&#xff1a;高通Android 13 这里特别说明&#xff0c;Android13中&#xff0c;ipconfig.txt配置文件目录有改变 以前&#xff1a;/data/misc/ethernet/ipconfig.txt 最新的有线网配置文件保存目录&#xff1a; /data/misc/apexdata/com.android.tethering/misc/ethe…

C++类和对象第二弹(构造,析构和拷贝构造函数)

目录 前言 1. 类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3. 析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 总结 前言 本文主要讲解类中构造函数、析构函数和拷贝构造函数。关于这三个类中默认成员函数的知识点很多&#xff0c;有许多…

视觉SLAM学习打卡【10】-后端·滑动窗口法位姿图

本节是对上一节BA的进一步简化&#xff0c;旨在提高优化实时性.难点在于位姿图部分的雅可比矩阵求解&#xff08;涉及李代数扰动模型求导&#xff09;&#xff0c;书中的相关推导存在跳步&#xff08;可能数学功底强的人认为过渡的理所当然&#xff09;&#xff0c;笔者参考了知…

【Gradle】Gradle的构建过程

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置&#xff0c;也增加了基于Kotlin语言的kotlin-based DSL&#xff0c;抛弃了基于XML的各种繁琐配置。 面向Java应用为主。当前其支持的语言C、J…

免费网址导航网站源码v1.7.0最新版内置多个模板

效果图 PC端&移动端&#xff08;共有7款主题&#xff09; 1.5IUX搜索 2.Onenav主题 六零二开 3.基于彩虹工具网修改 4.默认主题 5.基于default主题开发 6.极简个人主页主题 7.孤客主题 后台管理效果图 项目说明 孤客导航页&#xff08;LoSFeR&#xff09;是一个…

Zephyr Windows开发环境搭建

Zephyr 如果有错误或未及时更新&#xff0c;请以官网文档为主 官网&#xff1a;https://docs.zephyrproject.org/latest/develop/getting_started/index.htm 下载安装 Chocolatey 这是一个类似于在Linux系统下 yum 和 apt 那样的包管理器 官网&#xff1a;https://chocolat…