diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DropDownOptions.java b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DropDownOptions.java
index f74d6080d..b649ebc69 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/excel/DropDownOptions.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/excel/DropDownOptions.java
@@ -10,6 +10,8 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
/**
*
Excel下拉可选项
@@ -88,4 +90,60 @@ public class DropDownOptions {
public static List analyzeOptionValue(String option) {
return StrUtil.split(option, DELIMITER, true, true);
}
+
+ /**
+ * 创建级联下拉选项
+ *
+ * @param parentList 父实体可选项原始数据
+ * @param parentIndex 父下拉选位置
+ * @param sonList 子实体可选项原始数据
+ * @param sonIndex 子下拉选位置
+ * @param parentHowToGetIdFunction 父类如何获取唯一标识
+ * @param sonHowToGetParentIdFunction 子类如何获取父类的唯一标识
+ * @param howToBuildEveryOption 如何生成下拉选内容
+ * @return 级联下拉选项
+ */
+ public static DropDownOptions buildLinkedOptions(List parentList,
+ int parentIndex,
+ List sonList,
+ int sonIndex,
+ Function parentHowToGetIdFunction,
+ Function sonHowToGetParentIdFunction,
+ Function howToBuildEveryOption) {
+ DropDownOptions parentLinkSonOptions = new DropDownOptions();
+ // 先创建父类的下拉
+ parentLinkSonOptions.setIndex(parentIndex);
+ parentLinkSonOptions.setOptions(
+ parentList.stream()
+ .map(howToBuildEveryOption)
+ .collect(Collectors.toList())
+ );
+ // 提取父-子级联下拉
+ Map> sonOptions = new HashMap<>();
+ // 父级依据自己的ID分组
+ Map> parentGroupByIdMap =
+ parentList.stream().collect(Collectors.groupingBy(parentHowToGetIdFunction));
+ // 遍历每个子集,提取到Map中
+ sonList.forEach(everySon -> {
+ if (parentGroupByIdMap.containsKey(sonHowToGetParentIdFunction.apply(everySon))) {
+ // 找到对应的上级
+ T parentObj = parentGroupByIdMap.get(sonHowToGetParentIdFunction.apply(everySon)).get(0);
+ // 提取名称和ID作为Key
+ String key = howToBuildEveryOption.apply(parentObj);
+ // Key对应的Value
+ List thisParentSonOptionList;
+ if (sonOptions.containsKey(key)) {
+ thisParentSonOptionList = sonOptions.get(key);
+ } else {
+ thisParentSonOptionList = new ArrayList<>();
+ sonOptions.put(key, thisParentSonOptionList);
+ }
+ // 往Value中添加当前子集选项
+ thisParentSonOptionList.add(howToBuildEveryOption.apply(everySon));
+ }
+ });
+ parentLinkSonOptions.setNextIndex(sonIndex);
+ parentLinkSonOptions.setNextOptions(sonOptions);
+ return parentLinkSonOptions;
+ }
}
diff --git a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/ExportExcelServiceImpl.java b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/ExportExcelServiceImpl.java
index 404987825..37221c18d 100644
--- a/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/ExportExcelServiceImpl.java
+++ b/ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/ExportExcelServiceImpl.java
@@ -51,56 +51,36 @@ public class ExportExcelServiceImpl implements IExportExcelService {
// 首先从数据库中查询下拉框内的可选项
// 这里模拟查询结果
- List provinceList = getProvinceList();
- List cityList = getCityList(provinceList);
- List areaList = getAreaList(cityList);
+ List provinceList = getProvinceList(),
+ cityList = getCityList(provinceList),
+ areaList = getAreaList(cityList);
+ int provinceIndex = 5, cityIndex = 6, areaIndex = 7;
- // 把所有的结果提取为规范的下拉选可选项
- // 规范的一级省,用于级联省-市
- List provinceOptions = StreamUtils.toList(provinceList, everyProvince ->
- DropDownOptions.createOptionValue(everyProvince.getName(), everyProvince.getId()));
- // 规范的二级市,用于级联省-市
- Map> provinceToCityOptions = new HashMap<>();
- StreamUtils.groupByKey(cityList, DemoCityData::getPData)
- .forEach((province, thisProvinceCityList) -> {
- // 每个省下二级的市可选项
- String optionValue = DropDownOptions.createOptionValue(province.getName(), province.getId());
- List list = StreamUtils.toList(thisProvinceCityList, everyCity ->
- DropDownOptions.createOptionValue(everyCity.getName(), everyCity.getId()));
- provinceToCityOptions.put(optionValue, list);
- });
+ DropDownOptions provinceToCity = DropDownOptions.buildLinkedOptions(
+ provinceList,
+ provinceIndex,
+ cityList,
+ cityIndex,
+ DemoCityData::getId,
+ DemoCityData::getPid,
+ everyOptions -> DropDownOptions.createOptionValue(
+ everyOptions.getName(),
+ everyOptions.getId()
+ )
+ );
- // 规范的一级市,用于级联市-县
- List cityOptions = StreamUtils.toList(cityList, everyCity ->
- DropDownOptions.createOptionValue(everyCity.getName(), everyCity.getId()));
- // 规范的二级县,用于级联市-县
- Map> cityToAreaOptions = new HashMap<>();
- StreamUtils.groupByKey(areaList, DemoCityData::getPData)
- .forEach((city, thisCityAreaList) -> {
- // 每个市下二级的县可选项
- String optionValue = DropDownOptions.createOptionValue(city.getName(), city.getId());
- List list = StreamUtils.toList(thisCityAreaList, everyCity ->
- DropDownOptions.createOptionValue(everyCity.getName(), everyCity.getId()));
- cityToAreaOptions.put(optionValue, list);
- });
-
- // 因为省市县三个都是联动,省级联市,市级联县,因此需要创建两个级联下拉,分别以省和市为判断依据创建
- // 创建省-市级联
- DropDownOptions provinceToCity = new DropDownOptions();
- // 以省为一级
- provinceToCity.setIndex(5);
- // 以市为二级
- provinceToCity.setNextIndex(6);
- // 补充省的内容以及市的内容
- provinceToCity.setOptions(provinceOptions);
- provinceToCity.setNextOptions(provinceToCityOptions);
-
- // 创建市-县级联
- DropDownOptions cityToArea = new DropDownOptions();
- cityToArea.setIndex(6);
- cityToArea.setNextIndex(7);
- cityToArea.setOptions(cityOptions);
- cityToArea.setNextOptions(cityToAreaOptions);
+ DropDownOptions cityToArea = DropDownOptions.buildLinkedOptions(
+ cityList,
+ cityIndex,
+ areaList,
+ areaIndex,
+ DemoCityData::getId,
+ DemoCityData::getPid,
+ everyOptions -> DropDownOptions.createOptionValue(
+ everyOptions.getName(),
+ everyOptions.getId()
+ )
+ );
// 把所有的下拉框存储
List options = new ArrayList<>();