Quellcode durchsuchen

feat(activiti7-demo): add activiti7 workflow demo

WanJL vor 5 Tagen
Ursprung
Commit
ef9617eb85

+ 39 - 0
activiti7-demo/.gitignore

@@ -0,0 +1,39 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+.kotlin
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store

+ 78 - 0
activiti7-demo/pom.xml

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.4</version>
+    </parent>
+    <groupId>com.sf</groupId>
+    <artifactId>activiti7-demo</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+
+    <dependencies>
+        <!--安全框架 spring security -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+        <!--springboot与activiti7整合的starter-->
+        <dependency>
+            <groupId>org.activiti</groupId>
+            <artifactId>activiti-spring-boot-starter</artifactId>
+            <version>7.1.0.M6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <!-- mybatis -->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.1.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+
+        <!-- mysql驱动 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <!-- 单元测试 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.16.22</version>
+        </dependency>
+    </dependencies>
+
+    <!--如果activiti依赖下载不了,可以配置如下地址进行下载-->
+    <repositories>
+        <repository>
+            <id>activiti-releases</id>
+            <url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases</url>
+        </repository>
+    </repositories>
+
+</project>

+ 20 - 0
activiti7-demo/src/main/java/com/sf/Application.java

@@ -0,0 +1,20 @@
+package com.sf;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title Application
+ * @description
+ * @create 2026/3/15
+ */
+@SpringBootApplication
+public class Application {
+    public static void main(String[] args) {
+        SpringApplication.run(Application.class, args);
+    }
+
+}

+ 18 - 0
activiti7-demo/src/main/resources/application.yaml

@@ -0,0 +1,18 @@
+server:
+  port: 8989
+spring:
+  datasource:
+    username: root
+    password: 123456
+    url: jdbc:mysql://127.0.0.1:3306/activiti_db?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    #日志的相关配置
+  activiti:
+    #是否让activiti自动创建所有的历史表
+    history-level: full
+    #是否需要使用历史表,默认false不使用,而配置true是使用历史表
+    db-history-used: true
+    #流程自动部署,关闭,需要手动部署流程 服务启动的时候自动检查resources目录下的bpmn文件 如果为true自动部署流程
+    check-process-definitions: false
+    #关闭启动服务自动框架部署
+    deployment-mode: never-fail

+ 62 - 0
activiti7-demo/src/main/resources/bpmn/diagram-2.bpmn

@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:activiti="http://activiti.org/bpmn" id="sample-diagram" targetNamespace="http://activiti.org/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+  <bpmn2:process id="Process_2" name="请假申请单2" isExecutable="true">
+    <bpmn2:startEvent id="Event_06gl3p5">
+      <bpmn2:outgoing>Flow_063xmay</bpmn2:outgoing>
+    </bpmn2:startEvent>
+    <bpmn2:userTask id="Activity_02wm2ez" name="填写请假单" activiti:assignee="张三">
+      <bpmn2:incoming>Flow_063xmay</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_16lwbz6</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_063xmay" sourceRef="Event_06gl3p5" targetRef="Activity_02wm2ez" />
+    <bpmn2:userTask id="Activity_1nbzj3o" name="经理A审批" activiti:assignee="李四">
+      <bpmn2:incoming>Flow_16lwbz6</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_171qsr0</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_16lwbz6" sourceRef="Activity_02wm2ez" targetRef="Activity_1nbzj3o" />
+    <bpmn2:userTask id="Activity_0e8l7cx" name="经理B审批" activiti:assignee="王五">
+      <bpmn2:incoming>Flow_171qsr0</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_035txov</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_171qsr0" sourceRef="Activity_1nbzj3o" targetRef="Activity_0e8l7cx" />
+    <bpmn2:endEvent id="Event_1b4nk5g">
+      <bpmn2:incoming>Flow_035txov</bpmn2:incoming>
+    </bpmn2:endEvent>
+    <bpmn2:sequenceFlow id="Flow_035txov" sourceRef="Activity_0e8l7cx" targetRef="Event_1b4nk5g" />
+  </bpmn2:process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_2">
+      <bpmndi:BPMNEdge id="Flow_063xmay_di" bpmnElement="Flow_063xmay">
+        <di:waypoint x="228" y="370" />
+        <di:waypoint x="280" y="370" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_16lwbz6_di" bpmnElement="Flow_16lwbz6">
+        <di:waypoint x="380" y="370" />
+        <di:waypoint x="430" y="370" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_171qsr0_di" bpmnElement="Flow_171qsr0">
+        <di:waypoint x="530" y="370" />
+        <di:waypoint x="610" y="370" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_035txov_di" bpmnElement="Flow_035txov">
+        <di:waypoint x="710" y="370" />
+        <di:waypoint x="772" y="370" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="Event_06gl3p5_di" bpmnElement="Event_06gl3p5">
+        <dc:Bounds x="192" y="352" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_02wm2ez_di" bpmnElement="Activity_02wm2ez">
+        <dc:Bounds x="280" y="330" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_1nbzj3o_di" bpmnElement="Activity_1nbzj3o">
+        <dc:Bounds x="430" y="330" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_0e8l7cx_di" bpmnElement="Activity_0e8l7cx">
+        <dc:Bounds x="610" y="330" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Event_1b4nk5g_di" bpmnElement="Event_1b4nk5g">
+        <dc:Bounds x="772" y="352" width="36" height="36" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn2:definitions>

