From 0ff533e6b5d8060ea6a964468eaa6e2ad42c9a04 Mon Sep 17 00:00:00 2001 From: "Emil.Zhang" Date: Fri, 9 Jun 2023 18:31:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E7=BA=A7=E8=81=94=E9=80=89=E9=A1=B9=E5=8A=9F?= =?UTF-8?q?=E8=83=BD):?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.DropDownOptions中增加自动创建级联选项的方法 2.示例方法中增加调用示例 --- .../ruoyi/common/excel/DropDownOptions.java | 58 ++++++++++++++ .../service/impl/ExportExcelServiceImpl.java | 76 +++++++------------ 2 files changed, 86 insertions(+), 48 deletions(-) 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<>();