From 6f5a368c86c3818b968ad1055f5215f86c989084 Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: 星期四, 21 三月 2024 21:02:16 +0800
Subject: [PATCH] add 添加流程表单配置

---
 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml                                 |    4 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java        |   66 +++++++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java                      |   51 +++++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java                 |   10 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java                          |   33 +++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java                 |   59 ++++++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java                |   15 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java              |   20 +
 script/sql/flowable.sql                                                                                           |   20 ++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java             |   49 +++++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java            |    4 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java                 |   53 +++++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java     |   66 +++++++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java                |    5 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java                             |   10 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java |   52 +++--
 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml                        |    7 
 17 files changed, 497 insertions(+), 27 deletions(-)

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
index 77996ae..a4230b6 100644
--- 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
@@ -76,6 +76,11 @@
     String PROCESS_INSTANCE_VO = "processInstanceVo";
 
     /**
+     * 娴佺▼琛ㄥ崟閰嶇疆瀵硅薄
+     */
+    String WF_FORM_DEFINITION_VO = "wfFormDefinitionVo";
+
+    /**
      * 娴佺▼鍙戣捣浜�
      */
     String INITIATOR = "initiator";
@@ -91,6 +96,11 @@
     String BUSINESS_KEY = "businessKey";
 
     /**
+     * 娴佺▼瀹氫箟id
+     */
+    String PROCESS_DEFINITION_ID = "processDefinitionId";
+
+    /**
      * 寮�鍚烦杩囪〃杈惧紡鍙橀噺
      */
     String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED";
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java
new file mode 100644
index 0000000..0d8952e
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java
@@ -0,0 +1,66 @@
+package org.dromara.workflow.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.validation.constraints.*;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
+import org.dromara.workflow.domain.bo.WfFormDefinitionBo;
+import org.dromara.workflow.service.IWfFormDefinitionService;
+
+/**
+ * 琛ㄥ崟閰嶇疆
+ *
+ * @author gssong
+ * @date 2024-03-18
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/workflow/formDefinition")
+public class WfFormDefinitionController extends BaseController {
+
+    private final IWfFormDefinitionService wfFormDefinitionService;
+
+
+    /**
+     * 鑾峰彇琛ㄥ崟閰嶇疆璇︾粏淇℃伅
+     *
+     * @param definitionId 涓婚敭
+     */
+    @GetMapping("/getByDefId/{definitionId}")
+    public R<WfFormDefinitionVo> getByDefId(@NotBlank(message = "娴佺▼瀹氫箟ID涓嶈兘涓虹┖")
+                                            @PathVariable String definitionId) {
+        return R.ok(wfFormDefinitionService.getByDefId(definitionId));
+    }
+
+    /**
+     * 鏂板琛ㄥ崟閰嶇疆
+     */
+    @Log(title = "琛ㄥ崟閰嶇疆", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/saveOrUpdate")
+    public R<Void> saveOrUpdate(@Validated(AddGroup.class) @RequestBody WfFormDefinitionBo bo) {
+        return toAjax(wfFormDefinitionService.saveOrUpdate(bo));
+    }
+
+    /**
+     * 鍒犻櫎琛ㄥ崟閰嶇疆
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @Log(title = "琛ㄥ崟閰嶇疆", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] ids) {
+        return toAjax(wfFormDefinitionService.deleteByIds(List.of(ids)));
+    }
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java
new file mode 100644
index 0000000..e0e975c
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java
@@ -0,0 +1,51 @@
+package org.dromara.workflow.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 琛ㄥ崟閰嶇疆瀵硅薄 wf_form_definition
+ *
+ * @author gssong
+ * @date 2024-03-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("wf_form_definition")
+public class WfFormDefinition extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 璺敱鍦板潃
+     */
+    private String path;
+
+    /**
+     * 娴佺▼瀹氫箟ID
+     */
+    private String definitionId;
+
+    /**
+     * 娴佺▼KEY
+     */
+    private String processKey;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java
new file mode 100644
index 0000000..b32fe77
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java
@@ -0,0 +1,53 @@
+package org.dromara.workflow.domain.bo;
+
+import org.dromara.workflow.domain.WfFormDefinition;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 琛ㄥ崟閰嶇疆涓氬姟瀵硅薄 wf_form_definition
+ *
+ * @author gssong
+ * @date 2024-03-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = WfFormDefinition.class, reverseConvertGenerate = false)
+public class WfFormDefinitionBo extends BaseEntity {
+
+    /**
+     * 涓婚敭
+     */
+    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = {EditGroup.class})
+    private Long id;
+
+    /**
+     * 璺敱鍦板潃
+     */
+    @NotBlank(message = "璺敱鍦板潃涓嶈兘涓虹┖", groups = {AddGroup.class})
+    private String path;
+
+    /**
+     * 娴佺▼瀹氫箟ID
+     */
+    @NotBlank(message = "娴佺▼瀹氫箟ID涓嶈兘涓虹┖", groups = {AddGroup.class})
+    private String definitionId;
+
+    /**
+     * 娴佺▼KEY
+     */
+    @NotBlank(message = "娴佺▼KEY涓嶈兘涓虹┖", groups = {AddGroup.class})
+    private String processKey;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java
index 52c201d..624f3ee 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java
@@ -62,4 +62,9 @@
      */
     private Date deploymentTime;
 