BIN
activiti7-demo/src/main/resources/bpmn/diagram-2.jpg


+ 87 - 0
activiti7-demo/src/main/resources/bpmn/diagram-3-2.bpmn

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:activiti="http://activiti.org/bpmn" id="sample-diagram" targetNamespace="http://activiti.org/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+  <bpmn2:process id="Process_5" name="请假申请单" isExecutable="true">
+    <bpmn2:startEvent id="StartEvent_1">
+      <bpmn2:outgoing>Flow_1gcl954</bpmn2:outgoing>
+    </bpmn2:startEvent>
+    <bpmn2:userTask id="Activity_1o5gyjp" name="填写请假单" activiti:assignee="${a1}">
+      <bpmn2:incoming>Flow_1gcl954</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_07ccdt8</bpmn2:outgoing>
+      <bpmn2:outgoing>Flow_0onrp4u</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_1gcl954" sourceRef="StartEvent_1" targetRef="Activity_1o5gyjp" />
+    <bpmn2:userTask id="Activity_0fmc1ko" name="部门经理审批" activiti:assignee="${a2}">
+      <bpmn2:incoming>Flow_07ccdt8</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_1jcxvgk</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_07ccdt8" name="请假天数小于3天" sourceRef="Activity_1o5gyjp" targetRef="Activity_0fmc1ko">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${days&lt;3}</bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:endEvent id="Event_1m4zvar">
+      <bpmn2:incoming>Flow_1jcxvgk</bpmn2:incoming>
+      <bpmn2:incoming>Flow_0uovyco</bpmn2:incoming>
+    </bpmn2:endEvent>
+    <bpmn2:sequenceFlow id="Flow_1jcxvgk" sourceRef="Activity_0fmc1ko" targetRef="Event_1m4zvar" />
+    <bpmn2:userTask id="Activity_0uwd6ti" name="总经理审批" activiti:assignee="${a3}">
+      <bpmn2:incoming>Flow_0onrp4u</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_0uovyco</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_0onrp4u" name="请假天数大于3天" sourceRef="Activity_1o5gyjp" targetRef="Activity_0uwd6ti">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${days&gt;3}</bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow id="Flow_0uovyco" sourceRef="Activity_0uwd6ti" targetRef="Event_1m4zvar" />
+  </bpmn2:process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_5">
+      <bpmndi:BPMNEdge id="Flow_1gcl954_di" bpmnElement="Flow_1gcl954">
+        <di:waypoint x="318" y="258" />
+        <di:waypoint x="390" y="258" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_07ccdt8_di" bpmnElement="Flow_07ccdt8">
+        <di:waypoint x="490" y="258" />
+        <di:waypoint x="545" y="258" />
+        <di:waypoint x="545" y="160" />
+        <di:waypoint x="650" y="160" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="516" y="206" width="89" height="27" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1jcxvgk_di" bpmnElement="Flow_1jcxvgk">
+        <di:waypoint x="750" y="160" />
+        <di:waypoint x="786" y="160" />
+        <di:waypoint x="786" y="258" />
+        <di:waypoint x="822" y="258" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_0onrp4u_di" bpmnElement="Flow_0onrp4u">
+        <di:waypoint x="490" y="258" />
+        <di:waypoint x="540" y="258" />
+        <di:waypoint x="540" y="340" />
+        <di:waypoint x="650" y="340" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="515" y="296" width="84" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_0uovyco_di" bpmnElement="Flow_0uovyco">
+        <di:waypoint x="750" y="340" />
+        <di:waypoint x="786" y="340" />
+        <di:waypoint x="786" y="258" />
+        <di:waypoint x="822" y="258" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="Event_1m4zvar_di" bpmnElement="Event_1m4zvar">
+        <dc:Bounds x="822" y="240" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_0fmc1ko_di" bpmnElement="Activity_0fmc1ko">
+        <dc:Bounds x="650" y="120" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_0uwd6ti_di" bpmnElement="Activity_0uwd6ti">
+        <dc:Bounds x="650" y="300" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_1o5gyjp_di" bpmnElement="Activity_1o5gyjp">
+        <dc:Bounds x="390" y="218" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
+        <dc:Bounds x="282" y="240" width="36" height="36" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn2:definitions>

