ZZJ
2021-11-09 ccee429d379e0108b7445f72ade8d97c110a6fb3
src/pages/shuohuangMonitorAnalyze/components/transferDeviceManage.vue
@@ -1,86 +1,370 @@
<template>
  <div class="transfer-device-manage">
    <div class="general-view">
      <div
        class="indicator"
        :class="{'lastOne':index==generalIndicators.length-1}"
        v-for="(indicator,index) in generalIndicators"
        :key="indicator.id"
      >
        <div class="title">
          <span class="dot"></span>
          <span class="word">{{indicator.title}}</span>
        </div>
        <div class="indicator-val">{{indicator.val}}</div>
      </div>
    <div class="header-with-tab">
      <el-tabs v-model="actTab" @tab-click="checkTab">
        <el-tab-pane :name="tab.ID" v-for="tab in devices" :key="tab.ID">
          <div slot="label" class="label-slot">
            <span
              class="title"
              :style="tab.Status == 1 ? { color: '#8A98B8' } : {}"
              >{{ tab.Name }}</span
            >
            <span
              class="capsule"
              :class="{ online: tab.Status == 0, offline: tab.Status == 1 }"
              >{{ tab.Status == 0 ? "在线" : "离线" }}</span
            >
          </div>
        </el-tab-pane>
      </el-tabs>
      <!-- <div class="btn-add-dev" @click="showAddDevice">
        <span class="icon iconfont">&#xe602; </span>
        <span>添加设备</span>
      </div> -->
    </div>
    <div class="table-area">
      <div class="filter-bar flex-box">
        <div>
          <label>设备地址:</label>
          <div>
            <el-input v-model="deviceAddr" size="small"></el-input>
    <div class="t-d-content">
      <div class="general-view">
        <div class="indicator">
          <div class="icon-wrap">
            <div class="icon-div"><span class="iconfont">&#xe660;</span></div>
            <span class="text">设备重启</span>
          </div>
        </div>
        <div>
          <label>设备状态:</label>
          <div>
            <el-select v-model="deviceState" size="small">
              <el-option></el-option>
            </el-select>
        <div
          class="indicator"
          :class="{ lastOne: index == generalIndicators.length - 1 }"
          v-for="(indicator, index) in generalIndicators"
          :key="indicator.id"
        >
          <div class="img-desc">
            <img class="icon" :src="indicator.path" />
          </div>
        </div>
        <div class="btns">
          <el-button type="primary" size="small">查询</el-button>
        </div>
      </div>
      <el-table class="thbg" :data="tableData" fit>
        <el-table-column prop="name" label="转储设备名称"></el-table-column>
        <el-table-column prop="state" label="设备状态"></el-table-column>
        <el-table-column prop="pic" label="现场图片"></el-table-column>
        <el-table-column prop="addr" label="设备地址"></el-table-column>
        <el-table-column prop="tel" label="报修电话"></el-table-column>
        <el-table-column label="操作">
          <template slot-scope="scope">
            <div class="operation">
              <span @click="checkSlot(scope.row)">查看插槽</span>
          <div class="title">
            <div class="indicator-val" :style="{ color: indicator.color }">
              <span
                style="font-size: 24px"
                :style="{ color: indicator.color }"
                >{{ indicator.slots.length }}</span
              >
              个
            </div>
          </template>
        </el-table-column>
      </el-table>
            <span class="word">{{ indicator.title }}</span>
          </div>
        </div>
      </div>
      <div class="table-area">
        <div class="filter-bar flex-box">
          <div>
            <label>设备状态:</label>
            <div>
              <el-select v-model="deviceState" size="small">
                <el-option value="" label="全部"></el-option>
                <el-option value="1" label="读写中"></el-option>
                <el-option value="0" label="空闲中"></el-option>
                <el-option value="2" label="插槽故障"></el-option>
              </el-select>
            </div>
          </div>
          <div class="btns">
            <el-button @click="findDeviceIfo" type="primary" size="small"
              >查询</el-button
            >
          </div>
        </div>
        <el-table
          class="thbg"
          :data="tableData"
          fit
          stripe
          :header-cell-style="{
            background: '#2D52D7',
            color: '#fff',
            height: '50px',
          }"
        >
          <el-table-column
            type="index"
            width="240"
            label="序号"
          ></el-table-column>
          <el-table-column prop="Name" label="插槽名称"></el-table-column>
          <el-table-column prop="Status" label="状态">
            <template slot-scope="scope">
              <div>
                <span style="color: #6297f2" v-if="scope.row.Status == 0"
                  >空闲中</span
                >
                <span style="color: #fea425" v-if="scope.row.Status == 1"
                  >读写中</span
                >
                <span style="color: #ed663e" v-if="scope.row.Status == 2"
                  >插槽故障</span
                >
              </div>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </div>
    <el-dialog
      :visible="visibleOfialogAddDev"
      title="添加设备"
      class="dialog-addDev"
      @close="visibleOfialogAddDev = false"
    >
      <div>
        <div class="flex-box">
          <label>设备名称:</label>
          <el-input v-model="Name"></el-input>
        </div>
        <div class="flex-box">
          <label>设备IP:</label>
          <el-input v-model="IP"></el-input>
        </div>
        <div slot="footer" class="btns">
          <el-button type="primary" size="small" @click="toAddDevice"
            >确定</el-button
          >
          <el-button size="small" @click="visibleOfialogAddDev = false"
            >取消</el-button
          >
        </div>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import { addDevice, getDeviceList, getDeviceInfo } from "@/api/shuohuang";