+    /**
+     * 琛ㄥ崟閰嶇疆
+     */
+    private WfFormDefinitionVo wfFormDefinitionVo;
+
 }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java
index 0210b57..dc65e52 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java
@@ -150,4 +150,14 @@
      * 鏄惁浼氱
      */
     private Boolean multiInstance;
+
+    /**
+     * 涓氬姟id
+     */
+    private String businessKey;
+
+    /**
+     * 琛ㄥ崟閰嶇疆
+     */
+    private WfFormDefinitionVo wfFormDefinitionVo;
 }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java
new file mode 100644
index 0000000..129eacc
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java
@@ -0,0 +1,59 @@
+package org.dromara.workflow.domain.vo;
+
+import org.dromara.workflow.domain.WfFormDefinition;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+/**
+ * 琛ㄥ崟閰嶇疆瑙嗗浘瀵硅薄 wf_form_definition
+ *
+ * @author gssong
+ * @date 2024-03-18
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = WfFormDefinition.class)
+public class WfFormDefinitionVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @ExcelProperty(value = "涓婚敭")
+    private Long id;
+
+    /**
+     * 璺敱鍦板潃
+     */
+    @ExcelProperty(value = "璺敱鍦板潃")
+    private String path;
+
+    /**
+     * 娴佺▼瀹氫箟ID
+     */
+    @ExcelProperty(value = "娴佺▼瀹氫箟ID")
+    private String definitionId;
+
+    /**
+     * 娴佺▼KEY
+     */
+    @ExcelProperty(value = "娴佺▼KEY")
+    private String processKey;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java
new file mode 100644
index 0000000..4262532
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.workflow.mapper;
+
+import org.dromara.workflow.domain.WfFormDefinition;
+import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 琛ㄥ崟閰嶇疆Mapper鎺ュ彛
+ *
+ * @author gssong
+ * @date 2024-03-18
+ */
+public interface WfFormDefinitionMapper extends BaseMapperPlus<WfFormDefinition, WfFormDefinitionVo> {
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java
new file mode 100644
index 0000000..683fc73
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java
@@ -0,0 +1,49 @@
+package org.dromara.workflow.service;
+
+import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
+import org.dromara.workflow.domain.bo.WfFormDefinitionBo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 琛ㄥ崟閰嶇疆Service鎺ュ彛
+ *
+ * @author gssong
+ * @date 2024-03-18
+ */
+public interface IWfFormDefinitionService {
+
+    /**
+     * 鏌ヨ琛ㄥ崟閰嶇疆
+     *
+     * @param definitionId 娴佺▼瀹氫箟id
+     * @return 缁撴灉
+     */
+    WfFormDefinitionVo getByDefId(String definitionId);
+
+    /**
+     * 鏌ヨ琛ㄥ崟閰嶇疆鍒楄〃
+     *
+     * @param definitionIds 娴佺▼瀹氫箟id
+     * @return 缁撴灉
+     */
+    List<WfFormDefinitionVo> queryList(List<String> definitionIds);
+
+
+    /**
+     * 鏂板琛ㄥ崟閰嶇疆
+     *
+     * @param bo 鍙傛暟
+     * @return 缁撴灉
+     */
+    Boolean saveOrUpdate(WfFormDefinitionBo bo);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ids id
+     * @return 缁撴灉
+     */
+    Boolean deleteByIds(Collection<Long> ids);
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java
index cc82e00..28c3520 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java
@@ -20,8 +20,10 @@
 import org.dromara.workflow.domain.WfCategory;
 import org.dromara.workflow.domain.bo.ProcessDefinitionBo;
 import org.dromara.workflow.domain.vo.ProcessDefinitionVo;
+import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
 import org.dromara.workflow.service.IActProcessDefinitionService;
 import org.dromara.workflow.service.IWfCategoryService;
+import org.dromara.workflow.service.IWfFormDefinitionService;
 import org.dromara.workflow.utils.QueryUtils;
 import org.flowable.engine.ProcessMigrationService;
 import org.flowable.engine.RepositoryService;
@@ -37,7 +39,6 @@
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
@@ -53,6 +54,7 @@
     private final RepositoryService repositoryService;
     private final ProcessMigrationService processMigrationService;
     private final IWfCategoryService wfCategoryService;
+    private final IWfFormDefinitionService iWfFormDefinitionService;
 
     /**
      * 鍒嗛〉鏌ヨ
@@ -81,15 +83,22 @@
             List<String> deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId);
             deploymentList = QueryUtils.deploymentQuery(deploymentIds).list();
         }
-        for (ProcessDefinition processDefinition : definitionList) {
-            ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
-            if (CollUtil.isNotEmpty(deploymentList)) {
-                // 閮ㄧ讲鏃堕棿
-                deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> {
-                    processDefinitionVo.setDeploymentTime(e.getDeploymentTime());
-                });
+        if (CollUtil.isNotEmpty(definitionList)) {
+            List<String> ids = StreamUtils.toList(definitionList, ProcessDefinition::getId);
+            List<WfFormDefinitionVo> wfFormDefinitionVos = iWfFormDefinitionService.queryList(ids);
+            for (ProcessDefinition processDefinition : definitionList) {
+                ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
+                if (CollUtil.isNotEmpty(deploymentList)) {
+                    // 閮ㄧ讲鏃堕棿
+                    deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> {
+                        processDefinitionVo.setDeploymentTime(e.getDeploymentTime());
+                    });
+                }
+                if (CollUtil.isNotEmpty(wfFormDefinitionVos)) {
+                    wfFormDefinitionVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfFormDefinitionVo);
+                }
+                processDefinitionVoList.add(processDefinitionVo);
             }
-            processDefinitionVoList.add(processDefinitionVo);
         }
         // 鎬昏褰曟暟
         long total = query.count();
@@ -109,18 +118,25 @@
         List<ProcessDefinition> definitionList = query.processDefinitionKey(key).list();
         List<Deployment> deploymentList = null;
         if (CollUtil.isNotEmpty(definitionList)) {
-            List<String> deploymentIds = definitionList.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList());
+            List<String> deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId);
             deploymentList = QueryUtils.deploymentQuery(deploymentIds).list();
         }
-        for (ProcessDefinition processDefinition : definitionList) {
-            ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
-            if (CollUtil.isNotEmpty(deploymentList)) {
-                // 閮ㄧ讲鏃堕棿
-                deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> {
-                    processDefinitionVo.setDeploymentTime(e.getDeploymentTime());
-                });
+        if (CollUtil.isNotEmpty(definitionList)) {
+            List<String> ids = StreamUtils.toList(definitionList, ProcessDefinition::getId);
+            List<WfFormDefinitionVo> wfFormDefinitionVos = iWfFormDefinitionService.queryList(ids);
+            for (ProcessDefinition processDefinition : definitionList) {
+                ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
+                if (CollUtil.isNotEmpty(deploymentList)) {
+                    // 閮ㄧ讲鏃堕棿
+                    deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> {
+                        processDefinitionVo.setDeploymentTime(e.getDeploymentTime());
+                    });
+                    if (CollUtil.isNotEmpty(wfFormDefinitionVos)) {
+                        wfFormDefinitionVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfFormDefinitionVo);
+                    }
+                }
+                processDefinitionVoList.add(processDefinitionVo);
             }
-            processDefinitionVoList.add(processDefinitionVo);
         }
         return CollectionUtil.reverse(processDefinitionVoList);
     }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
index d35e930..b6747e7 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java
@@ -264,10 +264,14 @@
         Page<TaskVo> page = actTaskMapper.getTaskWaitByPage(pageQuery.build(), queryWrapper);
 
         List<TaskVo> taskList = page.getRecords();
-        for (TaskVo task : taskList) {
-            task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
-            task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
-            task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
+        if (CollUtil.isNotEmpty(taskList)) {
+            for (TaskVo task : taskList) {
+                task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
+                task.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
+                task.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
+            }
+            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
+            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
         }
         return new TableDataInfo<>(taskList, page.getTotal());
     }
@@ -345,8 +349,12 @@
         Page<TaskVo> page = actTaskMapper.getTaskFinishByPage(pageQuery.build(), queryWrapper);
 
         List<TaskVo> taskList = page.getRecords();
-        for (TaskVo task : taskList) {
-            task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
+        if (CollUtil.isNotEmpty(taskList)) {
+            for (TaskVo task : taskList) {
+                task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
+            }
+            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
+            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
         }
         return new TableDataInfo<>(taskList, page.getTotal());
     }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
index 1d48d25..276cafe 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/TestLeaveServiceImpl.java
@@ -42,7 +42,9 @@
      */
     @Override
     public TestLeaveVo queryById(Long id) {
-        return baseMapper.selectVoById(id);
+        TestLeaveVo testLeaveVo = baseMapper.selectVoById(id);
+        WorkflowUtils.setProcessInstanceVo(testLeaveVo,String.valueOf(id));
+        return testLeaveVo;
     }
 
     /**
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java
new file mode 100644
index 0000000..00def95
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java
@@ -0,0 +1,66 @@
+package org.dromara.workflow.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.workflow.domain.bo.WfFormDefinitionBo;
+import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
+import org.dromara.workflow.domain.WfFormDefinition;
+import org.dromara.workflow.mapper.WfFormDefinitionMapper;
+import org.dromara.workflow.service.IWfFormDefinitionService;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Collection;
+
+/**
+ * 琛ㄥ崟閰嶇疆Service涓氬姟灞傚鐞�
+ *
+ * @author gssong
+ * @date 2024-03-18
+ */
+@RequiredArgsConstructor
+@Service
+public class WfFormDefinitionServiceImpl implements IWfFormDefinitionService {
+
+    private final WfFormDefinitionMapper baseMapper;
+
+    /**
+     * 鏌ヨ琛ㄥ崟閰嶇疆
+     */
+    @Override
+    public WfFormDefinitionVo getByDefId(String definitionId) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<WfFormDefinition>().eq(WfFormDefinition::getDefinitionId, definitionId));
+    }
+
+    /**
+     * 鏌ヨ琛ㄥ崟閰嶇疆鍒楄〃
+     */
+    @Override
+    public List<WfFormDefinitionVo> queryList(List<String> definitionIds) {
+        return baseMapper.selectVoList(new LambdaQueryWrapper<WfFormDefinition>().in(WfFormDefinition::getDefinitionId, definitionIds));
+    }
+
+    /**
+     * 鏂板琛ㄥ崟閰嶇疆
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean saveOrUpdate(WfFormDefinitionBo bo) {
+        WfFormDefinition add = MapstructUtils.convert(bo, WfFormDefinition.class);
+        boolean flag = baseMapper.insertOrUpdate(add);
+        if (baseMapper.insertOrUpdate(add)) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎琛ㄥ崟閰嶇疆
+     */
+    @Override
+    public Boolean deleteByIds(Collection<Long> ids) {
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java
index 96a5089..faedab0 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java
@@ -26,9 +26,11 @@
 import org.dromara.workflow.domain.vo.MultiInstanceVo;
 import org.dromara.workflow.domain.vo.ParticipantVo;
 import org.dromara.workflow.domain.vo.ProcessInstanceVo;
+import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
 import org.dromara.workflow.flowable.cmd.UpdateHiTaskInstCmd;
 import org.dromara.workflow.mapper.ActHiTaskinstMapper;
 import org.dromara.workflow.service.IActHiProcinstService;
+import org.dromara.workflow.service.IWfFormDefinitionService;
 import org.dromara.workflow.service.IWorkflowUserService;
 import org.flowable.bpmn.model.BpmnModel;
 import org.flowable.bpmn.model.FlowNode;
@@ -45,6 +47,7 @@
 import java.util.*;
 
 import static org.dromara.workflow.common.constant.FlowConstant.PROCESS_INSTANCE_VO;
+import static org.dromara.workflow.common.constant.FlowConstant.WF_FORM_DEFINITION_VO;
 
 /**
  * 宸ヤ綔娴佸伐鍏�
@@ -58,6 +61,7 @@
     private static final IWorkflowUserService WORKFLOW_USER_SERVICE = SpringUtils.getBean(IWorkflowUserService.class);
     private static final IActHiProcinstService ACT_HI_PROCINST_SERVICE = SpringUtils.getBean(IActHiProcinstService.class);
     private static final ActHiTaskinstMapper ACT_HI_TASKINST_MAPPER = SpringUtils.getBean(ActHiTaskinstMapper.class);
+    private static final IWfFormDefinitionService I_WF_FORM_DEFINITION_SERVICE = SpringUtils.getBean(IWfFormDefinitionService.class);
 
     /**
      * 鍒涘缓涓�涓柊浠诲姟
@@ -241,7 +245,7 @@
      * @param businessKey 涓氬姟id
      */
     public static void setProcessInstanceVo(Object obj, String businessKey) {
-        if (StringUtils.isBlank(businessKey)) {
+        if (StringUtils.isBlank(businessKey) || obj == null) {
             return;
         }
         ActHiProcinst actHiProcinst = ACT_HI_PROCINST_SERVICE.selectByBusinessKey(businessKey);
@@ -264,7 +268,7 @@
      * @param fieldName 涓婚敭灞炴�у悕绉�
      */
     public static void setProcessInstanceListVo(Object obj, List<String> idList, String fieldName) {
-        if (CollUtil.isEmpty(idList)) {
+        if (CollUtil.isEmpty(idList) || obj == null) {
             return;
         }
         List<ActHiProcinst> actHiProcinstList = ACT_HI_PROCINST_SERVICE.selectByBusinessKeyIn(idList);
@@ -294,6 +298,31 @@
     }
 
     /**
+     * 璁剧疆娴佺▼琛ㄥ崟閰嶇疆
+     *
+     * @param obj       涓氬姟瀵硅薄
+     * @param idList    娴佺▼瀹氫箟id
+     * @param fieldName 娴佺▼瀹氫箟ID灞炴�у悕绉�
+     */
+    public static void setWfFormDefinitionVo(Object obj, List<String> idList, String fieldName) {
+        if (CollUtil.isEmpty(idList) || obj == null) {
+            return;
+        }
+        List<WfFormDefinitionVo> wfFormDefinitionVoList = I_WF_FORM_DEFINITION_SERVICE.queryList(idList);
+        if (obj instanceof Collection<?> collection) {
+            for (Object o : collection) {
+                String fieldValue = ReflectUtils.invokeGetter(o, fieldName).toString();
+                if (!CollUtil.isEmpty(wfFormDefinitionVoList)) {
+                    wfFormDefinitionVoList.stream().filter(e -> e.getDefinitionId().equals(fieldValue)).findFirst().ifPresent(e -> {
+                        ReflectUtils.invokeSetter(o, WF_FORM_DEFINITION_VO, BeanUtil.toBean(e, WfFormDefinitionVo.class));
+                    });
+                }
+            }
+        }
+    }
+
+
+    /**
      * 鍙戦�佹秷鎭�
      *
      * @param list        浠诲姟
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml
index 342ce09..9c33726 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml
+++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/ActTaskMapper.xml
@@ -27,12 +27,14 @@
         <result property="businessStatus" column="BUSINESS_STATUS_"/>
         <result property="processDefinitionName" column="processDefinitionName"/>
         <result property="processDefinitionKey" column="processDefinitionName"/>
+        <result property="businessKey" column="BUSINESS_KEY_"/>
 
     </resultMap>
     <select id="getTaskWaitByPage" resultMap="TaskVoResult">
         select *
         from (SELECT RES.*,
                      AHP.BUSINESS_STATUS_,
+                     AHP.BUSINESS_KEY_,
                      ARP.NAME_ AS processDefinitionName,
                      ARP.KEY_  AS processDefinitionKey
               FROM ACT_RU_TASK RES
@@ -46,6 +48,7 @@
         select *
         from (SELECT HTI.*,
                      AHP.BUSINESS_STATUS_,
+                     AHP.BUSINESS_KEY_,
                      ARP.NAME_ AS processDefinitionName,
                      ARP.KEY_  AS processDefinitionKey
               FROM ACT_HI_TASKINST HTI
@@ -59,6 +62,7 @@
         select *
         from (SELECT AHT.*,
                      AHP.BUSINESS_STATUS_,
+                     AHP.BUSINESS_KEY_,
                      ARP.NAME_ as processDefinitionName,
                      ARP.KEY_  as processDefinitionKey
               FROM ACT_HI_TASKINST AHT
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml
new file mode 100644
index 0000000..42af9d2
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.workflow.mapper.WfFormDefinitionMapper">
+
+</mapper>
diff --git a/script/sql/flowable.sql b/script/sql/flowable.sql
index 9cd6bfb..9c0d8bb 100644
--- a/script/sql/flowable.sql
+++ b/script/sql/flowable.sql
@@ -78,6 +78,26 @@
 )
     comment '鑺傜偣瀹℃壒璁板綍';
 
+create table wf_form_definition
+(
+    id            bigint                        not null comment '涓婚敭'
+        primary key,
+    path          varchar(200) default ''       not null comment '璺敱鍦板潃',
+    definition_id varchar(255)                  not null comment '娴佺▼瀹氫箟ID',
+    process_key   varchar(255)                  not null comment '娴佺▼KEY',
+    create_dept   bigint                        null comment '鍒涘缓閮ㄩ棬',
+    create_by     bigint                        null comment '鍒涘缓鑰�',
+    create_time   datetime                      null comment '鍒涘缓鏃堕棿',
+    update_by     bigint                        null comment '鏇存柊鑰�',
+    update_time   datetime                      null comment '鏇存柊鏃堕棿',
+    remark        varchar(500) default ''       null comment '澶囨敞',
+    tenant_id     varchar(20)  default '000000' null comment '绉熸埛缂栧彿',
+    constraint uni_definition_id
+        unique (definition_id)
+)
+    comment '琛ㄥ崟閰嶇疆';
+
+
 
 INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11638, '璇峰亣鐢宠', 5, 1, 'leave', 'workflow/leave/index', 1, 0, 'C', '0', '0', 'demo:leave:list', '#', 103, 1, sysdate(), NULL, NULL, '璇峰亣鐢宠鑿滃崟');
 INSERT INTO sys_menu(menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark) VALUES (11639, '璇峰亣鐢宠鏌ヨ', 11638, 1, '#', '', 1, 0, 'F', '0', '0', 'demo:leave:query', '#', 103, 1, sysdate(), NULL, NULL, '');

--
Gitblit v1.9.3