From 651b2e140ba842126c4177df1b909b2b764ecdb8 Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: 星期日, 31 三月 2024 15:34:27 +0800
Subject: [PATCH] add 添加表单配置

---
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java                   |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java           |   57 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java                 |   56 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java                          |   56 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java   |    6 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java                    |   15 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java                     |   63 ++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java         |  111 +++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java                         |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java                             |   31 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java                |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java      |   24 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java                     |   58 ++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java                  |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java              |   15 
 script/sql/sqlserver/flowable.sql                                                                                 |   28 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java                    |   54 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java                         |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java                          |   51 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java                 |   81 ++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java                     |   53 +
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java         |   73 ++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java            |  114 +++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java             |   48 +
 script/sql/postgres/flowable.sql                                                                                  |   32 
 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml                            |    2 
 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml                      |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java               |   20 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/constant/FlowConstant.java                 |    4 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/WorkflowUtils.java                          |   34 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActTaskServiceImpl.java              |   73 +
 script/sql/flowable.sql                                                                                           |   44 +
 ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml                            |    2 
 /dev/null                                                                                                         |   66 --
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/CustomInjectUserTaskCmd.java         |  114 +++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java   |   71 ++
 script/sql/oracle/flowable.sql                                                                                    |   27 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java                    |   10 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java               |   14 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessDefinitionVo.java                |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/TaskVo.java                             |    7 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java                    |   15 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java        |    2 
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java |   75 ++
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java                     |   69 ++
 45 files changed, 1,464 insertions(+), 225 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 a4230b6..d175ba8 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,9 +76,9 @@
     String PROCESS_INSTANCE_VO = "processInstanceVo";
 
     /**
-     * 娴佺▼琛ㄥ崟閰嶇疆瀵硅薄
+     * 娴佺▼瀹氫箟閰嶇疆
      */
-    String WF_FORM_DEFINITION_VO = "wfFormDefinitionVo";
+    String WF_DEFINITION_CONFIG_VO = "wfDefinitionConfigVo";
 
     /**
      * 娴佺▼鍙戣捣浜�
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java
new file mode 100644
index 0000000..083ab7b
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/FormTypeEnum.java
@@ -0,0 +1,54 @@
+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 FormTypeEnum {
+    /**
+     * 鑷畾涔夎〃鍗�
+     */
+    STATIC("static", "鑷畾涔夎〃鍗�"),
+    /**
+     * 鍔ㄦ�佽〃鍗�
+     */
+    DYNAMIC("dynamic", "鍔ㄦ�佽〃鍗�");
+
+    /**
+     * 绫诲瀷
+     */
+    private final String type;
+
+    /**
+     * 鎻忚堪
+     */
+    private final String desc;
+
+    /**
+     * 琛ㄥ崟绫诲瀷
+     *
+     * @param formType 琛ㄥ崟绫诲瀷
+     */
+    public static String findByType(String formType) {
+        if (StringUtils.isBlank(formType)) {
+            return StrUtil.EMPTY;
+        }
+
+        return Arrays.stream(FormTypeEnum.values())
+            .filter(statusEnum -> statusEnum.getType().equals(formType))
+            .findFirst()
+            .map(FormTypeEnum::getDesc)
+            .orElse(StrUtil.EMPTY);
+    }
+}
+
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/WfDefinitionConfigController.java
similarity index 66%
rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormDefinitionController.java
rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfDefinitionConfigController.java
index 0d8952e..d3388d4 100644
--- 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/WfDefinitionConfigController.java
@@ -4,6 +4,7 @@
 
 import lombok.RequiredArgsConstructor;
 import jakarta.validation.constraints.*;
+import org.dromara.workflow.domain.bo.WfDefinitionConfigBo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -12,23 +13,22 @@
 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;
+import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
+import org.dromara.workflow.service.IWfDefinitionConfigService;
 
 /**
  * 琛ㄥ崟閰嶇疆
  *
- * @author gssong
+ * @author may
  * @date 2024-03-18
  */
 @Validated
 @RequiredArgsConstructor
 @RestController
