Browse Source

!368 增加级联选项快速建立方法
Merge pull request !368 from Emil.Zhang/dev

疯狂的狮子Li 1 year ago
parent
commit
7cdeb3d3d7

+ 58 - 0
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;
 
 /**
  * <h1>Excel下拉可选项</h1>
@@ -88,4 +90,60 @@ public class DropDownOptions {
     public static List<String> 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 <T> DropDownOptions buildLinkedOptions(List<T> parentList,
+                                                         int parentIndex,
+                                                         List<T> sonList,
+                                                         int sonIndex,
+                                                         Function<T, Number> parentHowToGetIdFunction,
+                                                         Function<T, Number> sonHowToGetParentIdFunction,
+                                                         Function<T, String> howToBuildEveryOption) {
+        DropDownOptions parentLinkSonOptions = new DropDownOptions();
+        // 先创建父类的下拉
+        parentLinkSonOptions.setIndex(parentIndex);
+        parentLinkSonOptions.setOptions(
+            parentList.stream()
+                .map(howToBuildEveryOption)
+                .collect(Collectors.toList())
+        );
+        // 提取父-子级联下拉
+        Map<String, List<String>> sonOptions = new HashMap<>();
+        // 父级依据自己的ID分组
+        Map<Number, List<T>> 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<String> 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;
+    }
 }

+ 30 - 50
ruoyi-demo/src/main/java/com/ruoyi/demo/service/impl/ExportExcelServiceImpl.java

@@ -51,56 +51,36 @@ public class ExportExcelServiceImpl implements IExportExcelService {
 
         // 首先从数据库中查询下拉框内的可选项
         // 这里模拟查询结果
-        List<DemoCityData> provinceList = getProvinceList();
-        List<DemoCityData> cityList = getCityList(provinceList);
-        List<DemoCityData> areaList = getAreaList(cityList);
-
-        // 把所有的结果提取为规范的下拉选可选项
-        // 规范的一级省,用于级联省-市
-        List<String> provinceOptions = StreamUtils.toList(provinceList, everyProvince ->
-                DropDownOptions.createOptionValue(everyProvince.getName(), everyProvince.getId()));
-        // 规范的二级市,用于级联省-市
-        Map<String, List<String>> provinceToCityOptions = new HashMap<>();
-        StreamUtils.groupByKey(cityList, DemoCityData::getPData)
-            .forEach((province, thisProvinceCityList) -> {
-                // 每个省下二级的市可选项
-                String optionValue = DropDownOptions.createOptionValue(province.getName(), province.getId());
-                List<String> list = StreamUtils.toList(thisProvinceCityList, everyCity ->
-                    DropDownOptions.createOptionValue(everyCity.getName(), everyCity.getId()));
-                provinceToCityOptions.put(optionValue, list);
-            });
-
-        // 规范的一级市,用于级联市-县
-        List<String> cityOptions = StreamUtils.toList(cityList, everyCity ->
-            DropDownOptions.createOptionValue(everyCity.getName(), everyCity.getId()));
-        // 规范的二级县,用于级联市-县
-        Map<String, List<String>> cityToAreaOptions = new HashMap<>();
-        StreamUtils.groupByKey(areaList, DemoCityData::getPData)
-            .forEach((city, thisCityAreaList) -> {
-                // 每个市下二级的县可选项
-                String optionValue = DropDownOptions.createOptionValue(city.getName(), city.getId());
-                List<String> 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);
+        List<DemoCityData> provinceList = getProvinceList(),
+            cityList = getCityList(provinceList),
+            areaList = getAreaList(cityList);
+        int provinceIndex = 5, cityIndex = 6, areaIndex = 7;
+
+        DropDownOptions provinceToCity = DropDownOptions.buildLinkedOptions(
+            provinceList,
+            provinceIndex,
+            cityList,
+            cityIndex,
+            DemoCityData::getId,
+            DemoCityData::getPid,
+            everyOptions -> DropDownOptions.createOptionValue(
+                everyOptions.getName(),
+                everyOptions.getId()
+            )
+        );
+
+        DropDownOptions cityToArea = DropDownOptions.buildLinkedOptions(
+            cityList,
+            cityIndex,
+            areaList,
+            areaIndex,
+            DemoCityData::getId,
+            DemoCityData::getPid,
+            everyOptions -> DropDownOptions.createOptionValue(
+                everyOptions.getName(),
+                everyOptions.getId()
+            )
+        );
 
         // 把所有的下拉框存储
         List<DropDownOptions> options = new ArrayList<>();