+ 87 - 0
activiti7-demo/src/main/resources/bpmn/diagram-3.bpmn

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:activiti="http://activiti.org/bpmn" id="sample-diagram" targetNamespace="http://activiti.org/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+  <bpmn2:process id="Process_4" name="请假申请单" isExecutable="true">
+    <bpmn2:startEvent id="StartEvent_1">
+      <bpmn2:outgoing>Flow_1gcl954</bpmn2:outgoing>
+    </bpmn2:startEvent>
+    <bpmn2:userTask id="Activity_1o5gyjp" name="填写请假单" activiti:assignee="${a1}">
+      <bpmn2:incoming>Flow_1gcl954</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_07ccdt8</bpmn2:outgoing>
+      <bpmn2:outgoing>Flow_0onrp4u</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_1gcl954" sourceRef="StartEvent_1" targetRef="Activity_1o5gyjp" />
+    <bpmn2:userTask id="Activity_0fmc1ko" name="部门经理审批" activiti:assignee="${a2}">
+      <bpmn2:incoming>Flow_07ccdt8</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_1jcxvgk</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_07ccdt8" name="请假天数小于等于3天" sourceRef="Activity_1o5gyjp" targetRef="Activity_0fmc1ko">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${days&lt;=3}</bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:endEvent id="Event_1m4zvar">
+      <bpmn2:incoming>Flow_1jcxvgk</bpmn2:incoming>
+      <bpmn2:incoming>Flow_0uovyco</bpmn2:incoming>
+    </bpmn2:endEvent>
+    <bpmn2:sequenceFlow id="Flow_1jcxvgk" sourceRef="Activity_0fmc1ko" targetRef="Event_1m4zvar" />
+    <bpmn2:userTask id="Activity_0uwd6ti" name="总经理审批" activiti:assignee="${a3}">
+      <bpmn2:incoming>Flow_0onrp4u</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_0uovyco</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_0onrp4u" name="请假天数大于3天" sourceRef="Activity_1o5gyjp" targetRef="Activity_0uwd6ti">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression">${days&gt;3}</bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow id="Flow_0uovyco" sourceRef="Activity_0uwd6ti" targetRef="Event_1m4zvar" />
+  </bpmn2:process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_4">
+      <bpmndi:BPMNEdge id="Flow_1gcl954_di" bpmnElement="Flow_1gcl954">
+        <di:waypoint x="318" y="258" />
+        <di:waypoint x="390" y="258" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_07ccdt8_di" bpmnElement="Flow_07ccdt8">
+        <di:waypoint x="490" y="258" />
+        <di:waypoint x="545" y="258" />
+        <di:waypoint x="545" y="160" />
+        <di:waypoint x="650" y="160" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="516" y="206" width="89" height="27" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1jcxvgk_di" bpmnElement="Flow_1jcxvgk">
+        <di:waypoint x="750" y="160" />
+        <di:waypoint x="786" y="160" />
+        <di:waypoint x="786" y="258" />
+        <di:waypoint x="822" y="258" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_0onrp4u_di" bpmnElement="Flow_0onrp4u">
+        <di:waypoint x="490" y="258" />
+        <di:waypoint x="540" y="258" />
+        <di:waypoint x="540" y="340" />
+        <di:waypoint x="650" y="340" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="515" y="296" width="84" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_0uovyco_di" bpmnElement="Flow_0uovyco">
+        <di:waypoint x="750" y="340" />
+        <di:waypoint x="786" y="340" />
+        <di:waypoint x="786" y="258" />
+        <di:waypoint x="822" y="258" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="Event_1m4zvar_di" bpmnElement="Event_1m4zvar">
+        <dc:Bounds x="822" y="240" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_0fmc1ko_di" bpmnElement="Activity_0fmc1ko">
+        <dc:Bounds x="650" y="120" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_0uwd6ti_di" bpmnElement="Activity_0uwd6ti">
+        <dc:Bounds x="650" y="300" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_1o5gyjp_di" bpmnElement="Activity_1o5gyjp">
+        <dc:Bounds x="390" y="218" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
+        <dc:Bounds x="282" y="240" width="36" height="36" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn2:definitions>

BIN
activiti7-demo/src/main/resources/bpmn/diagram-3.png


