Newer
Older
smartKitchenFront / src / views / product / deviceList.vue
liyaguang on 6 Dec 2022 12 KB fix: 修改资质管理相关功能
<!--设备列表-->
<template>
  <div class="product_container">
    <div class="productData">
      <data-info-item
        :img="require('@/assets/kitchen/设备数.png')"
        :number="statistics.activeDeviceQuantity"
        :title="'累计激活设备数'"
        :unit="'个'"
      />
      <data-info-item
        :img="require('@/assets/kitchen/设备在线数.png')"
        :number="statistics.onlineDeviceQuantity"
        :title="'今日设备在线数'"
        :unit="'个'"
        class="middle"
      />
      <data-info-item
        :img="require('@/assets/kitchen/在线率.png')"
        :number="statistics.onlineDeviceRatio"
        :title="'今日设备在线率'"
        :unit="''"
      />
    </div>

    <div class="productFun" style="margin-top: 30px">
      <div class="productInput">
        SN码
        <div class="inputBox" style="width: 120px">
          <el-input
            v-model="selectInfo.snCode"
            placeholder="请入SN码"
            clearable
            class="product-input"
          />
        </div>
        设备型号
        <div class="inputBox" style="width: 144px">
          <el-input
            v-model="selectInfo.productCode"
            placeholder="请入设备型号"
            clearable
            class="product-input"
          />
        </div>
        品牌
        <div class="inputBox" style="width: 194px">
          <el-select
            v-model="selectInfo.brandName"
            filterable
            clearable
            placeholder="请输入或选择设备品牌"
          >
            <el-option
              v-for="item in brandList"
              :key="item.id"
              :label="item.brandName"
              :value="item.brandName"
            />
          </el-select>
        </div>
        设备状态
        <div class="inputBox" style="width: 90px">
          <el-select
            v-model="selectInfo.deviceStatus"
            filterable
            clearable
            placeholder="请选择"
          >
            <el-option
              v-for="item in DevState"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </div>
        是否绑定用户
        <div class="inputBox" style="width: 90px">
          <el-select
            v-model="selectInfo.deviceBindUser"
            filterable
            clearable
            placeholder="请选择"
          >
            <el-option
              v-for="item in userBind"
              :key="item.value"
              :label="item.label"
              :value="item.value"
            />
          </el-select>
        </div>
      </div>
      <div class="productBtn">
        <el-button
          type="primary"
          icon="el-icon-search"
          class="btnItem"
          @click="selectData"
        >
          查询
        </el-button>
        <el-button
          type="primary"
          icon="el-icon-refresh-right"
          class="btnItem"
          @click="reset"
        >
          重置
        </el-button>
        <el-button
          type="danger"
          con="el-icon-delete-solid"
          lass="btnItem bgred"
          @click="BatchDelete"
        >
          一键解绑
        </el-button>
        <el-button
          type="primary"
          icon="el-icon-folder-opened"
          class="btnItem"
          @click="exportToExcel"
        >
          导出
        </el-button>
        <el-button type="primary" @click="Upgrade"> 一键固件升级 </el-button>
      </div>
    </div>
    <el-table
      ref="multipleTable"
      v-loading="loading"
      :data="tableData.rows"
      :row-class-name="tableRowClassName"
      :header-cell-style="{
        'text-align': 'center',
        background: '  #2483b3',
        color: 'white',
      }"
      :row-style="{ 'text-align': 'center' }"
      style="width: 100%"
    >
      <el-table-column type="selection" width="55" />
      <!-- <el-table-column
        type="index"
        width="55"
        label="编号"
      /> -->
      <el-table-column type="index" label="序号">
        <template slot-scope="scope">
          {{ (offset - 1) * limit + scope.$index + 1 }}
        </template>
      </el-table-column>
      <el-table-column prop="snCode" label="SN码" />
      <el-table-column prop="brandName" label="设备品牌" />
      <el-table-column prop="productCode" label="设备型号" />
      <el-table-column prop="createTime" label="生产日期" />
      <el-table-column prop="deviceStatus" label="设备状态">
        <template slot-scope="scope">
          <!-- {{scope.deviceStatus=='1'}} -->
          <!-- {{scope.row.deviceStatus=='1'}} -->
          {{ scope.row.deviceStatus == "1" ? "在线" : "离线" }}
        </template>
      </el-table-column>
      <el-table-column prop="deviceActiveTime" label="激活时间" />
      <el-table-column prop="deviceActive" label="是否激活">
        <template slot-scope="scope">
          {{ scope.row.deviceActive == "1" ? "是" : "否" }}
        </template>
      </el-table-column>
      <el-table-column prop="deviceBindUser" label="是否用户绑定设备">
        <template slot-scope="scope">
          {{ scope.row.deviceBindUser == "1" ? "是" : "否" }}
        </template>
      </el-table-column>
      <el-table-column label="操作">
        <template slot-scope="scope">
          <el-button type="text" size="small" @click="showInfo(scope.row)">
            详情
          </el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页组件 -->
    <group-page
      v-model="isFristPage"
      :limit="limit"
      :total="total"
      :offset="offset"
      :count="tableData.total"
      @setOffset="setOffset"
      @setLimit="setLimit"
    />
    <device-info-dialog
      :is-show-info="isShowInfo"
      :data-info="rowInfo"
      @close="closeInfo"
    />
  </div>