export default {
  data () {
  data() {
    return {
      generalIndicators: [{ id: 'gz', title: '有故障设备', val: 156 }, { id: 'zc', title: '正常设备', val: 5000 }, { id: 'dx', title: '读写中', val: 56 }, { id: 'kx', title: '空闲中', val: 2000 }, { id: 'ccgz', title: '插槽故障', val: 1000 }],
      deviceAddr: '',
      deviceState: '',
      tableData: []
    }
      actTab: "dev1",
      devices: [],
      generalIndicators: [
        {
          id: "dx",
          title: "读写中",
          slots: [],
          color: "#FEA425",
          path: "/images/shuohuang/组 780.png",
        },
        {
          id: "kx",
          title: "空闲中",
          slots: [],
          color: "#6297F2",
          path: "/images/shuohuang/组 781.png",
        },
        {
          id: "ccgz",
          title: "插槽故障",
          slots: [],
          color: "#ED663E",
          path: "/images/shuohuang/组 782.png",
        },
      ],
      deviceAddr: "",
      deviceState: "",
      tableData: [],
      visibleOfialogAddDev: false,
      Name: "",
      IP: "",
    };
  },
  mounted() {
    this.findDeviceList();
  },
  methods: {
    checkSlot(row){
    }
  }
}
    findDeviceList() {
      let _this = this;
      getDeviceList().then((res) => {
        _this.devices = res.data;
        _this.actTab = _this.devices[0].ID;
        _this.findDeviceIfo();
      });
    },
    findDeviceIfo() {
      let _this = this;
      getDeviceInfo({
        DeviceID: this.actTab,
        Status: this.deviceState,
      }).then((res) => {
        // debugger
        _this.tableData = res.data;
        //统计当前插槽状态
        let dx = _this.generalIndicators.find(
          (indicator) => indicator.id == "dx"
        );
        let kx = _this.generalIndicators.find(
          (indicator) => indicator.id == "kx"
        );
        let ccgz = _this.generalIndicators.find(
          (indicator) => indicator.id == "ccgz"
        );
        dx.slots = [];
        kx.slots = [];
        ccgz.slots = [];
        res.data.forEach((slot) => {
          if (slot.Status == 0) {
            kx.slots.push(slot);
          }
          if (slot.Status == 1) {
            dx.slots.push(slot);
          }
          if (slot.Status == 2) {
            ccgz.slots.push(slot);
          }
        });
        //_this.generalIndicators
      });
    },
    toAddDevice() {
      let _this = this;
      let params = {
        Name: this.Name,
        IP: this.IP,
      };
      addDevice(params).then((res) => {
        if (res.success) {
          this.$notify({
            type: "success",
            message: res.msg,
          });
          _this.visibleOfialogAddDev = true;
        }
      });
    },
    showAddDevice() {
      this.visibleOfialogAddDev = true;
    },
    checkTab(tab, event) {
      this.findDeviceIfo();
    },
    checkSlot(row) {},
  },
};
</script>
<style lang="scss">
.transfer-device-manage {
  padding: 20px;
  // padding: 20px;
  // .el-tabs__nav-scroll {
  //   overflow-x: scroll;
  // }
  .el-tabs__nav-wrap.is-scrollable {
    padding-right: 90px;
  }
  .el-tabs__item {
    height: 45px;
    line-height: 45px;
  }
  .el-tabs__nav-wrap::after {
    height: 1px;
  }
  .header-with-tab {
    position: relative;
    background: #ffffff;
    box-shadow: 0px 3px 6px rgba(160, 174, 230, 0.56);
    border-radius: 10px;
    padding: 0 35px;
    padding-top: 15px;
    .el-tabs__header {
      margin: 0;
    }
    .el-tabs__item.is-active .label-slot .title {
      color: #2d52d7;
    }
    .label-slot {
      display: flex;
      align-items: center;
      padding: 0 20px;
      font-weight: bold;
      position: relative;
      .title {
        font-size: 14px;
      }
      .capsule {
        width: 36px;
        height: 18px;
        margin-left: 10px;
        line-height: 18px;
        position: absolute;
        text-align: center;
        top: 0px;
        text-align: center;
        border-radius: 20px;
        font-size: 12px;
        font-weight: normal;
        color: #fff;
        right: -20px;
        &.online {
          background: #2ace7c;
        }
        &.offline {
          background: #8a98b8;
        }
      }
    }
    // .btn-add-dev {
    //   cursor: pointer;
    //   position: absolute;
    //   right: 25px;
    //   top: 20px;
    //   /* color: #1890ff; */
    //   font-size: 16px;
    // }
  }
  .t-d-content {
    background: #fff;
    margin-top: 20px;
    border-radius: 10px;
    box-shadow: 0px 3px 6px rgb(160 174 230 / 56%);
    padding: 30px 45px;
    button span {
      color: #fff;
    }
  }
  .general-view {
    display: flex;
    padding: 30px;
    .indicator {
      flex: 1;
      position: relative;
      background: #f4f6f9;
      width: 263px;
      height: 101px;
      display: flex;
      align-items: center;
      justify-content: center;
      margin-right: 50px;
      .img-desc {
        margin-right: 8px;
        img {
          width: 53px;
        }
      }
      .icon-wrap {
        display: flex;
        flex-direction: column;
        .icon-div {
          background: #26d4b4;
          width: 42px;
          height: 42px;
          line-height: 42px;
          border-radius: 21px;
          box-shadow: 0 0 0 8px #caf0eb;
          margin-bottom: 10px;
          span {
            font-size: 32px;
            color: #fff;
          }
        }
      }
      &:not(.lastOne):after {
        content: '';
        content: "";
        width: 1px;
        height: 57px;
        background: #e9e9e9;
@@ -91,22 +375,43 @@
      }
      .title {
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 14px;
        color: #999;
        margin-bottom: 10px;
        .dot {
          width: 10px;
          height: 10px;
          margin-right: 5px;
          border-radius: 50%;
          background: rgb(94, 14, 243);
        flex-direction: column;
        .indicator-val {
          font-size: 16px;
          font-weight: bold;
        }
      }
      .indicator-val {
        font-size: 24px;
      }
    }
  }
  .table-area {
    margin-top: 25px;
    button {
      background: #2d52d7 !important;
      border-color: #2d52d7 !important;
    }
    .el-table--striped
      .el-table__body
      tr.el-table__row--striped
      td.el-table__cell {
      background: #f4f6f9;
    }
    th.el-table__cell > .cell {
      color: #fff;
    }
    .thbg {
      margin-top: 15px;
      border: none;
    }
    .el-table__row > td {
      border: none;
    }
    .el-table th.is-leaf {
      border: none;
    }
    .el-table::before {
      height: 0px;
    }
  }
  .filter-bar.flex-box {
@@ -119,6 +424,24 @@
      }
    }
  }
  .dialog-addDev {
    .el-dialog {
      width: 600px;
    }
    .flex-box {
      align-items: center;
      margin-bottom: 10px;
      label {
        width: 90px;
        text-align: left;
      }
      .el-input {
        width: 500px;
      }
    }
    .btns {
      padding: 10px 0;
    }
  }
}
</style>