+ 50 - 0
activiti7-demo/src/main/resources/bpmn/diagram-uel.bpmn

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:activiti="http://activiti.org/bpmn" id="sample-diagram" targetNamespace="http://activiti.org/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+  <bpmn2:process id="Process_3" name="请假申请单" isExecutable="true">
+    <bpmn2:startEvent id="StartEvent_1">
+      <bpmn2:outgoing>Flow_1gcl954</bpmn2:outgoing>
+    </bpmn2:startEvent>
+    <bpmn2:userTask id="Activity_1o5gyjp" name="填写请假单" activiti:assignee="${a1}">
+      <bpmn2:incoming>Flow_1gcl954</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_07ccdt8</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_1gcl954" sourceRef="StartEvent_1" targetRef="Activity_1o5gyjp" />
+    <bpmn2:userTask id="Activity_0fmc1ko" name="经理审批" activiti:assignee="${a2}">
+      <bpmn2:incoming>Flow_07ccdt8</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_1jcxvgk</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_07ccdt8" sourceRef="Activity_1o5gyjp" targetRef="Activity_0fmc1ko" />
+    <bpmn2:endEvent id="Event_1m4zvar">
+      <bpmn2:incoming>Flow_1jcxvgk</bpmn2:incoming>
+    </bpmn2:endEvent>
+    <bpmn2:sequenceFlow id="Flow_1jcxvgk" sourceRef="Activity_0fmc1ko" targetRef="Event_1m4zvar" />
+  </bpmn2:process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_3">
+      <bpmndi:BPMNEdge id="Flow_1gcl954_di" bpmnElement="Flow_1gcl954">
+        <di:waypoint x="448" y="258" />
+        <di:waypoint x="500" y="258" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_07ccdt8_di" bpmnElement="Flow_07ccdt8">
+        <di:waypoint x="600" y="258" />
+        <di:waypoint x="670" y="258" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_1jcxvgk_di" bpmnElement="Flow_1jcxvgk">
+        <di:waypoint x="770" y="258" />
+        <di:waypoint x="822" y="258" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
+        <dc:Bounds x="412" y="240" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_1o5gyjp_di" bpmnElement="Activity_1o5gyjp">
+        <dc:Bounds x="500" y="218" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Event_1m4zvar_di" bpmnElement="Event_1m4zvar">
+        <dc:Bounds x="822" y="240" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_0fmc1ko_di" bpmnElement="Activity_0fmc1ko">
+        <dc:Bounds x="670" y="218" width="100" height="80" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn2:definitions>

+ 50 - 0
activiti7-demo/src/main/resources/bpmn/diagram.bpmn

@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:activiti="http://activiti.org/bpmn" id="sample-diagram" targetNamespace="http://activiti.org/bpmn" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+  <bpmn2:process id="Process_1" name="请假申请单" isExecutable="true">
+    <bpmn2:startEvent id="Event_06gl3p5">
+      <bpmn2:outgoing>Flow_063xmay</bpmn2:outgoing>
+    </bpmn2:startEvent>
+    <bpmn2:userTask id="Activity_02wm2ez" name="填写请假单" activiti:assignee="张三">
+      <bpmn2:incoming>Flow_063xmay</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_16lwbz6</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_063xmay" sourceRef="Event_06gl3p5" targetRef="Activity_02wm2ez" />
+    <bpmn2:userTask id="Activity_1nbzj3o" name="经理审批" activiti:assignee="李四">
+      <bpmn2:incoming>Flow_16lwbz6</bpmn2:incoming>
+      <bpmn2:outgoing>Flow_00jz1e6</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="Flow_16lwbz6" sourceRef="Activity_02wm2ez" targetRef="Activity_1nbzj3o" />
+    <bpmn2:endEvent id="Event_1ygb7l6">
+      <bpmn2:incoming>Flow_00jz1e6</bpmn2:incoming>
+    </bpmn2:endEvent>
+    <bpmn2:sequenceFlow id="Flow_00jz1e6" sourceRef="Activity_1nbzj3o" targetRef="Event_1ygb7l6" />
+  </bpmn2:process>
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
+      <bpmndi:BPMNEdge id="Flow_063xmay_di" bpmnElement="Flow_063xmay">
+        <di:waypoint x="228" y="370" />
+        <di:waypoint x="280" y="370" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_16lwbz6_di" bpmnElement="Flow_16lwbz6">
+        <di:waypoint x="380" y="370" />
+        <di:waypoint x="470" y="370" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="Flow_00jz1e6_di" bpmnElement="Flow_00jz1e6">
+        <di:waypoint x="570" y="370" />
+        <di:waypoint x="662" y="370" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="Event_06gl3p5_di" bpmnElement="Event_06gl3p5">
+        <dc:Bounds x="192" y="352" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_02wm2ez_di" bpmnElement="Activity_02wm2ez">
+        <dc:Bounds x="280" y="330" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Event_1ygb7l6_di" bpmnElement="Event_1ygb7l6">
+        <dc:Bounds x="662" y="352" width="36" height="36" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="Activity_1nbzj3o_di" bpmnElement="Activity_1nbzj3o">
+        <dc:Bounds x="470" y="330" width="100" height="80" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn2:definitions>

BIN
activiti7-demo/src/main/resources/bpmn/diagram.jpg


+ 170 - 0
activiti7-demo/src/test/java/com/sf/ACTQuickStarTest.java

