Echarts甘特图

吾之初為,記之以便後日視資。

效果展示
在这里插入图片描述

示例代码

<template>
  <div class="app-container">
    <el-row class="mb10">
      <el-col :span="24">
        <el-descriptions class="margin-top" :column="4" title="基础信息">
          <el-descriptions-item label="设备名称">{{
            useDetail.E_NAME
          }}</el-descriptions-item>
          <el-descriptions-item label="设备编码">{{
            useDetail.E_CODE
          }}</el-descriptions-item>
          <el-descriptions-item label="设备利用率">{{
            useDetail.RATE
          }}</el-descriptions-item>
          <el-descriptions-item
            label="故障维修次数"
            prop=""
          ></el-descriptions-item>
          <el-descriptions-item label="设备分类">{{
            useDetail.CLASS_NAME
          }}</el-descriptions-item>
          <el-descriptions-item label="首次上线时间">{{
            useDetail.FIRST_ONLINE
          }}</el-descriptions-item>
          <el-descriptions-item label="累计在线时长">{{
            useDetail.ONLINE_NUM
          }}</el-descriptions-item>
          <el-descriptions-item label="功能位置">{{
            useDetail.POSITION_NAME
          }}</el-descriptions-item>
        </el-descriptions>
      </el-col>
    </el-row>
    <el-row>
      <el-col :span="24">
        <b>设备状态回溯</b>
        <el-card style="height: 600px" id="device_state">
          <!-- 甘特图 横坐标:时间 纵坐标:上线,下线,维修 -->
          暂无数据
        </el-card>
      </el-col>
    </el-row>
  </div>
</template>

<script>
import * as echarts from "echarts";
import useApi from "@/api/bdia/device/sint/use/index";
import { timeDifference } from "@/utils/elvis";

export default {
  watch: {},
  mounted() {
    this.getState();
  },
  data() {
    return {
      useDetail: this.$route.query.data,
      equStatus: [],
    };
  },
  methods: {
    getState() {
      let param = { eCode: this.useDetail.E_CODE };
      if (param.eCode != undefined) {
        let projectItem = [];
        let showData = [];
        // 开始时间
        let startDate = [];
        // 最后操作时间
        let endDate = [];
        let disPlayDays = "";
        let data = [];
        useApi.getEquStatusByeCode(param).then((response) => {
          let equStatus = response.data;
          equStatus.forEach((item, index) => {
            // 首次上线 没有上一次操作时间
            if (item.LAST_OPT_DATE != undefined) {
              // 同类型设备【_+序号】展示
              projectItem.push(item.E_NAME + "_" + index);
              disPlayDays = timeDifference(item.LAST_OPT_DATE, item.OPT_DATE);
              data = [
                item.LAST_OPT_DATE,
                item.E_NAME + "_" + index,
                item.LAST_OPT_DATE,
                item.OPT_DATE,
                disPlayDays,
              ];
              startDate.push(item.LAST_OPT_DATE);
              endDate.push(item.OPT_DATE);
            }
            if (data.length != 0) {
              showData.push(data);
            }
          });
          // 判断最后操作类型是否为上线
          for (var key in equStatus) {
            if (equStatus[equStatus.length - 1].OPT_TYPE_CODE == "U") {
              var ename =
                equStatus[equStatus.length - 1].E_NAME + "_" + equStatus.length;
              // 下线时间设置为当前时间进行展示
              disPlayDays = timeDifference(
                equStatus[equStatus.length - 1].OPT_DATE,
                new Date().format("yyyy-MM-dd HH:mm:ss")
              );
              data = [
                equStatus[equStatus.length - 1].OPT_DATE,
                equStatus[equStatus.length - 1].E_NAME + "_" + equStatus.length,
                equStatus[equStatus.length - 1].OPT_DATE,
                new Date().format("yyyy-MM-dd HH:mm:ss"),
                disPlayDays,
              ];
              endDate.push(new Date().format("yyyy-MM-dd HH:mm:ss"));
            }
          }
          if (ename != undefined) {
            projectItem.push(ename);
          }
          if (data.length != 0) {
            showData.push(data);
          }
          // X轴起始值
          let dateMin = startDate.sort()[0];
          let dateMax = endDate.reverse()[0];
          let device_state_obj = echarts.init(
            document.getElementById("device_state")
          );
          let option = {
            dataZoom: [
              {
                show: true,
                realtime: true,
                height: 15,
                bottom: 10,
                start: 0,
                end: 100,
              },
            ],
            grid: {
              left: 10,
              right: 10,
              bottom: 20,
              top: 10,
              containLabel: true,
            },
            xAxis: {
              type: "time",
              min: dateMin,
              max: dateMax,
            },
            tooltip: {
              trigger: "item",
            },
            yAxis: {
              type: "category",
              data: projectItem,
            },
            series: [
              {
                type: "custom",
                renderItem: function (params, api) {
                  const start = api.coord([api.value(0), api.value(1)]);
                  const s1 = api.coord([api.value(2), 0]);
                  const s2 = api.coord([api.value(3), 0]);

                  const height = api.size([0, 1])[1] * 0.8;
                  const width = s2[0] - s1[0];

                  const rectShape = echarts.graphic.clipRectByRect(
                    {
                      x: start[0],
                      y: start[1] - height / 2,
                      width: width,
                      height: height,
                    },
                    {
                      x: params.coordSys.x,
                      y: params.coordSys.y,
                      width: params.coordSys.width,
                      height: params.coordSys.height,
                    }
                  );

                  return (
                    rectShape && {
                      type: "rect",
                      shape: rectShape,
                      style: api.style(),
                    }
                  );
                },
                //0:X轴;1:Y轴;2:开始位置(s1);3:结束位置(s2);4:鼠标提示层
                data: showData,
              },
            ],
          };
          device_state_obj.setOption(option);
        });
      }
    },
  },
};
</script>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值