java返给前端ECharts的格式2
- 1. 返回值:值对象(Value Object)
- 1. 带LinkedHashMap的 key Value 格式的VO
- 2. 带X轴和Y轴的VO
- 3. 带标签的返回值
- 2. 业务对象BO:(Business Object)
- 1. AreaBO
- 2. AreaNameBO
- 3. LegendAreaBO
- 4.LegendNameBO
- 5.NameBO
- 3. EChartsUtil 工具
- 4.枚举
1. 返回值:值对象(Value Object)
1. 带LinkedHashMap的 key Value 格式的VO
KvVOMap
package com.包名.路径.vo;import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.LinkedHashMap;
import java.util.Map;@Data
@NoArgsConstructor
//@AllArgsConstructor
public class KvVOMap<T> extends LinkedHashMap<String, Object> {@ApiModelProperty("key")private String k;@ApiModelProperty("value")private T v;public void setK(String k) {this.k = k;this.put("k", k);}public void setV(T v) {this.v = v;this.put("v", v);}//全参构造public KvVOMap(String k, T v) {this.k = k;this.v = v;this.put("k", k);this.put("v", v);}public KvVOMap<T> extra(Map<String, Object> extra) {if (CollUtil.isNotEmpty(extra)) {this.putAll(extra);}return this;}public KvVOMap<T> extra(String k, Object v) {if (ObjectUtil.isAllNotEmpty(new Object[]{k, v})) {this.put(k, v);}return this;}public String getK() {return this.k;}public T getV() {return this.v;}public String toString() {return "KvVOMap(k=" + this.getK() + ", v=" + this.getV() + ")";}public boolean equals(final Object o) {if (o == this) {return true;} else if (!(o instanceof KvVOMap)) {return false;} else {KvVOMap<?> other = (KvVOMap<?>)o;if (!other.canEqual(this)) {return false;} else if (!super.equals(o)) {return false;} else {Object this$k = this.getK();Object other$k = other.getK();if (this$k == null) {if (other$k != null) {return false;}} else if (!this$k.equals(other$k)) {return false;}Object this$v = this.getV();Object other$v = other.getV();if (this$v == null) {if (other$v != null) {return false;}} else if (!this$v.equals(other$v)) {return false;}return true;}}}protected boolean canEqual(final Object other) {return other instanceof KvVOMap;}public int hashCode() {int result = super.hashCode();Object $k = this.getK();result = result * 59 + ($k == null ? 43 : $k.hashCode());Object $v = this.getV();result = result * 59 + ($v == null ? 43 : $v.hashCode());return result;}
}
最终返给前端的格式,大概率是这样的
Apache ECharts
2. 带X轴和Y轴的VO
DataVO
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.ArrayList;
import java.util.List;@Data
@NoArgsConstructor
@AllArgsConstructor
public class DataVO<T> {@ApiModelProperty(value = "数值")private List<T> data = new ArrayList<>();@ApiModelProperty(value = "图例")private String name;public DataVO(List<T> data) {this.data = data;}
}
3. 带标签的返回值
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;import java.util.LinkedList;
import java.util.List;@Accessors(chain = true)
@Data
public class ChartVO<T> {@ApiModelProperty(value = "标签")private DataVO<String> legend = new DataVO<>();@ApiModelProperty(value = "x轴")@JsonProperty("xAxis")private DataVO<String> xAxis = new DataVO<>();@ApiModelProperty(value = "统计图数据")private List<DataVO<T>> series = new LinkedList<>();@ApiModelProperty(value = "辅助数据")private Object obj;
}
2. 业务对象BO:(Business Object)
1. AreaBO
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;@NoArgsConstructor
@Data
public class AreaBO {/*** 数量*/private BigDecimal num;/*** 名称*/private String name;/*** 所属区县*/private String homeArea;public AreaBO(BigDecimal num, String name) {this.num = num;this.name = name;}public AreaBO(BigDecimal num, String name, String homeArea) {this.num = num;this.name = name;this.homeArea = homeArea;}public AreaBO(BigDecimal num, String name, Integer homeArea) {this.num = num;this.name = name;this.homeArea = homeArea.toString();}
}
2. AreaNameBO
import lombok.Data;
import lombok.experimental.Accessors;import java.math.BigDecimal;@Accessors(chain = true)
@Data
public class AreaNameBO {/*** 数量*/private BigDecimal num;/*** 名称*/private String name;/*** 标签*/private String homeArea;/*** 标签1*/private String legend;public AreaNameBO() {}public AreaNameBO(BigDecimal num, String name) {this.num = num;this.name = name;}public AreaNameBO(BigDecimal num, String name, String homeArea,String legend) {this.num = num;this.name = name;this.homeArea = homeArea;this.legend = legend;}public AreaNameBO(String legend, BigDecimal num) {this.num = num;this.legend = legend;}
}
3. LegendAreaBO
import lombok.Data;
import lombok.experimental.Accessors;import java.math.BigDecimal;@Accessors(chain = true)
@Data
public class LegendAreaBO {/*** 数量*/private BigDecimal num;/*** 名称*/private String name;/*** 标签*/private String legend;/*** 所属区县*/private String homeArea;public LegendAreaBO() {}public LegendAreaBO(BigDecimal num, String name, String legend) {this.num = num;this.name = name;this.legend = legend;}public LegendAreaBO(BigDecimal num, String name, String legend, String homeArea) {this.num = num;this.name = name;this.legend = legend;this.homeArea = homeArea;}
}
4.LegendNameBO
import lombok.Data;
import lombok.experimental.Accessors;import java.math.BigDecimal;@Accessors(chain = true)
@Data
public class LegendNameBO {/*** 数量*/private BigDecimal num;/*** 名称*/private String name;/*** 标签*/private String legend;public LegendNameBO() {}public LegendNameBO(BigDecimal num, String name) {this.num = num;this.name = name;}public LegendNameBO(BigDecimal num, String name, String legend) {this.num = num;this.name = name;this.legend = legend;}public LegendNameBO(String legend,BigDecimal num) {this.num = num;this.legend = legend;}
}
5.NameBO
import cn.hutool.core.util.NumberUtil;
import lombok.Data;
import lombok.experimental.Accessors;import java.math.BigDecimal;@Accessors(chain = true)
@Data
public class NameBO {/*** 数量*/private BigDecimal num;/*** 名称*/private String name;public NameBO() {}public NameBO(BigDecimal num, String name) {this.num = NumberUtil.round(num, 4);this.name = name;}public NameBO(BigDecimal num) {this.num = num;}public void setNum(BigDecimal num) {this.num = NumberUtil.round(num, 4);}
}
3. EChartsUtil 工具
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.gas.base.enums.BaseEnum;
import com.gas.bo.*;
import com.gas.enums.AreaEnum;
import com.gas.utils.bean.GasBeanUtil;
import com.gas.utils.collection.GasCollectionUtil;
import com.gas.utils.convert.GasConvertUtil;
import com.gas.utils.enums.AreaBOEnum;
import com.gas.utils.list.GasListUtil;
import com.gas.utils.map.GasMapUtil;
import com.gas.utils.string.GasStringUtil;
import com.gas.vo.*;
import lombok.extern.slf4j.Slf4j;import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;@Slf4j
public class EChartsUtil {public static List<Integer> area(String area) {if (StrUtil.isBlank(area)) {return GasListUtil.empty();}return StrUtil.split(area, ",").stream().map(GasConvertUtil::toInt).toList();}public static List<AreaBO> areaBOMain(List<AreaBO> list) {if (GasCollectionUtil.isNotEmpty(list)) {if (list.stream().anyMatch(e -> AreaEnum.mainArea.contains(e.getHomeArea()))) {//汇总主城区数量BigDecimal sum = list.stream().filter(e -> AreaEnum.mainArea.contains(e.getHomeArea())).map(AreaBO::getNum).reduce(BigDecimal.ZERO, BigDecimal::add);list.removeIf(e -> AreaEnum.mainArea.contains(e.getHomeArea()));//添加主城区数量list.add(0, new AreaBO(sum, AreaEnum.mainAreaName, StrUtil.join(",", AreaEnum.mainArea)));}}return list;}public static List<AreaBO> areaBOCityMain(List<AreaBO> list) {return areaBOMain(list);}public static ChartVO<BigDecimal> areaBO(List<AreaBO> bos, AreaBOEnum enums, List<Integer> areas) {List<AreaBO> list = Arrays.stream(AreaEnum.values()).filter(e -> {if (GasCollectionUtil.isNotEmpty(areas)) {return areas.contains(e.getType());}return true;}).map(e ->new AreaBO(bos.stream().filter(y -> ObjectUtil.equal(y.getHomeArea(), e.getType().toString())).map(AreaBO::getNum).findFirst().orElse(BigDecimal.ZERO),e.getName(), e.getType().toString())).collect(Collectors.toList());list.forEach(e -> e.setName(AreaEnum.name(e.getHomeArea())));list.sort(Comparator.comparing(e -> AreaEnum.sort(e.getHomeArea())));//组装数据switch (enums) {case CITY -> areaBOCityMain(list);case MAIN -> areaBOMain(list);}//组装辅助数据BigDecimal sum = list.stream().map(AreaBO::getNum).reduce(BigDecimal.ZERO, BigDecimal::add);Map<String, List<CityTotalKvVO<BigDecimal, BigDecimal>>> obj = list.stream().collect(Collectors.groupingBy(AreaBO::getName,Collectors.mapping(e ->new CityTotalKvVO<>(e.getName(), e.getNum(), sum), Collectors.toList())));return areaBO(list).setObj(obj);}public static ChartVO<BigDecimal> areaBO(List<AreaBO> bos, AreaBOEnum enums) {return areaBO(bos, enums, null);}public static ChartVO<BigDecimal> areaBO(List<AreaBO> list) {ChartVO<BigDecimal> chart = new ChartVO<>();//汇总x轴List<String> xAxis = list.stream().map(AreaBO::getName).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList());chart.setXAxis(new DataVO<>(xAxis));//汇总数据List<BigDecimal> series = list.stream().filter(e -> StrUtil.isNotBlank(e.getName())).map(AreaBO::getNum).collect(Collectors.toList());chart.getSeries().add(new DataVO<>(series));return chart;}public static List<LegendAreaBO> legendAreaBOSort(List<LegendAreaBO> list, Map<String, Integer> legendSort) {//List自带的排序方法list.sort(//先按区域排序,再按标签排序Comparator.comparing((LegendAreaBO e) -> AreaEnum.sort(e.getHomeArea())).thenComparing((LegendAreaBO e) -> legendSort.getOrDefault(e.getLegend(), Integer.MAX_VALUE)));return list;}public static Map<String, Map<String, BigDecimal>> legendNameBOGroup(List<LegendNameBO> bos) {return bos.stream().collect(Collectors.groupingBy(LegendNameBO::getName,LinkedHashMap::new,Collectors.groupingBy(LegendNameBO::getLegend,LinkedHashMap::new,Collectors.mapping(LegendNameBO::getNum,Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))));}public static Map<String, Map<String, BigDecimal>> legendAreaBOGroup(List<LegendAreaBO> bos) {return bos.stream().collect(Collectors.groupingBy(LegendAreaBO::getHomeArea,Collectors.groupingBy(LegendAreaBO::getLegend,Collectors.mapping(LegendAreaBO::getNum,Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))));}/*** 主城区 + 标签 + x轴 + obj辅助数据*/public static ChartVO legendAreaBO(List<LegendAreaBO> list) {EChartsUtil.legendAreaBOMain(list);ChartVO<BigDecimal> chart = new ChartVO<>();//汇总标签List<String> legend = list.stream().map(LegendAreaBO::getLegend).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList());chart.setLegend(new DataVO<>(legend));//汇总x轴List<String> xAxis = list.stream().map(LegendAreaBO::getName).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList());chart.setXAxis(new DataVO<>(xAxis));//汇总数据legend.forEach(e -> {List<BigDecimal> series = list.stream().filter(y -> ObjectUtil.equal(e, y.getLegend()) && StrUtil.isNotEmpty(y.getName())).map(LegendAreaBO::getNum).collect(Collectors.toList());chart.getSeries().add(new DataVO<>(series, e));});Map<String, BigDecimal> legendMap = list.stream().collect(Collectors.groupingBy(LegendAreaBO::getLegend,Collectors.mapping(LegendAreaBO::getNum, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));//组装辅助数据Map<String, List<CityTotalKvVO<BigDecimal, BigDecimal>>> obj = list.stream().collect(Collectors.groupingBy(LegendAreaBO::getName,Collectors.mapping(e ->new CityTotalKvVO<>(e.getLegend(), e.getNum(), legendMap.get(e.getLegend())), Collectors.toList())));return chart.setObj(obj);}public static List<LegendAreaBO> legendAreaBOMain(List<LegendAreaBO> list) {if (CollUtil.isNotEmpty(list)) {//汇总主城区数量LinkedHashMap<String, BigDecimal> map = list.stream().filter(e -> AreaEnum.mainArea.contains(e.getHomeArea())).collect(Collectors.groupingBy(LegendAreaBO::getLegend,LinkedHashMap::new,Collectors.mapping(LegendAreaBO::getNum, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));//移除 路南、路北、高新区list.removeIf(e -> AreaEnum.mainArea.contains(e.getHomeArea()));//添加主城区数量List<LegendAreaBO> area = new LinkedList();map.forEach((k, v) ->area.add(new LegendAreaBO(v, AreaEnum.mainAreaName, k)));list.addAll(0, area);}return list;}public static ChartVO legendAreaBODictObj(List<LegendAreaBO> list) {list.forEach(e -> e.setName(AreaEnum.name(e.getHomeArea())));return EChartsUtil.legendAreaBO(list);}public static ChartVO legendAreaBODictObj(List<LegendAreaBO> bos, List<KvBO> dict) {Map<String, Map<String, BigDecimal>> map = legendAreaBOGroup(bos);Set<String> areas = bos.stream().map(LegendAreaBO::getHomeArea).collect(Collectors.toSet());bos = areas.stream().map(e -> dict.stream().map(y -> new LegendAreaBO(map.getOrDefault(e, GasMapUtil.empty()).getOrDefault(y.getKey(), BigDecimal.ZERO),AreaEnum.name(e), y.getValue(), e)).collect(Collectors.toList())).flatMap(Collection::stream).collect(Collectors.toList());return EChartsUtil.legendAreaBO(bos);}public static <T extends BaseEnum> ChartVO legendNameBOEnumObj(List<LegendNameBO> bos,//X轴List<T> names,//标签List<String> legends) {Map<String, Map<String, BigDecimal>> map = legendNameBOGroup(bos);bos = names.stream().map(e ->legends.stream().map(y -> new LegendNameBO(map.getOrDefault(e.getValue().toString(), MapUtil.empty()).getOrDefault(y, BigDecimal.ZERO),e.getEnumName(), y)).collect(Collectors.toList())).flatMap(Collection::stream).collect(Collectors.toList());return EChartsUtil.legendNameBO(bos);}public static <T extends BaseEnum> ChartVO legendAreaBOEnumObj(List<LegendAreaBO> list,//枚举ListList<T> enums,//标签排序Map<String, Integer> legendSort) {list.forEach(e -> {//区域名称e.setName(AreaEnum.name(e.getHomeArea()));BaseEnum baseEnum = enums.stream().filter(y -> ObjectUtil.equal(y.getValue().toString(), e.getLegend())).findFirst().get();if (ObjectUtil.isNotNull(baseEnum)) {e.setLegend(baseEnum.getEnumName());}});Optional.of(list.stream().map(LegendAreaBO::getHomeArea).toList()).orElse(new ArrayList<>()).forEach(e -> {//补充标签enums.forEach(y -> {boolean bool = list.stream().anyMatch(t -> ObjectUtil.equal(e + y.getEnumName(),t.getHomeArea() + t.getLegend()));if (!bool) {list.add(new LegendAreaBO(BigDecimal.ZERO, AreaEnum.name(e), y.getEnumName(), e));}});});//排序数据EChartsUtil.legendAreaBOSort(list, legendSort);return EChartsUtil.legendAreaBO(list);}public static ChartVO legendNameBO(List<LegendNameBO> list) {ChartVO chart = new ChartVO<>();//汇总标签List<String> legend = list.stream().map(LegendNameBO::getLegend).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList());chart.setLegend(new DataVO<>(legend));//汇总x轴List<String> xAxis = list.stream().map(LegendNameBO::getName).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList());chart.setXAxis(new DataVO<>(xAxis));//汇总数据legend.forEach(e -> {List<BigDecimal> series = list.stream().filter(y -> ObjectUtil.equal(e, y.getLegend()) && StrUtil.isNotEmpty(y.getName())).map(LegendNameBO::getNum).collect(Collectors.toList());chart.getSeries().add(new DataVO<>(series, e));});return chart;}public static List<LegendNameBO> legendNameBOSort(List<LegendNameBO> list, Map<String, Integer> legendSort) {list.sort(Comparator.comparing(e -> legendSort.get(e.getLegend())));return list;}public static <T extends BaseEnum> ChartVO legendNameBOEnumObj(List<LegendNameBO> list,List<String> names,List<T> enums,Map<String, Integer> legendSort) {list.forEach(e -> {BaseEnum baseEnum = enums.stream().filter(y -> ObjectUtil.equal(y.getValue().toString(), e.getLegend())).findFirst().get();if (ObjectUtil.isNotNull(baseEnum)) {e.setLegend(baseEnum.getEnumName());}});names.forEach(e -> {enums.forEach(y -> {boolean bool = list.stream().anyMatch(t -> ObjectUtil.equal(e + y.getEnumName(),t.getName() + t.getLegend()));if (!bool) {list.add(new LegendNameBO(BigDecimal.ZERO, e, y.getEnumName()));}});});Map<String, BigDecimal> collect = list.stream().collect(Collectors.groupingBy(LegendNameBO::getName,Collectors.mapping(LegendNameBO::getNum,Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));collect.forEach((k, v) -> {if (BigDecimal.ZERO.compareTo(v) == 0) {list.removeIf(e -> ObjectUtil.equal(k, e.getName()));}});list.sort(Comparator.comparing((LegendNameBO e) -> GasConvertUtil.toInt(e.getName())).thenComparing((LegendNameBO e) -> legendSort.getOrDefault(e.getLegend(), Integer.MAX_VALUE)));//组装辅助数据Map<String, List<KvVO<BigDecimal>>> obj = list.stream().collect(Collectors.groupingBy(LegendNameBO::getName,Collectors.mapping(e ->new KvVO<>(e.getLegend(), e.getNum()), Collectors.toList())));return EChartsUtil.legendNameBO(list).setObj(obj);}public static <T extends BaseEnum> ChartVO legendNameBOEnumObj(List<LegendNameBO> bos,List<T> enums) {Set<String> names = bos.stream().map(LegendNameBO::getName).collect(Collectors.toSet());Map<String, BigDecimal> map = bos.stream().collect(Collectors.toMap(e -> e.getName() + e.getLegend(), LegendNameBO::getNum));List<LegendNameBO> list = names.stream().map(e ->enums.stream().map(y -> new LegendNameBO(map.getOrDefault(e + y.getValue(), BigDecimal.ZERO),e, y.getEnumName())).collect(Collectors.toList())).flatMap(Collection::stream).toList();Map<String, BigDecimal> collect = list.stream().collect(Collectors.groupingBy(LegendNameBO::getName,Collectors.mapping(LegendNameBO::getNum,Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));collect.forEach((k, v) -> {if (BigDecimal.ZERO.compareTo(v) == 0) {list.removeIf(e -> ObjectUtil.equal(k, e.getName()));}});//组装辅助数据Map<String, List<KvVO<BigDecimal>>> obj = list.stream().collect(Collectors.groupingBy(LegendNameBO::getName,Collectors.mapping(e ->new KvVO<>(e.getLegend(), e.getNum()), Collectors.toList())));return EChartsUtil.legendNameBO(list).setObj(obj);}public static ChartVO legendNameBOAreaEnterprise(List<LegendNameBO> list, List<LegendNameBO> listArea, String area) {Map<String, BigDecimal> collect = list.stream().collect(Collectors.groupingBy(LegendNameBO::getName,Collectors.mapping(LegendNameBO::getNum,Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));collect.forEach((k, v) -> {if (BigDecimal.ZERO.compareTo(v) == 0) {list.removeIf(e -> ObjectUtil.equal(k, e.getName()));}});Map<String, BigDecimal> map = list.stream().collect(Collectors.groupingBy(LegendNameBO::getLegend,Collectors.mapping(LegendNameBO::getNum,Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));String areaName = AreaEnum.getAreaName(area);listArea.forEach(e ->e.setName(areaName).setNum(map.getOrDefault(e.getLegend(), BigDecimal.ZERO)));list.addAll(0, listArea);return legendNameBO(list);}public static <T extends BaseEnum> ChartVO legendNameBOAreaEnterpriseEnum(List<LegendNameBO> bos,String areaCode,List<T> enums,Map<String, Integer> legendSort) {String areaName = AreaEnum.getAreaName(areaCode);List<LegendNameBO> areaList = enums.stream().map(e ->new LegendNameBO(bos.stream().filter(y -> ObjectUtil.equal(e.getValue().toString(), y.getLegend())).map(LegendNameBO::getNum).reduce(BigDecimal.ZERO, BigDecimal::add), areaName, e.getValue().toString())).collect(Collectors.toList());Set<String> names = bos.stream().map(LegendNameBO::getName).collect(Collectors.toSet());List<LegendNameBO> list = names.stream().map(e ->enums.stream().map(y -> {LegendNameBO legendNameBO = bos.stream().filter(k -> ObjectUtil.equal(e, k.getName())).filter(k -> ObjectUtil.equal(y.getValue().toString(), k.getLegend())).findFirst().orElse(null);if (ObjectUtil.isNull(legendNameBO)) {legendNameBO = new LegendNameBO(BigDecimal.ZERO, e, y.getValue().toString());}return legendNameBO;}).collect(Collectors.toList())).flatMap(Collection::stream).collect(Collectors.toList());list.addAll(0, areaList);//补第一列轴
// enums.forEach(e -> {
// LegendNameBO legendNameBO = areaList.stream()
// .filter(y -> ObjectUtil.equal(e.getValue().toString(), y.getLegend()))
// .findFirst()
// .orElse(null);
// if (ObjectUtil.isNull(legendNameBO)) {
// areaList.add(new LegendNameBO(BigDecimal.ZERO, areaName, e.getEnumName()));
// } else {
// legendNameBO.setName(areaName)
// .setLegend(e.getEnumName());
// }
// });
//list.forEach(e -> {BaseEnum baseEnum = enums.stream().filter(y -> ObjectUtil.equal(y.getValue().toString(), e.getLegend())).findFirst().get();if (ObjectUtil.isNotNull(baseEnum)) {e.setLegend(baseEnum.getEnumName());}});//补x轴
// Optional.of(list.stream()
// .map(LegendNameBO::getName)
// .toList())
// .orElse(new ArrayList<>())
// .forEach(e -> {
// enums.forEach(y -> {
// boolean bool = list.stream()
// .anyMatch(t -> ObjectUtil.equal(e + y.getEnumName(),
// t.getName() + t.getLegend()));
// if (!bool) {
// list.add(new LegendNameBO(BigDecimal.ZERO, e, y.getEnumName()));
// }
// });
// });// Map<String, BigDecimal> collect = list.stream()
// .collect(Collectors.groupingBy(LegendNameBO::getName,
// Collectors.mapping(LegendNameBO::getNum,
// Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
// collect.forEach((k, v) -> {
// if (BigDecimal.ZERO.compareTo(v) == 0) {
// list.removeIf(e -> ObjectUtil.equal(k, e.getName()));
// }
// });legendNameBOSort(list, legendSort);return legendNameBO(list);}public static ChartVO legendNameBOAreaEnterpriseDict(List<LegendNameBO> bos, List<KvBO> dict, String area) {Map<String, BigDecimal> areaMap = bos.stream().collect(Collectors.groupingBy(LegendNameBO::getLegend,Collectors.mapping(LegendNameBO::getNum,Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));List<LegendNameBO> areaBO = dict.stream().map(e -> new LegendNameBO(areaMap.getOrDefault(e.getKey(), BigDecimal.ZERO),AreaEnum.getAreaName(area),e.getValue())).collect(Collectors.toList());Map<String, Map<String, BigDecimal>> map = legendNameBOGroup(bos);Set<String> names = bos.stream().map(LegendNameBO::getName).collect(Collectors.toSet());bos = names.stream().map(e -> dict.stream().map(y -> new LegendNameBO(map.getOrDefault(e, GasMapUtil.empty()).getOrDefault(y.getKey(), BigDecimal.ZERO),e, y.getValue())).collect(Collectors.toList())).flatMap(Collection::stream).collect(Collectors.toList());bos.addAll(0, areaBO);//组装辅助数据Map<String, List<KvVO<BigDecimal>>> obj = bos.stream().collect(Collectors.groupingBy(LegendNameBO::getName,Collectors.mapping(e ->new KvVO<>(e.getLegend(), e.getNum()), Collectors.toList())));return legendNameBO(bos).setObj(obj);}public static ChartVO nameBODateScope(List<NameBO> bos,List<String> dateScope) {List<NameBO> list = new ArrayList<>();Map<String, BigDecimal> map = bos.stream().collect(Collectors.toMap(NameBO::getName, NameBO::getNum));for (int i = 0; i < dateScope.size(); i++) {String e = dateScope.get(i);list.add(new NameBO(map.getOrDefault(e, BigDecimal.ZERO), e));}//若这里出问题,就把这段代码删了 或 注释了,再把下边的代码 解开注释List<KvBO> obj = list.stream().map(e -> new KvBO(e.getName(),e.getNum().toString())).collect(Collectors.toList());kvBOPercent(obj);obj.forEach(e -> e.setValue(e.getValue() + "%"));// Map<String, BigDecimal> collect = list.stream()
// .collect(Collectors.groupingBy(NameBO::getName, Collectors.mapping(NameBO::getNum,
// Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
// BigDecimal sum = list.stream()
// .map(NameBO::getNum)
// .reduce(BigDecimal.ZERO, BigDecimal::add);
//
// List<KvBO> obj = new ArrayList<>();
// for (int i = 0; i < dateScope.size(); i++) {
// String e = dateScope.get(i);
// BigDecimal total = collect.getOrDefault(e, BigDecimal.ZERO);
// KvBO bo = new KvBO(e, "0%");
// if (BigDecimal.ZERO.compareTo(total) != 0) {
// bo.setValue(NumberUtil.round(
// NumberUtil.mul(
// NumberUtil.div(total, sum), EChartsUtil.ONE_HUNDRED)
// , 2)
// + "%");
// }
// obj.add(bo);
// }return nameBO(list).setObj(obj);}public static ChartVO nameBOAreaEnterprise(List<NameBO> list, NameBO bo, String areaCode) {bo.setName(AreaEnum.getAreaName(areaCode));list.add(0, bo);return nameBO(list);}public static ChartVO nameBOAreaEnterprise(List<NameBO> list, String areaCode) {list.add(0, new NameBO(list.stream().map(NameBO::getNum).reduce(BigDecimal.ZERO, BigDecimal::add), AreaEnum.getAreaName(areaCode)));return nameBO(list);}public static ChartVO nameBO(List<NameBO> list) {ChartVO chart = new ChartVO<>();//汇总x轴List<String> xAxis = list.stream().map(NameBO::getName).filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList());chart.setXAxis(new DataVO<>(xAxis));//汇总数据List<BigDecimal> series = list.stream().map(NameBO::getNum).collect(Collectors.toList());chart.getSeries().add(new DataVO<>(series));return chart;}public static final BigDecimal ONE_HUNDRED = new BigDecimal("100");public static ChartVO kvBOPiePercent(List<KvBO> list, Map<String, String> map) {return kvBOPie(kvBOPercent(list), map);}public static BigDecimal percent(String divisor, String dividend) {return percent(StrUtil.isNotBlank(divisor) ? new BigDecimal(divisor) : null,StrUtil.isNotBlank(dividend) ? new BigDecimal(dividend) : null);}public static BigDecimal percent(BigDecimal divisor, BigDecimal dividend) {if (ObjectUtil.isAllNotEmpty(divisor, dividend) && dividend.compareTo(BigDecimal.ZERO) != 0) {return NumberUtil.round(NumberUtil.mul(NumberUtil.div(divisor, dividend), EChartsUtil.ONE_HUNDRED), 2);}return BigDecimal.ZERO;}public static ChartVO kvBOPiePercent(List<KvBO> list) {return kvBOPie(kvBOPercent(list));}private static List<KvBO> kvBOPercent(List<KvBO> list) {BigDecimal sum = list.stream().map(e -> new BigDecimal(e.getValue())).reduce(BigDecimal.ZERO, BigDecimal::add);list.forEach(e -> {BigDecimal value = new BigDecimal(e.getValue());if (BigDecimal.ZERO.compareTo(value) != 0) {e.setValue(NumberUtil.round(NumberUtil.mul(NumberUtil.div(e.getValue(), StrUtil.toString(sum)), ONE_HUNDRED), 2).toString());} else {e.setValue("0");}});return list;}public static ChartVO kvBOPie(List<KvBO> list) {ChartVO chart = new ChartVO();//汇总标签List<String> legend = list.stream().map(KvBO::getKey).collect(Collectors.toList());chart.setLegend(new DataVO<>(legend));List<PieDataVO> pieData = list.stream().map(e -> new PieDataVO<>(e.getKey(), e.getValue())).collect(Collectors.toList());chart.setSeries(GasListUtil.toList(new DataVO<>(pieData)));return chart.setObj(list);}public static ChartVO kvBOPie(List<KvBO> list, Map<String, String> map, List<String> names) {ChartVO chartVO = kvBOPie(list, map);chartVO.getLegend().setData(names);return chartVO;}public static ChartVO kvBOPie(List<KvBO> list, Map<String, String> map) {map.forEach((k, v) -> {KvBO kvBO = list.stream().filter(e -> ObjectUtil.equal(e.getKey(), k)).findFirst().orElse(null);if (ObjectUtil.isNull(kvBO)) {list.add(new KvBO(v, "0"));} else {kvBO.setKey(v);}});return kvBOPie(list);}/*** KvBO 柱形图 折线图*/public static ChartVO kvVO(List<KvVO<BigDecimal>> bo) {ChartVO chart = new ChartVO<>();//汇总x轴List<String> xAxis = bo.stream().filter(e -> StrUtil.isNotBlank(e.getK())).map(KvVO::getK).distinct().collect(Collectors.toList());chart.setXAxis(new DataVO<>(xAxis));//汇总数据List<BigDecimal> series = bo.stream().filter(e -> StrUtil.isNotBlank(e.getK())).map(KvVO::getV).collect(Collectors.toList());chart.getSeries().add(new DataVO<>(series));return chart;}/*** KvBO 转换为饼图->处理数据** @param bo* @param div 被除数* @return*/public static ChartVO kvBOPie(List<KvBO> bo, String div) {if (StrUtil.isNotBlank(div) && GasConvertUtil.toInt(div) != 0) {bo.forEach(e -> {e.setValue(NumberUtil.div(e.getValue(), div, 2).toString());});}return kvBOPie(bo);}public static ChartVO legendNameBODateScope(List<LegendNameBO> bos, List<String> legends, List<String> dateScope) {List<LegendNameBO> list = new ArrayList<>();Map<String, Map<String, BigDecimal>> map = legendNameBOGroup(bos);for (int i = 0; i < dateScope.size(); i++) {String e = dateScope.get(i);for (int k = 0; k < legends.size(); k++) {String y = legends.get(k);list.add(new LegendNameBO(map.getOrDefault(e, GasMapUtil.empty()).getOrDefault(y, BigDecimal.ZERO), e, y));}}return legendNameBO(list);}public static ChartVO legendNameBOAreaEnterprise(List<LegendNameBO> bos, String area) {String areaName = AreaEnum.getAreaName(area);bos.addAll(0, bos.stream().collect(Collectors.groupingBy(LegendNameBO::getLegend,LinkedHashMap::new,Collectors.mapping(LegendNameBO::getNum,Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))).entrySet().stream().map(e -> new LegendNameBO(e.getValue(), areaName, e.getKey())).collect(Collectors.toList()));return legendNameBO(bos);}public static <T extends BaseEnum> ChartVO legendNameBOEnumDateScope(List<LegendNameBO> bos,List<T> enums,Map<String, Integer> legendSort,//日期偏移量List<String> dateScope) {HashMap<String, Integer> dateScopeSort = new HashMap<>();for (int i = 0; i < dateScope.size(); i++) {dateScopeSort.put(dateScope.get(i), i);}Map<String, Map<String, BigDecimal>> map = legendNameBOGroup(bos);bos = dateScope.stream().map(e -> enums.stream().map(y -> new LegendNameBO(map.getOrDefault(e, GasMapUtil.empty()).getOrDefault(y.getValue().toString(), BigDecimal.ZERO),e, y.getEnumName())).collect(Collectors.toList())).flatMap(Collection::stream).collect(Collectors.toList());bos.sort(Comparator.comparing((LegendNameBO e) -> dateScopeSort.get(e.getName())).thenComparing((LegendNameBO e) -> legendSort.getOrDefault(e.getLegend(), Integer.MAX_VALUE)));return legendNameBO(bos);}private static final List<AreaEnum> AREA_LIST = GasListUtil.toList(AreaEnum.values());public static Map<String, Map<String, BigDecimal>> areaNameBOGroup(List<AreaNameBO> bos) {return bos.stream().collect(Collectors.groupingBy(AreaNameBO::getName,LinkedHashMap::new,Collectors.groupingBy(AreaNameBO::getHomeArea,LinkedHashMap::new,Collectors.mapping(AreaNameBO::getNum,Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))));};public static ChartVO areaNameBORadarEnumObj(List<AreaNameBO> bos,List<KvBO> nameBOS) {Map<String, Map<String, BigDecimal>> map = areaNameBOGroup(bos);List<AreaNameBO> list = nameBOS.stream().map(e ->AREA_LIST.stream().map(y -> new AreaNameBO(map.getOrDefault(e.getKey(), GasMapUtil.empty()).getOrDefault(y.getValue().toString(), BigDecimal.ZERO),e.getValue(), y.getType().toString(), y.getEnumName())).collect(Collectors.toList())).flatMap(Collection::stream).collect(Collectors.toList());String main = GasStringUtil.join(",", AreaEnum.mainArea);List<AreaNameBO> mainBOS = list.stream().filter(e -> AreaEnum.mainArea.contains(e.getHomeArea())).collect(Collectors.groupingBy(AreaNameBO::getName,LinkedHashMap::new,Collectors.mapping(AreaNameBO::getNum,Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))).entrySet().stream().map(e -> new AreaNameBO(e.getValue(),e.getKey(), main, AreaEnum.mainAreaName)).collect(Collectors.toList());list.removeIf(e -> AreaEnum.mainArea.contains(e.getHomeArea()));list.addAll(mainBOS);list.sort(Comparator.comparing(e -> AreaEnum.LEGEND_SORT.getOrDefault(e.getLegend(), Integer.MAX_VALUE)));//组装辅助数据Map<String, List<KvVO<BigDecimal>>> obj = list.stream().collect(Collectors.groupingBy(AreaNameBO::getLegend,Collectors.mapping(e ->new KvVO<>(e.getName(), e.getNum()), Collectors.toList())));return EChartsUtil.legendNameBO(GasBeanUtil.copyPropertiesList(list, LegendNameBO.class)).setObj(obj);}
}
4.枚举
public interface BaseEnum<T> {T getValue();default String getEnumName() {return null;}
}
package com.gas.enums;import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.gas.base.enums.BaseEnum;
import com.gas.utils.convert.GasConvertUtil;
import com.gas.utils.obj.GasObjectUtil;
import com.gas.utils.string.GasStringUtil;
import lombok.Getter;import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;/*** 区县类型* 1:路北区 2:路南区 3:古冶区 4:开平区 5:丰南区 6:丰润区 7:高新开发区 8:迁安市 9:遵化市* 10:滦州市 11:滦南县 12:乐亭县 13:迁西县 14:玉田县 15:海港开发区 16:国际旅游岛 17:芦台开发区* 18:汉沽管理区 19:曹妃甸区 20:南堡开发区** @author zhaoyang*/
@Getter
public enum AreaEnum implements BaseEnum<Integer> {_130203(130203, 1, "路北区", 1),_130202(130202, 2, "路南区", 2),_130204(130204, 3, "古冶区", 3),_130205(130205, 4, "开平区", 4),_130207(130207, 5, "丰南区", 5),_130208(130208, 6, "丰润区", 6),_130273(130273, 7, "高新开发区", 7),_130283(130283, 8, "迁安市", 8),_130281(130281, 9, "遵化市", 9),_130284(130284, 10, "滦州市", 10),_130224(130224, 11, "滦南县", 11),_130225(130225, 12, "乐亭县", 12),_130227(130227, 13, "迁西县", 13),_130229(130229, 14, "玉田县", 14),_130274(130274, 15, "海港开发区", 15),_130290(130290, 16, "国际旅游岛", 16),_130271(130271, 17, "芦台开发区", 17),_130272(130272, 18, "汉沽管理区", 18),_130209(130209, 19, "曹妃甸区", 19),//南堡 暂时属于 曹妃甸_20(130209, 20, "南堡开发区", 20),;private final Integer region;private final Integer type;private final String name;private final Integer sort;public static final Map<String, Integer> LEGEND_SORT = Arrays.stream(AreaEnum.values()).collect(Collectors.toMap(AreaEnum::getName, AreaEnum::getSort));public static final String mainAreaName = "主城区";public static final String allAreaName = "全市";AreaEnum(Integer region, Integer type, String name, Integer sort) {this.region = region;this.type = type;this.name = name;this.sort = sort;}public static final List<String> mainArea = Arrays.stream(AreaEnum.values()).filter(e -> GasObjectUtil.equals(e, _130203, _130202, _130273)).map(AreaEnum::getType).map(GasStringUtil::toString).toList();public static final List<Integer> allArea = Arrays.stream(AreaEnum.values()).map(AreaEnum::getType).toList();public static AreaEnum of(Integer type) {return Arrays.stream(AreaEnum.values()).filter(e -> GasObjectUtil.equals(e.getType(), type)).findFirst().orElse(null);}public static String name(String type) {return name(GasConvertUtil.toInt(type));}public static String name(Integer type) {return Arrays.stream(AreaEnum.values()).filter(e -> ObjectUtil.equals(e.getType(), type)).findFirst().map(AreaEnum::getName).orElse(GasStringUtil.EMPTY);}public static Integer sort(String type) {return sort(GasConvertUtil.toInt(type));}public static Integer sort(Integer type) {return Arrays.stream(AreaEnum.values()).filter(e -> ObjectUtil.equals(e.getType(), type)).findFirst().map(AreaEnum::getSort).orElse(0);}public static Integer type(String name) {return Arrays.stream(AreaEnum.values()).filter(e -> ObjectUtil.equals(e.getName(), name)).findFirst().map(AreaEnum::getType).orElse(null);}public static boolean isMain(String area) {return StrUtil.contains(area, ",");}public static String getAreaName(String area) {return isMain(area) ? AreaEnum.mainAreaName : name(area);}public static Integer getRegionByAreaType(String type) {return Arrays.stream(AreaEnum.values()).filter(e -> Objects.equals(e.getType(), Integer.valueOf(type))).findFirst().map(AreaEnum::getRegion).orElse(null);}@Overridepublic Integer getValue() {return this.type;}@Overridepublic String getEnumName() {return this.name;}public Integer handleSort(String type) {return sort(type);}}
记录个大概