<!-- 物料信息基础档案 -->
<script src="../../../main.js"></script>
<template>
  <div class="material-basic" v-loading="failLoad">
    <!-- 主体列表 -->
    <el-card
      class="material-list"
      v-loading="loading"
      :body-style="{
        height: '100%',
        padding: '10px ',
        display: 'flex',
        'flex-direction': 'column',
      }"
    >
      <!-- 查询条件 -->
      <el-super-search
        v-model="params"
        :size="size"
        :dict="dict"
        :columns="SearchColumns"
        @reset="handleResetQuery"
        @submit="handleQuery"
      ></el-super-search>

      <!-- 操作栏 -->
      <el-row
        :gutter="10"
        class="mb10"
        type="flex"
        justify="end"
        style="margin: 10px 0"
      >
        <!-- 新增、修改、删除、复制 -->
        <el-col :span="1.5">
          <el-button-group>
            <el-button :size="size" @click="handleEdit">修改</el-button>
            <el-button :size="size" @click="handleRefresh">刷新</el-button>
          </el-button-group>
        </el-col>

        <!-- 启用 -->
        <el-col :span="1.5">
          <is-using
            :size="size"
            :select-data="checkedList"
            @success="handleQuery"
          ></is-using>
        </el-col>

        <!-- 导入导出 -->
        <el-col :span="1.5">
          <el-button-group>
            <el-button
              :size="size"
              @click="handleImport"
              v-hasPermi="['system:material:import']"
              >批量导入</el-button
            >
            <el-button
              :size="size"
              @click="handleExport"
              v-hasPermi="['system:material:export']"
              >批量导出</el-button
            >
          </el-button-group>
        </el-col>

        <!-- <el-col :span="1.5">
          <whlbButton :data="checkedList" :size="size"></whlbButton>
        </el-col> -->
      </el-row>

      <div
        class="el-super-ux-table"
        v-resize="resize"
        style="
          position: relative;
          display: flex;
          flex: 1;
          flex-direction: column;
          overflow: auto;
        "
      >
        <ux-grid
          v-if="tableHeader.length"
          border
          use-virtual
          keep-source
          beautify-table
          :size="size"
          :data="taskList"
          :height="tableHeight"
          ref="materialTable"
          @cell-dblclick="handledbClick"
          @select="handleSelect"
          @select-all="handleSelectAll"
          :header-row-style="{
            color: '#515a6e',
          }"
          style="flex: 1"
        >
          <
          <!-- 多选 -->
          <ux-table-column
            fixed="left"
            width="60"
            align="center"
            type="checkbox"
            resizable
            reserve-selection
            :column-key="rowKey"
          ></ux-table-column>
          <!-- 序号 -->
          <ux-table-column
            fixed="left"
            width="50"
            title="序号"
            type="index"
            align="center"
            class="is-index"
            resizable
          ></ux-table-column>
          <!-- <ux-table-column type="selection" width="45" :reserve-selection="true" fixed/>
          <ux-table-column type="index" title="序号" width="55" align="center"/> -->
          <ux-table-column
            width="150"
            v-for="h in tableHeader"
            v-if="h.show"
            :title="h.name"
            align="center"
            resizable
            show-overflow-tooltip
          >
            <template slot-scope="scope">
              <span v-if="h.apiUrl">{{ scope.row[`${h.prop}Name`] }}</span>
              <el-checkbox
                v-else-if="h.attribute == 'checkbox'"
                v-model="scope.row[h.prop]"
                disabled
                true-label="0"
                false-label="2"
              ></el-checkbox>
              <el-dict-tag
                v-else-if="h.dictId"
                :value="scope.row[h.prop]"
                :options="dict.type[h.dictId]"
              ></el-dict-tag>

              <span v-else>{{ scope.row[h.prop] || "--" }}</span>
              <!-- {{ h.attribute == 'select' ? scope.row[`${h.prop}Name`] :
              (h.attribute == 'checkbox' ?
              (scope.row[h.prop] == '0' ? '√' : '')
              : scope.row[h.prop])
              }} -->
            </template>
          </ux-table-column>
        </ux-grid>
        <div
          style="
            height: 50px;
            display: flex;
            justify-content: space-between;
            align-items: center;
          "
          :style="{
            height: '50px',
          }"
        >
          <pagination
            :total="total"
            :page.sync="queryParams.pageNum"
            :limit.sync="queryParams.pageSize"
            @pagination="handleQuery"
            style="
              height: 32px;
              padding: 0 !important;
              flex: 1;
              overflow-x: auto;
            "
          />
        </div>
      </div>
    </el-card>

    <!-- 操作提示 -->
    <el-dialog
      title="操作提示"
      :visible.sync="optionDialog.show"
      width="30%"
      center
    >
      <span>是否确认{{ optionDialog.op }}?</span>
      <span slot="footer">
        <el-button @click="handleOptionShow('option', false)">取 消</el-button>
        <el-button type="primary" @click="handleComfirmOption('cancal')"
          >确 定</el-button
        >
      </span>
    </el-dialog>

    <!-- 导入弹窗 -->
    <el-dialog
      title="批量导入"
      :visible.sync="importData.show"
      width="35%"
      center
      :before-close="handlefileDialogColse"
    >
      <div class="mb-import">
        <el-upload
          class="upload-demo"
          accept=".xls, .xlsx"
          ref="upload"
          action="#"
          :on-remove="handleFileRemove"
          :file-list="importData.list"
          :auto-upload="false"
          :on-change="handleChangeFile"
          :limit="1"
        >
          <el-button slot="trigger" :size="size" type="primary"
            >选取文件</el-button
          >
          <el-button
            style="margin-left: 10px"
            :size="size"
            type="success"
            @click="handleDownTemplate"
            >下载模板</el-button
          >
          <div slot="tip" class="el-upload__tip">只能上传Excel文件</div>
        </el-upload>
      </div>
      <span slot="footer">
        <el-button @click="handleImportData('cancal')">取 消</el-button>
        <el-button type="primary" @click="handleImportData('confirm')"
          >确 定</el-button
        >
      </span>
    </el-dialog>
  </div>