@@ -0,0 +1,170 @@
+package com.sf;
+
+
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.repository.Deployment;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title ACTQuickStarTest
+ * @description 流程部署:添加资源文件、获取部署信息、部署时间
+ * @create 2026/3/15
+ */
+@SpringBootTest
+public class ACTQuickStarTest {
+    /*
+        使用Activiti提供的API快速实现流程
+     */
+    //用来部署流程定义
+    @Autowired
+    private RepositoryService repositoryService;
+
+    @Test
+    public void deployProcess() {
+        //资源文件:
+        String fileName = "bpmn/diagram.bpmn";
+        String imageFile = "bpmn/diagram.jpg";
+        //定义流程
+        Deployment deployment = repositoryService.createDeployment()//创建流程
+                .addClasspathResource(fileName)//添加资源文件
+                .addClasspathResource(imageFile)//添加资源文件
+                .name("Process_1")
+                .deploy();
+        //部署流程
+        System.out.println("流程部署ID:" + deployment.getId());
+        System.out.println("流程部署名称:" + deployment.getName());
+    }
+
+    /**
+     * 流程实例
+     */
+    @Autowired
+    private RuntimeService runtimeService;
+
+    /**
+     * 初始化流程实例
+     */
+    @Test
+    public void initProcessInstance() {
+        //流程定义key
+        ProcessInstance processInstance =
+                runtimeService.startProcessInstanceByKey("Process_1", "business_key_01");
+        //business_key是业务表示,通常是业务表的主键,业务标识和流程实例一一对应。业务表示来源与业务系统,存储业务标识就是根据业务表示来关联查询业务系统的数据。
+        //比如,这个请假流程中,有一个表是专门用来存储请假单的。
+        //那么不同的人执行请假流程,就会有单独的流程实例,那么对应的请假单表里面的数据也是不一样的,那么对应的业务标识就是请假单的ID(主键)。
+        System.out.println("流程实例ID:" + processInstance.getProcessInstanceId()); //流程实例ID
+        System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());//流程定义ID
+
+    }
+
+    //任务服务
+    @Autowired
+    private TaskService taskService;
+
+    /**
+     * 查询我的代办任务
+     */
+    @Test
+    public void getTaskByAssignee() {
+        //根据条件获取任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_1")  //流程定义key
+                .taskAssignee("张三")//任务执行人
+                .processInstanceBusinessKey("business_key_01")  //业务标识
+                .singleResult();//返回单个结果
+        System.out.println("任务ID:" + task.getId());
+        System.out.println("任务名称:" + task.getName());
+        System.out.println("任务创建时间:" + task.getCreateTime());
+        System.out.println("任务办理人:" + task.getAssignee());
+    }
+
+    @Test
+    public void completeTask() {
+        String assignee = "张三";
+        String businessKey = "business_key_01";
+        //根据流程业务键和任务负责人查询任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_1")  //流程定义key
+                .taskAssignee(assignee)//任务执行人
+                .processInstanceBusinessKey(businessKey)  //业务标识
+                .singleResult();//返回单个结果
+        //执行任务
+        if (task != null) {
+            Map<String,Object> variables = new HashMap<>();
+            variables.put("userName","张三");
+            variables.put("starDate","2026-03-15");
+            variables.put("days",1);
+            variables.put("reason","出去打假");
+            taskService.complete(task.getId(), variables);
+            System.out.println("任务完成,任务ID:" + task.getId());
+        }
+
+
+    }
+    /**
+     * 经理审批:同意
+     */
+    @Test
+    public void approvalOk(){
+        //设置当前的用户
+        Authentication authentication = new UsernamePasswordAuthenticationToken("李四", "123456");
+        SecurityContextHolder.getContext().setAuthentication(authentication);
+
+        //查询任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_1")  //流程定义key
+                .taskAssignee("李四")//任务执行人
+                .processInstanceBusinessKey("business_key_01")  //业务标识
+                .singleResult();
+
+        //完成任务
+        if (task != null){
+            Map<String,Object> variables = new HashMap<>();
+            variables.put("approvalStatus","同意");
+            variables.put("approvalNote","去吧...");
+            taskService.complete(task.getId(), variables);
+            System.out.println("任务完成,任务ID:" + task.getId());
+        }
+    }
+
+    /**
+     * 经理审批:不同意
+     */
+    @Test
+    public void approvalNoOk(){
+        String assignee = "李四";
+        //查询任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_1")  //流程定义key
+                .taskAssignee(assignee)//任务执行人
+                .processInstanceBusinessKey("business_key_01")  //业务标识
+                .singleResult();
+        String reason="不行,我们就是假的...";
+        if (task != null){
+            Map<String,Object> variables = new HashMap<>();
+            variables.put("approvalStatus","不同意");
+            variables.put("approvalNote",reason);
+
+            //记录流程变量
+            runtimeService.setVariables(task.getProcessInstanceId(), variables);
+            //添加流程变量,删除流程实例,表示任务被拒绝
+            runtimeService.deleteProcessInstance(task.getProcessInstanceId(), reason);
+        }
+    }
+
+
+}

+ 145 - 0
activiti7-demo/src/test/java/com/sf/ACTQuickStarTest02.java

