日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot下的工作流Activiti开发

發布時間:2025/5/22 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot下的工作流Activiti开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.準備pom.xml

<?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>


? ? <groupId>activiti.demo</groupId>

? ? <artifactId>activiti-demo</artifactId>

? ? <version>1.0-SNAPSHOT</version>

? ? <packaging>war</packaging>


? ? <name>activiti-demo</name>

? ? <description>spring-activiti-demo</description>


? ? <parent>

? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? <artifactId>spring-boot-starter-parent</artifactId>

? ? ? ? <version>2.0.2.RELEASE</version>

? ? ? ? <relativePath/>

? ? </parent>


? ? <properties>

? ? ? ? <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

? ? ? ? <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

? ? ? ? <java.version>1.8</java.version>

? ? </properties>


? ? <dependencies>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.projectlombok</groupId>

? ? ? ? ? ? <artifactId>lombok</artifactId>

? ? ? ? ? ? <version>1.16.20</version>

? ? ? ? ? ? <scope>provided</scope>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? <artifactId>spring-boot-starter</artifactId>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? <artifactId>spring-boot-starter-web</artifactId>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.activiti</groupId>

? ? ? ? ? ? <artifactId>activiti-spring-boot-starter-basic</artifactId>

? ? ? ? ? ? <version>6.0.0</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>mysql</groupId>

? ? ? ? ? ? <artifactId>mysql-connector-java</artifactId>

? ? ? ? ? ? <version>5.1.35</version>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? <artifactId>spring-boot-starter-test</artifactId>

? ? ? ? ? ? <scope>test</scope>

? ? ? ? </dependency>

? ? </dependencies>


? ? <build>

? ? ? ? <plugins>

? ? ? ? ? ? <plugin>

? ? ? ? ? ? ? ? <groupId>org.springframework.boot</groupId>

? ? ? ? ? ? ? ? <artifactId>spring-boot-maven-plugin</artifactId>

? ? ? ? ? ? </plugin>

? ? ? ? </plugins>

? ? </build>

</project>

-----------------------------------------------------------------------------------------------------------------------

2.準備流程文件one-task-process.bpmn20.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" 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:tns="http://www.activiti.org/testm1539766523202" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1539766523202" name="" targetNamespace="http://www.activiti.org/testm1539766523202" typeLanguage="http://www.w3.org/2001/XMLSchema">

? ? <process id="leave1" isClosed="false" isExecutable="true" processType="None">

? ? ? ? <startEvent id="_2" name="start"/>

? ? ? ? <userTask activiti:assignee="${leave.userId}" activiti:exclusive="true" id="_3" name="submit"/>

? ? ? ? <exclusiveGateway gatewayDirection="Unspecified" id="_4" name="result"/>

? ? ? ? <userTask activiti:assignee="${leave.approver1}" activiti:exclusive="true" id="_5" name="approve1"/>

? ? ? ? <exclusiveGateway gatewayDirection="Unspecified" id="_6" name="result"/>

? ? ? ? <userTask activiti:assignee="${leave.approver2}" activiti:exclusive="true" id="_7" name="approve2"/>

? ? ? ? <exclusiveGateway gatewayDirection="Unspecified" id="_8" name="result"/>

? ? ? ? <endEvent id="_9" name="end"/>

? ? ? ? <sequenceFlow id="_10" sourceRef="_2" targetRef="_3"/>

? ? ? ? <sequenceFlow id="_11" sourceRef="_3" targetRef="_4"/>

? ? ? ? <sequenceFlow id="_12" name="y" sourceRef="_4" targetRef="_5">

? ? ? ? ? ? <conditionExpression xsi:type="tFormalExpression"><![CDATA[${leave.submit==true}]]></conditionExpression>

? ? ? ? </sequenceFlow>

? ? ? ? <sequenceFlow id="_13" name="n" sourceRef="_4" targetRef="_9">

? ? ? ? ? ? <conditionExpression xsi:type="tFormalExpression"><![CDATA[${leave.submit==false}]]></conditionExpression>

? ? ? ? </sequenceFlow>

? ? ? ? <sequenceFlow id="_14" sourceRef="_5" targetRef="_6"/>

? ? ? ? <sequenceFlow id="_15" name="n" sourceRef="_6" targetRef="_7">

? ? ? ? ? ? <conditionExpression xsi:type="tFormalExpression"><![CDATA[${leave.agree1==true}]]></conditionExpression>

? ? ? ? </sequenceFlow>

? ? ? ? <sequenceFlow id="_16" sourceRef="_7" targetRef="_8"/>

