Browse Source

update - 2022-09-25

1. 调整图表展示的标题内容
moccus 2 years atrás
parent
commit
39e89fa1f5

+ 2 - 0
README.md

@@ -101,6 +101,8 @@ color:@green;
 
 栅格化布局
 
+"element-plus": "^1.1.0-beta.4",
+"vue": "^3.0.11",
 采用element ui 源码直接引入,可直接参考element ui
 https://element.faas.ele.me/#/zh-CN/component/layout
 

+ 1 - 1
package.json

@@ -37,7 +37,7 @@
     "three-fbx-loader": "^1.0.2",
     "three-obj-mtl-loader": "^1.0.3",
     "vivus": "^0.4.6",
-    "vue": "^3.0.11",
+    "vue": "^3.2",
     "vue-axios": "^3.2.4",
     "vue-router": "^4.0.0-0",
     "vuex": "^4.0.0-0",

+ 1 - 1
src/assets/styles/theme/light/aqgk/personnel.less

@@ -11,7 +11,7 @@
 					background: rgba(75, 85, 174, 0.6);
 					color: @white;
 				}
-				background: rgb(220 221 223);
+				background: rgb(220, 221, 223);
 				border: 1px solid @black;
 				color: @black;
 			}

+ 2 - 1
src/assets/styles/theme/light/components.less

@@ -106,7 +106,8 @@
 	.btn:hover {
 		color: @deepblue;
 		border-color: @deepblue;
-		background: rgba(@deepblueBg, 0.2);
+		// background: rgba(@deepblueBg, 0.2);
+		background: rbga(54, 52, 142, 0.2);
 	}
 
 	.el-select__popper.select,

+ 6 - 3
src/assets/styles/theme/light/light-qt.less

@@ -108,7 +108,8 @@
 
     .el-picker-panel.el-date-range-picker .el-date-range-picker__content .el-date-table td.end-date span,
     .el-picker-panel.el-date-range-picker .el-date-range-picker__content .el-date-table td.start-date span {
-        background: rgba(@deepblueBg, 0.2);
+        // background-color: rgba(@deepblueBg, 0.2);
+        background-color: rgba(54, 52, 142, 0.2);
     }
 
     // 原始数据查询-数据导出