</template>

<script>
import "./style/index.scss";
import materialApi from "@/api/material/basic";
import { SearchColumns, OtherDictColumns } from "./columns";
import { initDicts } from "@/utils/init.js";

export default {
  name: "material-basic",
  dicts: [...initDicts([...SearchColumns, ...OtherDictColumns])],
  components: {
    ElSuperSearch: () => import("@/components/super-search/index.vue"),
    ElDictTag: () => import("@/components/DictTag/index.vue"),
    IsUsing: () => import("./isUsing/index.vue"),
    whlbButton: () => import("./wei-hu-lei-bie/index.vue"),
  },
  data() {
    const params = this.$init.params(SearchColumns);

    return {
      failLoad: false,
      params: params,
      SearchColumns: SearchColumns,
      rowKey: "id",
      size: "mini",
      // 物料基本信息数据
      taskList: [],
      // 查询表单字段
      queryForm: {
        name: "",
        code: "",
        isEnable: "",
      },
      // 总条数
      total: 1,
      loading: false,
      importData: {
        show: false,
        list: [],
      },
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 50,
        code: null,
        name: null,
      },
      // 表头
      tableHeader: [],
      // 多选数组
      checkedList: [],
      // 列表选中数据
      // checkedList: [],
      // 操作弹窗
      optionDialog: {
        show: false,
        op: "",
      },
      resizeHeight: 0,
    };
  },
  computed: {
    tableHeight: {
      get() {
        return this.resizeHeight;
      },
      set() {},
    },
  },
  directives: {
    // 使用局部注册指令的方式
    resize: {
      // 指令的名称
      bind(el, binding) {
        // el为绑定的元素,binding为绑定给指令的对象
        let width = "",
          height = "";
        function isReize() {
          const style = document.defaultView.getComputedStyle(el);
          if (width !== style.width || height !== style.height) {
            binding.value(); // 关键
          }
          width = style.width;
          height = style.height;
        }
        el.__vueSetInterval__ = setInterval(isReize, 300);
      },
      unbind(el) {
        clearInterval(el.__vueSetInterval__);
      },
    },
  },
  methods: {
    resize() {
      this.resizeHeight =
        document.getElementsByClassName("el-super-ux-table")[0].offsetHeight -
        55;
    },
    // 判读是否启用
    handleJudgeIsUsing() {
      return (
        this.checkedList.length == 1 && this.checkedList[0].isEnable == "已启用"
      );
    },

    // 修改
    handleEdit() {
      if (this.checkedList.length == 1) {
        this.$router.push({
          path: `/material/basicFile/detail/${this.checkedList[0].id}`,
          query: {
            isEdit: true,
          },
        });
      } else {
        this.$notify.warning({
          message: `${
            this.checkedList.length > 1
              ? "修改只能选择单个数据!"
              : "请选择需要修改的信息!"
          }`,
        });
      }
    },
    // 删除
    handleDel() {
      console.log("删除", this.checkedList);
      // delMaterial
      if (this.checkedList.length) {
        let ids = this.checkedList.map((i) => i.id);
        materialApi.delMaterial(ids).then((res) => {
          if (res.code == 200) {
            this.handleRefresh();
            // 清空选中数据
            this.checkedList = [];
            this.$refs.materialTable.clearSelection();
          }
        });
      } else {
        this.$notify.warning({
          message: `请选择需要删除的数据!`,
        });
      }
    },
    //查询
    handleQuery() {
      // 重新查询后需要清空列表选中的数据
      this.checkedList = [];
      this.$refs.materialTable.clearSelection();
      this.getMaterialList();
    },
    // 重置查询条件
    handleResetQuery() {
      this.queryParams.pageNum = 1;

      this.queryParams.pageSize = 100;

      this.params = this.$init.params(SearchColumns);

      this.handleQuery();
    },
    // 刷新
    handleRefresh() {
      this.getMaterialList();
      // for (const key in this.queryForm) {
      //   this.queryForm[key] = '';
      // }
    },

    // 批量导入
    handleImport() {
      this.importData.show = true;
    },
    // 导入弹窗关闭前
    handlefileDialogColse(done) {
      this.importData.list = [];
      done();
    },
    // 导入弹窗操作
    handleImportData(type) {
      switch (type) {
        // 取消
        case "cancal":
          this.importData.list = [];
          this.importData.show = false;
          break;
        // 确认
        case "confirm":
          if (this.importData.list.length) {
            let formData = new FormData();

            formData.append("file", this.importData.list[0].raw);
            materialApi.fileImport(formData).then((res) => {
              if (res.code == 200) {
                this.importData.show = false;
                this.importData.list = [];
                if (res.data.flag) {
                  this.failLoad = true;
                  console.log(res.data.datas);
                  let param = { failDatas: res.data.datas };
                  if (null != param) {
                    materialApi.exportMartial(param).then((res) => {
                      const blob = new Blob([res], {
                        type: "application/vnd.ms-excel;charset=UTF-8",
                      }); // 创建一个类文件对象:Blob对象表示一个不可变的、原始数据的类文件对象
                      const downloadElement = document.createElement("a"); //创建a标签
                      const href = window.URL.createObjectURL(blob); // 创建下载的链接
                      downloadElement.href = href; //下载地址
                      downloadElement.download =
                        "导入失败的物料基础档案数据.xlsx"; // 下载后文件名
                      document.body.appendChild(downloadElement);
                      downloadElement.click(); // 点击下载
                      document.body.removeChild(downloadElement); // 下载完成移除元素
                      window.URL.revokeObjectURL(href); // 释放blob对象
                      this.failLoad = false;
                    });
                  }
                }
                this.$notify({
                  message: res.data.msg,
                  type: res.data.flag ? "warning" : "success",
                });
              } else {
                this.$notify({
                  message: res.msg,
                  type: res.code == 200 ? "success" : "warning",
                });
              }
            });
          } else {
            this.$notify({
              title: "警告",
              message: "请上传文件之后在确认!",
              type: "warning",
            });
          }
          break;
      }
    },

    // 删除文件
    handleFileRemove(file, fileList) {
      // console.log('删除文件', file, 'file', fileList, 'fileList');
      this.importData.list = fileList;
    },
    // 文件发生改变
    handleChangeFile(file, fileList) {
      this.importData.list = fileList;
    },

    // 批量导出
    handleExport() {
      let ids = this.checkedList.length
        ? this.checkedList.map((i) => i.id)
        : [];

      if (ids.length) {
        let params = {
          // orgId: '1',
          ids,
        };
        this.download(
          "/system/material/export",
          params,
          `物料基本信息${new Date().getTime()}.xlsx`
        );
      } else {
        let params = {
          templateCode: "material",
          ...this.params,
          createTimeBegin:
            (this.params.createTimeQueue && this.params.createTimeQueue[0]) ||
            "",
          createTimeEnd:
            (this.params.createTimeQueue && this.params.createTimeQueue[1]) ||
            "",
          updateTimeBegin:
            (this.params.updateTimeQueue && this.params.updateTimeQueue[0]) ||
            "",
          updateTimeEnd:
            (this.params.updateTimeQueue && this.params.updateTimeQueue[1]) ||
            "",
        };
        this.download(
          "/system/material/export",
          params,
          `物料基本信息${new Date().getTime()}.xlsx`
        );
      }
    },
    // 下载模板
    handleDownTemplate() {
      this.download("/system/material/download", {}, `物料基本信息模板.xlsx`);
    },

    // 操作弹窗显隐
    handleOptionShow(type, val) {
      switch (type) {
        case "option":
          this.optionDialog.show = val;
          break;
      }
    },
    // 操作弹窗确认按钮
    handleComfirmOption(op) {
      switch (op) {
        case "cancal":
          this.handleOptionShow("option", false);
          break;
      }
    },

    // 双击行
    handledbClick(e) {
      this.$router.push({
        path: `/material/basicFile/detail/${e.id}`,
      });
    },
    // 绑定row-key
    getRowKey(row) {
      return row.id;
    },
    // 对象数组去重
    handleUnique(arr, key) {
      // arr  需要去重的数组   type:作为去重依据的key
      const res = new Map();
      return arr.filter((arr) => !res.has(arr[key]) && res.set(arr[key], 1));
    },
    // 行数据勾选操作
    handleSelect(selection, row) {
      this.checkedList = selection;
      // // true就是选中,0或者false是取消选中
      // let selected = selection.length && selection.indexOf(row) !== -1
    },
    //手动勾选全选
    handleSelectAll(selection) {
      this.checkedList = selection;
    },
    // 获取物料列表信息
    async getMaterialList() {
      try {
        this.loading = true;
        let page = {
          pageNum: this.queryParams.pageNum,
          pageSize: this.queryParams.pageSize,
        };

        let param = {
          templateCode: "material",
          ...this.params,
          createTimeBegin:
            (this.params.createTimeQueue && this.params.createTimeQueue[0]) ||
            "",
          createTimeEnd:
            (this.params.createTimeQueue && this.params.createTimeQueue[1]) ||
            "",
          updateTimeBegin:
            (this.params.updateTimeQueue && this.params.updateTimeQueue[0]) ||
            "",
          updateTimeEnd:
            (this.params.updateTimeQueue && this.params.updateTimeQueue[1]) ||
            "",
        };

        let { code, data } = await materialApi.materialList(param, page);

        if (code == 200) {
          this.taskList = data.tableBody.rows;
          this.total = data.tableBody.total;
        }
      } catch (error) {
      } finally {
        this.loading = false;
      }

      // materialApi.materialList(param, page).then((res) => {
      //   _this.loading = false;
      //   console.log(res, '获取物料列表信息以及表头字段');
      //   let {code, data} = res;
      //   if (code == 200) {
      //     _this.taskList = data.tableBody.rows;
      //     _this.total = data.tableBody.total;

      //   }
      // })
    },
    // 获取物料列表表头
    getTagList(templateCode) {
      materialApi.tagList({ templateCode }).then((res) => {
        console.log(res, "获取物料列表表头");
        if (res.code == 200) {
          this.tableHeader = res.data;
        }
      });
    },
  },
  created() {},
  beforeRouteEnter(to, from, next) {
    next((vm) => {
      if (from.name == "materialDetail") {
        // this.$store.getQuery(this.queryForm);
        console.log(vm, "queryValue", vm.$store);
        vm.queryForm = vm.$store.state.query.queryVlue;
        // 清空选中数据
        vm.checkedList = [];
        vm.$refs.materialTable && vm.$refs.materialTable.clearSelection();
      }
      vm.getTagList("material_list");
      vm.getMaterialList();
    });
  },
  // 进入详情,保留查询条件
  beforeRouteLeave(to, from, next) {
    if (to.name == "materialDetail") {
      this.$store.commit("SET_QUERY", this.queryForm);
    } else {
      this.$store.commit("SET_QUERY", { name: "", code: "" });
    }
    next();
  },
};
</script>

<style lang="scss">
.material-basic {
  height: calc(100vh);
}
.material-list {
  // height: calc(100vh - 70px);
  height: 100%;

  .el-card__body {
    height: 100%;
    box-sizing: border-box;
    padding: 10px;

    .el-table {
      // overflow: auto;

      .el-table__body-wrapper {
        overflow-y: auto !important;
        overflow-x: auto !important;
      }
    }
  }

  .el-pagination {
    // margin-top: 8px;
    text-align: right;
  }
}

.mb-import {
  padding: 0 20%;
  text-align: center;
  display: flex;
  align-items: flex-start;
  justify-content: space-around;
}
</style>
<style scoped>
.el-dialog__header {
  background-color: rgb(244, 244, 244);
}

.mb-query >>> .el-form-item__label {
  font-weight: normal;
  font-size: 12px;
}

.mb-query >>> .el-form-item {
  margin-bottom: 8px;
}

.mb-query >>> .el-select {
  width: 90px;
}

.mb-query >>> .el-scrollbar__wrap {
  margin-bottom: -18px;
}
::v-deep.uxbeautifyTableClass
  .elx-header--column
  .elx-resizable.is--line:before {
  height: 100%;
  background-color: #dfe6ec;
}
</style>