使用echarts制作甘特图

400 阅读4分钟
  //计算两个日期相差天数
  function DateDiff(sDate1, sDate2) {
    //sDate1和sDate2是2006-12-18格式
    var aDate, oDate1, oDate2, iDays
    aDate = sDate1.split('-')
    oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
    aDate = sDate2.split('-')
    oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
    iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 / 24) //把相差的毫秒数转换为天数
    return iDays
  }

  //获得两个日期间所有日期-fn1
  Date.prototype.format = function() {
    var s = ''
    var mouth =
      this.getMonth() + 1 >= 10
        ? this.getMonth() + 1
        : '0' + (this.getMonth() + 1)
    var day = this.getDate() >= 10 ? this.getDate() : '0' + this.getDate()
    s += this.getFullYear() + '-' // 获取年份。
    s += mouth + '-' // 获取月份。
    s += day //获取日。
    return s //返回日期。
  }
  //获得两个日期间所有日期-fn2
  function getAll(begin, end) {
    var return_ = []
    var ab = begin.split('-')
    // console.log(ab, 1111)
    var ae = end.split('-')
    // console.log(ae, 2222)
    // var aaa = new Date()
    // console.log(aaa.setUTCFullYear(1992))
    var db = new Date()
    db.setUTCFullYear(ab[0], ab[1] - 1, ab[2])
    // console.log(db.setUTCFullYear(ab[0], ab[1] - 1, ab[2]), 3333)
    var de = new Date()
    de.setUTCFullYear(ae[0], ae[1] - 1, ae[2])
    // console.log(de.setUTCFullYear(ae[0], ae[1] - 1, ae[2]), 4444)
    var unixDb = db.getTime()
    // console.log(unixDb, 5555)
    var unixDe = de.getTime()
    // console.log(unixDe, 6666)
    for (var k = unixDb; k <= unixDe; ) {
      // console.log(new Date(parseInt(k)).format())
      return_.push(new Date(parseInt(k)).format())
      k = k + 24 * 60 * 60 * 1000
    }
    return return_
  }
  var dataa = [
    {
      name: '某余热发电项目',
      startTime: '2016-05-12',
      latestTime: '2017-06-19'
    },
    {
      name: '某8MW光伏发电项目',
      startTime: '2017-05-14',
      latestTime: '2017-12-17'
    },
    {
      name: '某陶瓷公司设备改造项目',
      startTime: '2018-02-14',
      latestTime: '2018-09-17'
    },
    {
      name: '某10MW太阳能发电项目',
      startTime: '2018-02-14',
      latestTime: '2018-07-17'
    },
    {
      name: '某造纸厂设备改造项目',
      startTime: '2016-06-14',
      latestTime: '2018-12-17'
    },
    {
      name: '某纺织厂光伏发电项目',
      startTime: '2018-01-14',
      latestTime: '2019-12-17'
    },
    {
      name: '某点击改造项目',
      startTime: '2017-11-14',
      latestTime: '2018-10-17'
    },
    {
      name: '某光伏发电示范项目',
      startTime: '2018-04-14',
      latestTime: '2019-12-17'
    }
  ]
  var start_ = '2016-05-12',
    end_ = '2019-12-17' //用户自定义时间
  var data$ = DateDiff(start_, end_) //用户自定义的时间长度
  // console.log(data$)
  var data1 = DateDiff(start_, dataa[0].startTime) //项目a 起始位置
  var data1_1 = DateDiff(dataa[0].startTime, dataa[0].latestTime) //项目a 持续时间
  var data2 = DateDiff(start_, dataa[1].startTime) //项目b 起始位置
  var data2_1 = DateDiff(dataa[1].startTime, dataa[1].latestTime) //项目b 持续时间

  var data3 = DateDiff(start_, dataa[2].startTime)
  var data3_1 = DateDiff(dataa[2].startTime, dataa[2].latestTime)

  var data4 = DateDiff(start_, dataa[3].startTime)
  var data4_1 = DateDiff(dataa[3].startTime, dataa[3].latestTime)

  var data5 = DateDiff(start_, dataa[4].startTime)
  var data5_1 = DateDiff(dataa[4].startTime, dataa[4].latestTime)

  var data6 = DateDiff(start_, dataa[5].startTime)
  var data6_1 = DateDiff(dataa[5].startTime, dataa[5].latestTime)

  var data7 = DateDiff(start_, dataa[6].startTime)
  var data7_1 = DateDiff(dataa[6].startTime, dataa[6].latestTime)

  var data8 = DateDiff(start_, dataa[7].startTime)
  var data8_1 = DateDiff(dataa[7].startTime, dataa[7].latestTime)
  x_ = getAll(start_, end_)
  // console.log(x_)
  var myChart = echarts.init(document.getElementById('main'))
  var option = {
    title: {
      text: '项目监测预警表',
      x: 'center'
    },
    legend: {
      y: 'bottom',
      data: ['时长'] //和series配置项里面的name一一对应
    },
    grid: {
      containLabel: true,
      left: 20
    },
    xAxis: {
      type: 'value',
      max: data$,
      axisLabel: {
        formatter: function(value, index) {
          // console.log(value, index)
          // console.log(x_)
          return x_[value]
        }
      }
    },
    yAxis: {
      type: 'category',
      splitLine: { show: false },
      data: [
        '某余热发电项目',
        '某8MW光伏发电项目',
        '某陶瓷公司设备改造项目',
        '某10MW太阳能发电项目',
        '某造纸厂设备改造项目',
        '某纺织厂光伏发电项目',
        '某电机改造项目',
        '某光伏发电示范项目'
      ]
    },
    tooltip: {
      trigger: 'axis',
      axisPointer: {
        type: 'shadow'
      },
      formatter: function(params) {
        // console.log(params)
        var tar = params[1]
        // console.log(tar.value)
        return (
          tar.name +
          '<br/>' +
          // tar.seriesName +
          ' 总共耗时为:' +
          tar.value +
          '小时'
        )
      }
    },
    series: [
      {
        name: '辅助',
        type: 'bar',
        stack: '时间',
        itemStyle: {
          normal: {
            barBorderColor: 'rgba(0,0,0,0)',
            color: 'rgba(0,0,0,0)'
          },
          emphasis: {
            barBorderColor: 'rgba(0,0,0,0)',
            color: 'rgba(0,0,0,0)'
          }
        },
        data: [data1, data2, data3, data4, data5, data6, data7, data8]
      },
      {
        //每个项目 持续时间长度
        name: '时长',
        type: 'bar',
        stack: '时间',
        label: {
          normal: {
            show: true,
            position: 'inside'
          }
        },
        itemStyle: {
          color: function(params) {
            // console.log(params)
            if (params.value < 200) {
              return '#4382EB'
            }
            if (params.value > 200 && params.value < 600) {
              return '#00FF05'
            }
            if (params.value > 600) {
              return '#FF2F35'
            }
          }
        },
        data: [
          data1_1,
          data2_1,
          data3_1,
          data4_1,
          data5_1,
          data6_1,
          data7_1,
          data8_1
        ]
      }
    ]
  }
  myChart.setOption(option)

该配置适用于改变每个柱子的颜色的不同,比如某一个时间段的值大于或者小于某一个基准值,不同的情况柱子颜色不一样,可以直观看到效果,当然这些都是静态数据写死了,如果是发送ajax请求的数据可以看着在每一项里面去添加,柱子的颜色由series配置项里面的itemStyle控制,可以自己去定义基准值