? ? ? ? <sequenceFlow id="_17" name="y" sourceRef="_6" targetRef="_3">

? ? ? ? ? ? <conditionExpression xsi:type="tFormalExpression"><![CDATA[${leave.agree1==false}]]></conditionExpression>

? ? ? ? </sequenceFlow>

? ? ? ? <sequenceFlow id="_18" name="n" sourceRef="_8" targetRef="_3">

? ? ? ? ? ? <conditionExpression xsi:type="tFormalExpression"><![CDATA[${leave.agree2==false}]]></conditionExpression>

? ? ? ? </sequenceFlow>

? ? ? ? <sequenceFlow id="_19" name="y" sourceRef="_8" targetRef="_9">

? ? ? ? ? ? <conditionExpression xsi:type="tFormalExpression"><![CDATA[${leave.agree2==true}]]></conditionExpression>

? ? ? ? </sequenceFlow>

? ? </process>

</definitions>

-----------------------------------------------------------------------------------------------------------------------

3.準備SpringBoot屬性文件application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xh_activiti?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false&autoReconnect=true&failOverReadOnly=false&useUnicode=true&characterEncoding=UTF-8

spring.datasource.username=root

spring.datasource.password=123456

spring.jpa.properties.hibernate.hbm2ddl.auto=update

spring.jpa.show-sql=true

server.port=8082

server.tomcat.uri-encoding=UTF-8


spring.activiti.history-level=full

spring.activiti.database-schema-update=true

spring.activiti.check-process-definitions=false

-----------------------------------------------------------------------------------------------------------------------

4.實體類

包名:com.springboot.demo.domain

類名:Leave

實現:

package com.springboot.demo.domain;


import lombok.Data;


import java.io.Serializable;

import java.util.Date;


/**

?* @ClassName Leave

?* @Description TODO

?* @Author yunshuodeng

?* @Date 2019-05-05 15:47

?* @Version 1.0

?**/

@Data

public class Leave implements Serializable {

? ? private String userId;


? ? private Boolean submit;


? ? private String startDate;


? ? private String endDate;


? ? private float totalDay;


? ? private String desc;


? ? private String taskId;


? ? private String taskName;


? ? private String approver1;


? ? private Boolean agree1;


? ? private String approveDesc1;


? ? private String approver2;


? ? private Boolean agree2;


? ? private String approveDesc2;


? ? private String processId;

}

-----------------------------------------------------------------------------------------------------------------------

5.控制器

包名:com.springboot.demo.controller

類名:LeaveController

實現:

package com.springboot.demo.controller;


import com.springboot.demo.domain.Leave;

import org.activiti.engine.HistoryService;

import org.activiti.engine.ProcessEngine;

import org.activiti.engine.RuntimeService;

import org.activiti.engine.TaskService;

import org.activiti.engine.history.HistoricProcessInstance;

import org.activiti.engine.runtime.ProcessInstance;

import org.activiti.engine.task.Task;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.util.CollectionUtils;

import org.springframework.web.bind.annotation.*;


import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;


/**

?* @ClassName LeaveController

?* @Description TODO

?* @Author yunshuodeng

?* @Date 2019-05-05 15:41

?* @Version 1.0

?**/

@RestController

@RequestMapping("level/v1")

