> nodeMap = new LinkedHashMap<>();
+ doBuildTreeNodeMap(trees, "", joiner, fieldGetter, nodeMap);
+ return nodeMap;
+ }
+
/**
* 获取指定节点下的所有叶子节点
*
@@ -141,4 +157,33 @@ public class TreeBuildUtils extends TreeUtil {
}
}
+ /**
+ * 递归构建【路径为key,节点为value】的Map
+ * 深度优先遍历树结构,将拼接好的路径作为key,原始Tree节点作为value
+ *
+ * @param trees 当前层级的节点列表
+ * @param parentPath 父节点已拼接好的路径
+ * @param joiner 路径拼接符,如 "/"、"-"、"_"
+ * @param fieldGetter 用于拼接路径的节点字段获取器
+ * @param nodeMap 存放最终结果的有序Map(路径->Tree节点)
+ * @param 树节点ID的类型
+ */
+ private static void doBuildTreeNodeMap(List> trees, String parentPath, String joiner, Function, CharSequence> fieldGetter, Map> nodeMap) {
+ if (CollUtil.isEmpty(trees)) {
+ return;
+ }
+ for (Tree tree : trees) {
+ CharSequence field = fieldGetter.apply(tree);
+ if (StrUtil.isEmpty(field)) {
+ continue;
+ }
+ // 拼接路径作为 KEY
+ String currentPath = StrUtil.isEmpty(parentPath) ? field.toString() : parentPath + joiner + field;
+ // 路径 = key,节点 = value
+ nodeMap.put(currentPath, tree);
+ // 递归子节点
+ doBuildTreeNodeMap(tree.getChildren(), currentPath, joiner, fieldGetter, nodeMap);
+ }
+ }
+
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java
index 528851111..13b563f91 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java
@@ -5,6 +5,7 @@ import lombok.NoArgsConstructor;
import org.apache.fesod.sheet.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.system.listener.DeptExcelConverter;
import java.io.Serial;
import java.io.Serializable;
@@ -15,7 +16,6 @@ import java.util.Date;
*
* @author Lion Li
*/
-
@Data
@NoArgsConstructor
public class SysUserExportVo implements Serializable {
@@ -35,6 +35,12 @@ public class SysUserExportVo implements Serializable {
@ExcelProperty(value = "用户账号")
private String userName;
+ /**
+ * 部门ID
+ */
+ @ExcelProperty(value = "部门名称", converter = DeptExcelConverter.class)
+ private Long deptId;
+
/**
* 用户昵称
*/
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java
index 41544d491..b25e90d08 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java
@@ -4,7 +4,10 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.fesod.sheet.annotation.ExcelProperty;
import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.annotation.ExcelDynamicOptions;
import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.system.listener.DeptExcelConverter;
+import org.dromara.system.listener.DeptExcelOptions;
import java.io.Serial;
import java.io.Serializable;
@@ -32,7 +35,8 @@ public class SysUserImportVo implements Serializable {
/**
* 部门ID
*/
- @ExcelProperty(value = "部门编号")
+ @ExcelProperty(value = "部门名称", converter = DeptExcelConverter.class)
+ @ExcelDynamicOptions(providerClass = DeptExcelOptions.class)
private Long deptId;
/**
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/DeptExcelConverter.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/DeptExcelConverter.java
new file mode 100644
index 000000000..bbba2ec9a
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/DeptExcelConverter.java
@@ -0,0 +1,121 @@
+package org.dromara.system.listener;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.tree.Tree;
+import lombok.RequiredArgsConstructor;
+import org.apache.fesod.sheet.converters.Converter;
+import org.apache.fesod.sheet.enums.CellDataTypeEnum;
+import org.apache.fesod.sheet.metadata.GlobalConfiguration;
+import org.apache.fesod.sheet.metadata.data.ReadCellData;
+import org.apache.fesod.sheet.metadata.data.WriteCellData;
+import org.apache.fesod.sheet.metadata.property.ExcelContentProperty;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.core.utils.TreeBuildUtils;
+import org.dromara.system.domain.bo.SysDeptBo;
+import org.dromara.system.service.ISysDeptService;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Excel 部门转换处理
+ *
+ * @author AprilWind
+ */
+@RequiredArgsConstructor
+@Component
+public class DeptExcelConverter implements Converter {
+
+ /**
+ * 线程内缓存:ID → 名称
+ */
+ private static final ThreadLocal