@@ -0,0 +1,145 @@
+package com.sf;
+
+
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.repository.Deployment;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title ACTQuickStarTest
+ * @description 流程部署:添加资源文件、获取部署信息、部署时间
+ * @create 2026/3/15
+ */
+@SpringBootTest
+public class ACTQuickStarTest02 {
+    /*
+        使用Activiti提供的API快速实现流程
+     */
+    //用来部署流程定义
+    @Autowired
+    private RepositoryService repositoryService;
+
+    @Test
+    public void deployProcess() {
+        //资源文件:
+        String fileName = "bpmn/diagram-2.bpmn";
+        String imageFile = "bpmn/diagram-2.jpg";
+        //定义流程
+        Deployment deployment = repositoryService.createDeployment()//创建流程
+                .addClasspathResource(fileName)//添加资源文件
+                .addClasspathResource(imageFile)//添加资源文件
+                .name("Process_2")
+                .deploy();
+        //部署流程
+        System.out.println("流程部署ID:" + deployment.getId());
+        System.out.println("流程部署名称:" + deployment.getName());
+    }
+
+    /**
+     * 流程实例
+     */
+    @Autowired
+    private RuntimeService runtimeService;
+
+    /**
+     * 初始化流程实例
+     */
+    @Test
+    public void initProcessInstance() {
+        //流程定义key
+        ProcessInstance processInstance =
+                runtimeService.startProcessInstanceByKey("Process_2", "business_key_02");
+        //business_key是业务表示,通常是业务表的主键,业务标识和流程实例一一对应。业务表示来源与业务系统,存储业务标识就是根据业务表示来关联查询业务系统的数据。
+        //比如,这个请假流程中,有一个表是专门用来存储请假单的。
+        //那么不同的人执行请假流程,就会有单独的流程实例,那么对应的请假单表里面的数据也是不一样的,那么对应的业务标识就是请假单的ID(主键)。
+        System.out.println("流程实例ID:" + processInstance.getProcessInstanceId()); //流程实例ID
+        System.out.println("流程定义ID:" + processInstance.getProcessDefinitionId());//流程定义ID
+
+    }
+
+    //任务服务
+    @Autowired
+    private TaskService taskService;
+
+    /**
+     * 查询我的代办任务
+     */
+    @Test
+    public void getTaskByAssignee() {
+        //根据条件获取任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_2")  //流程定义key
+                .taskAssignee("张三")//任务执行人
+                .processInstanceBusinessKey("business_key_02")  //业务标识
+                .singleResult();//返回单个结果
+        System.out.println("任务ID:" + task.getId());
+        System.out.println("任务名称:" + task.getName());
+        System.out.println("任务创建时间:" + task.getCreateTime());
+        System.out.println("任务办理人:" + task.getAssignee());
+    }
+
+    @Test
+    public void completeTask() {
+        String assignee = "张三";
+        String businessKey = "business_key_02";
+        //根据流程业务键和任务负责人查询任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_2")  //流程定义key
+                .taskAssignee(assignee)//任务执行人
+                .processInstanceBusinessKey(businessKey)  //业务标识
+                .singleResult();//返回单个结果
+        //执行任务
+        if (task != null) {
+            Map<String,Object> variables = new HashMap<>();
+            variables.put("userName","张三");
+            variables.put("starDate","2026-03-16");
+            variables.put("days",10);
+            variables.put("reason","出去潇洒");
+            taskService.complete(task.getId(), variables);
+            System.out.println("任务完成,任务ID:" + task.getId());
+        }
+
+
+    }
+
+    /**
+     * 经理审批:不同意
+     */
+    @Test
+    public void approvalNoOk(){
+        String assignee = "李四";
+        //查询任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_2")  //流程定义key
+                .taskAssignee(assignee)//任务执行人
+                .processInstanceBusinessKey("business_key_02")  //业务标识
+                .singleResult();
+        String reason="不行,就是不行...";
+        if (task != null){
+            Map<String,Object> variables = new HashMap<>();
+            variables.put("approvalStatus","不同意");
+            variables.put("approvalNote",reason);
+
+            //记录流程变量
+            runtimeService.setVariables(task.getProcessInstanceId(), variables);
+            //添加流程变量,删除流程实例,表示任务被拒绝
+            runtimeService.deleteProcessInstance(task.getProcessInstanceId(), reason);
+        }
+    }
+
+
+}

+ 128 - 0
activiti7-demo/src/test/java/com/sf/ACTTest03.java