public class LeaveController {

? ? public static final Logger log = LoggerFactory.getLogger(LeaveController.class);


? ? // 注入流程實例進行管理與控制的服務

? ? @Autowired

? ? private RuntimeService runtimeService;


? ? // 注入流程任務進行管理服務

? ? @Autowired

? ? private TaskService taskService;


? ? // 注入流程引擎

? ? @Autowired

? ? private ProcessEngine processEngine;


? ? /**

? ? ?* 部門主管審批

? ? ?* @param leave

? ? ?* @return

? ? ?*/

? ? @RequestMapping(value = "/approve2", method = RequestMethod.POST)

? ? public Map<String, Object> approve2(@RequestBody Leave leave){

? ? ? ? Task task = taskService.createTaskQuery().taskId(leave.getTaskId()).singleResult();

? ? ? ? Map<String, Object> vars = new HashMap<>();

? ? ? ? Leave origin = (Leave) taskService.getVariable(leave.getTaskId(), "leave");

? ? ? ? origin.setApproveDesc2(leave.getApproveDesc2());

? ? ? ? origin.setAgree2(leave.getAgree2());

? ? ? ? vars.put("leave", origin);

? ? ? ? taskService.complete(leave.getTaskId(),vars);

? ? ? ? Map<String, Object> resultMap = new HashMap<>();

? ? ? ? resultMap.put("taskId",task.getId());

? ? ? ? return resultMap;

? ? }


? ? /**

? ? ?* 直接主管審批

? ? ?* @param leave

? ? ?* @return

? ? ?*/

? ? @RequestMapping(value = "/approve1", method = RequestMethod.POST)

? ? public Map<String, Object> approve1(@RequestBody Leave leave){

? ? ? ? Task task = taskService.createTaskQuery().taskId(leave.getTaskId()).singleResult();

? ? ? ? Map<String, Object> vars = new HashMap<>();

? ? ? ? Leave origin = (Leave) taskService.getVariable(leave.getTaskId(), "leave");

? ? ? ? origin.setApproveDesc1(leave.getApproveDesc1());

? ? ? ? origin.setAgree1(leave.getAgree1());

? ? ? ? vars.put("leave", origin);

? ? ? ? taskService.complete(leave.getTaskId(),vars);

? ? ? ? Map<String, Object> resultMap = new HashMap<>();

? ? ? ? resultMap.put("taskId",task.getId());

? ? ? ? return resultMap;

? ? }



? ? /**

? ? ?* 查詢用戶流程

? ? ?* @param userId

? ? ?* @return

? ? ?*/

? ? @RequestMapping(value = "/find", method = RequestMethod.GET)

? ? public Map<String, Object> find(@RequestParam("userId")String userId){

? ? ? ? List<Task> taskList = taskService.createTaskQuery().taskAssignee(userId).list();

? ? ? ? System.out.println(taskList.size());

? ? ? ? List<Leave> resultList = new ArrayList<>();

? ? ? ? if(!CollectionUtils.isEmpty(taskList)){

? ? ? ? ? ? for(Task task : taskList){

? ? ? ? ? ? ? ? Leave leave = (Leave) taskService.getVariable(task.getId(),"leave");

? ? ? ? ? ? ? ? leave.setTaskId(task.getId());

? ? ? ? ? ? ? ? leave.setTaskName(task.getName());

? ? ? ? ? ? ? ? resultList.add(leave);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? Map<String, Object> resultMap = new HashMap<>();

? ? ? ? resultMap.put("datas", resultList);

? ? ? ? return resultMap;

? ? }


? ? /**

? ? ?* 填寫請假單

? ? ?* @param leave

? ? ?* @return

? ? ?*/

? ? @RequestMapping(value = "apply",method = RequestMethod.POST)

? ? public Map<String,Object> apply(@RequestBody Leave leave){

? ? ? ? Task task = taskService.createTaskQuery().processInstanceId(leave.getProcessId()).singleResult();

? ? ? ? Map<String,Object> map = new HashMap<>();

? ? ? ? Leave origin = (Leave) taskService.getVariable(task.getId(),"leave");

? ? ? ? origin.setDesc(leave.getDesc());

? ? ? ? origin.setStartDate(leave.getStartDate());

? ? ? ? origin.setEndDate(leave.getEndDate());

? ? ? ? origin.setTotalDay(leave.getTotalDay());

? ? ? ? origin.setApprover1(leave.getApprover1());

? ? ? ? origin.setApprover2(leave.getApprover2());

? ? ? ? origin.setSubmit(leave.getSubmit());

? ? ? ? map.put("leave",origin);

? ? ? ? taskService.complete(task.getId(),map);


? ? ? ? Map<String,Object> resultMap = new HashMap<>();

? ? ? ? resultMap.put("taskId",task.getId());

? ? ? ? return resultMap;


? ? }


? ? /**

? ? ?* 啟動流程

? ? ?* @param userId

? ? ?* @return

? ? ?*/

? ? @RequestMapping(value = "/start",method = RequestMethod.GET)

? ? public Map<String,Object> start(@RequestParam String userId){

? ? ? ? Map<String,Object> map = new HashMap<>();

? ? ? ? Leave leave = new Leave();

? ? ? ? leave.setUserId(userId);

? ? ? ? map.put("leave",leave);


? ? ? ? ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave1",map);


? ? ? ? Map<String,Object> resultMap = new HashMap<>();

? ? ? ? resultMap.put("processId",processInstance.getId());


? ? ? ? return resultMap;

? ? }


}

-----------------------------------------------------------------------------------------------------------------------

6.啟動應用,并按如下順序進行訪問

1)啟動流程

訪問地址:http://localhost:8082/level/v1/start?userId=10

返回結果:{"processId":"10001"}

2)填寫請假單申請

訪問地址:http://localhost:8082/level/v1/apply

參數列表:

{

"desc":"測試",

"startDate":"2019-05-05",

"endDate":"2019-05-09",

"totalDay":4,

"approver1":11,

"approver2":12,

"submit":true,

"processId":"10001"

}