@@ -151,14 +152,16 @@
         color: @black;
     }
     .el-picker-panel.el-date-picker td.current .cell{
-        background-color: rgba(@deepblueBg, 0.2);
+        // background-color: rgba(@deepblueBg, 0.2);
+        background-color: rgba(54, 52, 142, 0.2);
         color: @deepblue;
     }   
 
     //设备管理
     .el-tabs--card>.el-tabs__header .el-tabs__nav {
         border: 1px solid @deepblue;
-        background: rgba(@deepblueBg, 0.2);
+        // background-color: rgba(@deepblueBg, 0.2);
+        background-color: rgba(54, 52, 142, 0.2);
     }
 
     .tab .el-tabs__item.is-active {

+ 1 - 1
src/views/Home/Home.vue

@@ -1653,7 +1653,7 @@ export default {
     }
 
     .el-collapse-item__content {
-      background: rgba(18, 29, 28);
+      background: rgba(18, 29, 28, 1);
       color: rgba(255, 255, 255, 0.75);
       padding: 20px;
     }

+ 1 - 1
src/views/NewPages/alarm-center-1.vue

@@ -321,7 +321,7 @@ export default {
     //对比
     showChart(column) {
       let that = this;
-      that.dialogTitle = column.column.name;
+      that.dialogTitle = column.column.name + ` (${column.row.name})`;
       that.wtId = column.row.name;
       that.descName = column.column.name;
 

+ 698 - 0
src/views/NewPages/bak/alarm-center-1.vue

@@ -0,0 +1,698 @@
+<template>
+  <div class="alarm-center-1">
+    <div class="action-bar">
+      <div class="query mg-b-16">
+        <div class="query-items">
+          <div class="query-item">
+            <div class="lable">风场:</div>
+            <div class="search-input">
+              <el-select
+                v-model="wpvalue"
+                clearable
+                placeholder="请选择"
+                popper-class="select"
+              >
+                <el-option
+                  v-for="item in wpoptions"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                >
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+          <div class="query-item">
+            <div class="lable">开始日期:</div>
+            <div class="search-input">
+              <el-date-picker
+                v-model="startdate"
+                type="date"
+                placeholder="选择日期"
+                popper-class="date-select"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="query-item">
+            <div class="lable">结束日期:</div>
+            <div class="search-input">
+              <el-date-picker
+                v-model="enddate"
+                type="date"
+                placeholder="选择日期"
+                popper-class="date-select"
+              >
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="query-item">
+            <div class="lable">规则:</div>
+            <el-cascader
+              style="width: 240px"
+              size="mini"
+              popper-class="search-select"
+              :options="cascaderOptions"
+              :props="cascaderProps"
+              v-model="cascaderSel"
+              collapse-tags
+              :clearable="true"
+            ></el-cascader>
+          </div>
+        </div>
+        <div class="query-actions">
+          <button class="btn green" @click="searchData">搜索</button>
+          <button class="btn green" @click="searchTree">筛选</button>
+          <!-- <button class="btn green" @click="fx">分析</button> -->
+        </div>
+      </div>
+    </div>
+    <panel-3 class="table-panel">
+      <table-3 :data="tableData" :height="'85vh'">
+        <template v-for="(item, i) in column" :key="i" #[item]="scope">
+          <div class="bar" @click="showChart(scope)">
+            <div
+              class="bar-percent"
+              :style="{ width: scope?.data?.countStyle }"
+            ></div>
+            <span class="value">{{ scope?.data?.count }} 次数</span>
+          </div>
+
+          <div class="bar" @click="showChart(scope)">
+            <div
+              class="bar-percent"
+              :style="{ width: scope?.data?.timeStyle }"
+            ></div>
+            <span class="value">{{ scope?.data?.time }} 分钟</span>
+          </div>
+        </template>
+      </table-3>
+    </panel-3>
+    <el-dialog
+      :title="dialogTitle"
+      v-model="dialogVisible"
+      width="70%"
+      top="10vh"
+      custom-class="modal"
+      :close-on-click-modal="false"
+    >
+      <div class="searchForm">
+        <div class="choose">
+          <button class="btn green">等间隔</button>
+          <!-- <button :class="chooseStatus?'btn green':'btn'" @click="switchChange(1,'original')">原始数据</button> -->
+        </div>
+        <el-select
+          v-if="!chooseStatus"
+          @change="switchChange(selectValue)"
+          class="inputs"
+          v-model="selectValue"
+          placeholder="请选择"
+        >
+          <el-option
+            v-for="item in timeoptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </div>
+      <multiple-y-line-chart-normal
+        height="500px"
+        :list="Analysis"
+        :yAxises="AnalysisYAxises"
+        :showLegend="true"
+      />
+    </el-dialog>
+    <el-dialog
+      :title="dialogTitleFX"
+      v-model="dialogVisibleFX"
+      width="70%"
+      top="10vh"
+      custom-class="modal"
+      :close-on-click-modal="false"
+      :destroy-on-close="true"
+    >
+      <FX :date="startdate" :wpid="wpvalue" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Panel3 from "../../components/coms/panel/panel3.vue";
+import Table3 from "../../components/coms/table/table3.vue";
+import MultipleYLineChartNormal from "./multiple-y-line-chart-normal.vue";
+import FX from "./alarm-center-yjfx.vue";
+import BASE from "@tools/basicTool.js";
+export default {
+  components: {
+    Panel3,
+    Table3,
+    MultipleYLineChartNormal,
+    FX,
+  },
+  data() {
+    return {
+      dialogTitleFX: "",
+      dialogVisibleFX: false,
+      dialogTitle: "",
+      chooseStatus: false,
+      dialogVisible: false,
+      chooseTime: [],
+      wpvalue: "",
+      wpid: "",
+      wtId: "",
+      descName: "",
+      AnalysisName: "",
+      AnalysisUnit: "",
+      Analysis: [
+        {
+          title: "",
+          yAxisIndex: 0, // 使用单位
+          value: [],
+        },
+      ],
+      AnalysisYAxises: [
+        {
+          name: "",
+          min: "",
+          max: "",
+          unit: "",
+          position: "left",
+        },
+        {
+          name: "",
+          min: "",
+          max: "",
+          unit: "",
+          position: "right",
+        },
+      ],
+      selectValue: "60",
+      timeoptions: [
+        {
+          value: "60",
+          label: "一分钟",
+        },
+        {
+          value: "300",
+          label: "五分钟",
+        },
+        {
+          value: "600",
+          label: "十分钟",
+        },
+        {
+          value: "1800",
+          label: "三十分钟",
+        },
+        {
+          value: "3600",
+          label: "一小时",
+        },
+        {
+          value: "86400",
+          label: "一天",
+        },
+      ],
+      wpoptions: "",
+      options: [],
+      cascaderOptions: [],
+      cascaderSel: [],
+      cascaderProps: {
+        multiple: true,
+      },
+      column: [
+        "风机偏航过程震动",
+        "齿轮箱轴承温升超过40度",
+        "三相电流不平衡",
+        "断轴或联轴器打滑",
+        "风速突变",
+      ],
+      columnObj: [
+        {
+          name: "风机编号",
+          field: "name",
+          width: "100px",
+          minWidth: "100px",
+        },
+        {
+          name: "风机偏航过程震动",
+          field: "风机偏航过程震动",
+          align: "left",
+          slot: true,
+          sortable: true,
+          minWidth: "200px",
+        },
+        {
+          name: "齿轮箱轴承温升超过40度",
+          field: "齿轮箱轴承温升超过40度",
+          align: "left",
+          slot: true,
+          sortable: true,
+          minWidth: "200px",
+        },
+        {
+          name: "三相电流不平衡",
+          field: "三相电流不平衡",
+          align: "left",
+          slot: true,
+          sortable: true,
+          minWidth: "200px",
+        },
+        {
+          name: "断轴或联轴器打滑",
+          field: "断轴或联轴器打滑",
+          align: "left",
+          slot: true,
+          sortable: true,
+          minWidth: "200px",
+        },
+        {
+          name: "风速突变",
+          align: "left",
+          field: "风速突变",
+          slot: true,
+          sortable: true,
+          minWidth: "200px",
+        },
+      ],
+      startdate: new Date(
+        new Date(new Date().setDate(new Date().getDate() - 1))
+      ).formatDate("yyyy-MM-dd"),
+      enddate: new Date(new Date()).formatDate("yyyy-MM-dd"),
+      tableData: {
+        column: [
+          {
+            name: "风机编号",
+            field: "name",
+          },
+          {
+            name: "主轴温度温差大于8度",
+            field: "v1",
+            align: "left",
+            slot: true,
+          },
+          {
+            name: "浆叶角过小",
+            field: "v2",
+            align: "left",
+            slot: true,
+          },
+        ],
+        data: [
+          {
+            name: "MG01_01",
+            v1: {
+              count: 12,
+              time: 0,
+            },
+          },
+        ],
+      },
+    };
+  },
+  created() {
+    this.$nextTick(() => {
+      this.search();
+    });
+  },
+  methods: {
+    //对比
+    showChart(column) {
+      let that = this;
+      that.dialogTitle = column.column.name + ` (${column.row.name})`;
+      that.wtId = column.row.name;
+      that.descName = column.column.name;
+
+      that.requestDetailData(
+        that.wpvalue,
+        that.startdate,
+        that.enddate,
+        60,
+        column.row.name,
+        column.column.name
+      );
+    },
+    requestDetailData(station, startTs, endTs, interval, wtId, name) {
+      let that = this;
+      BASE.showLoading();
+      that.API.requestData({
+        method: "GET",
+        subUrl: "/analysis/detail",
+        data: {
+          // station: that.wpvalue,
+          // startTs: new Date(that.startdate).getTime(),
+          // endTs: new Date(that.enddate).getTime(),
+          // // interval: 360,
+          // interval:1,
+          // wtId: column.row.name,
+          // name: column.column.name,
+          station: station,
+          startTs: new Date(
+            new Date(startTs).formatDate("yyyy/MM/dd")
+          ).getTime(),
+          endTs: new Date(new Date(endTs).formatDate("yyyy/MM/dd")).getTime(),
+          interval: interval,
+          wtId: wtId,
+          name: name,
+        },
+        success(res) {
+          if (res.data.length == 1) {
+            that.dialogVisible = true;
+            BASE.closeLoading();
+            let yaxises = [
+              {
+                name: "",
+                min: 0,
+                max: null,
+                unit: "",
+                position: "left",
+              },
+            ];
+            // yaxises.name = res.data[0].name;
+            yaxises.unit = res.data[0].unit;
+            that.AnalysisYAxises = yaxises;
+            let aKey1 = ["doubleValue"];
+            let aList1 = [
+              {
+                title: "",
+                // yAxisIndex:"",
+                smooth: true,
+                value: [],
+              },
+            ];
+            aKey1.forEach((keyEle, keyIndex) => {
+              aList1[keyIndex].title = res.data[keyIndex].name;
+              aList1[keyIndex].yAxisIndex = keyIndex
+              res.data[keyIndex].data.forEach((rEle) => {
+                aList1[keyIndex].value.push({
+                  text: new Date(rEle.ts).formatDate("hh:mm"),
+                  value: rEle.doubleValue,
+                });
+              });
+            });
+            that.Analysis = aList1;
+          } else if (res.data.length == 2) {
+            that.dialogVisible = true;
+            BASE.closeLoading();
+            let aKey2 = ["doubleValue", "doubleValue"];
+            let aList2 = [
+              {
+                title: "",
+                 yAxisIndex:0,
+                smooth: true,
+                value: [],
+              },
+              {
+                title: "",
+                yAxisIndex:1,
+                smooth: true,
+                value: [],
+              },
+            ];
+            let yaxises1 = [
+              {
+                name: "",
+                min: 0,
+                max: null,
+                unit: "",
+                position: "left",
+              },
+              {
+                name: "",
+                min: 0,
+                max: null,
+                unit: "",
+                position: "right",
+              },
+            ];
+            res.data.forEach((aEle, keyIndex) => {
+              // res.data.forEach((rEle) => {
+                // yaxises1[aIndex].name = aEle.name;
+                yaxises1[keyIndex].unit = aEle.unit;
+                // aEle.unit = rEle.unit;
+              // });
+              aList2[keyIndex].title = res.data[keyIndex].name;
+              aList2[keyIndex].yAxisIndex = keyIndex
+              res.data[keyIndex].data.forEach((rEle) => {
+                aList2[keyIndex].value.push({
+                  text: new Date(rEle.ts).formatDate("hh:mm"),
+                  value: rEle.doubleValue,
+                });
+              });
+            });
+            that.AnalysisYAxises = yaxises1;
+            that.Analysis = aList2;
+          } else if (res.data.length >=3) {
+            that.dialogVisible = true;
+            BASE.closeLoading();
+            let aList4 = []
+            let yaxises2 = []
+            res.data.forEach((aEle, keyIndex) => {
+              yaxises2.push( {
+                name: "",
+                min: 0,
+                max: null,
+                unit: aEle.unit,
+                position: keyIndex %2 === 0 ? 'left' : 'right'
+              })
+              aList4.push({
+                title: aEle.name,
+                yAxisIndex: keyIndex,
+                smooth: true,
+                value: aEle.data.map(o => {
+                  return {
+                    text: new Date(o.ts).formatDate("hh:mm"),
+                    value: o.doubleValue,
+                  }
+                }),
+              })
+            });
+            console.log(aList4)
+            that.AnalysisYAxises = yaxises2;
+            that.Analysis = aList4;
+          } else if (res.data.length == 0) {
+            that.dialogVisible = false;
+            BASE.closeLoading();
+            that.BASE.showMsg({
+              type: "warning",
+              msg: "暂无数据",
+            });
+          }
+        },
+      });
+    },
+    //切换数据类型
+    switchChange(interval, status) {
+      if (status === "interval") {
+        this.chooseStatus = false;
+        this.selectValue = "60";
+      } else if (status === "original") {
+        this.chooseStatus = true;
+      }
+      this.requestDetailData(
+        this.wpvalue,
+        this.startdate,
+        this.enddate,
+        interval,
+        this.wtId,
+        this.descName
+      );
+    },
+
+    async search() {
+      const { data } = await this.API.requestData({
+        subUrl: "powercompare/windfarmAjax",
+      });
+      this.wpoptions = data.data;
+      this.wpvalue = data.data[0].id;
+      this.searchData();
+    },
+
+    async searchTree() {
+      let arr = [];
+      let columnObj = [
+        {
+          name: "风机编号",
+          field: "name",
+          minWidth: "100px",
+        },
+      ];
+      this.cascaderSel.forEach((e) => {
+        let obj = {
+          name: e[1],
+          field: e[1],
+          align: "left",
+          slot: true,
+          sortable: true,
+          minWidth: "200px",
+        };
+        columnObj.push(obj);
+
+        arr.push(e[1]);
+      });
+      this.columnObj = columnObj;
+      this.column = arr;
+      this.searchData();
+    },
+
+    async searchData() {
+      let enddate = new Date(
+        Date.parse(new Date(this.enddate)) + 24 * 3600 * 1000
+      ).formatDate("yyyy-MM-dd");
+      const { data } = await this.API.requestData({
+        showLoading: true,
+        baseURL: "http://192.168.1.18:8075/",
+        subUrl: "alarm/count/query/new2",
+        data: {
+          stationid: this.wpvalue,
+          startdate: new Date(this.startdate).formatDate("yyyy-MM-dd"),
+          enddate: enddate,
+        },
+      });
+
+      ////////
+      this.tableData = [];
+      const resData = data.data;
+      // const resData =this.resdata;
+      const column = this.columnObj;
+      let dataAll = []; // 总数据集合
+      resData.forEach((e) => {
+        let obj = {
+          name: Object.keys(e)[0],
+        };
+        let wpid = Object.keys(e)[0];
+        this.wpid = wpid;
+
+        e[wpid].forEach((k) => {
+          column.forEach((c) => {
+            if (k.alertText == c.name) {
+              const countStyle = k.count / (k.count + k.time);
+              const timeStyle = k.time / (k.count + k.time);
+              let obj1 = {
+                count: k.count,
+                countStyle: countStyle ? countStyle * 100 + "px" : "0",
+                time: k.time,
+                timeStyle: timeStyle ? timeStyle * 100 + "px" : "0",
+              };
+              obj[k.alertText] = obj1;
+            }
+          });
+        });
+        dataAll.push(obj);
+      });
+
+      this.tableData.column = column;
+      this.tableData.data = dataAll;
+
+      ///////////////////// 获取规则list
+      const map = {};
+      var windNum = [];
+      for (let i in resData) {
+        for (let k in resData[i]) {
+          map[k] = resData[i][k];
+        }
+      }
+      // nmap为新的map 整理数据结构
+      const nmap = {};
+      for (let kv in map) {
+        var nchildMap = {};
+        var childrenMap = map[kv];
+        for (var ckv in childrenMap) {
+          var cckey = childrenMap[ckv].alertText;
+          var ccvalue = childrenMap[ckv];
+          nchildMap[cckey] = ccvalue;
+        }
+        nmap[kv] = nchildMap;
+      }
+      windNum = Object.keys(nmap);
+      var cascaderOptions = [];
+      var root = {}; // 原始根节点
+      var clumnsOnes = nmap[windNum[0]];
+      for (let k in clumnsOnes) {
+        let f = clumnsOnes[k].relatePartsText
+          ? clumnsOnes[k].relatePartsText
+          : "其他";
+        let fvalue = clumnsOnes[k].relateParts ? clumnsOnes[k].relateParts : "";
+
+        if (root[f]) {
+          // 已经存在此子节点
+          if (!root[f].children[k]) {
+            // 不存在子节点
+            root[f].children[k] = {};
+            root[f].children[k].value = root[f].children[k].label = k;
+            root[f].fobj.children.push(root[f].children[k]);
+          }
+        } else {
+          // 不存在子节点
+          root[f] = {};
+          // root[f].value = fvalue;
+          // root[f].label = f;
+          root[f].children = {};
+          root[f].children[k] = {};
+          root[f].children[k].value = root[f].children[k].label = k;
+
+          // 将对象放入 cascaderOptions
+          let childrenArray = [];
+          childrenArray.push(root[f].children[k]);
+          let fobj = {};
+          fobj.value = fvalue;
+          fobj.label = f;
+          fobj.children = childrenArray;
+          cascaderOptions.push(fobj);
+          root[f].fobj = fobj;
+        }
+      }
+      this.cascaderOptions = cascaderOptions;
+    },
+    fx() {
+      this.startdate = new Date(this.startdate).formatDate("yyyy-MM-dd");
+      this.dialogTitleFX = "预警分析";
+      this.dialogVisibleFX = true;
+    },
+  },
+};
+</script>
+
+<style lang="less">
+.alarm-center-1 {
+  .action-bar {
+    display: flex;
+
+    .query {
+      justify-content: flex-start;
+    }
+  }
+
+  .table-panel {
+    width: 100%;
+    background: transparent;
+    padding: 0;
+
+    .bar {
+      display: flex;
+      align-items: center;
+      height: 16px;
+      margin: 8px 0;
+
+      .bar-percent {
+        height: 100%;
+        background: @green;
+        margin-right: 8px;
+      }
+    }
+  }
+
+  .searchForm {
+    display: flex;
+    margin-left: 36px;
+    flex-direction: row-reverse;
+
+    .inputs {
+      width: 15%;
+      margin-right: 18px;
+    }
+  }
+}
+</style>

+ 549 - 0
src/views/NewPages/bak/multiple-y-line-chart-normal.vue

@@ -0,0 +1,549 @@
+<template>
+  <div class="chart" :id="id"></div>
+</template>
+
+<script>
+import util from "@/helper/util.js";
+import partten from "@/helper/partten.js";
+import * as echarts from "echarts";
+
+export default {
+  name: "multiple-y-line-chart-normal",
+  componentName: "multiple-y-line-chart-normal",
+  props: {
+    width: {
+      type: String,
+      default: "100%",
+    },
+    height: {
+      type: String,
+      default: "13.889vh",
+    },
+    // 数据
+    list: {
+      type: Array,
+      default: () => [
+        {
+          title: "机舱震动x方向",
+          yAxisIndex: 0,
+          value: [
+            {
+              text: "-0.003",
+              value: -0.003,
+            },
+            {
+              text: "-0.002",
+              value: -0.002,
+            },
+            {
+              text: "-0.003",
+              value: -0.006,
+            },
+            {
+              text: "-0.003",
+              value: -0.003,
+            },
+            {
+              text: "-0.002",
+              value: -0.002,
+            },
+            {
+              text: "-0.003",
+              value: -0.006,
+            },
+            {
+              text: "-0.003",
+              value: -0.003,
+            },
+            {
+              text: "-0.002",
+              value: -0.002,
+            },
+            {
+              text: "-0.003",
+              value: -0.006,
+            },
+          ],
+        },
+        {
+          title: "机舱震动y方向",
+          yAxisIndex: 1,
+          value: [
+            {
+              text: "-0.01",
+              value: -0.01,
+            },
+            {
+              text: "-0.005",
+              value: -0.005,
+            },
+            {
+              text: "-0.008",
+              value: -0.008,
+            },
+            {
+              text: "-0.01",
+              value: -0.01,
+            },
+            {
+              text: "-0.005",
+              value: -0.005,
+            },
+            {
+              text: "-0.008",
+              value: -0.008,
+            },
+            {
+              text: "-0.01",
+              value: -0.01,
+            },
+            {
+              text: "-0.005",
+              value: -0.005,
+            },
+            {
+              text: "-0.008",
+              value: -0.008,
+            },
+          ],
+        },
+        {
+          title: "机舱震动最大偏移值",
+          yAxisIndex: 2,
+          value: [
+            {
+              text: "1",
+              value: 1,
+            },
+            {
+              text: "0.05",
+              value: 0.05,
+            },
+            {
+              text: "0.5",
+              value: 0.5,
+            },
+            {
+              text: "1",
+              value: 1,
+            },
+            {
+              text: "0.05",
+              value: 0.05,
+            },
+            {
+              text: "0.5",
+              value: 0.5,
+            },
+            {
+              text: "1",
+              value: 1,
+            },
+            {
+              text: "0.05",
+              value: 0.05,
+            },
+            {
+              text: "0.5",
+              value: 0.5,
+            },
+          ],
+        },
+        {
+          title: "风速1",
+          yAxisIndex: 3,
+          value: [
+            {
+              text: "1",
+              value: 1,
+            },
+            {
+              text: "5",
+              value: 5,
+            },
+            {
+              text: "3",
+              value: 1,
+            },
+            {
+              text: "1",
+              value: 1,
+            },
+            {
+              text: "5",
+              value: 5,
+            },
+            {
+              text: "3",
+              value: 1,
+            },
+            {
+              text: "1",
+              value: 1,
+            },
+            {
+              text: "5",
+              value: 5,
+            },
+            {
+              text: "3",
+              value: 1,
+            },
+          ],
+        },
+        {
+          title: "风速2",
+          yAxisIndex: 4,
+          value: [
+            {
+              text: "1",
+              value: 1,
+            },
+            {
+              text: "2",
+              value: 2,
+            },
+            {
+              text: "3",
+              value: 1,
+            },
+            {
+              text: "1",
+              value: 1,
+            },
+            {
+              text: "2",
+              value: 2,
+            },
+            {
+              text: "3",
+              value: 1,
+            },
+            {
+              text: "1",
+              value: 1,
+            },
+            {
+              text: "2",
+              value: 2,
+            },
+            {
+              text: "3",
+              value: 1,
+            },
+          ],
+        },
+      ],
+    },
+    showLegend: {
+      type: Boolean,
+      default: false,
+    },
+    default: {
+      type: Boolean,
+      default: false,
+    },
+    // 轴
+    yAxises: {
+      type: Array,
+      default: () => [
+        {
+          name: "机舱震动x方向",
+          min: -0.01,
+          max: 0,
+          unit: "",
+          position: "left",
+        },
+        {
+          name: "机舱震动y方向",
+          min: -0.01,
+          max: 0,
+          unit: "",
+          position: "right",
+        },
+        {
+          name: "机舱震动最大偏移值",
+          min: 0,
+          max: 1,
+          unit: "",
+          position: "left",
+        },
+        {
+          name: "风速1",
+          min: 0,
+          max: 10,
+          unit: "",
+          position: "right",
+        },
+        {
+          name: "风速2",
+          min: 0,
+          max: 10,
+          unit: "",
+          position: "left",
+        },
+      ],
+    },
+
+    markLineData: {
+      type: Array,
+      defaylt: () => [],
+    },
+  },
+  data() {
+    return {
+      id: "",
+      chart: null,
+      color: ["#1DA0D7", "#05BB4C", "#323E6F", "#EDB32F", "#DB5520"],
+    };
+  },
+  computed: {
+    legend() {
+      return this.list.map((t) => {
+        return t.title;
+      });
+    },
+    xdata() {
+      if (this.list.length > 1) {
+        // this.list[1].value.forEach((lEle, lIndex) => {
+        //   console.log(
+        //     this.list[1].value.indexOf(
+        //       this.list[1].value[lIndex].text == "00:00"
+        //     )
+        //   );
+        // });
+        return this.list[1]?.value.map((t) => {
+          return t.text || new Date(t.ts).formatDate("hh:mm:ss");
+        });
+      } else if (this.list.length == 1) {
+        return this.list[0]?.value.map((t) => {
+          return t.text || new Date(t.ts).formatDate("hh:mm:ss");
+        });
+      }
+    },
+    yAxis() {
+      let result = [];
+      let p = { left: 0, right: 0 };
+      this.yAxises.forEach((item, index) => {
+        result.push({
+          type: "value",
+          name: `${item.name}${item.unit}`,
+          nameLocation: p[item.position] % 2 == 0 ? "end" : "start",
+          nameGap: 10,
+          min: item.min,
+          max: item.max,
+          position: item.position,
+          offset: p[item.position] * 50,
+          axisLabel: {
+            formatter: "{value}",
+            fontSize: 12,
+          },
+          //分格线
+          splitLine: {
+            lineStyle: {
+              color:
+                this.$store.state.themeName === "dark"
+                  ? partten.getColor("gray")
+                  : partten.getColor("black"),
+              type: "dashed",
+            },
+          },
+          axisLine: {
+            show: true,
+          },
+          axisTick: {
+            show: true,
+          },
+        });
+        p[item.position]++;
+      });
+      return result;
+    },
+    series() {
+      let result = [];
+      this.list.forEach((value, index) => {
+        result.push({
+          name: value.title,
+          type: "line",
+          smooth: true,
+          zlevel: index,
+          lineStyle: {
+            normal: {
+              color: this.color[index],
+              width: 1,
+            },
+          },
+          showSymbol: false,
+          yAxisIndex: value.yAxisIndex,
+          markLine: this.markLineData
+            ? {
+                name: "",
+                silent: true,
+                label: {
+                  position: "end",
+                  formatter: "",
+                  color: "red",
+                  fontSize: 14,
+                },
+                data: this.markLineData,
+                lineStyle: {
+                  normal: {
+                    type: "dashed",
+                    color: "red",
+                    width: 2,
+                  },
+                },
+              }
+            : {},
+          data: value.value.map((t) => {
+            if (t.value || t.value === 0) {
+              return t.value;
+            } else if (t.doubleValue || t.doubleValue === 0) {
+              return t.doubleValue;
+            } else {
+              return t.longValue;
+            }
+          }),
+        });
+      });
+      return result;
+    },
+  },
+  methods: {
+    resize() {},
+    initChart() {
+      const chart = echarts.init(this.$el);
+
+      let option = this.option();
+      chart.clear();
+
+      chart.setOption(option);
+      if (this.default) {
+        chart.dispatchAction({
+          type: "showTip",
+          seriesIndex: 0, // 显示第几个series
+          dataIndex: this.list[0].value.length - 600, // 显示第几个数据
+        });
+      }
+
+      this.resize = function () {
+        chart.resize();
+      };
+
+      window.addEventListener("resize", this.resize);
+    },
+    option: function () {
+      let themeName = "";
+      this.$store.state.themeName === "dark"
+        ? (themeName = true)
+        : (themeName = false);
+      return {
+        color: this.color,
+        tooltip: {
+          trigger: "axis",
+          triggerOn: this.default ? "click" : "mousemove",
+          alwaysShowContent: true,
+          backgroundColor: themeName
+            ? "rgba(0,0,0,0.4)"
+            : "rgba(255,255,255,0.5)",
+          borderColor: themeName ? partten.getColor("gray") : "#000",
+          textStyle: {
+            color: themeName ? "#fff" : "#000",
+            fontSize: 12,
+          },
+        },
+        legend: {
+          show: this.showLegend,
+          data: this.legend,
+          top: "top",
+          icon: "circle",
+          itemWidth: 6,
+          inactiveColor: themeName ? partten.getColor("gray") : "#000",
+          textStyle: {
+            color: themeName ? partten.getColor("grayl") : "#000",
+            fontSize: 12,
+          },
+        },
+        grid: {
+          top: 27,
+          left: 32, // 16
+          right: 32, // 16
+          bottom: 0,
+          containLabel: true,
+        },
+        xAxis: [
+          {
+            type: "category",
+            boundaryGap: false,
+            axisLabel: {
+              interval:
+                Number((this.xdata.length / 8).toFixed(0)) > 2
+                  ? Number((this.xdata.length / 8).toFixed(0))
+                  : 0,
+              showMinLabel: true,
+              showMaxLabel: true,
+              formatter: "{value}",
+              fontSize: 12,
+              textStyle: {
+                color: themeName ? partten.getColor("gray") : "#000",
+              },
+            },
+            data: this.xdata,
+          },
+        ],
+        // yAxis: {
+        //   type: "value",
+        //   axisLabel: {
+        //     formatter: "{value}",
+        //     fontSize: 14,
+        //   },
+        //   axisLine: {
+        //     show: false,
+        //   },
+        //   splitLine: {
+        //     show: true,
+        //     lineStyle: {
+        //       color: "#606769",
+        //       type: "dashed",
+        //     },
+        //   },
+        // },
+        yAxis: this.yAxis,
+        series: this.series,
+      };
+    },
+    reload: function () {
+      const chart = echarts.getInstanceByDom(this.$el);
+      chart.clear();
+      let option = this.option();
+      chart.setOption(option);
+    },
+  },
+  created() {
+    this.id = "pie-chart-" + util.newGUID();
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.$el.style.width = this.width;
+      this.$el.style.height = this.height;
+      this.initChart();
+    });
+  },
+  beforeUpdate() {
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  unmounted() {
+    window.removeEventListener("resize", this.resize);
+  },
+};
+</script>
+
+<style lang="less">
+.chart {
+  width: 100%;
+  height: 100%;
+  display: inline-block;
+}
+</style>

+ 1 - 1
src/views/SandTable/SandTable.vue

@@ -1302,7 +1302,7 @@ export default {
   }
 
   .el-collapse-item__content {
-    background: rgba(18, 29, 28);
+    background: rgba(18, 29, 28, 1);
     color: rgba(255, 255, 255, 0.75);
     padding: 20px;
   }

+ 1 - 1
src/views/alarmCenter/configAlarm.vue

@@ -5,7 +5,7 @@
 <script>
 export default {
   created() {
-    window.open("http://10.155.32.2:8078/#/login", "_blank");
+    window.open("http://10.155.32.14:8082", "_blank");
     this.$router.go(-1);
   },
 };

+ 4 - 0
src/views/layout/Menu.vue

@@ -12,6 +12,7 @@
         <router-link :to="menu.path">
           <el-tooltip
             class="item"
+            popper-class="tip-set"
             effect="dark"
             :content="menu.text"
             placement="bottom"
@@ -1131,6 +1132,9 @@ export default {
 </script>
  
 <style lang="less">
+.tip-set{
+  z-index: 9999!important;
+}
 .menu {
   padding-top: 1.481vh;
 

File diff suppressed because it is too large
+ 10717 - 0
yarn.lock