@@ -0,0 +1,128 @@
+package com.sf;
+
+
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.repository.Deployment;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title ACTTest03
+ * @description 审批判断,3天以内部门经理审批,3天以上总经理审批
+ * @create 2026/3/22
+ */
+@SpringBootTest
+public class ACTTest03 {
+    //用来部署流程定义
+    @Autowired
+    private RepositoryService repositoryService;
+    //流程实例
+    @Autowired
+    private RuntimeService runtimeService;
+    //任务服务
+    @Autowired
+    private TaskService taskService;
+
+    /**
+     * 1、流程部署
+     */
+    @Test
+    public void deployProcess() {
+        //1、BPMN资源文件
+        String fileName = "bpmn/diagram-3.bpmn";
+        //2、定义流程
+        Deployment deployment = repositoryService.createDeployment()//创建流程
+                .addClasspathResource(fileName)//添加资源文件
+                .name("Process_4")
+                .deploy();
+        System.out.println("流程部署ID:" + deployment.getId());
+        System.out.println("流程部署名称:" + deployment.getName());
+    }
+    /**
+     * 2、启动流程实例---带参数--(这个方法是重复调用的,每次请假都需要创建一个实例)
+     */
+    @Test
+    public void initProcessInstance() {
+        //1、准备流程变量
+        Map<String, Object> variables = new HashMap<>();
+        variables.put("a1", "陈1");  //业务参数1  填写请假单的人
+        variables.put("a2", "王2");  //业务参数2  部门经理
+        variables.put("a3", "刘3");  //业务参数3  总经理
+        //2、启动流程实例
+        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
+                "Process_4",
+                "business_key_04",
+                variables);
+        System.out.println("流程实例ID:" + processInstance.getProcessInstanceId());
+    }
+
+    /**
+     * 3、查询我的代办任务---陈1
+     */
+    @Test
+    public void getTaskByAssignee() {
+        //根据条件获取任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_4")  //流程定义key
+                .taskAssignee("陈1")//任务执行人
+                .singleResult();//返回单个结果
+        System.out.println("任务ID:" + task.getId());
+        System.out.println("任务名称:" + task.getName());
+        System.out.println("任务创建时间:" + task.getCreateTime());
+        System.out.println("任务办理人:" + task.getAssignee());
+    }
+    /**
+     * 4、完成任务--填写申请单
+     */
+    @Test
+    public void completeTask() {
+        String name="陈1";
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_4")  //流程定义key
+                .taskAssignee(name)//任务执行人
+                .singleResult();//返回单个结果
+        if (task == null){
+            System.out.println(name+"没有任务可以执行...");
+        }else {
+            //执行任务
+            Map<String, Object> variables = new HashMap<>();
+            variables.put("userName", "陈1");
+            variables.put("startDate", "2026-3-22");
+            variables.put("days", "5");
+            variables.put("reason", "出去潇洒");
+            //完成任务
+            taskService.complete(task.getId(), variables);
+            System.out.println("完成任务....");
+        }
+    }
+    /**
+     * 4、查询我的代办任务---王2|刘3
+     */
+    @Test
+    public void getTaskByAssignee2() {
+        //根据条件获取任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_4")  //流程定义key
+                .taskAssignee("刘3")//任务执行人
+                .singleResult();//返回单个结果
+        if (task == null)
+        {
+            System.out.println("没有任务可以执行...");
+            return;
+        }
+        System.out.println("任务ID:" + task.getId());
+        System.out.println("任务名称:" + task.getName());
+        System.out.println("任务创建时间:" + task.getCreateTime());
+        System.out.println("任务办理人:" + task.getAssignee());
+    }
+}

+ 128 - 0
activiti7-demo/src/test/java/com/sf/ACTTest04.java

@@ -0,0 +1,128 @@
+package com.sf;
+
+
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.repository.Deployment;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title ACTTest03
+ * @description 审批判断,小于3天部门经理审批,大于3天总经理审批
+ * @create 2026/3/22
+ */
+@SpringBootTest
+public class ACTTest04 {
+    //用来部署流程定义
+    @Autowired
+    private RepositoryService repositoryService;
+    //流程实例
+    @Autowired
+    private RuntimeService runtimeService;
+    //任务服务
+    @Autowired
+    private TaskService taskService;
+
+    /**
+     * 1、流程部署
+     */
+    @Test
+    public void deployProcess() {
+        //1、BPMN资源文件
+        String fileName = "bpmn/diagram-3-2.bpmn";
+        //2、定义流程
+        Deployment deployment = repositoryService.createDeployment()//创建流程
+                .addClasspathResource(fileName)//添加资源文件
+                .name("Process_5")
+                .deploy();
+        System.out.println("流程部署ID:" + deployment.getId());
+        System.out.println("流程部署名称:" + deployment.getName());
+    }
+    /**
+     * 2、启动流程实例---带参数--(这个方法是重复调用的,每次请假都需要创建一个实例)
+     */
+    @Test
+    public void initProcessInstance() {
+        //1、准备流程变量
+        Map<String, Object> variables = new HashMap<>();
+        variables.put("a1", "陈1");  //业务参数1  填写请假单的人
+        variables.put("a2", "王2");  //业务参数2  部门经理
+        variables.put("a3", "刘3");  //业务参数3  总经理
+        //2、启动流程实例
+        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
+                "Process_5",
+                "business_key_05",
+                variables);
+        System.out.println("流程实例ID:" + processInstance.getProcessInstanceId());
+    }
+
+    /**
+     * 3、查询我的代办任务---陈1
+     */
+    @Test
+    public void getTaskByAssignee() {
+        //根据条件获取任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_5")  //流程定义key
+                .taskAssignee("陈1")//任务执行人
+                .singleResult();//返回单个结果
+        System.out.println("任务ID:" + task.getId());
+        System.out.println("任务名称:" + task.getName());
+        System.out.println("任务创建时间:" + task.getCreateTime());
+        System.out.println("任务办理人:" + task.getAssignee());
+    }
+    /**
+     * 4、完成任务--填写申请单
+     */
+    @Test
+    public void completeTask() {
+        String name="陈1";
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_5")  //流程定义key
+                .taskAssignee(name)//任务执行人
+                .singleResult();//返回单个结果
+        if (task == null){
+            System.out.println(name+"没有任务可以执行...");
+        }else {
+            //执行任务
+            Map<String, Object> variables = new HashMap<>();
+            variables.put("userName", "陈1");
+            variables.put("startDate", "2026-3-22");
+            variables.put("days", "3");
+            variables.put("reason", "出去潇洒");
+            //完成任务
+            taskService.complete(task.getId(), variables);
+            System.out.println("完成任务....");
+        }
+    }
+    /**
+     * 4、查询我的代办任务---王2|刘3
+     */
+    @Test
+    public void getTaskByAssignee2() {
+        //根据条件获取任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_5")  //流程定义key
+                .taskAssignee("刘3")//任务执行人
+                .singleResult();//返回单个结果
+        if (task == null)
+        {
+            System.out.println("没有任务可以执行...");
+            return;
+        }
+        System.out.println("任务ID:" + task.getId());
+        System.out.println("任务名称:" + task.getName());
+        System.out.println("任务创建时间:" + task.getCreateTime());
+        System.out.println("任务办理人:" + task.getAssignee());
+    }
+}

