美文网首页echarts中国
如何使用echarts的Graph图实现一个流程控制图

如何使用echarts的Graph图实现一个流程控制图

作者: lane_developer | 来源:发表于2017-07-20 18:54 被阅读5106次

    前言:

    最近接到一个新需求,需要写一个新模块,这个模块主要是用于查看当前每个生产计划的完成情况,然后所有的生产计划都列在了表格里,而流程控制图用于直观展示选中的生产计划的完成进度

    1、首先看一下这个生产计划的流程控制图大概的样子

    2、我们分析一下后端给出的数据接口(这是根据事先约定好的数据)


    data属性对应后台返回的数据,是一个数组,数组里面的元素对应流程控制图的每一个节点,id字段表示当前节点的id号,用于关联其他节点,next-process字段是一个数组,用于表示该节点的子节点,process表示当前节点计划完成了多少,pre-process字段在这里不是表示该节点的所有父级节点

    3、echart的Graph图及其配置

    Graph图的原始配置,我稍微做了更改,就是links属性中的每一个元素代表了节点间的关系,由于生产计划的名称可能存在重名的情况,所以我们改用节点元素在data属性中的索引来建立节点之间的联系

    option = {
        title: {
            text: 'Graph 简单示例'
        },
        tooltip: {},
        animationDurationUpdate: 1500,
        animationEasingUpdate: 'quinticInOut',
        series : [
            {
                type: 'graph',
                layout: 'none',
                symbolSize: 50,
                roam: true,
                label: {
                    normal: {
                        show: true
                    }
                },
                edgeSymbol: ['circle', 'arrow'],
                edgeSymbolSize: [4, 10],
                edgeLabel: {
                    normal: {
                        textStyle: {
                            fontSize: 20
                        }
                    }
                },
                data: [{
                    name: '节点1',
                    x: 300, //节点在图上的x坐标
                    y: 300 //节点在图上的y坐标
                }, {
                    name: '节点2',
                    x: 800,
                    y: 300
                }, {
                    name: '节点3',
                    x: 550,
                    y: 100
                }, {
                    name: '节点4',
                    x: 550,
                    y: 500
                }],
                // links: [],
                links: [{
                    source: 0,
                    target: 1,
                    symbolSize: [5, 20],
                    label: {
                        normal: {
                            show: true
                        }
                    },
                    lineStyle: {
                        normal: {
                            width: 5,
                            curveness: 0.2
                        }
                    }
                }, {
                    source: 1,
                    target: 0,
                    label: {
                        normal: {
                            show: true
                        }
                    },
                    lineStyle: {
                        normal: { curveness: 0.2 }
                    }
                }, {
                    source: 0,
                    target: 2
                }, {
                    source: 1,
                    target: 2
                }, {
                    source: 1,
                    target: 3
                }, {
                    source: 0,
                    target: 3
                }],
                lineStyle: {
                    normal: {
                        opacity: 0.9,
                        width: 2,
                        curveness: 0
                    }
                }
            }
        ]
    };
    

    该段配置对应的原始Graph图


    4、我的思考

    我开始的想法是既然给出了next-process字段,也就知道了当前节点的下级子节点,所以我开始的想法也是从上往下构建树就行了,首先构建这棵树我的想法是由于节点之间的联系依赖于节点在data属性对应的数组中的索引(也就是在data属性中的位置),所以我们只能一级一级的找出同级节点,然后给每一级同级节点编号,比如第一级的节点有三个元素掘金计划,爬山计划,看书计划,所以这三个节点属于同一个级别,但是我这里想说的是,登山计划理应属于第二级的节点,但是你找第一级节点肯定是找那些没有父级节点的节点,所以这里就有问题了,登山计划和掘金计划,爬山计划,看书计划成了同一级别,这样计算位置肯定会有问题,所以我决定从下往上拼树就可以完美避开这个问题,但是从小网上拼树就一些小地方需要特别处理,就是纵坐标的位置怎么确立,我首先就找出了最后一个节点,我怎么知道把它的y坐标设置成多少,放在哪里?所以我灵机一动,我第一次循环只把所有的节点分出级别,然后第二次循环再根据级别确定y轴的坐标位置并添加节点信息,第三次循环找出所有节点之间的联系,给它们加上指向箭头

    5、具体实现

    echart原始配置数据:


    具体实现(这三幅图是一个函数):


    有错或者有更好的实现方式欢迎指正和交流!!!

    相关文章

      网友评论

      • 3bd66b67bd4f:我想问一下,怎样对节点进行拖拽
        lane_developer:@槑_2de3 这个暂时没有关注,有时间我会帮你看一看,看了再回复你:smile:
      • 727ba99a3316:为什么我在项目里面用这个渐变色图片就直接显示成白色了。求大神指导
        lane_developer:格式化一下这个节点信息数据
        lane_developer:{
        name: '节点4',
        x: 550,
        y: 500,
        value: 1,
        itemStyle: {
        normal: {
        color: {
        type: 'linear',
        x: 1,
        y: 1,
        x2: 1,
        y2: 0,
        colorStops: [{
        offset: 0, color: '#27a2e6'
        },{
        offset: 0.5, color: '#27a2e6'
        },{
        offset: 0.5, color: '#22658f'
        },{
        offset: 1, color: '#22658f'
        }],
        }
        }
        }
        }
        节点信息像我这样配置
      • 3f19cde61712:大佬还在吗?问一下有没有源码,研究研究
        lane_developer:@hter 我不是什么大佬,那是我工作半年写的,现在看那代码也有很多不好的地方,关键是思路看能不能帮到大家,现在也才工作一年,叫大佬让我惭愧:relieved:
        3f19cde61712:@lane_developer 可惜,看了下代码感觉大佬的思路很清晰,复杂的地方就是在坐标的处理上
        lane_developer:@hter 很抱歉,截图就是源码,主要思路已经再截图的注释上说明,因为以前公司代码加密保护拿不出来,所以一气之下年终奖都不要直接提职了,以后文章都会直接发源码:pensive:
      • 牛威猛:请问,echarts这种流程图,line是否可以做成直角线
        edd226f2dc62:我特想问这个问题,请问有解了么?

      本文标题:如何使用echarts的Graph图实现一个流程控制图

      本文链接:https://www.haomeiwen.com/subject/vpyjkxtx.html