Java桑葚图

项目场景:

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方法即可
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值