diff --git a/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/DictApi.java b/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/DictApi.java
index 82089c9af..581fb4a2e 100644
--- a/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/DictApi.java
+++ b/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/DictApi.java
@@ -25,6 +25,7 @@
package cn.stylefeng.roses.kernel.dict.api;
import cn.stylefeng.roses.kernel.dict.api.pojo.DictDetail;
+import cn.stylefeng.roses.kernel.dict.api.pojo.DictTreeDto;
import cn.stylefeng.roses.kernel.dict.api.pojo.SimpleDictUpdateParam;
import cn.stylefeng.roses.kernel.rule.pojo.dict.SimpleDict;
@@ -101,4 +102,14 @@ public interface DictApi {
*/
void simpleEditDict(SimpleDictUpdateParam simpleDictUpdateParam);
+ /**
+ * 构建一个完整的字典树
+ *
+ * 包含字典的类型和字典底下的详情信息
+ *
+ * @author fengshuonan
+ * @since 2023/11/15 18:55
+ */
+ List buildDictTreeStructure();
+
}
diff --git a/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/pojo/DictTreeDto.java b/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/pojo/DictTreeDto.java
new file mode 100644
index 000000000..f36757d5f
--- /dev/null
+++ b/kernel-s-dict/dict-api/src/main/java/cn/stylefeng/roses/kernel/dict/api/pojo/DictTreeDto.java
@@ -0,0 +1,31 @@
+package cn.stylefeng.roses.kernel.dict.api.pojo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 字典值
+ *
+ * @author fengshuonan
+ * @since 2023/11/15 18:44
+ */
+@Data
+public class DictTreeDto {
+
+ /**
+ * 字典的名称
+ */
+ private String dictLabel;
+
+ /**
+ * 字典的编码
+ */
+ private String dictValue;
+
+ /**
+ * 字典的子集
+ */
+ private List children;
+
+}
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/controller/CommonDictController.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/controller/CommonDictController.java
index 5f5dee721..9bd922857 100644
--- a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/controller/CommonDictController.java
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/controller/CommonDictController.java
@@ -24,6 +24,7 @@
*/
package cn.stylefeng.roses.kernel.dict.modular.controller;
+import cn.stylefeng.roses.kernel.dict.api.pojo.DictTreeDto;
import cn.stylefeng.roses.kernel.dict.modular.service.DictService;
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
@@ -32,6 +33,7 @@ import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
+import java.util.List;
/**
* 字典通用接口
@@ -57,4 +59,15 @@ public class CommonDictController {
return new SuccessResponseData<>(this.dictService.getPinyin(name));
}
+ /**
+ * 获取所有的字典类型树
+ *
+ * @author fengshuonan
+ * @since 2023/11/15 19:08
+ */
+ @GetResource(name = "获取所有的字典类型树", path = "/dictType/dictTreeBuild")
+ public ResponseData> dictTreeBuild() {
+ return new SuccessResponseData<>(dictService.buildDictTreeStructure());
+ }
+
}
diff --git a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/DictServiceImpl.java b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/DictServiceImpl.java
index 58e6529cf..339e2f949 100644
--- a/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/DictServiceImpl.java
+++ b/kernel-s-dict/dict-business/src/main/java/cn/stylefeng/roses/kernel/dict/modular/service/impl/DictServiceImpl.java
@@ -25,11 +25,13 @@
package cn.stylefeng.roses.kernel.dict.modular.service.impl;
import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.stylefeng.roses.kernel.dict.api.exception.DictException;
import cn.stylefeng.roses.kernel.dict.api.exception.enums.DictExceptionEnum;
import cn.stylefeng.roses.kernel.dict.api.pojo.DictDetail;
+import cn.stylefeng.roses.kernel.dict.api.pojo.DictTreeDto;
import cn.stylefeng.roses.kernel.dict.api.pojo.SimpleDictUpdateParam;
import cn.stylefeng.roses.kernel.dict.modular.entity.SysDict;
import cn.stylefeng.roses.kernel.dict.modular.entity.SysDictType;
@@ -54,7 +56,9 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
@@ -324,6 +328,58 @@ public class DictServiceImpl extends ServiceImpl implements
this.edit(dictRequest);
}
+ @Override
+ public List buildDictTreeStructure() {
+
+ // 获取所有字典类型
+ LambdaQueryWrapper dictTypeLambdaQueryWrapper = new LambdaQueryWrapper<>();
+ dictTypeLambdaQueryWrapper.select(SysDictType::getDictTypeCode, SysDictType::getDictTypeName);
+ dictTypeLambdaQueryWrapper.orderByAsc(SysDictType::getDictTypeSort);
+ List dictTypeList = this.dictTypeService.list(dictTypeLambdaQueryWrapper);
+
+ // 获取所有字典信息
+ LambdaQueryWrapper sysDictLambdaQueryWrapper = new LambdaQueryWrapper<>();
+ sysDictLambdaQueryWrapper.select(SysDict::getDictCode, SysDict::getDictName, SysDict::getDictTypeId);
+ sysDictLambdaQueryWrapper.orderByAsc(SysDict::getDictSort);
+ List dictList = this.list(sysDictLambdaQueryWrapper);
+
+ // 构建字典类型基本信息
+ Map dictTypeMap = new HashMap<>();
+ for (SysDictType sysDictType : dictTypeList) {
+ DictTreeDto dictTreeDto = new DictTreeDto();
+ dictTreeDto.setDictLabel(sysDictType.getDictTypeName());
+ dictTreeDto.setDictValue(sysDictType.getDictTypeCode());
+ dictTypeMap.put(sysDictType.getDictTypeId(), dictTreeDto);
+ }
+
+ // 遍历所有字典,把字典信息装配到字典类型信息里
+ for (SysDict sysDict : dictList) {
+ Long dictTypeId = sysDict.getDictTypeId();
+ if (ObjectUtil.isNotEmpty(dictTypeId)) {
+ continue;
+ }
+ DictTreeDto dictTreeDto = dictTypeMap.get(dictTypeId);
+ if (dictTreeDto == null) {
+ continue;
+ }
+
+ List children = dictTreeDto.getChildren();
+ if (ObjectUtil.isEmpty(children)) {
+ children = new ArrayList<>();
+ }
+
+ DictTreeDto dictValue = new DictTreeDto();
+ dictValue.setDictLabel(sysDict.getDictName());
+ dictValue.setDictValue(sysDict.getDictCode());
+
+ children.add(dictValue);
+ dictTreeDto.setChildren(children);
+ }
+
+ // map转化为树形结构
+ return ListUtil.list(true, dictTypeMap.values());
+ }
+
@Override
public String getPinyin(String name) {
if (ObjectUtil.isNotEmpty(name)) {