diff --git a/pom.xml b/pom.xml
index 1ce5af976..ba9ced2d7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -57,6 +57,9 @@
3.11.0
3.1.2
1.3.0
+
+
+ 7.0.0
@@ -111,6 +114,14 @@
import
+
+ org.flowable
+ flowable-bom
+ ${flowable.version}
+ pom
+ import
+
+
me.zhyd.oauth
@@ -353,6 +364,13 @@
${revision}
+
+
+ org.dromara
+ ruoyi-workflow
+ ${revision}
+
+
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 26cd02333..cbf03ce36 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -75,6 +75,12 @@
ruoyi-demo
+
+
+ org.dromara
+ ruoyi-workflow
+
+
de.codecentric
spring-boot-admin-starter-client
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 847e4c2dd..5589e5864 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -43,7 +43,7 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
- url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+ url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root
password: root
# 从库数据源
@@ -51,7 +51,7 @@ spring:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+ url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username:
password:
# oracle:
diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml
index c8817aae6..b4f4040bd 100644
--- a/ruoyi-admin/src/main/resources/application-prod.yml
+++ b/ruoyi-admin/src/main/resources/application-prod.yml
@@ -46,7 +46,7 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
- url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+ url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root
password: root
# 从库数据源
@@ -54,7 +54,7 @@ spring:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+ url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username:
password:
# oracle:
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 0d334a2d4..a3ea740be 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -266,3 +266,21 @@ websocket:
path: /resource/websocket
# 设置访问源地址
allowedOrigins: '*'
+
+--- #flowable配置
+flowable:
+ async-executor-activate: false #关闭定时任务JOB
+ # 将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。
+ database-schema-update: true
+ activity-font-name: 宋体
+ label-font-name: 宋体
+ annotation-font-name: 宋体
+ # 关闭各个模块生成表,目前只使用工作流基础表
+ idm:
+ enabled: false
+ cmmn:
+ enabled: false
+ dmn:
+ enabled: false
+ app:
+ enabled: false
diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml
index 4044916fb..daff497a0 100644
--- a/ruoyi-modules/pom.xml
+++ b/ruoyi-modules/pom.xml
@@ -14,6 +14,7 @@
ruoyi-generator
ruoyi-job
ruoyi-system
+ ruoyi-workflow
ruoyi-modules
diff --git a/ruoyi-modules/ruoyi-workflow/pom.xml b/ruoyi-modules/ruoyi-workflow/pom.xml
new file mode 100644
index 000000000..f0391e358
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/pom.xml
@@ -0,0 +1,93 @@
+
+
+
+ org.dromara
+ ruoyi-modules
+ ${revision}
+ ../pom.xml
+
+ 4.0.0
+ jar
+ ruoyi-workflow
+
+
+ 工作流模块
+
+
+
+
+
+
+ org.flowable
+ flowable-spring-boot-autoconfigure
+
+
+ org.flowable
+ flowable-spring-security
+
+
+
+
+
+ org.flowable
+ flowable-spring-configurator
+
+
+
+ org.flowable
+ flowable-spring-boot-starter-actuator
+
+
+
+
+ org.flowable
+ flowable-image-generator
+
+
+
+
+ org.flowable
+ flowable-json-converter
+ 6.8.0
+
+
+
+
+ org.apache.xmlgraphics
+ batik-all
+ 1.10
+
+
+ xalan
+ xalan
+
+
+
+
+
+
+ org.dromara
+ ruoyi-system
+
+
+
+ org.dromara
+ ruoyi-common-websocket
+
+
+
+ org.dromara
+ ruoyi-common-mail
+
+
+
+ org.dromara
+ ruoyi-common-sms
+
+
+
+
+
+
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java
new file mode 100644
index 000000000..5ea262d17
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/annotation/FlowListenerAnnotation.java
@@ -0,0 +1,27 @@
+package org.dromara.workflow.annotation;
+
+
+import java.lang.annotation.*;
+
+/**
+ * 流程任务监听注解
+ *
+ * @author may
+ * @date 2023-12-27
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+public @interface FlowListenerAnnotation {
+
+ /**
+ * 流程定义key
+ */
+ String processDefinitionKey();
+
+ /**
+ * 节点id
+ */
+ String taskDefId() default "";
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/PageEntity.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/PageEntity.java
new file mode 100644
index 000000000..cc8aaddd8
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/PageEntity.java
@@ -0,0 +1,28 @@
+package org.dromara.workflow.common;
+
+
+import lombok.Data;
+
+/**
+ * 分页参数
+ *
+ * @author may
+ */
+@Data
+public class PageEntity {
+
+ /**
+ * 当前页码
+ */
+ private Integer pageNum = 0;
+
+ /**
+ * 页容量
+ */
+ private Integer pageSize = 10;
+
+ public Integer getPageNum() {
+ return (pageNum - 1) * pageSize;
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java
new file mode 100644
index 000000000..614f9fffa
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java
@@ -0,0 +1,92 @@
+package org.dromara.workflow.common.constant;
+
+
+/**
+ * 工作流常量
+ *
+ * @author may
+ */
+public interface FlowConstant {
+
+ String MESSAGE_CURRENT_TASK_IS_NULL = "当前任务不存在或你不是任务办理人!";
+
+ String MESSAGE_SUSPENDED = "当前任务已挂起不可审批!";
+
+ /**
+ * 连线
+ */
+ String SEQUENCE_FLOW = "sequenceFlow";
+
+ /**
+ * 并行网关
+ */
+ String PARALLEL_GATEWAY = "parallelGateway";
+
+ /**
+ * 排它网关
+ */
+ String EXCLUSIVE_GATEWAY = "exclusiveGateway";
+
+ /**
+ * 包含网关
+ */
+ String INCLUSIVE_GATEWAY = "inclusiveGateway";
+
+ /**
+ * 结束节点
+ */
+ String END_EVENT = "endEvent";
+
+
+ /**
+ * 流程委派标识
+ */
+ String PENDING = "PENDING";
+
+ /**
+ * 候选人标识
+ */
+ String CANDIDATE = "candidate";
+
+ /**
+ * 会签任务总数
+ */
+ String NUMBER_OF_INSTANCES = "nrOfInstances";
+
+ /**
+ * 正在执行的会签总数
+ */
+ String NUMBER_OF_ACTIVE_INSTANCES = "nrOfActiveInstances";
+
+ /**
+ * 已完成的会签任务总数
+ */
+ String NUMBER_OF_COMPLETED_INSTANCES = "nrOfCompletedInstances";
+
+ /**
+ * 循环的索引值,可以使用elementIndexVariable属性修改loopCounter的变量名
+ */
+ String LOOP_COUNTER = "loopCounter";
+
+ String ZIP = "ZIP";
+
+ /**
+ * 流程实例对象
+ */
+ String PROCESS_INSTANCE_VO = "processInstanceVo";
+
+ /**
+ * 流程发起人
+ */
+ String INITIATOR = "initiator";
+
+ /**
+ * 开启跳过表达式变量
+ */
+ String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED";
+
+ /**
+ * 模型标识key命名规范正则表达式
+ */
+ String MODEL_KEY_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{0,254}$";
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java
new file mode 100644
index 000000000..43204f542
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/BusinessStatusEnum.java
@@ -0,0 +1,93 @@
+package org.dromara.workflow.common.enums;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.StringUtils;
+
+import java.util.Arrays;
+
+/**
+ * 业务状态枚举
+ *
+ * @author may
+ */
+@Getter
+@AllArgsConstructor
+public enum BusinessStatusEnum {
+ /**
+ * 已撤销
+ */
+ CANCEL("cancel", "已撤销"),
+ /**
+ * 草稿
+ */
+ DRAFT("draft", "草稿"),
+ /**
+ * 待审核
+ */
+ WAITING("waiting", "待审核"),
+ /**
+ * 已完成
+ */
+ FINISH("finish", "已完成"),
+ /**
+ * 已作废
+ */
+ INVALID("invalid", "已作废"),
+ /**
+ * 已退回
+ */
+ BACK("back", "已退回"),
+ /**
+ * 已终止
+ */
+ TERMINATION("termination", "已终止");
+
+ /**
+ * 状态
+ */
+ private final String status;
+
+ /**
+ * 描述
+ */
+ private final String desc;
+
+ /**
+ * 获取业务状态
+ *
+ * @param status 状态
+ */
+ public static String findByStatus(String status) {
+ if (StringUtils.isBlank(status)) {
+ return StrUtil.EMPTY;
+ }
+ return Arrays.stream(BusinessStatusEnum.values())
+ .filter(statusEnum -> statusEnum.getStatus().equals(status))
+ .findFirst()
+ .map(BusinessStatusEnum::getDesc)
+ .orElse(StrUtil.EMPTY);
+ }
+
+ /**
+ * 启动流程校验
+ *
+ * @param status 状态
+ */
+ public static void checkStartStatus(String status) {
+ if (WAITING.getStatus().equals(status)) {
+ throw new ServiceException("该单据已提交过申请,正在审批中!");
+ } else if (FINISH.getStatus().equals(status)) {
+ throw new ServiceException("该单据已完成申请!");
+ } else if (INVALID.getStatus().equals(status)) {
+ throw new ServiceException("该单据已作废!");
+ } else if (TERMINATION.getStatus().equals(status)) {
+ throw new ServiceException("该单据已终止!");
+ } else if (StringUtils.isBlank(status)) {
+ throw new ServiceException("流程状态为空!");
+ }
+ }
+}
+
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java
new file mode 100644
index 000000000..d7ba1bf01
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/MessageTypeEnum.java
@@ -0,0 +1,31 @@
+package org.dromara.workflow.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 消息类型枚举
+ *
+ * @author may
+ */
+@Getter
+@AllArgsConstructor
+public enum MessageTypeEnum {
+ /**
+ * 站内信
+ */
+ SYSTEM_MESSAGE("1", "站内信"),
+ /**
+ * 邮箱
+ */
+ EMAIL_MESSAGE("2", "邮箱"),
+ /**
+ * 短信
+ */
+ SMS_MESSAGE("3", "短信");
+
+ private final String code;
+
+ private final String desc;
+}
+
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java
new file mode 100644
index 000000000..03be8dc53
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskStatusEnum.java
@@ -0,0 +1,90 @@
+package org.dromara.workflow.common.enums;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Arrays;
+
+/**
+ * 任务状态枚举
+ *
+ * @author may
+ */
+@Getter
+@AllArgsConstructor
+public enum TaskStatusEnum {
+ /**
+ * 撤销
+ */
+ CANCEL("cancel", "撤销"),
+ /**
+ * 通过
+ */
+ PASS("pass", "通过"),
+ /**
+ * 待审核
+ */
+ WAITING("waiting", "待审核"),
+ /**
+ * 作废
+ */
+ INVALID("invalid", "作废"),
+ /**
+ * 退回
+ */
+ BACK("back", "退回"),
+ /**
+ * 终止
+ */
+ TERMINATION("termination", "终止"),
+ /**
+ * 转办
+ */
+ TRANSFER("transfer", "转办"),
+ /**
+ * 委托
+ */
+ PENDING("pending", "委托"),
+ /**
+ * 抄送
+ */
+ COPY("copy", "抄送"),
+ /**
+ * 加签
+ */
+ SIGN("sign", "加签"),
+ /**
+ * 减签
+ */
+ SIGN_OFF("sign_off", "减签");
+
+ /**
+ * 状态
+ */
+ private final String status;
+
+ /**
+ * 描述
+ */
+ private final String desc;
+
+ /**
+ * 任务业务状态
+ *
+ * @param status 状态
+ */
+ public static String findByStatus(String status) {
+ if (StringUtils.isBlank(status)) {
+ return StrUtil.EMPTY;
+ }
+
+ return Arrays.stream(TaskStatusEnum.values())
+ .filter(statusEnum -> statusEnum.getStatus().equals(status))
+ .findFirst()
+ .map(TaskStatusEnum::getDesc)
+ .orElse(StrUtil.EMPTY);
+ }
+}
+
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
new file mode 100644
index 000000000..31e31e6eb
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActModelController.java
@@ -0,0 +1,135 @@
+package org.dromara.workflow.controller;
+
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.workflow.domain.bo.ModelBo;
+import org.dromara.workflow.domain.vo.ModelVo;
+import org.dromara.workflow.service.IActModelService;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.repository.Model;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+
+/**
+ * 模型管理 控制层
+ *
+ * @author may
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/workflow/model")
+public class ActModelController extends BaseController {
+
+ private final RepositoryService repositoryService;
+
+ private final IActModelService actModelService;
+
+
+ /**
+ * 分页查询模型
+ *
+ * @param modelBo 模型参数
+ */
+ @GetMapping("/list")
+ public TableDataInfo page(ModelBo modelBo) {
+ return actModelService.page(modelBo);
+ }
+
+ /**
+ * 新增模型
+ *
+ * @param modelBo 模型请求对象
+ */
+ @Log(title = "模型管理", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping("/save")
+ public R saveNewModel(@Validated(AddGroup.class) @RequestBody ModelBo modelBo) {
+ return toAjax(actModelService.saveNewModel(modelBo));
+ }
+
+ /**
+ * 查询模型
+ *
+ * @param id 模型id
+ */
+ @GetMapping("/getInfo/{id}")
+ public R getInfo(@NotBlank(message = "模型id不能为空") @PathVariable String id) {
+ return R.ok(actModelService.getInfo(id));
+ }
+
+ /**
+ * 修改模型信息
+ *
+ * @param modelBo 模型数据
+ */
+ @Log(title = "模型管理", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping(value = "/update")
+ public R update(@RequestBody ModelBo modelBo) {
+ return toAjax(actModelService.update(modelBo));
+ }
+
+ /**
+ * 编辑XMl模型
+ *
+ * @param modelBo 模型数据
+ */
+ @Log(title = "模型管理", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping(value = "/editModelXml")
+ public R editModel(@Validated(EditGroup.class) @RequestBody ModelBo modelBo) {
+ return toAjax(actModelService.editModelXml(modelBo));
+ }
+
+ /**
+ * 删除流程模型
+ *
+ * @param ids 模型id
+ */
+ @Log(title = "模型管理", businessType = BusinessType.DELETE)
+ @RepeatSubmit()
+ @DeleteMapping("/{ids}")
+ @Transactional(rollbackFor = Exception.class)
+ public R delete(@NotEmpty(message = "主键不能为空") @PathVariable String[] ids) {
+ Arrays.stream(ids).parallel().forEachOrdered(repositoryService::deleteModel);
+ return R.ok();
+ }
+
+ /**
+ * 模型部署
+ *
+ * @param id 模型id
+ */
+ @Log(title = "模型管理", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping("/modelDeploy/{id}")
+ public R deploy(@NotBlank(message = "模型id不能为空") @PathVariable("id") String id) {
+ return toAjax(actModelService.modelDeploy(id));
+ }
+
+ /**
+ * 导出模型zip压缩包
+ *
+ * @param modelId 模型id
+ * @param response 相应
+ */
+ @GetMapping("/export/zip/{modelId}")
+ public void exportZip(@NotEmpty(message = "模型id不能为空") @PathVariable String modelId,
+ HttpServletResponse response) {
+ actModelService.exportZip(modelId, response);
+ }
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java
new file mode 100644
index 000000000..a19cba152
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/ActProcessDefinitionController.java
@@ -0,0 +1,146 @@
+package org.dromara.workflow.controller;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.workflow.domain.bo.ProcessDefinitionBo;
+import org.dromara.workflow.domain.vo.ProcessDefinitionVo;
+import org.dromara.workflow.service.IActProcessDefinitionService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 流程定义管理 控制层
+ *
+ * @author may
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/workflow/processDefinition")
+public class ActProcessDefinitionController extends BaseController {
+
+ private final IActProcessDefinitionService actProcessDefinitionService;
+
+ /**
+ * 分页查询
+ *
+ * @param processDefinitionBo 参数
+ */
+ @GetMapping("/list")
+ public TableDataInfo page(ProcessDefinitionBo processDefinitionBo) {
+ return actProcessDefinitionService.page(processDefinitionBo);
+ }
+
+ /**
+ * 查询历史流程定义列表
+ *
+ * @param key 流程定义key
+ */
+ @GetMapping("/getProcessDefinitionListByKey/{key}")
+ public R> getProcessDefinitionListByKey(@NotEmpty(message = "流程定义key不能为空") @PathVariable String key) {
+ return R.ok("操作成功", actProcessDefinitionService.getProcessDefinitionListByKey(key));
+ }
+
+ /**
+ * 查看流程定义图片
+ *
+ * @param processDefinitionId 流程定义id
+ */
+ @GetMapping("/processDefinitionImage/{processDefinitionId}")
+ public R processDefinitionImage(@PathVariable String processDefinitionId) {
+ return R.ok("操作成功", actProcessDefinitionService.processDefinitionImage(processDefinitionId));
+ }
+
+ /**
+ * 查看流程定义xml文件
+ *
+ * @param processDefinitionId 流程定义id
+ */
+ @GetMapping("/processDefinitionXml/{processDefinitionId}")
+ public R