</template>

<script>
// 组件
import DataInfoItem from "../../components/mycomponent/DataInfoItem.vue";
import deviceInfoDialog from "../../components/mycomponent/dialog/deviceInfoDialog.vue";
import GroupPage from "../../components/mycomponent/groupPage.vue";
// 逻辑
import { tableRowClassName } from "../../utils/myUtils/changeTableTr";
import {
  d_listPage,
  d_statistics,
  d_unbind,
  d_firmwareUpgrade,
  d_listExport,
} from "../../api/product/device";
import { listMixin, elDataDialog } from "../../utils/myUtils/mixins/listPage";
import { SelectList } from "../../api/product/brand";
import { exportFile } from "@/utils/exportutils";
import { export_json_to_excel } from "../../utils/Export2Excel";
export default {
  components: {
    DataInfoItem,
    deviceInfoDialog,
    GroupPage,
  },
  mixins: [listMixin, elDataDialog],
  data() {
    return {
      statistics: {},
      dataInfo: {}, // 新数据的chushixiang
      selectInfo: {
        // 搜索框中的数据的数据
        snCode: "",
        productCode: "",
        brandName: "",
        deviceStatus: "",
        deviceBindUser: "",
      },
      brandList: [],
      DevState: [
        {
          label: "在线",
          value: "1",
        },
        {
          label: "离线",
          value: "0",
        },
      ],
      userBind: [
        {
          label: "是",
          value: "1",
        },
        {
          label: "否",
          value: "0",
        },
      ],
    };
  },
  mounted() {
    // 相关状态获取
    d_statistics().then((res) => {
      this.statistics = res;
    });
    SelectList().then((res) => {
      this.brandList = res;
    });
  },
  methods: {
    tableRowClassName: tableRowClassName,
    // handleClick(rowData){
    //   this.isShowInfo =true
    //   this.rowId = rowData.id
    // },
    // closeInfo(){
    //   this.isShowInfo =false
    // },
    // 获取指定页面
    getListPage(limit, offset) {
      this.loading = true;
      d_listPage(`limit=${limit}&offset=${offset}`, this.queryInfo)
        .then((res) => {
          // 得到相关数据
          res.rows.forEach((item, index) => {
            item.index = index + 1 + (offset - 1) * 10;
          });
          this.tableData = res;
          this.loading = false;
        })
        .catch((_) => {
          this.loading = false;
        });
    },
    reset() {
      this.selectInfo = {
        snCode: "",
        productCode: "",
        brandName: "",
        deviceStatus: "",
        deviceBindUser: "",
      };
      this.queryInfo = { ...this.selectInfo };
      this.refresh();
    },
    // 批量删除
    BatchDelete() {
      if (this.$refs.multipleTable.selection.length) {
        //  得到选中行
        const dle_ary = this.$refs.multipleTable.selection;
        const ids = [];
        dle_ary.forEach((ele) => {
          ids.push(ele.id);
        });
        d_unbind({ deviceIds: ids })
          .then((res) => {
            this.$message({
              message: res || "解绑成功",
              type: "success",
            });
            this.refresh();
          })
          .catch((_) => {});
      }else{
        this.$message.warning('请先选择需要解绑的设备')
      }
    },
    Upgrade() {
      //  得到选中行
      const dle_ary = this.$refs.multipleTable.selection;
      const ids = [];
      console.log(dle_ary);
      dle_ary.forEach((ele) => {
        ids.push(ele.deviceId);
      });
      d_firmwareUpgrade({ deviceIds: ids }).then((res) => {
        this.$message({
          message: res || "升级成功",
          type: "success",
        });
        this.refresh();
      });
    },
    exportToExcel() {
      // 全屏加载动画
      const loading = this.$loading({
        lock: true,
        text: "下载中,请稍后...",
        spinner: "el-icon-loading",
        background: "rgba(0, 0, 0, 0.7)",
      });
      d_listExport(this.selectInfo).then((res) => {
        loading.close(); // 关闭加载动画
        const blob = new Blob([res.data]);
        let fileName = "设备列表.xlsx";
        fileName = fileName.replace(/-|:| /g, "");
        exportFile(blob, fileName);
      });
      // d_listPage("offset=1", {}).then((res) => {
      //   console.log(res.rows, "全部数据");
      // 对数据进行加工
      // res.rows = res.rows.map((item) => {
      //   return {
      //     产品名称: item.productName,
      //     产品品牌: item.brandName,
      //     产品型号: item.productCode,
      //     产品品类: item.categoryStr,
      //     产品颜色: item.productColor,
      //     产品材质: item.productMaterialQuality,
      //     产品状态: item.productStatus,
      //     产品版本: item.productEdition,
      //     规格: item.productPackageSize,
      //     重量: item.productWeight,
      //     国际69码: item.internationalCode,
      //     更新时间: item.updateTime,
      //   };
      // });
      //   this.ExportTable = res.rows;
      //   const header = Object.keys(res.rows[0]);
      //   console.log(header);
      //   const data = res.rows.map((user, index) => {
      //     const userArr = [];
      //     console.log(user, index);
      //     for (const key in res.rows[0]) {
      //       // console.log(res.rows[key]);
      //       const item = user[key];
      //       userArr.push(item);
      //     }
      //     return userArr;
      //   });
      //   console.log(data);
      //   // //把定义好的header和data放进export_json_to_excel的函数里作为参数
      //   export_json_to_excel({
      //     header,
      //     data,
      //     filename: "设备列表",
      //   });
      // });
    },
  },
};
</script>

<style lang="scss" scoped>
.product_container {
  position: relative;
  width: 100%;
  // min-height: 600px;
  min-height: 700px;
  overflow: auto;
  .productData {
    // min-width:1725px;
    width: 100%;
    display: flex;
    justify-content: center;
    .middle {
      margin: 0 30px;
    }
  }
  .productFun {
    margin: 0px 0px 30px;
    display: flex;
    justify-content: space-between;
    .productInput {
      display: flex;
      align-items: center;
      .inputBox {
        margin: 0 8px;
      }
    }
    .productBtn {
      .btnItem {
        //margin-right: 10px;
        border-radius: 5px;
        // height: 32px;
        // width: 84px;
        //font-size: 16px;
      }
    }
  }
}
</style>