返回結果:

{

? ? "taskId": "10010"

}

3)查看流程中待辦任務列表

訪問地址:http://localhost:8082/level/v1/find?userId=11

返回結果:{"datas":[{"userId":"10","submit":true,"startDate":"2019-05-05","endDate":"2019-05-09","totalDay":4.0,"desc":"測試","taskId":"10016","taskName":"approve1","approver1":"11","agree1":null,"approveDesc1":null,"approver2":"12","agree2":null,"approveDesc2":null,"processId":null}]}

4)直接領導審批

訪問地址:http://localhost:8082/level/v1/approve1

請求參數:

{

"taskId":10016,

"approveDesc1":"同意",

"agree1":true

}

返回結果:{

? ? "taskId": "10016"

}

5)部門領導審批

查看流程中待辦任務列表

訪問地址:http://localhost:8082/level/v1/find?userId=12

返回結果:

{"datas":[{"userId":"10","submit":true,"startDate":"2019-05-05","endDate":"2019-05-09","totalDay":4.0,"desc":"測試","taskId":"10022","taskName":"approve2","approver1":"11","agree1":true,"approveDesc1":"同意","approver2":"12","agree2":null,"approveDesc2":null,"processId":null}]}

執行審批操作

訪問地址:http://localhost:8082/level/v1/approve2

請求參數:

{

"taskId":10022,

"approveDesc2":"同意",

"agree2":true

}

返回結果:

{

? ? "taskId": "10022"

}


轉載于:https://blog.51cto.com/suyanzhu/2389565

總結

以上是生活随笔為你收集整理的SpringBoot下的工作流Activiti开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 伊伊综合网 | 欧美综合区 | 嫩草av久久伊人妇女超级a | 亚洲人体视频 | 久久综合热 | 欧洲一级片 | 欧美午夜在线视频 | 一区二区三区在线视频播放 | 素人一区二区三区 | 久久艹精品视频 | 性少妇videosexfre | 成人夜视频 | 欧美五月激情 | 黄视频在线 | 国产区在线观看视频 | 一本色道久久综合狠狠躁 | 日韩美一级片 | 4444亚洲人成无码网在线观看 | 日本japanese丰满白浆 | 国产男女在线 | 国内精品视频在线 | 国产香蕉尹人视频在线 | 亚洲香蕉av| 国产自偷自拍 | 国产无遮挡aaa片爽爽 | 日本猛少妇色xxxxx猛叫 | 欧美成人一区二区 | 久久久久久国产精品免费 | 欧美精品一区二 | 日韩人妻精品无码一区二区三区 | 国产精品久久久久久亚洲色 | 久久高清 | 69精品国产 | 一区二区亚洲精品 | 免费在线一区二区三区 | 久久久久黄 | 深爱综合网 | 女生扒开尿口给男生捅 | 国产精品一区二区免费看 | 国产永久精品大片wwwapp | 午夜激情视频在线播放 | 日日夜夜爽爽 | 亚洲大成色 | 成人综合区| 中文字幕不卡 | 国产福利一区在线观看 | 欧美 国产 日本 | 亚洲一区二区三区无码久久 | 亚洲精品成人无码 | 可以直接在线观看的av | 性欧美日韩 | 香蕉视频在线网址 | 亚洲精品乱码久久久久久蜜桃欧美 | 欧美天天性 | 国产精品麻豆入口 | 亚洲free性xxxx护士白浆 | 婷婷色中文字幕 | 国产欧美一区二区三区视频 | 九九色影院 | 国产精品有码 | 麻豆黄色网 | 九九色网| 国产精品一品二区三区的使用体验 | 蜜桃av成人| 秘密基地电影免费版观看国语 | 中文字幕视频网 | 超碰www| 在线播放色| 激情五月综合网 | 久久久久久久久久91 | 另类天堂| 在线观看亚洲av每日更新 | 免费在线一级片 | 国产精品一区在线 | 大白屁股一区二区视频 | 色一涩| 少妇性高潮视频 | 色操插| 国产精品久久久久久久久久妞妞 | 久久三级网 | 美女av网址 | 中文字幕欧美一区 | 天海翼av| 少妇特黄一区二区 | 中文字幕在线高清 | www.猫咪av| 久久香蕉精品视频 | 久久电影一区 | xxxx在线播放| 伊人网综合网 | xxxx国产 | 国产xxxx裸体xxx免费 | 色婷婷综合在线 | 欧美视频一区二区 | 精品美女在线观看 | 色屁屁在线 | 欧美日韩黄色一区二区 | 日毛片| 五月婷婷深深爱 |