+ 48 - 0
activiti7-demo/src/test/java/com/sf/HistoryTest.java

@@ -0,0 +1,48 @@
+package com.sf;
+
+
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.history.HistoricProcessInstanceQuery;
+import org.activiti.engine.history.HistoricTaskInstance;
+import org.activiti.engine.history.HistoricTaskInstanceQuery;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title HistoryTest
+ * @description
+ * @create 2026/3/15
+ */
+@SpringBootTest
+public class HistoryTest {
+    @Autowired
+    private HistoryService historyService;
+    @Test
+    public void getHistoryList(){
+        HistoricTaskInstanceQuery tasked = historyService.createHistoricTaskInstanceQuery()//创建历史任务查询
+                .includeProcessVariables()  //包含流程变量
+                .orderByHistoricTaskInstanceEndTime()
+                .desc()
+                .finished()//只查询已经结束的流程实例
+                .taskAssignee("张三");
+        List<HistoricTaskInstance> list = tasked.list();
+        for (HistoricTaskInstance task : list) {
+            System.out.println("任务ID:" + task.getId());
+            System.out.println("任务名称:" + task.getName());
+            System.out.println("任务创建时间:" + task.getCreateTime());
+            System.out.println("任务办理人:" + task.getAssignee());
+            Map<String, Object> variables = task.getProcessVariables();
+            System.out.println("请假时长:"+variables.get("days"));
+            System.out.println("请假原因:"+variables.get("reason"));
+            System.out.println("--------------------------------------------------");
+        }
+
+    }
+}

+ 87 - 0
activiti7-demo/src/test/java/com/sf/UelTest.java

@@ -0,0 +1,87 @@
+package com.sf;
+
+
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.repository.Deployment;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author WanJl
+ * @version 1.0
+ * @title UelTest
+ * @description
+ * @create 2026/3/22
+ */
+@SpringBootTest
+public class UelTest {
+
+    //用来部署流程定义
+    @Autowired
+    private RepositoryService repositoryService;
+    //流程实例
+    @Autowired
+    private RuntimeService runtimeService;
+
+    //任务服务
+    @Autowired
+    private TaskService taskService;
+
+    /**
+     * 1、流程部署
+     */
+    @Test
+    public void deployProcess() {
+        //1、BPMN资源文件
+        String fileName = "bpmn/diagram-uel.bpmn";
+        //2、定义流程
+        Deployment deployment = repositoryService.createDeployment()//创建流程
+                .addClasspathResource(fileName)//添加资源文件
+                .name("Process_3")
+                .deploy();
+        System.out.println("流程部署ID:" + deployment.getId());
+        System.out.println("流程部署名称:" + deployment.getName());
+    }
+
+    /**
+     * 2、启动流程实例---带参数
+     */
+    @Test
+    public void initProcessInstance() {
+        //1、准备流程变量
+        Map<String, Object> variables = new HashMap<>();
+        variables.put("a1", "赵六");
+        variables.put("a2", "王五");
+        //2、启动流程实例
+        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(
+                "Process_3",
+                "business_key_03",
+                variables);
+        System.out.println("流程实例ID:" + processInstance.getProcessInstanceId());
+    }
+
+    /**
+     * 3、查询我的代办任务
+     */
+    @Test
+    public void getTaskByAssignee() {
+        //根据条件获取任务
+        Task task = taskService.createTaskQuery()//创建任务查询
+                .processDefinitionKey("Process_3")  //流程定义key
+                .taskAssignee("赵六")//任务执行人
+                .singleResult();//返回单个结果
+        System.out.println("任务ID:" + task.getId());
+        System.out.println("任务名称:" + task.getName());
+        System.out.println("任务创建时间:" + task.getCreateTime());
+        System.out.println("任务办理人:" + task.getAssignee());
+    }
+
+}