diff --git a/pom.xml b/pom.xml
index 3d8a5c7e3..8bde7d395 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,7 +50,7 @@
8.7.2-20250101
- 1.6.7-M1
+ 1.6.7-M2
3.2.2
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java
new file mode 100644
index 000000000..6bc818c4c
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/ButtonPermissionEnum.java
@@ -0,0 +1,30 @@
+package org.dromara.workflow.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 按钮权限枚举
+ *
+ * @author AprilWind
+ */
+@Getter
+@AllArgsConstructor
+public enum ButtonPermissionEnum implements NodeExtEnum {
+
+ /**
+ * 是否弹窗选人
+ */
+ APPROVE("是否弹窗选人", "1", false),
+
+ /**
+ * 是否能委托
+ */
+ REJECT("是否能委托", "2", false);
+
+ private final String label;
+ private final String value;
+ private final boolean selected;
+
+}
+
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java
new file mode 100644
index 000000000..dfa9e9a99
--- /dev/null
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/NodeExtEnum.java
@@ -0,0 +1,26 @@
+package org.dromara.workflow.common.enums;
+
+/**
+ * 节点扩展属性枚举
+ *
+ * @author AprilWind
+ */
+public interface NodeExtEnum {
+
+ /**
+ * 选项label
+ */
+ String getLabel();
+
+ /**
+ * 选项值
+ */
+ String getValue();
+
+ /**
+ * 是否默认选中
+ */
+ boolean isSelected();
+
+}
+
diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java
index f7e58ed70..0b4d4b790 100644
--- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java
+++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwNodeExtServiceImpl.java
@@ -10,12 +10,11 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.warm.flow.ui.service.NodeExtService;
import org.dromara.warm.flow.ui.vo.NodeExt;
import org.dromara.workflow.common.ConditionalOnEnable;
+import org.dromara.workflow.common.enums.ButtonPermissionEnum;
+import org.dromara.workflow.common.enums.NodeExtEnum;
import org.springframework.stereotype.Service;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
/**
* 流程设计器-节点扩展属性
@@ -39,9 +38,9 @@ public class FlwNodeExtServiceImpl implements NodeExtService {
private static final String PERMISSION_TAB_NAME = "权限";
/**
- * 字典类型逗号分隔
+ * 枚举类型标识
*/
- private static final String DICT_TYPES = "wf_button_permission";
+ private static final String ENUM_TYPE_PREFIX = "enum:";
/**
* 基础设置
@@ -59,7 +58,8 @@ public class FlwNodeExtServiceImpl implements NodeExtService {
private static final Map> CHILD_NODE_MAP = new HashMap<>();
static {
- CHILD_NODE_MAP.put("wf_button_permission", Map.of("type", 4, "must", false, "multiple", true));
+ CHILD_NODE_MAP.put(ButtonPermissionEnum.class.getName(),
+ Map.of("label", "权限按钮", "type", 4, "must", false, "multiple", true));
}
private final DictService dictService;
@@ -73,26 +73,29 @@ public class FlwNodeExtServiceImpl implements NodeExtService {
public List getNodeExt() {
List nodeExtList = new ArrayList<>();
// 构建按钮权限页面
- nodeExtList.add(buildNodeExt(PERMISSION_TAB, PERMISSION_TAB_NAME, TYPE_NEW_TAB, DICT_TYPES));
+ nodeExtList.add(buildNodeExt(PERMISSION_TAB, PERMISSION_TAB_NAME, TYPE_NEW_TAB,
+ ENUM_TYPE_PREFIX + ButtonPermissionEnum.class.getName()));
return nodeExtList;
}
/**
* 构建一个 NodeExt 对象
*
- * @param code 编码,此json中唯一
- * @param name 名称,如果type为新页签时,作为页签名称
- * @param type 节点类型,1:基础设置,2:新页签
- * @param dictTypes 字典类型逗号分隔
+ * @param code 编码,此json中唯一
+ * @param name 名称,如果type为新页签时,作为页签名称
+ * @param type 节点类型,1:基础设置,2:新页签
+ * @param sourceTypes 字典/枚举类型来源(逗号分隔)
* @return 返回构建好的 NodeExt 对象
*/
- private NodeExt buildNodeExt(String code, String name, int type, String dictTypes) {
+ private NodeExt buildNodeExt(String code, String name, int type, String sourceTypes) {
NodeExt nodeExt = new NodeExt();
nodeExt.setCode(code);
nodeExt.setType(type);
nodeExt.setName(name);
- nodeExt.setChilds(StringUtils.splitList(dictTypes)
- .stream().map(this::buildChildNode).toList()
+ nodeExt.setChilds(StringUtils.splitList(sourceTypes)
+ .stream().map(this::buildChildNode)
+ .filter(ObjectUtil::isNotNull)
+ .toList()
);
return nodeExt;
}
@@ -100,31 +103,61 @@ public class FlwNodeExtServiceImpl implements NodeExtService {
/**
* 构建一个 ChildNode 对象
*
+ * @param sourceType 字典类型
+ * @return 返回构建好的 ChildNode 对象
+ */
+ private NodeExt.ChildNode buildChildNode(String sourceType) {
+ return sourceType.startsWith(ENUM_TYPE_PREFIX) ?
+ buildChildNodeFromEnum(sourceType.substring(ENUM_TYPE_PREFIX.length())) : buildChildNodeFromDict(sourceType);
+ }
+
+ /**
+ * 根据枚举构建一个 ChildNode 对象
+ *
+ * @param enumClassName 枚举名称
+ * @return 返回构建好的 ChildNode 对象
+ */
+ private NodeExt.ChildNode buildChildNodeFromEnum(String enumClassName) {
+ try {
+ Class> enumClass = Class.forName(enumClassName);
+ if (!enumClass.isEnum()) {
+ return null;
+ }
+ NodeExt.ChildNode childNode = buildChildNodeMap(enumClassName);
+ // 编码,此json中唯
+ childNode.setCode(ENUM_TYPE_PREFIX + enumClassName);
+ // 字典,下拉框和复选框时用到
+ childNode.setDict(Arrays.stream(enumClass.getEnumConstants())
+ .filter(NodeExtEnum.class::isInstance)
+ .map(NodeExtEnum.class::cast)
+ .map(x ->
+ new NodeExt.DictItem(x.getLabel(), x.getValue(), x.isSelected())
+ ).toList());
+ return childNode;
+ } catch (ClassNotFoundException e) {
+ log.error("Enum class not found: {}", enumClassName, e);
+ }
+ return null;
+ }
+
+ /**
+ * 根据字典构建一个 ChildNode 对象
+ *
* @param dictType 字典类型
* @return 返回构建好的 ChildNode 对象
*/
- private NodeExt.ChildNode buildChildNode(String dictType) {
- NodeExt.ChildNode childNode = new NodeExt.ChildNode();
- if (StringUtils.isBlank(dictType)) {
- return childNode;
- }
+ private NodeExt.ChildNode buildChildNodeFromDict(String dictType) {
DictTypeDTO dictTypeDTO = dictService.getDictTypeDto(dictType);
if (ObjectUtil.isNull(dictTypeDTO)) {
- return childNode;
+ return null;
}
+ NodeExt.ChildNode childNode = buildChildNodeMap(dictType);
// 编码,此json中唯一
childNode.setCode(dictType);
// label名称
childNode.setLabel(dictTypeDTO.getDictName());
// 描述
childNode.setDesc(dictTypeDTO.getRemark());
- Map map = CHILD_NODE_MAP.get(dictType);
- // 1:输入框 2:输入框 3:下拉框 4:选择框
- childNode.setType(Convert.toInt(map.get("type"), 1));
- // 是否必填
- childNode.setMust(Convert.toBool(map.get("must"), false));
- // 是否多选
- childNode.setMultiple(Convert.toBool(map.get("multiple"), true));
// 字典,下拉框和复选框时用到
childNode.setDict(dictService.getDictDataDto(dictType)
.stream().map(x ->
@@ -133,4 +166,25 @@ public class FlwNodeExtServiceImpl implements NodeExtService {
return childNode;
}
+ /**
+ * 根据 CHILD_NODE_MAP 中的配置信息,构建一个基本的 ChildNode 对象
+ * 该方法用于设置 ChildNode 的常规属性,例如 label、type、是否必填、是否多选等
+ *
+ * @param key CHILD_NODE_MAP 的 key
+ * @return 返回构建好的 ChildNode 对象
+ */
+ private NodeExt.ChildNode buildChildNodeMap(String key) {
+ NodeExt.ChildNode childNode = new NodeExt.ChildNode();
+ Map map = CHILD_NODE_MAP.get(key);
+ // label名称
+ childNode.setLabel((String) map.get("label"));
+ // 1:输入框 2:输入框 3:下拉框 4:选择框
+ childNode.setType(Convert.toInt(map.get("type"), 1));
+ // 是否必填
+ childNode.setMust(Convert.toBool(map.get("must"), false));
+ // 是否多选
+ childNode.setMultiple(Convert.toBool(map.get("multiple"), true));
+ return childNode;
+ }
+
}