项目场景:
Java实现 Echarts-桑葚图数据
问题描述:
桑葚图展示需要使用到的数据如下
https://cdn.jsdelivr.net/gh/apache/echarts-website@asf-site/examples/data/asset/data/product.json
原因分析:
展示需要两个数组
1.nodes数组 每个节点的名称
2.links数组 相邻两个节点的名称及它们之间的值
(source:第一个节点名称 , target: 第二个节点名称, value:值)
如下图:红框及节点名称,灰色部分为两个节点之间的值
解决方案:
sql查询出数据之后如上图所示
一级名称: 洗衣中心
二级名称: 抗体洗整衣, ADC洗整衣
三级名称: 2KTX01-S, 2KTX02-S(备注一), 2LX01-S, 2LX02-S
完整代码 下面代码因为业务务求分了4次 如果你们只有3个级别的名称 代码看到设备类型即可
public Map<String,List<Object>> findFigureLists(TEnergytEquipment tEnergytEquipment) {
Map resultMap = new HashMap();
List<Nodes> ns = new ArrayList<>();
List<Links> ls = new ArrayList<>();
List<Nodes> names = new ArrayList<>();
List<Nodes> lxNames = new ArrayList<>();
List<ViewSht> viewShts = tEnergytEquipmentMapper.findAll(tEnergytEquipment);
List<ViewSht> collect = viewShts.stream().filter(e -> e.getCxmc() != null
&& e.getQymc() != null
&& e.getLxmc() != null
&& e.getSbmc() != null).collect(Collectors.toList());
if (collect.size() > 0) {
//产线名称
Map<String, List<ViewSht>> cxCollect = collect.stream().collect(Collectors.groupingBy(ViewSht::getCxmc));
ns.add(Nodes.builder().name((String) cxCollect.keySet().toArray()[0]).build());
//区域名称
Map<String, List<ViewSht>> qyCollect = collect.stream().collect(Collectors.groupingBy(ViewSht::getQymc));
qyCollect.keySet().forEach(e -> {
long sum = collect.stream().filter(c -> ns.get(0).getName().equals(c.getCxmc()) && c.getQymc().equals(e)).mapToLong(ViewSht::getNumber).sum();
ls.add(Links.builder().source(ns.get(0).getName()).target(e).value(sum).build());
ns.add(Nodes.builder().name(e).build());
});
int size = ns.size();
names.addAll(ns.subList(1, ns.size()));
//设备类型名称
for (Nodes nodes : names) {
Map<String, LongSummaryStatistics> map = collect.stream().filter(f -> f.getQymc().equals(nodes.getName())).collect(Collectors.groupingBy(ViewSht::getLxmc, Collectors.summarizingLong(ViewSht::getNumber)));
for (Map.Entry<String, LongSummaryStatistics> mp : map.entrySet()) {
ls.add(Links.builder().value(mp.getValue().getSum()).source(nodes.getName()).target(mp.getKey()).build());
ns.add(Nodes.builder().name(mp.getKey()).build());
}
}
lxNames.addAll(ns.subList(size, ns.size()));
Set lxNameSet = new HashSet(lxNames);
List<Nodes> lxName = new ArrayList<>(lxNameSet);
//详细设备名称
for (Nodes lx : lxName) {
Map<String, LongSummaryStatistics> map = collect.stream().filter(f -> f.getLxmc().equals(lx.getName())).collect(Collectors.groupingBy(ViewSht::getSbmc, Collectors.summarizingLong(ViewSht::getNumber)));
for (Map.Entry<String, LongSummaryStatistics> mp : map.entrySet()) {
ls.add(Links.builder().value(mp.getValue().getSum()).source(lx.getName()).target(mp.getKey()).build());
ns.add(Nodes.builder().name(mp.getKey()).build());
}
}
Set set = new HashSet(ns);
List<Nodes> list = new ArrayList<>(set);
resultMap.put("nodes", list);
resultMap.put("links", ls);
}
return resultMap;
}
Nodes类
public class Nodes {
private String name;
}
Links类
public class Links {
private String source;
private String target;
private Long value;
}
查询出的ViewSht类
public class ViewSht {
private String cxmc;
private String qymc;
private String lxmc;
private String sbmc;
private Long number;
private Date gatherTime;
}
自己写一下get/set方法即可