-@RequestMapping("/workflow/formDefinition")
-public class WfFormDefinitionController extends BaseController {
+@RequestMapping("/workflow/definitionConfig")
+public class WfDefinitionConfigController extends BaseController {
 
-    private final IWfFormDefinitionService wfFormDefinitionService;
+    private final IWfDefinitionConfigService wfDefinitionConfigService;
 
 
     /**
@@ -37,9 +37,9 @@
      * @param definitionId 涓婚敭
      */
     @GetMapping("/getByDefId/{definitionId}")
-    public R<WfFormDefinitionVo> getByDefId(@NotBlank(message = "娴佺▼瀹氫箟ID涓嶈兘涓虹┖")
+    public R<WfDefinitionConfigVo> getByDefId(@NotBlank(message = "娴佺▼瀹氫箟ID涓嶈兘涓虹┖")
                                             @PathVariable String definitionId) {
-        return R.ok(wfFormDefinitionService.getByDefId(definitionId));
+        return R.ok(wfDefinitionConfigService.getByDefId(definitionId));
     }
 
     /**
@@ -48,8 +48,8 @@
     @Log(title = "琛ㄥ崟閰嶇疆", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping("/saveOrUpdate")
-    public R<Void> saveOrUpdate(@Validated(AddGroup.class) @RequestBody WfFormDefinitionBo bo) {
-        return toAjax(wfFormDefinitionService.saveOrUpdate(bo));
+    public R<Void> saveOrUpdate(@Validated(AddGroup.class) @RequestBody WfDefinitionConfigBo bo) {
+        return toAjax(wfDefinitionConfigService.saveOrUpdate(bo));
     }
 
     /**
@@ -61,6 +61,6 @@
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
                           @PathVariable Long[] ids) {
-        return toAjax(wfFormDefinitionService.deleteByIds(List.of(ids)));
+        return toAjax(wfDefinitionConfigService.deleteByIds(List.of(ids)));
     }
 }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java
new file mode 100644
index 0000000..198e233
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/WfFormManageController.java
@@ -0,0 +1,114 @@
+package org.dromara.workflow.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+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.mybatis.core.page.PageQuery;
+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.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.workflow.domain.vo.WfFormManageVo;
+import org.dromara.workflow.domain.bo.WfFormManageBo;
+import org.dromara.workflow.service.IWfFormManageService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 琛ㄥ崟绠$悊
+ *
+ * @author may
+ * @date 2024-03-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/workflow/formManage")
+public class WfFormManageController extends BaseController {
+
+    private final IWfFormManageService wfFormManageService;
+
+    /**
+     * 鏌ヨ琛ㄥ崟绠$悊鍒楄〃
+     */
+    @SaCheckPermission("workflow:formManage:list")
+    @GetMapping("/list")
+    public TableDataInfo<WfFormManageVo> list(WfFormManageBo bo, PageQuery pageQuery) {
+        return wfFormManageService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 鏌ヨ琛ㄥ崟绠$悊鍒楄〃
+     */
+    @SaCheckPermission("workflow:formManage:list")
+    @GetMapping("/list/selectList")
+    public R<List<WfFormManageVo>> selectList() {
+        return R.ok(wfFormManageService.selectList());
+    }
+
+    /**
+     * 瀵煎嚭琛ㄥ崟绠$悊鍒楄〃
+     */
+    @SaCheckPermission("workflow:formManage:export")
+    @Log(title = "琛ㄥ崟绠$悊", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(WfFormManageBo bo, HttpServletResponse response) {
+        List<WfFormManageVo> list = wfFormManageService.queryList(bo);
+        ExcelUtil.exportExcel(list, "琛ㄥ崟绠$悊", WfFormManageVo.class, response);
+    }
+
+    /**
+     * 鑾峰彇琛ㄥ崟绠$悊璇︾粏淇℃伅
+     *
+     * @param id 涓婚敭
+     */
+    @SaCheckPermission("workflow:formManage:query")
+    @GetMapping("/{id}")
+    public R<WfFormManageVo> getInfo(@NotNull(message = "涓婚敭涓嶈兘涓虹┖")
+                                     @PathVariable Long id) {
+        return R.ok(wfFormManageService.queryById(id));
+    }
+
+    /**
+     * 鏂板琛ㄥ崟绠$悊
+     */
+    @SaCheckPermission("workflow:formManage:add")
+    @Log(title = "琛ㄥ崟绠$悊", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody WfFormManageBo bo) {
+        return toAjax(wfFormManageService.insertByBo(bo));
+    }
+
+    /**
+     * 淇敼琛ㄥ崟绠$悊
+     */
+    @SaCheckPermission("workflow:formManage:edit")
+    @Log(title = "琛ㄥ崟绠$悊", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody WfFormManageBo bo) {
+        return toAjax(wfFormManageService.updateByBo(bo));
+    }
+
+    /**
+     * 鍒犻櫎琛ㄥ崟绠$悊
+     *
+     * @param ids 涓婚敭涓�
+     */
+    @SaCheckPermission("workflow:formManage:remove")
+    @Log(title = "琛ㄥ崟绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "涓婚敭涓嶈兘涓虹┖")
+                          @PathVariable Long[] ids) {
+        return toAjax(wfFormManageService.deleteByIds(List.of(ids)));
+    }
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java
index 578ea9c..abc17b5 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/ActHiTaskinst.java
@@ -11,7 +11,7 @@
 /**
  * 娴佺▼鍘嗗彶浠诲姟瀵硅薄 act_hi_taskinst
  *
- * @author gssong
+ * @author may
  * @date 2024-03-02
  */
 @Data
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/WfDefinitionConfig.java
similarity index 82%
rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormDefinition.java
rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfDefinitionConfig.java
index e0e975c..b80da0e 100644
--- 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/WfDefinitionConfig.java
@@ -10,13 +10,13 @@
 /**
  * 琛ㄥ崟閰嶇疆瀵硅薄 wf_form_definition
  *
- * @author gssong
+ * @author may
  * @date 2024-03-18
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@TableName("wf_form_definition")
-public class WfFormDefinition extends BaseEntity {
+@TableName("wf_definition_config")
+public class WfDefinitionConfig extends BaseEntity {
 
     @Serial
     private static final long serialVersionUID = 1L;
@@ -28,9 +28,9 @@
     private Long id;
 
     /**
-     * 璺敱鍦板潃
+     * 琛ㄥ崟ID
      */
-    private String path;
+    private Long formId;
 
     /**
      * 娴佺▼瀹氫箟ID
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java
new file mode 100644
index 0000000..47f0d7a
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfFormManage.java
@@ -0,0 +1,51 @@
+package org.dromara.workflow.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 琛ㄥ崟绠$悊瀵硅薄 wf_form_manage
+ *
+ * @author may
+ * @date 2024-03-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("wf_form_manage")
+public class WfFormManage extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 琛ㄥ崟鍚嶇О
+     */
+    private String formName;
+
+    /**
+     * 琛ㄥ崟绫诲瀷
+     */
+    private String formType;
+
+    /**
+     * 璺敱鍦板潃/琛ㄥ崟ID
+     */
+    private String router;
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java
new file mode 100644
index 0000000..cf88676
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/WfNodeConfig.java
@@ -0,0 +1,56 @@
+package org.dromara.workflow.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 鑺傜偣閰嶇疆瀵硅薄 wf_node_config
+ *
+ * @author may
+ * @date 2024-03-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("wf_node_config")
+public class WfNodeConfig extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 琛ㄥ崟id
+     */
+    private Long formId;
+
+    /**
+     * 琛ㄥ崟绫诲瀷
+     */
+    private String formType;
+
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    private String nodeName;
+
+    /**
+     * 鑺傜偣id
+     */
+    private String nodeId;
+
+    /**
+     * 娴佺▼瀹氫箟id
+     */
+    private String definitionId;
+
+
+}
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/WfDefinitionConfigBo.java
similarity index 74%
rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormDefinitionBo.java
rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfDefinitionConfigBo.java
index b32fe77..80e7191 100644
--- 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/WfDefinitionConfigBo.java
@@ -1,6 +1,6 @@
 package org.dromara.workflow.domain.bo;
 
-import org.dromara.workflow.domain.WfFormDefinition;
+import org.dromara.workflow.domain.WfDefinitionConfig;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
@@ -12,13 +12,13 @@
 /**
  * 琛ㄥ崟閰嶇疆涓氬姟瀵硅薄 wf_form_definition
  *
- * @author gssong
+ * @author may
  * @date 2024-03-18
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = WfFormDefinition.class, reverseConvertGenerate = false)
-public class WfFormDefinitionBo extends BaseEntity {
+@AutoMapper(target = WfDefinitionConfig.class, reverseConvertGenerate = false)
+public class WfDefinitionConfigBo extends BaseEntity {
 
     /**
      * 涓婚敭
@@ -27,10 +27,10 @@
     private Long id;
 
     /**
-     * 璺敱鍦板潃
+     * 琛ㄥ崟ID
      */
-    @NotBlank(message = "璺敱鍦板潃涓嶈兘涓虹┖", groups = {AddGroup.class})
-    private String path;
+    @NotNull(message = "琛ㄥ崟ID涓嶈兘涓虹┖", groups = {AddGroup.class})
+    private Long formId;
 
     /**
      * 娴佺▼瀹氫箟ID
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java
new file mode 100644
index 0000000..8afc286
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfFormManageBo.java
@@ -0,0 +1,53 @@
+package org.dromara.workflow.domain.bo;
+
+import org.dromara.workflow.domain.WfFormManage;
+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_manage
+ *
+ * @author may
+ * @date 2024-03-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = WfFormManage.class, reverseConvertGenerate = false)
+public class WfFormManageBo extends BaseEntity {
+
+    /**
+     * 涓婚敭
+     */
+    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 琛ㄥ崟鍚嶇О
+     */
+    @NotBlank(message = "琛ㄥ崟鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String formName;
+
+    /**
+     * 琛ㄥ崟绫诲瀷
+     */
+    @NotBlank(message = "琛ㄥ崟绫诲瀷涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String formType;
+    /**
+     * 璺敱鍦板潃/琛ㄥ崟ID
+     */
+    @NotBlank(message = "璺敱鍦板潃/琛ㄥ崟ID涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String router;
+
+
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java
new file mode 100644
index 0000000..24144cf
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/WfNodeConfigBo.java
@@ -0,0 +1,58 @@
+package org.dromara.workflow.domain.bo;
+
+import org.dromara.workflow.domain.WfNodeConfig;
+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_node_config
+ *
+ * @author may
+ * @date 2024-03-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = WfNodeConfig.class, reverseConvertGenerate = false)
+public class WfNodeConfigBo extends BaseEntity {
+
+    /**
+     * 涓婚敭
+     */
+    @NotNull(message = "涓婚敭涓嶈兘涓虹┖", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 琛ㄥ崟id
+     */
+    private Long formId;
+
+    /**
+     * 琛ㄥ崟绫诲瀷
+     */
+    private String formType;
+
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    @NotBlank(message = "鑺傜偣鍚嶇О涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String nodeName;
+
+    /**
+     * 鑺傜偣id
+     */
+    @NotBlank(message = "鑺傜偣id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String nodeId;
+
+    /**
+     * 娴佺▼瀹氫箟id
+     */
+    @NotBlank(message = "娴佺▼瀹氫箟id涓嶈兘涓虹┖", groups = { AddGroup.class, EditGroup.class })
+    private String definitionId;
+
+
+}
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 624f3ee..cd8ea2a 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
@@ -65,6 +65,6 @@
     /**
      * 琛ㄥ崟閰嶇疆
      */
-    private WfFormDefinitionVo wfFormDefinitionVo;
+    private WfDefinitionConfigVo wfDefinitionConfigVo;
 
 }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java
index 73e1e6d..34eb970 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/ProcessInstanceVo.java
@@ -96,5 +96,5 @@
     /**
      * 琛ㄥ崟閰嶇疆
      */
-    private WfFormDefinitionVo wfFormDefinitionVo;
+    private WfDefinitionConfigVo wfDefinitionConfigVo;
 }
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 dc65e52..cafff89 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
@@ -159,5 +159,10 @@
     /**
      * 琛ㄥ崟閰嶇疆
      */
-    private WfFormDefinitionVo wfFormDefinitionVo;
+    private WfDefinitionConfigVo wfDefinitionConfigVo;
+
+    /**
+     * 鑺傜偣閰嶇疆
+     */
+    private WfNodeConfigVo wfNodeConfigVo;
 }
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/WfDefinitionConfigVo.java
similarity index 72%
rename from ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormDefinitionVo.java
rename to ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfDefinitionConfigVo.java
index 129eacc..a7c96f3 100644
--- 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/WfDefinitionConfigVo.java
@@ -1,6 +1,6 @@
 package org.dromara.workflow.domain.vo;
 
-import org.dromara.workflow.domain.WfFormDefinition;
+import org.dromara.workflow.domain.WfDefinitionConfig;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
 import io.github.linpeilie.annotations.AutoMapper;
@@ -10,17 +10,16 @@
 import java.io.Serializable;
 
 
-
 /**
  * 琛ㄥ崟閰嶇疆瑙嗗浘瀵硅薄 wf_form_definition
  *
- * @author gssong
+ * @author may
  * @date 2024-03-18
  */
 @Data
 @ExcelIgnoreUnannotated
-@AutoMapper(target = WfFormDefinition.class)
-public class WfFormDefinitionVo implements Serializable {
+@AutoMapper(target = WfDefinitionConfig.class)
+public class WfDefinitionConfigVo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 1L;
@@ -32,10 +31,10 @@
     private Long id;
 
     /**
-     * 璺敱鍦板潃
+     * 琛ㄥ崟ID
      */
-    @ExcelProperty(value = "璺敱鍦板潃")
-    private String path;
+    @ExcelProperty(value = "琛ㄥ崟ID")
+    private Long formId;
 
     /**
      * 娴佺▼瀹氫箟ID
@@ -55,5 +54,10 @@
     @ExcelProperty(value = "澶囨敞")
     private String remark;
 
+    /**
+     * 琛ㄥ崟绠$悊
+     */
+    private WfFormManageVo wfFormManageVo;
+
 
 }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java
new file mode 100644
index 0000000..302df23
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfFormManageVo.java
@@ -0,0 +1,63 @@
+package org.dromara.workflow.domain.vo;
+
+import org.dromara.workflow.domain.WfFormManage;
+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_manage
+ *
+ * @author may
+ * @date 2024-03-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = WfFormManage.class)
+public class WfFormManageVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @ExcelProperty(value = "涓婚敭")
+    private Long id;
+
+    /**
+     * 琛ㄥ崟鍚嶇О
+     */
+    @ExcelProperty(value = "琛ㄥ崟鍚嶇О")
+    private String formName;
+
+    /**
+     * 琛ㄥ崟绫诲瀷
+     */
+    @ExcelProperty(value = "琛ㄥ崟绫诲瀷")
+    private String formType;
+
+    /**
+     * 琛ㄥ崟绫诲瀷鍚嶇О
+     */
+    private String formTypeName;
+
+    /**
+     * 璺敱鍦板潃/琛ㄥ崟ID
+     */
+    @ExcelProperty(value = "璺敱鍦板潃/琛ㄥ崟ID")
+    private String router;
+
+    /**
+     * 澶囨敞
+     */
+    @ExcelProperty(value = "澶囨敞")
+    private String remark;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java
new file mode 100644
index 0000000..90b5ab5
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/WfNodeConfigVo.java
@@ -0,0 +1,69 @@
+package org.dromara.workflow.domain.vo;
+
+import org.dromara.workflow.domain.WfNodeConfig;
+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_node_config
+ *
+ * @author may
+ * @date 2024-03-30
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = WfNodeConfig.class)
+public class WfNodeConfigVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭
+     */
+    @ExcelProperty(value = "涓婚敭")
+    private Long id;
+
+    /**
+     * 琛ㄥ崟id
+     */
+    @ExcelProperty(value = "琛ㄥ崟id")
+    private Long formId;
+
+    /**
+     * 琛ㄥ崟绫诲瀷
+     */
+    @ExcelProperty(value = "琛ㄥ崟绫诲瀷")
+    private String formType;
+
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    @ExcelProperty(value = "鑺傜偣鍚嶇О")
+    private String nodeName;
+
+    /**
+     * 鑺傜偣id
+     */
+    @ExcelProperty(value = "鑺傜偣id")
+    private String nodeId;
+
+    /**
+     * 娴佺▼瀹氫箟id
+     */
+    @ExcelProperty(value = "娴佺▼瀹氫箟id")
+    private String definitionId;
+
+    /**
+     * 琛ㄥ崟绠$悊
+     */
+    private WfFormManageVo wfFormManageVo;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/CustomInjectUserTaskCmd.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/CustomInjectUserTaskCmd.java
new file mode 100644
index 0000000..a403c7c
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/flowable/cmd/CustomInjectUserTaskCmd.java
@@ -0,0 +1,114 @@
+package org.dromara.workflow.flowable.cmd;
+
+import org.flowable.bpmn.BpmnAutoLayout;
+import org.flowable.bpmn.model.*;
+import org.flowable.bpmn.model.Process;
+import org.flowable.common.engine.impl.interceptor.Command;
+import org.flowable.common.engine.impl.interceptor.CommandContext;
+import org.flowable.engine.impl.cmd.AbstractDynamicInjectionCmd;
+import org.flowable.engine.impl.dynamic.BaseDynamicSubProcessInjectUtil;
+import org.flowable.engine.impl.dynamic.DynamicUserTaskBuilder;
+import org.flowable.engine.impl.persistence.entity.DeploymentEntity;
+import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
+import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntity;
+
+import java.util.List;
+import java.util.Map;
+
+
+public class CustomInjectUserTaskCmd extends AbstractDynamicInjectionCmd implements Command<Void> {
+
+    private final FlowElement currentElement;
+    private final String processInstanceId;
+    private final DynamicUserTaskBuilder dynamicUserTaskBuilder;
+
+    public CustomInjectUserTaskCmd(String processInstanceId, DynamicUserTaskBuilder dynamicUserTaskBuilder, FlowElement currentElement) {
+        this.currentElement = currentElement;
+        this.processInstanceId = processInstanceId;
+        this.dynamicUserTaskBuilder = dynamicUserTaskBuilder;
+    }
+
+    @Override
+    protected void updateBpmnProcess(CommandContext commandContext, Process process, BpmnModel bpmnModel, ProcessDefinitionEntity originalProcessDefinitionEntity, DeploymentEntity newDeploymentEntity) {
+        if (!(this.currentElement instanceof UserTask currentUserTask)) {
+            return;
+        }
+        if (currentUserTask.getOutgoingFlows().isEmpty() || currentUserTask.getOutgoingFlows().size() > 1) {
+            return;
+        }
+        SequenceFlow currentOutgoingFlow = currentUserTask.getOutgoingFlows().get(0);
+        FlowElement targetFlowElement = currentOutgoingFlow.getTargetFlowElement();
+        //鍒涘缓鏂扮殑浠诲姟鑺傜偣鍜屼袱鏉¤繛绾�
+        UserTask newUserTask = createUserTask(process);
+        SequenceFlow newSequenceFlow1 = new SequenceFlow(currentUserTask.getId(), newUserTask.getId());
+        newSequenceFlow1.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap()));
+        SequenceFlow newSequenceFlow2 = new SequenceFlow(newUserTask.getId(), targetFlowElement.getId());
+        newSequenceFlow2.setId(dynamicUserTaskBuilder.nextFlowId(process.getFlowElementMap()));
+        //娣诲姞鍒版祦绋�
+        process.addFlowElement(newUserTask);
+        process.addFlowElement(newSequenceFlow1);
+        process.addFlowElement(newSequenceFlow2);
+        process.removeFlowElement(currentOutgoingFlow.getId());
+        //鑾峰彇寮�濮嬭妭鐐�
+        StartEvent startEvent = process.findFlowElementsOfType(StartEvent.class, false).get(0);
+        //缁樺埗鏂扮殑娴佺▼鍥�
+        GraphicInfo elementGraphicInfo = bpmnModel.getGraphicInfo(currentUserTask.getId());
+        if (elementGraphicInfo != null) {
+            double yDiff = 0;
+            double xDiff = 80;
+            if (elementGraphicInfo.getY() < 173) {
+                yDiff = 173 - elementGraphicInfo.getY();
+                elementGraphicInfo.setY(173);
+            }
+
+            Map<String, GraphicInfo> locationMap = bpmnModel.getLocationMap();
+            for (String locationId : locationMap.keySet()) {
+                if (startEvent.getId().equals(locationId)) {
+                    continue;
+                }
+
+                GraphicInfo locationGraphicInfo = locationMap.get(locationId);
+                locationGraphicInfo.setX(locationGraphicInfo.getX() + xDiff);
+                locationGraphicInfo.setY(locationGraphicInfo.getY() + yDiff);
+            }
+
+            Map<String, List<GraphicInfo>> flowLocationMap = bpmnModel.getFlowLocationMap();
+            for (String flowId : flowLocationMap.keySet()) {
+                List<GraphicInfo> flowGraphicInfoList = flowLocationMap.get(flowId);
+                for (GraphicInfo flowGraphicInfo : flowGraphicInfoList) {
+                    flowGraphicInfo.setX(flowGraphicInfo.getX() + xDiff);
+                    flowGraphicInfo.setY(flowGraphicInfo.getY() + yDiff);
+                }
+            }
+            //绉婚櫎褰撳墠娴佺▼杩炵嚎
+            bpmnModel.removeFlowGraphicInfoList(currentOutgoingFlow.getId());
+            //閲嶆柊缁樺埗
+            new BpmnAutoLayout(bpmnModel).execute();
+        }
+        BaseDynamicSubProcessInjectUtil.processFlowElements(commandContext, process, bpmnModel, originalProcessDefinitionEntity, newDeploymentEntity);
+    }
+
+    @Override
+    protected void updateExecutions(CommandContext commandContext, ProcessDefinitionEntity processDefinitionEntity, ExecutionEntity processInstance, List<ExecutionEntity> childExecutions) {
+    }
+
+    private UserTask createUserTask(Process process) {
+        UserTask userTask = new UserTask();
+        if (dynamicUserTaskBuilder.getId() != null) {
+            userTask.setId(dynamicUserTaskBuilder.getId());
+        } else {
+            userTask.setId(dynamicUserTaskBuilder.nextTaskId(process.getFlowElementMap()));
+        }
+        dynamicUserTaskBuilder.setDynamicTaskId(userTask.getId());
+
+        userTask.setName(dynamicUserTaskBuilder.getName());
+        userTask.setAssignee(dynamicUserTaskBuilder.getAssignee());
+        return userTask;
+    }
+
+    @Override
+    public Void execute(CommandContext commandContext) {
+        createDerivedProcessDefinitionForProcessInstance(commandContext, processInstanceId);
+        return null;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java
index f8bb260..63b394b 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActHiTaskinstMapper.java
@@ -7,7 +7,7 @@
 /**
  * 娴佺▼鍘嗗彶浠诲姟Mapper鎺ュ彛
  *
- * @author gssong
+ * @author may
  * @date 2024-03-02
  */
 @InterceptorIgnore(tenantLine = "true")
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java
index 5682862..63c5ecb 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/ActTaskMapper.java
@@ -13,7 +13,7 @@
 /**
  * 浠诲姟淇℃伅Mapper鎺ュ彛
  *
- * @author gssong
+ * @author may
  * @date 2024-03-02
  */
 @InterceptorIgnore(tenantLine = "true")
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java
new file mode 100644
index 0000000..95e0b87
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfDefinitionConfigMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.workflow.mapper;
+
+import org.dromara.workflow.domain.WfDefinitionConfig;
+import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 琛ㄥ崟閰嶇疆Mapper鎺ュ彛
+ *
+ * @author may
+ * @date 2024-03-18
+ */
+public interface WfDefinitionConfigMapper extends BaseMapperPlus<WfDefinitionConfig, WfDefinitionConfigVo> {
+
+}
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
deleted file mode 100644
index 4262532..0000000
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormDefinitionMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-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/mapper/WfFormManageMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java
new file mode 100644
index 0000000..acf8111
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfFormManageMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.workflow.mapper;
+
+import org.dromara.workflow.domain.WfFormManage;
+import org.dromara.workflow.domain.vo.WfFormManageVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 琛ㄥ崟绠$悊Mapper鎺ュ彛
+ *
+ * @author may
+ * @date 2024-03-29
+ */
+public interface WfFormManageMapper extends BaseMapperPlus<WfFormManage, WfFormManageVo> {
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java
new file mode 100644
index 0000000..d2aecac
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/mapper/WfNodeConfigMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.workflow.mapper;
+
+import org.dromara.workflow.domain.WfNodeConfig;
+import org.dromara.workflow.domain.vo.WfNodeConfigVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 鑺傜偣閰嶇疆Mapper鎺ュ彛
+ *
+ * @author may
+ * @date 2024-03-30
+ */
+public interface WfNodeConfigMapper extends BaseMapperPlus<WfNodeConfig, WfNodeConfigVo> {
+
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java
index d71e93f..ad286e2 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IActHiTaskinstService.java
@@ -4,7 +4,7 @@
 /**
  * 娴佺▼鍘嗗彶浠诲姟Service鎺ュ彛
  *
- * @author gssong
+ * @author may
  * @date 2024-03-02
  */
 public interface IActHiTaskinstService {
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java
new file mode 100644
index 0000000..b9216a5
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfDefinitionConfigService.java
@@ -0,0 +1,57 @@
+package org.dromara.workflow.service;
+
+import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
+import org.dromara.workflow.domain.bo.WfDefinitionConfigBo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 琛ㄥ崟閰嶇疆Service鎺ュ彛
+ *
+ * @author may
+ * @date 2024-03-18
+ */
+public interface IWfDefinitionConfigService {
+
+    /**
+     * 鏌ヨ琛ㄥ崟閰嶇疆
+     *
+     * @param definitionId 娴佺▼瀹氫箟id
+     * @return 缁撴灉
+     */
+    WfDefinitionConfigVo getByDefId(String definitionId);
+
+    /**
+     * 鏌ヨ琛ㄥ崟閰嶇疆鍒楄〃
+     *
+     * @param definitionIds 娴佺▼瀹氫箟id
+     * @return 缁撴灉
+     */
+    List<WfDefinitionConfigVo> queryList(List<String> definitionIds);
+
+
+    /**
+     * 鏂板琛ㄥ崟閰嶇疆
+     *
+     * @param bo 鍙傛暟
+     * @return 缁撴灉
+     */
+    Boolean saveOrUpdate(WfDefinitionConfigBo bo);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param ids id
+     * @return 缁撴灉
+     */
+    Boolean deleteByIds(Collection<Long> ids);
+
+    /**
+     * 鎸夌収娴佺▼瀹氫箟id鍒犻櫎
+     *
+     * @param ids 娴佺▼瀹氫箟id
+     * @return 缁撴灉
+     */
+    Boolean deleteByDefIds(Collection<String> ids);
+}
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
deleted file mode 100644
index 683fc73..0000000
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormDefinitionService.java
+++ /dev/null
@@ -1,49 +0,0 @@
-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/IWfFormManageService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java
new file mode 100644
index 0000000..2ca2264
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfFormManageService.java
@@ -0,0 +1,81 @@
+package org.dromara.workflow.service;
+
+import org.dromara.workflow.domain.vo.WfFormManageVo;
+import org.dromara.workflow.domain.bo.WfFormManageBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 琛ㄥ崟绠$悊Service鎺ュ彛
+ *
+ * @author may
+ * @date 2024-03-29
+ */
+public interface IWfFormManageService {
+
+    /**
+     * 鏌ヨ琛ㄥ崟绠$悊
+     *
+     * @param id 涓婚敭
+     * @return 缁撴灉
+     */
+    WfFormManageVo queryById(Long id);
+
+    /**
+     * 鏌ヨ琛ㄥ崟绠$悊
+     *
+     * @param ids 涓婚敭
+     * @return 缁撴灉
+     */
+    List<WfFormManageVo> queryByIds(List<Long> ids);
+
+    /**
+     * 鏌ヨ琛ㄥ崟绠$悊鍒楄〃
+     *
+     * @param bo        鍙傛暟
+     * @param pageQuery 鍒嗛〉
+     * @return 缁撴灉
+     */
+    TableDataInfo<WfFormManageVo> queryPageList(WfFormManageBo bo, PageQuery pageQuery);
+
+    /**
+     * 鏌ヨ琛ㄥ崟绠$悊鍒楄〃
+     *
+     * @return 缁撴灉
+     */
+    List<WfFormManageVo> selectList();
+    /**
+     * 鏌ヨ琛ㄥ崟绠$悊鍒楄〃
+     *
+     * @param bo 鍙傛暟
+     * @return 缁撴灉
+     */
+    List<WfFormManageVo> queryList(WfFormManageBo bo);
+
+    /**
+     * 鏂板琛ㄥ崟绠$悊
+     *
+     * @param bo 鍙傛暟
+     * @return 缁撴灉
+     */
+    Boolean insertByBo(WfFormManageBo bo);
+
+    /**
+     * 淇敼琛ㄥ崟绠$悊
+     *
+     * @param bo 鍙傛暟
+     * @return 缁撴灉
+     */
+    Boolean updateByBo(WfFormManageBo bo);
+
+    /**
+     * 鎵归噺鍒犻櫎琛ㄥ崟绠$悊淇℃伅
+     *
+     * @param ids 涓婚敭
+     * @return 缁撴灉
+     */
+    Boolean deleteByIds(Collection<Long> ids);
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java
new file mode 100644
index 0000000..5e64d64
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IWfNodeConfigService.java
@@ -0,0 +1,56 @@
+package org.dromara.workflow.service;
+
+import org.dromara.workflow.domain.WfNodeConfig;
+import org.dromara.workflow.domain.vo.WfNodeConfigVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鑺傜偣閰嶇疆Service鎺ュ彛
+ *
+ * @author may
+ * @date 2024-03-30
+ */
+public interface IWfNodeConfigService {
+
+    /**
+     * 鏌ヨ鑺傜偣閰嶇疆
+     *
+     * @param id 涓婚敭
+     * @return 缁撴灉
+     */
+    WfNodeConfigVo queryById(Long id);
+
+    /**
+     * 淇濆瓨鑺傜偣閰嶇疆
+     *
+     * @param list 鍙傛暟
+     * @return 缁撴灉
+     */
+    Boolean saveOrUpdate(List<WfNodeConfig> list);
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傜偣閰嶇疆淇℃伅
+     *
+     * @param ids 涓婚敭
+     * @return 缁撴灉
+     */
+    Boolean deleteByIds(Collection<Long> ids);
+
+    /**
+     * 鎸夌収娴佺▼瀹氫箟id鍒犻櫎
+     *
+     * @param ids 娴佺▼瀹氫箟id
+     * @return 缁撴灉
+     */
+    Boolean deleteByDefIds(Collection<String> ids);
+
+    /**
+     * 鎸夌収娴佺▼瀹氫箟id鏌ヨ
+     *
+     * @param ids 娴佺▼瀹氫箟id
+     * @return 缁撴灉
+     */
+    List<WfNodeConfigVo> selectByDefIds(Collection<String> ids);
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java
index 7faabc2..5548f22 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActHiTaskinstServiceImpl.java
@@ -8,7 +8,7 @@
 /**
  * 娴佺▼鍘嗗彶浠诲姟Service涓氬姟灞傚鐞�
  *
- * @author gssong
+ * @author may
  * @date 2024-03-02
  */
 @RequiredArgsConstructor
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
index e070dfd..226b88c 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActModelServiceImpl.java
@@ -7,27 +7,30 @@
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.ZipUtil;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.excel.util.StringUtils;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import org.apache.batik.transcoder.TranscoderInput;
 import org.apache.batik.transcoder.TranscoderOutput;
 import org.apache.batik.transcoder.image.PNGTranscoder;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.workflow.common.constant.FlowConstant;
+import org.dromara.workflow.domain.WfNodeConfig;
 import org.dromara.workflow.domain.bo.ModelBo;
-import org.dromara.workflow.domain.bo.WfFormDefinitionBo;
+import org.dromara.workflow.domain.bo.WfDefinitionConfigBo;
 import org.dromara.workflow.domain.vo.ModelVo;
-import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
+import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
 import org.dromara.workflow.service.IActModelService;
-import org.dromara.workflow.service.IWfFormDefinitionService;
+import org.dromara.workflow.service.IWfDefinitionConfigService;
+import org.dromara.workflow.service.IWfNodeConfigService;
 import org.dromara.workflow.utils.ModelUtils;
 import org.dromara.workflow.utils.QueryUtils;
 import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.bpmn.model.UserTask;
 import org.flowable.engine.RepositoryService;
 import org.flowable.engine.repository.*;
 import org.flowable.validation.ValidationError;
@@ -40,6 +43,7 @@
 import java.io.InputStream;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.zip.ZipEntry;
@@ -55,7 +59,8 @@
 public class ActModelServiceImpl implements IActModelService {
 
     private final RepositoryService repositoryService;
-    private final IWfFormDefinitionService iWfFormDefinitionService;
+    private final IWfDefinitionConfigService iWfDefinitionConfigService;
+    private final IWfNodeConfigService iWfNodeConfigService;
 
     /**
      * 鍒嗛〉鏌ヨ妯″瀷
@@ -66,13 +71,13 @@
     @Override
     public TableDataInfo<Model> page(ModelBo modelBo, PageQuery pageQuery) {
         ModelQuery query = QueryUtils.modelQuery();
-        if (StringUtils.isNotEmpty(modelBo.getName())) {
+        if (StringUtils.isNotBlank(modelBo.getName())) {
             query.modelNameLike("%" + modelBo.getName() + "%");
         }
-        if (StringUtils.isNotEmpty(modelBo.getKey())) {
+        if (StringUtils.isNotBlank(modelBo.getKey())) {
             query.modelKey(modelBo.getKey());
         }
-        if (StringUtils.isNotEmpty(modelBo.getCategoryCode())) {
+        if (StringUtils.isNotBlank(modelBo.getCategoryCode())) {
             query.modelCategory(modelBo.getCategoryCode());
         }
         query.orderByLastUpdateTime().desc();
@@ -279,17 +284,36 @@
             // 鏇存柊鍒嗙被
             ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult();
             repositoryService.setProcessDefinitionCategory(definition.getId(), model.getCategory());
+            //鏇存柊娴佺▼瀹氫箟琛ㄥ崟
             if (processDefinition != null) {
-                WfFormDefinitionVo definitionVo = iWfFormDefinitionService.getByDefId(processDefinition.getId());
+                WfDefinitionConfigVo definitionVo = iWfDefinitionConfigService.getByDefId(processDefinition.getId());
                 if (definitionVo != null) {
-                    WfFormDefinitionBo wfFormDefinition = new WfFormDefinitionBo();
+                    WfDefinitionConfigBo wfFormDefinition = new WfDefinitionConfigBo();
                     wfFormDefinition.setDefinitionId(definition.getId());
                     wfFormDefinition.setProcessKey(definition.getKey());
-                    wfFormDefinition.setPath(definitionVo.getPath());
+                    wfFormDefinition.setFormId(ObjectUtil.isNotNull(definitionVo.getFormId()) ? definitionVo.getFormId() : null);
                     wfFormDefinition.setRemark(definitionVo.getRemark());
-                    iWfFormDefinitionService.saveOrUpdate(wfFormDefinition);
+                    iWfDefinitionConfigService.saveOrUpdate(wfFormDefinition);
                 }
             }
+            //鏇存柊娴佺▼鑺傜偣閰嶇疆琛ㄥ崟
+            List<UserTask> userTasks = ModelUtils.getuserTaskFlowElements(definition.getId());
+            List<WfNodeConfig> wfNodeConfigList = new ArrayList<>();
+            for (UserTask userTask : userTasks) {
+                if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) {
+                    WfNodeConfig wfNodeConfig = new WfNodeConfig();
+                    wfNodeConfig.setNodeId(userTask.getId());
+                    wfNodeConfig.setNodeName(userTask.getName());
+                    wfNodeConfig.setDefinitionId(definition.getId());
+                    String[] split = userTask.getFormKey().split(StrUtil.COLON);
+                    wfNodeConfig.setFormType(split[0]);
+                    wfNodeConfig.setFormId(Long.valueOf(split[1]));
+                    wfNodeConfigList.add(wfNodeConfig);
+                }
+            }
+            if (CollUtil.isNotEmpty(wfNodeConfigList)) {
+                iWfNodeConfigService.saveOrUpdate(wfNodeConfigList);
+            }
             return true;
         } catch (Exception e) {
             e.printStackTrace();
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 dafbad6..3ec2c47 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
@@ -7,6 +7,7 @@
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.commons.io.IOUtils;
@@ -18,13 +19,18 @@
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.workflow.common.constant.FlowConstant;
 import org.dromara.workflow.domain.WfCategory;
+import org.dromara.workflow.domain.WfNodeConfig;
 import org.dromara.workflow.domain.bo.ProcessDefinitionBo;
+import org.dromara.workflow.domain.bo.WfDefinitionConfigBo;
 import org.dromara.workflow.domain.vo.ProcessDefinitionVo;
-import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
+import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
 import org.dromara.workflow.service.IActProcessDefinitionService;
 import org.dromara.workflow.service.IWfCategoryService;
-import org.dromara.workflow.service.IWfFormDefinitionService;
+import org.dromara.workflow.service.IWfDefinitionConfigService;
+import org.dromara.workflow.service.IWfNodeConfigService;
+import org.dromara.workflow.utils.ModelUtils;
 import org.dromara.workflow.utils.QueryUtils;
+import org.flowable.bpmn.model.UserTask;
 import org.flowable.engine.ProcessMigrationService;
 import org.flowable.engine.RepositoryService;
 import org.flowable.engine.impl.bpmn.deployer.ResourceNameUtil;
@@ -38,6 +44,7 @@
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
@@ -54,7 +61,8 @@
     private final RepositoryService repositoryService;
     private final ProcessMigrationService processMigrationService;
     private final IWfCategoryService wfCategoryService;
-    private final IWfFormDefinitionService iWfFormDefinitionService;
+    private final IWfDefinitionConfigService iWfDefinitionConfigService;
+    private final IWfNodeConfigService iWfNodeConfigService;
 
     /**
      * 鍒嗛〉鏌ヨ
@@ -85,7 +93,7 @@
         }
         if (CollUtil.isNotEmpty(definitionList)) {
             List<String> ids = StreamUtils.toList(definitionList, ProcessDefinition::getId);
-            List<WfFormDefinitionVo> wfFormDefinitionVos = iWfFormDefinitionService.queryList(ids);
+            List<WfDefinitionConfigVo> wfDefinitionConfigVos = iWfDefinitionConfigService.queryList(ids);
             for (ProcessDefinition processDefinition : definitionList) {
                 ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
                 if (CollUtil.isNotEmpty(deploymentList)) {
@@ -94,8 +102,8 @@
                         processDefinitionVo.setDeploymentTime(e.getDeploymentTime());
                     });
                 }
-                if (CollUtil.isNotEmpty(wfFormDefinitionVos)) {
-                    wfFormDefinitionVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfFormDefinitionVo);
+                if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) {
+                    wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo);
                 }
                 processDefinitionVoList.add(processDefinitionVo);
             }
@@ -125,7 +133,7 @@
         }
         if (CollUtil.isNotEmpty(definitionList)) {
             List<String> ids = StreamUtils.toList(definitionList, ProcessDefinition::getId);
-            List<WfFormDefinitionVo> wfFormDefinitionVos = iWfFormDefinitionService.queryList(ids);
+            List<WfDefinitionConfigVo> wfDefinitionConfigVos = iWfDefinitionConfigService.queryList(ids);
             for (ProcessDefinition processDefinition : definitionList) {
                 ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class);
                 if (CollUtil.isNotEmpty(deploymentList)) {
@@ -133,8 +141,8 @@
                     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);
+                    if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) {
+                        wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo);
                     }
                 }
                 processDefinitionVoList.add(processDefinitionVo);
@@ -192,7 +200,9 @@
             //鍒犻櫎娴佺▼瀹氫箟
             repositoryService.deleteDeployment(deploymentId);
             //鍒犻櫎琛ㄥ崟閰嶇疆
-            iWfFormDefinitionService.getByDefId(processDefinitionId);
+            iWfDefinitionConfigService.deleteByDefIds(Collections.singletonList(processDefinitionId));
+            //鍒犻櫎鑺傜偣閰嶇疆
+            iWfNodeConfigService.deleteByDefIds(Collections.singletonList(processDefinitionId));
             return true;
         } catch (Exception e) {
             e.printStackTrace();
@@ -313,12 +323,14 @@
                     String processName = splitFilename[0];
                     //娴佺▼key
                     String processKey = splitFilename[1];
+                    ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult();
                     DeploymentBuilder builder = repositoryService.createDeployment();
                     Deployment deployment = builder.addInputStream(filename, zipInputStream)
                         .tenantId(TenantHelper.getTenantId())
                         .name(processName).key(processKey).category(categoryCode).deploy();
                     ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult();
                     repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode);
+                    setForm(oldProcessDefinition, definition);
                     zipInputStream.closeEntry();
                 }
             } catch (IOException e) {
@@ -341,6 +353,8 @@
                 String processName = splitFilename[0];
                 //娴佺▼key
                 String processKey = splitFilename[1];
+                ProcessDefinition oldProcessDefinition = QueryUtils.definitionQuery().processDefinitionKey(processKey).latestVersion().singleResult();
+
                 DeploymentBuilder builder = repositoryService.createDeployment();
                 Deployment deployment = builder.addInputStream(originalFilename, inputStream)
                     .tenantId(TenantHelper.getTenantId())
@@ -348,10 +362,51 @@
                 // 鏇存柊鍒嗙被
                 ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult();
                 repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode);
+                setForm(oldProcessDefinition, definition);
+
             } else {
                 throw new ServiceException("鏂囦欢绫诲瀷涓婁紶閿欒锛�");
             }
         }
 
     }
+
+    /**
+     * 璁剧疆琛ㄥ崟鍐呭
+     *
+     * @param oldProcessDefinition 閮ㄧ讲鍓嶆渶鏂版祦绋嬪畾涔�
+     * @param definition           閮ㄧ讲鍚庢渶鏂版祦绋嬪畾涔�
+     */
+    private void setForm(ProcessDefinition oldProcessDefinition, ProcessDefinition definition) {
+        //鏇存柊娴佺▼瀹氫箟琛ㄥ崟
+        if (oldProcessDefinition != null) {
+            WfDefinitionConfigVo definitionVo = iWfDefinitionConfigService.getByDefId(oldProcessDefinition.getId());
+            if (definitionVo != null) {
+                WfDefinitionConfigBo wfFormDefinition = new WfDefinitionConfigBo();
+                wfFormDefinition.setDefinitionId(definition.getId());
+                wfFormDefinition.setProcessKey(definition.getKey());
+                wfFormDefinition.setFormId(ObjectUtil.isNotNull(definitionVo.getFormId()) ? definitionVo.getFormId() : null);
+                wfFormDefinition.setRemark(definitionVo.getRemark());
+                iWfDefinitionConfigService.saveOrUpdate(wfFormDefinition);
+            }
+        }
+        //鏇存柊娴佺▼鑺傜偣閰嶇疆琛ㄥ崟
+        List<UserTask> userTasks = ModelUtils.getuserTaskFlowElements(definition.getId());
+        List<WfNodeConfig> wfNodeConfigList = new ArrayList<>();
+        for (UserTask userTask : userTasks) {
+            if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) {
+                WfNodeConfig wfNodeConfig = new WfNodeConfig();
+                wfNodeConfig.setNodeId(userTask.getId());
+                wfNodeConfig.setNodeName(userTask.getName());
+                wfNodeConfig.setDefinitionId(definition.getId());
+                String[] split = userTask.getFormKey().split(StrUtil.COLON);
+                wfNodeConfig.setFormType(split[0]);
+                wfNodeConfig.setFormId(Long.valueOf(split[1]));
+                wfNodeConfigList.add(wfNodeConfig);
+            }
+        }
+        if (CollUtil.isNotEmpty(wfNodeConfigList)) {
+            iWfNodeConfigService.saveOrUpdate(wfNodeConfigList);
+        }
+    }
 }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java
index 3edf8ec..d316520 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessInstanceServiceImpl.java
@@ -122,7 +122,7 @@
         }
         if (CollUtil.isNotEmpty(list)) {
             List<String> processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId);
-            WorkflowUtils.setWfFormDefinitionVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
+            WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
         }
         long count = query.count();
         TableDataInfo<ProcessInstanceVo> build = TableDataInfo.build();
@@ -164,7 +164,7 @@
         }
         if (CollUtil.isNotEmpty(list)) {
             List<String> processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId);
-            WorkflowUtils.setWfFormDefinitionVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
+            WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
         }
         long count = query.count();
         TableDataInfo<ProcessInstanceVo> build = TableDataInfo.build();
@@ -669,7 +669,7 @@
         }
         if (CollUtil.isNotEmpty(list)) {
             List<String> processDefinitionIds = StreamUtils.toList(list, ProcessInstanceVo::getProcessDefinitionId);
-            WorkflowUtils.setWfFormDefinitionVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
+            WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
         }
         long count = query.count();
         TableDataInfo<ProcessInstanceVo> build = TableDataInfo.build();
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 44d6932..871db16 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
@@ -30,6 +30,7 @@
 import org.dromara.workflow.mapper.ActHiTaskinstMapper;
 import org.dromara.workflow.mapper.ActTaskMapper;
 import org.dromara.workflow.service.IActTaskService;
+import org.dromara.workflow.service.IWfNodeConfigService;
 import org.dromara.workflow.service.IWfTaskBackNodeService;
 import org.dromara.workflow.utils.ModelUtils;
 import org.dromara.workflow.utils.QueryUtils;
@@ -76,6 +77,7 @@
     private final ActTaskMapper actTaskMapper;
     private final IWfTaskBackNodeService iWfTaskBackNodeService;
     private final ActHiTaskinstMapper actHiTaskinstMapper;
+    private final IWfNodeConfigService iWfNodeConfigService;
 
     /**
      * 鍚姩浠诲姟
@@ -273,13 +275,17 @@
 
         List<TaskVo> taskList = page.getRecords();
         if (CollUtil.isNotEmpty(taskList)) {
+            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
+            List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds);
             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(wfNodeConfigVoList)) {
+                    wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(task::setWfNodeConfigVo);
+                }
             }
-            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
-            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
+            WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
         }
         return TableDataInfo.build(page);
     }
@@ -322,25 +328,29 @@
             processInstanceList = QueryUtils.instanceQuery(processInstanceIds).list();
         }
         List<TaskVo> list = new ArrayList<>();
-        for (Task task : taskList) {
-            TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
-            if (CollUtil.isNotEmpty(processInstanceList)) {
-                processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
-                    taskVo.setBusinessStatus(e.getBusinessStatus());
-                    taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus()));
-                    taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey());
-                    taskVo.setProcessDefinitionName(e.getProcessDefinitionName());
-                    taskVo.setBusinessKey(e.getBusinessKey());
-                });
+        if (CollUtil.isNotEmpty(taskList)) {
+            List<String> processDefinitionIds = StreamUtils.toList(taskList, Task::getProcessDefinitionId);
+            List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds);
+            for (Task task : taskList) {
+                TaskVo taskVo = BeanUtil.toBean(task, TaskVo.class);
+                if (CollUtil.isNotEmpty(processInstanceList)) {
+                    processInstanceList.stream().filter(e -> e.getId().equals(task.getProcessInstanceId())).findFirst().ifPresent(e -> {
+                        taskVo.setBusinessStatus(e.getBusinessStatus());
+                        taskVo.setBusinessStatusName(BusinessStatusEnum.findByStatus(taskVo.getBusinessStatus()));
+                        taskVo.setProcessDefinitionKey(e.getProcessDefinitionKey());
+                        taskVo.setProcessDefinitionName(e.getProcessDefinitionName());
+                        taskVo.setBusinessKey(e.getBusinessKey());
+                    });
+                }
+                taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null);
+                taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
+                taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
+                if (CollUtil.isNotEmpty(wfNodeConfigVoList)) {
+                    wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(taskVo::setWfNodeConfigVo);
+                }
+                list.add(taskVo);
             }
-            taskVo.setAssignee(StringUtils.isNotBlank(task.getAssignee()) ? Long.valueOf(task.getAssignee()) : null);
-            taskVo.setParticipantVo(WorkflowUtils.getCurrentTaskParticipant(task.getId()));
-            taskVo.setMultiInstance(WorkflowUtils.isMultiInstance(task.getProcessDefinitionId(), task.getTaskDefinitionKey()) != null);
-            list.add(taskVo);
-        }
-        if (CollUtil.isNotEmpty(list)) {
-            List<String> processDefinitionIds = StreamUtils.toList(list, TaskVo::getProcessDefinitionId);
-            WorkflowUtils.setWfFormDefinitionVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
+            WorkflowUtils.setWfDefinitionConfigVo(list, processDefinitionIds, PROCESS_DEFINITION_ID);
         }
         long count = query.count();
         TableDataInfo<TaskVo> build = TableDataInfo.build();
@@ -366,11 +376,15 @@
 
         List<TaskVo> taskList = page.getRecords();
         if (CollUtil.isNotEmpty(taskList)) {
+            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
+            List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds);
             for (TaskVo task : taskList) {
                 task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
+                if (CollUtil.isNotEmpty(wfNodeConfigVoList)) {
+                    wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(task::setWfNodeConfigVo);
+                }
             }
-            List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
-            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
+            WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
         }
         return TableDataInfo.build(page);
     }
@@ -397,12 +411,17 @@
         Page<TaskVo> page = actTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper);
 
         List<TaskVo> taskList = page.getRecords();
-        for (TaskVo task : taskList) {
-            task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
-        }
         if (CollUtil.isNotEmpty(taskList)) {
             List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
-            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
+            List<WfNodeConfigVo> wfNodeConfigVoList = iWfNodeConfigService.selectByDefIds(processDefinitionIds);
+            for (TaskVo task : taskList) {
+                task.setBusinessStatusName(BusinessStatusEnum.findByStatus(task.getBusinessStatus()));
+                if (CollUtil.isNotEmpty(wfNodeConfigVoList)) {
+                    wfNodeConfigVoList.stream().filter(e -> e.getDefinitionId().equals(task.getProcessDefinitionId()) && e.getNodeId().equals(task.getTaskDefinitionKey())).findFirst().ifPresent(task::setWfNodeConfigVo);
+                }
+            }
+            WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
+
         }
         return TableDataInfo.build(page);
     }
@@ -426,7 +445,7 @@
         }
         if (CollUtil.isNotEmpty(taskList)) {
             List<String> processDefinitionIds = StreamUtils.toList(taskList, TaskVo::getProcessDefinitionId);
-            WorkflowUtils.setWfFormDefinitionVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
+            WorkflowUtils.setWfDefinitionConfigVo(taskList, processDefinitionIds, PROCESS_DEFINITION_ID);
         }
         return TableDataInfo.build(page);
     }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java
new file mode 100644
index 0000000..5127d66
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfDefinitionConfigServiceImpl.java
@@ -0,0 +1,71 @@
+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.dromara.workflow.domain.WfDefinitionConfig;
+import org.dromara.workflow.domain.bo.WfDefinitionConfigBo;
+import org.dromara.workflow.domain.vo.WfDefinitionConfigVo;
+import org.dromara.workflow.service.IWfDefinitionConfigService;
+import org.springframework.stereotype.Service;
+import org.dromara.workflow.mapper.WfDefinitionConfigMapper;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Collection;
+
+/**
+ * 琛ㄥ崟閰嶇疆Service涓氬姟灞傚鐞�
+ *
+ * @author may
+ * @date 2024-03-18
+ */
+@RequiredArgsConstructor
+@Service
+public class WfDefinitionConfigServiceImpl implements IWfDefinitionConfigService {
+
+    private final WfDefinitionConfigMapper baseMapper;
+
+    /**
+     * 鏌ヨ琛ㄥ崟閰嶇疆
+     */
+    @Override
+    public WfDefinitionConfigVo getByDefId(String definitionId) {
+        return baseMapper.selectVoOne(new LambdaQueryWrapper<WfDefinitionConfig>().eq(WfDefinitionConfig::getDefinitionId, definitionId));
+    }
+
+    /**
+     * 鏌ヨ琛ㄥ崟閰嶇疆鍒楄〃
+     */
+    @Override
+    public List<WfDefinitionConfigVo> queryList(List<String> definitionIds) {
+        return baseMapper.selectVoList(new LambdaQueryWrapper<WfDefinitionConfig>().in(WfDefinitionConfig::getDefinitionId, definitionIds));
+    }
+
+    /**
+     * 鏂板琛ㄥ崟閰嶇疆
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean saveOrUpdate(WfDefinitionConfigBo bo) {
+        WfDefinitionConfig add = MapstructUtils.convert(bo, WfDefinitionConfig.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;
+    }
+
+    @Override
+    public Boolean deleteByDefIds(Collection<String> ids) {
+        return baseMapper.delete(new LambdaQueryWrapper<WfDefinitionConfig>().in(WfDefinitionConfig::getDefinitionId, ids)) > 0;
+    }
+}
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
deleted file mode 100644
index 00def95..0000000
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormDefinitionServiceImpl.java
+++ /dev/null
@@ -1,66 +0,0 @@
-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/service/impl/WfFormManageServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java
new file mode 100644
index 0000000..e0850d7
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfFormManageServiceImpl.java
@@ -0,0 +1,111 @@
+package org.dromara.workflow.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.workflow.common.enums.FormTypeEnum;
+import org.springframework.stereotype.Service;
+import org.dromara.workflow.domain.bo.WfFormManageBo;
+import org.dromara.workflow.domain.vo.WfFormManageVo;
+import org.dromara.workflow.domain.WfFormManage;
+import org.dromara.workflow.mapper.WfFormManageMapper;
+import org.dromara.workflow.service.IWfFormManageService;
+
+import java.util.List;
+import java.util.Collection;
+
+/**
+ * 琛ㄥ崟绠$悊Service涓氬姟灞傚鐞�
+ *
+ * @author may
+ * @date 2024-03-29
+ */
+@RequiredArgsConstructor
+@Service
+public class WfFormManageServiceImpl implements IWfFormManageService {
+
+    private final WfFormManageMapper baseMapper;
+
+    /**
+     * 鏌ヨ琛ㄥ崟绠$悊
+     */
+    @Override
+    public WfFormManageVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    @Override
+    public List<WfFormManageVo> queryByIds(List<Long> ids) {
+        return baseMapper.selectVoBatchIds(ids);
+    }
+
+    /**
+     * 鏌ヨ琛ㄥ崟绠$悊鍒楄〃
+     */
+    @Override
+    public TableDataInfo<WfFormManageVo> queryPageList(WfFormManageBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<WfFormManage> lqw = buildQueryWrapper(bo);
+        Page<WfFormManageVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public List<WfFormManageVo> selectList() {
+        List<WfFormManageVo> wfFormManageVos = baseMapper.selectVoList(new LambdaQueryWrapper<WfFormManage>().orderByDesc(WfFormManage::getUpdateTime));
+        for (WfFormManageVo wfFormManageVo : wfFormManageVos) {
+            wfFormManageVo.setFormTypeName(FormTypeEnum.findByType(wfFormManageVo.getFormType()));
+        }
+        return wfFormManageVos;
+    }
+
+    /**
+     * 鏌ヨ琛ㄥ崟绠$悊鍒楄〃
+     */
+    @Override
+    public List<WfFormManageVo> queryList(WfFormManageBo bo) {
+        LambdaQueryWrapper<WfFormManage> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<WfFormManage> buildQueryWrapper(WfFormManageBo bo) {
+        LambdaQueryWrapper<WfFormManage> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getFormName()), WfFormManage::getFormName, bo.getFormName());
+        lqw.eq(StringUtils.isNotBlank(bo.getFormType()), WfFormManage::getFormType, bo.getFormType());
+        return lqw;
+    }
+
+    /**
+     * 鏂板琛ㄥ崟绠$悊
+     */
+    @Override
+    public Boolean insertByBo(WfFormManageBo bo) {
+        WfFormManage add = MapstructUtils.convert(bo, WfFormManage.class);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 淇敼琛ㄥ崟绠$悊
+     */
+    @Override
+    public Boolean updateByBo(WfFormManageBo bo) {
+        WfFormManage update = MapstructUtils.convert(bo, WfFormManage.class);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎琛ㄥ崟绠$悊
+     */
+    @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/service/impl/WfNodeConfigServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java
new file mode 100644
index 0000000..e47d4af
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/WfNodeConfigServiceImpl.java
@@ -0,0 +1,73 @@
+package org.dromara.workflow.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.StreamUtils;
+import org.dromara.workflow.domain.vo.WfFormManageVo;
+import org.dromara.workflow.service.IWfFormManageService;
+import org.springframework.stereotype.Service;
+import org.dromara.workflow.domain.vo.WfNodeConfigVo;
+import org.dromara.workflow.domain.WfNodeConfig;
+import org.dromara.workflow.mapper.WfNodeConfigMapper;
+import org.dromara.workflow.service.IWfNodeConfigService;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 鑺傜偣閰嶇疆Service涓氬姟灞傚鐞�
+ *
+ * @author may
+ * @date 2024-03-30
+ */
+@RequiredArgsConstructor
+@Service
+public class WfNodeConfigServiceImpl implements IWfNodeConfigService {
+
+    private final WfNodeConfigMapper baseMapper;
+    private final IWfFormManageService iWfFormManageService;
+
+    /**
+     * 鏌ヨ鑺傜偣閰嶇疆
+     */
+    @Override
+    public WfNodeConfigVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 淇濆瓨鑺傜偣閰嶇疆
+     */
+    @Override
+    public Boolean saveOrUpdate(List<WfNodeConfig> list) {
+        return baseMapper.insertOrUpdateBatch(list);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傜偣閰嶇疆
+     */
+    @Override
+    public Boolean deleteByIds(Collection<Long> ids) {
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    @Override
+    public Boolean deleteByDefIds(Collection<String> ids) {
+        return baseMapper.delete(new LambdaQueryWrapper<WfNodeConfig>().in(WfNodeConfig::getDefinitionId, ids)) > 0;
+    }
+
+    @Override
+    public List<WfNodeConfigVo> selectByDefIds(Collection<String> ids) {
+        List<WfNodeConfigVo> wfNodeConfigVos = baseMapper.selectVoList(new LambdaQueryWrapper<WfNodeConfig>().in(WfNodeConfig::getDefinitionId, ids));
+        if (CollUtil.isNotEmpty(wfNodeConfigVos)) {
+            List<Long> formIds = StreamUtils.toList(wfNodeConfigVos, WfNodeConfigVo::getFormId);
+            List<WfFormManageVo> wfFormManageVos = iWfFormManageService.queryByIds(formIds);
+            for (WfNodeConfigVo wfNodeConfigVo : wfNodeConfigVos) {
+                wfFormManageVos.stream().filter(e -> ObjectUtil.equals(e.getId(), wfNodeConfigVo.getFormId())).findFirst().ifPresent(wfNodeConfigVo::setWfFormManageVo);
+            }
+        }
+        return wfNodeConfigVos;
+    }
+}
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java
index 7906287..dff3e4e 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/utils/ModelUtils.java
@@ -164,6 +164,37 @@
     }
 
     /**
+     * 鑾峰彇娴佺▼鍏ㄩ儴鐢ㄦ埛鑺傜偣
+     *
+     * @param processDefinitionId 娴佺▼瀹氫箟id
+     */
+    public static List<UserTask> getuserTaskFlowElements(String processDefinitionId) {
+        BpmnModel bpmnModel = PROCESS_ENGINE.getRepositoryService().getBpmnModel(processDefinitionId);
+        List<UserTask> list = new ArrayList<>();
+        List<Process> processes = bpmnModel.getProcesses();
+        Collection<FlowElement> flowElements = processes.get(0).getFlowElements();
+        buildUserTaskFlowElements(flowElements, list);
+        return list;
+    }
+
+    /**
+     * 閫掑綊鑾峰彇鎵�鏈夎妭鐐�
+     *
+     * @param flowElements 鑺傜偣淇℃伅
+     * @param list         闆嗗悎
+     */
+    private static void buildUserTaskFlowElements(Collection<FlowElement> flowElements, List<UserTask> list) {
+        for (FlowElement flowElement : flowElements) {
+            if (flowElement instanceof SubProcess) {
+                Collection<FlowElement> subFlowElements = ((SubProcess) flowElement).getFlowElements();
+                buildUserTaskFlowElements(subFlowElements, list);
+            } else if (flowElement instanceof UserTask) {
+                list.add((UserTask) flowElement);
+            }
+        }
+    }
+
+    /**
      * 鑾峰彇娴佺▼鍏ㄩ儴鑺傜偣
      *
      * @param processDefinitionId 娴佺▼瀹氫箟id
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 faedab0..328e02f 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
@@ -23,15 +23,10 @@
 import org.dromara.workflow.common.enums.TaskStatusEnum;
 import org.dromara.workflow.domain.ActHiProcinst;
 import org.dromara.workflow.domain.ActHiTaskinst;
-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.domain.vo.*;
 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.dromara.workflow.service.*;
 import org.flowable.bpmn.model.BpmnModel;
 import org.flowable.bpmn.model.FlowNode;
 import org.flowable.common.engine.api.delegate.Expression;
@@ -46,8 +41,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;
+import static org.dromara.workflow.common.constant.FlowConstant.*;
 
 /**
  * 宸ヤ綔娴佸伐鍏�
@@ -61,7 +55,8 @@
     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);
+    private static final IWfDefinitionConfigService I_WF_FORM_DEFINITION_SERVICE = SpringUtils.getBean(IWfDefinitionConfigService.class);
+    private static final IWfFormManageService I_WF_FORM_MANAGE_SERVICE = SpringUtils.getBean(IWfFormManageService.class);
 
     /**
      * 鍒涘缓涓�涓柊浠诲姟
@@ -304,17 +299,26 @@
      * @param idList    娴佺▼瀹氫箟id
      * @param fieldName 娴佺▼瀹氫箟ID灞炴�у悕绉�
      */
-    public static void setWfFormDefinitionVo(Object obj, List<String> idList, String fieldName) {
+    public static void setWfDefinitionConfigVo(Object obj, List<String> idList, String fieldName) {
         if (CollUtil.isEmpty(idList) || obj == null) {
             return;
         }
-        List<WfFormDefinitionVo> wfFormDefinitionVoList = I_WF_FORM_DEFINITION_SERVICE.queryList(idList);
+        List<WfDefinitionConfigVo> wfDefinitionConfigVoList = I_WF_FORM_DEFINITION_SERVICE.queryList(idList);
+        if (CollUtil.isNotEmpty(wfDefinitionConfigVoList)) {
+            List<Long> formIds = StreamUtils.toList(wfDefinitionConfigVoList, WfDefinitionConfigVo::getFormId);
+            List<WfFormManageVo> wfFormManageVos = I_WF_FORM_MANAGE_SERVICE.queryByIds(formIds);
+            if (CollUtil.isNotEmpty(wfFormManageVos)) {
+                for (WfDefinitionConfigVo wfDefinitionConfigVo : wfDefinitionConfigVoList) {
+                    wfFormManageVos.stream().filter(e -> ObjectUtil.equals(wfDefinitionConfigVo.getFormId(), e.getId())).findFirst().ifPresent(wfDefinitionConfigVo::setWfFormManageVo);
+                }
+            }
+        }
         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));
+                if (!CollUtil.isEmpty(wfDefinitionConfigVoList)) {
+                    wfDefinitionConfigVoList.stream().filter(e -> e.getDefinitionId().equals(fieldValue)).findFirst().ifPresent(e -> {
+                        ReflectUtils.invokeSetter(o, WF_DEFINITION_CONFIG_VO, BeanUtil.toBean(e, WfDefinitionConfigVo.class));
                     });
                 }
             }
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml
similarity index 69%
copy from ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml
copy to ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml
index 42af9d2..8d579f7 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml
+++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfDefinitionConfigMapper.xml
@@ -2,6 +2,6 @@
 <!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 namespace="org.dromara.workflow.mapper.WfDefinitionConfigMapper">
 
 </mapper>
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml
similarity index 69%
rename from ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml
rename to ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml
index 42af9d2..59221f8 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml
+++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormManageMapper.xml
@@ -2,6 +2,6 @@
 <!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 namespace="org.dromara.workflow.mapper.WfFormManageMapper">
 
 </mapper>
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml
similarity index 69%
copy from ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml
copy to ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml
index 42af9d2..b65194f 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfFormDefinitionMapper.xml
+++ b/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/WfNodeConfigMapper.xml
@@ -2,6 +2,6 @@
 <!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 namespace="org.dromara.workflow.mapper.WfNodeConfigMapper">
 
 </mapper>
diff --git a/script/sql/flowable.sql b/script/sql/flowable.sql
index ab363fa..f08ad05 100644
--- a/script/sql/flowable.sql
+++ b/script/sql/flowable.sql
@@ -78,12 +78,12 @@
 )
     comment '鑺傜偣瀹℃壒璁板綍';
 
-DROP TABLE if EXISTS wf_form_definition;
-create table wf_form_definition
+DROP TABLE if EXISTS wf_definition_config;
+create table wf_definition_config
 (
     id            bigint                        not null comment '涓婚敭'
         primary key,
-    path          varchar(200) default ''       not null comment '璺敱鍦板潃',
+    form_id       bigint                        not null comment '琛ㄥ崟ID',
     definition_id varchar(255)                  not null comment '娴佺▼瀹氫箟ID',
     process_key   varchar(255)                  not null comment '娴佺▼KEY',
     create_dept   bigint                        null comment '鍒涘缓閮ㄩ棬',
@@ -96,8 +96,44 @@
     constraint uni_definition_id
         unique (definition_id)
 )
-    comment '琛ㄥ崟閰嶇疆';
+    comment '娴佺▼瀹氫箟閰嶇疆';
 
+create table wf_form_manage
+(
+    id          bigint       not null comment '涓婚敭'
+        primary key,
+    form_name   varchar(255) not null comment '琛ㄥ崟鍚嶇О',
+    form_type   varchar(255) not null comment '琛ㄥ崟绫诲瀷',
+    router      varchar(255) not null comment '璺敱鍦板潃/琛ㄥ崟ID',
+    remark      varchar(500) null comment '澶囨敞',
+    tenant_id   varchar(20)  null comment '绉熸埛缂栧彿',
+    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 '鏇存柊鏃堕棿'
+)
+    comment '琛ㄥ崟绠$悊';
+
+insert into wf_form_manage(id, form_name, form_type, router, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1, '璇峰亣鐢宠', 'static', '/demo/leaveEdit/index', NULL, '000000', 103, 1, sysdate(), 1, sysdate());
+
+create table wf_node_config
+(
+    id            bigint       not null comment '涓婚敭'
+        primary key,
+    form_id       bigint       null comment '琛ㄥ崟id',
+    form_type     varchar(255) null comment '琛ㄥ崟绫诲瀷',
+    node_name     varchar(255) not null comment '鑺傜偣鍚嶇О',
+    node_id       varchar(255) not null comment '鑺傜偣id',
+    definition_id varchar(255) not null comment '娴佺▼瀹氫箟id',
+    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 '鏇存柊鏃堕棿',
+    tenant_id     varchar(20)  null comment '绉熸埛缂栧彿'
+)
+    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, '璇峰亣鐢宠鑿滃崟');
diff --git a/script/sql/oracle/flowable.sql b/script/sql/oracle/flowable.sql
index 6fde11f..a8616c9 100644
--- a/script/sql/oracle/flowable.sql
+++ b/script/sql/oracle/flowable.sql
@@ -120,12 +120,12 @@
 comment on column WF_TASK_BACK_NODE.UPDATE_BY is '鏇存柊鑰�'
 comment on column WF_TASK_BACK_NODE.UPDATE_TIME is '鏇存柊鏃堕棿'
 
-create table WF_FORM_DEFINITION
+create table WF_DEFINITION_CONFIG
 (
     ID            NUMBER(20) NOT NULL
-        CONSTRAINT PK_WF_FORM_DEFINITION
+        CONSTRAINT PK_WF_DEFINITION_CONFIG
         PRIMARY KEY,
-    PATH          VARCHAR2(200) NOT NULL,
+    FORM_ID       NUMBER(20) NOT NULL,
     DEFINITION_ID VARCHAR2(255) NOT NULL,
     PROCESS_KEY   VARCHAR2(255)  NOT NULL,
     TENANT_ID     VARCHAR2(20),
@@ -137,16 +137,17 @@
     constraint uni_definition_id
         unique (definition_id)
 );
-comment on table WF_FORM_DEFINITION is '琛ㄥ崟閰嶇疆'
-comment on column WF_FORM_DEFINITION.ID is '涓婚敭'
-comment on column WF_FORM_DEFINITION.DEFINITION_ID is '娴佺▼瀹氫箟ID'
-comment on column WF_FORM_DEFINITION.PROCESS_KEY is '娴佺▼KEY'
-comment on column WF_FORM_DEFINITION.TENANT_ID is '绉熸埛缂栧彿'
-comment on column WF_FORM_DEFINITION.CREATE_DEPT is '鍒涘缓閮ㄩ棬'
-comment on column WF_FORM_DEFINITION.CREATE_BY is '鍒涘缓鑰�'
-comment on column WF_FORM_DEFINITION.CREATE_TIME is '鍒涘缓鏃堕棿'
-comment on column WF_FORM_DEFINITION.UPDATE_BY is '鏇存柊鑰�'
-comment on column WF_FORM_DEFINITION.UPDATE_TIME is '鏇存柊鏃堕棿'
+comment on table WF_DEFINITION_CONFIG is '娴佺▼瀹氫箟閰嶇疆'
+comment on column WF_DEFINITION_CONFIG.ID is '涓婚敭'
+comment on column WF_DEFINITION_CONFIG.FORM_ID is '琛ㄥ崟ID'
+comment on column WF_DEFINITION_CONFIG.DEFINITION_ID is '娴佺▼瀹氫箟ID'
+comment on column WF_DEFINITION_CONFIG.PROCESS_KEY is '娴佺▼KEY'
+comment on column WF_DEFINITION_CONFIG.TENANT_ID is '绉熸埛缂栧彿'
+comment on column WF_DEFINITION_CONFIG.CREATE_DEPT is '鍒涘缓閮ㄩ棬'
+comment on column WF_DEFINITION_CONFIG.CREATE_BY is '鍒涘缓鑰�'
+comment on column WF_DEFINITION_CONFIG.CREATE_TIME is '鍒涘缓鏃堕棿'
+comment on column WF_DEFINITION_CONFIG.UPDATE_BY is '鏇存柊鑰�'
+comment on column WF_DEFINITION_CONFIG.UPDATE_TIME is '鏇存柊鏃堕棿'
 
 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, '');
diff --git a/script/sql/postgres/flowable.sql b/script/sql/postgres/flowable.sql
index 4e4f708..b02be4f 100644
--- a/script/sql/postgres/flowable.sql
+++ b/script/sql/postgres/flowable.sql
@@ -166,12 +166,12 @@
 alter table wf_task_back_node
     owner to postgres;
 
-create table wf_form_definition
+create table wf_definition_config
 (
     id            bigint(20) not null
-        constraint pk_wf_form_definition
+        constraint pk_wf_definition_config
         primary key,
-    path          varchar(200) not null,
+    form_id       bigint(20) not null,
     definition_id varchar(255) not null,
     process_key   varchar(255)  not null,
     tenant_id     varchar(20),
@@ -182,32 +182,32 @@
     update_time   timestamp
 );
 
-comment on table wf_form_definition is '琛ㄥ崟閰嶇疆';
+comment on table wf_definition_config is '娴佺▼瀹氫箟閰嶇疆';
 
-comment on column wf_form_definition.id is '涓婚敭';
+comment on column wf_definition_config.id is '涓婚敭';
 
-comment on column wf_form_definition.path is '璺敱鍦板潃';
+comment on column wf_definition_config.form_id is '琛ㄥ崟ID';
 
-comment on column wf_form_definition.definition_id is '娴佺▼瀹氫箟ID';
+comment on column wf_definition_config.definition_id is '娴佺▼瀹氫箟ID';
 
-comment on column wf_form_definition.process_key is '娴佺▼KEY';
+comment on column wf_definition_config.process_key is '娴佺▼KEY';
 
-comment on column wf_form_definition.tenant_id is '绉熸埛id';
+comment on column wf_definition_config.tenant_id is '绉熸埛id';
 
-comment on column wf_form_definition.create_dept is '鍒涘缓閮ㄩ棬';
+comment on column wf_definition_config.create_dept is '鍒涘缓閮ㄩ棬';
 
-comment on column wf_form_definition.create_by is '鍒涘缓鑰�';
+comment on column wf_definition_config.create_by is '鍒涘缓鑰�';
 
-comment on column wf_form_definition.create_time is '鍒涘缓鏃堕棿';
+comment on column wf_definition_config.create_time is '鍒涘缓鏃堕棿';
 
-comment on column wf_form_definition.update_by is '淇敼鑰�';
+comment on column wf_definition_config.update_by is '淇敼鑰�';
 
-comment on column wf_form_definition.update_time is '淇敼鏃堕棿';
+comment on column wf_definition_config.update_time is '淇敼鏃堕棿';
 
-alter table wf_form_definition
+alter table wf_definition_config
     owner to postgres;
 create unique index uni_definition_id
-    on wf_form_definition (definition_id);
+    on wf_definition_config (definition_id);
 
 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, now(), 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, now(), NULL, NULL, '');
diff --git a/script/sql/sqlserver/flowable.sql b/script/sql/sqlserver/flowable.sql
index 99db42c..7db4e90 100644
--- a/script/sql/sqlserver/flowable.sql
+++ b/script/sql/sqlserver/flowable.sql
@@ -214,10 +214,10 @@
      'update_time'
 go
 
-create table wf_form_definition
+create table wf_definition_config
 (
     id            bigint(20) not null primary key,
-    path          nvarchar(200) not null,
+    form_id       bigint(20) not null,
     definition_id nvarchar(255)
         constraint uni_definition_id
         unique,
@@ -231,43 +231,43 @@
 )
 
 go
-exec sp_addextendedproperty 'MS_Description', N'琛ㄥ崟閰嶇疆', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition'
+exec sp_addextendedproperty 'MS_Description', N'娴佺▼瀹氫箟閰嶇疆', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config'
 go
 
-exec sp_addextendedproperty 'MS_Description', N'涓婚敭', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN', 'id'
+exec sp_addextendedproperty 'MS_Description', N'涓婚敭', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', 'id'
 go
 
-exec sp_addextendedproperty 'MS_Description', N'璺敱鍦板潃', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
-     'path'
+exec sp_addextendedproperty 'MS_Description', N'琛ㄥ崟ID', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
+     'form_id'
 go
 
-exec sp_addextendedproperty 'MS_Description', N'娴佺▼瀹氫箟ID', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
+exec sp_addextendedproperty 'MS_Description', N'娴佺▼瀹氫箟ID', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
      'definition_id'
 go
 
-exec sp_addextendedproperty 'MS_Description', N'娴佺▼KEY', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
+exec sp_addextendedproperty 'MS_Description', N'娴佺▼KEY', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
      'process_key'
 go
 
-exec sp_addextendedproperty 'MS_Description', N'绉熸埛缂栧彿', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
+exec sp_addextendedproperty 'MS_Description', N'绉熸埛缂栧彿', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
      'tenant_id'
 go
 
-exec sp_addextendedproperty 'MS_Description', N'鍒涘缓閮ㄩ棬', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
+exec sp_addextendedproperty 'MS_Description', N'鍒涘缓閮ㄩ棬', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
      'create_dept'
 go
 
-exec sp_addextendedproperty 'MS_Description', N'鍒涘缓鑰�', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN', 'create_by'
+exec sp_addextendedproperty 'MS_Description', N'鍒涘缓鑰�', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', 'create_by'
 go
 
-exec sp_addextendedproperty 'MS_Description', N'鍒涘缓鏃堕棿', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
+exec sp_addextendedproperty 'MS_Description', N'鍒涘缓鏃堕棿', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
      'create_time'
 go
 
-exec sp_addextendedproperty 'MS_Description', N'鏇存柊鑰�', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN', 'update_by'
+exec sp_addextendedproperty 'MS_Description', N'鏇存柊鑰�', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN', 'update_by'
 go
 
-exec sp_addextendedproperty 'MS_Description', N'鏇存柊鏃堕棿', 'SCHEMA', 'dbo', 'TABLE', 'wf_form_definition', 'COLUMN',
+exec sp_addextendedproperty 'MS_Description', N'鏇存柊鏃堕棿', 'SCHEMA', 'dbo', 'TABLE', 'wf_definition_config', 'COLUMN',
      'update_time'
 go
 

--
Gitblit v1.9.3