<template>
  <div class="app-container">
    <el-form :inline="true" ref="query" :model="query" size="mini">
      <el-form-item label="姓名" prop="uuid">
        <el-select v-model="query.uuid" filterable placeholder="请输入姓名">
          <el-option v-for="(item, index) in queryList" :key="index" :label="item.username" :value="item.uuid"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="专业" prop="profession">
        <el-input v-model="query.profession" placeholder="请输入专业"></el-input>
      </el-form-item>
      <el-form-item label="技术职称" prop="technical_titles">
        <el-input v-model="query.technical_titles" placeholder="请输入技术职称"></el-input>
      </el-form-item>
      <el-form-item label="安全评价师等级" prop="safe_occu_level">
        <el-input v-model="query.safe_occu_level" placeholder="请输入安全评价师等级"></el-input>
      </el-form-item>
      <el-form-item label="安全评价师专业" prop="safe_occu_level_profe">
        <el-input v-model="query.safe_occu_level_profe" placeholder="请输入安全评价师专业"></el-input>
      </el-form-item>
      <el-form-item label="注册安全工程师" prop="is_reg_safe_engineer">
        <el-select v-model="query.is_reg_safe_engineer" placeholder="是否是注册安全工程师">
          <el-option v-for="(item, index) in options" :key="index" :label="item.label" :value="item.value"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="省专家库成员" prop="is_prov_exp_db_staff">
        <el-select v-model="query.is_prov_exp_db_staff" placeholder="是否是省专家库成员">
          <el-option v-for="(item, index) in options" :key="index" :label="item.label" :value="item.value"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="评审行业" prop="review_industry">
        <el-input v-model="query.review_industry" placeholder="请输入评审行业"></el-input>
      </el-form-item>
      <el-form-item label="报告撰写能力" prop="report_writing_ability">
        <el-input v-model="query.report_writing_ability" placeholder="请输入报告撰写能力"></el-input>
      </el-form-item>
      <el-form-item label="培训领域" prop="training_field">
        <el-input v-model="query.training_field" placeholder="请输入培训领域"></el-input>
      </el-form-item>
      <el-form-item label="咨询范围" prop="consult_scope">
        <el-input v-model="query.consult_scope" placeholder="请输入咨询范围"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="onQuery">查询</el-button>
      </el-form-item>
      <el-form-item>
        <el-button @click="onReset('query')">重置</el-button>
      </el-form-item>
      <el-form-item>
        <el-button type="warning" @click="onAdd">添加</el-button>
      </el-form-item>
      <el-form-item>
        <el-popover placement="top-start" width="180" trigger="click">
          <el-checkbox-group :min="1" v-model="checkList" @change="onCheckboxChange">
            <el-checkbox :label="item" v-for="(item, index) in headerList" :key="index"></el-checkbox>
          </el-checkbox-group>
          <el-button type="success" slot="reference">表头设置</el-button>
        </el-popover>
      </el-form-item>
      <el-form-item>
        <el-button type="info" plain @click="handleDownload">导出当前数据</el-button>
      </el-form-item>
    </el-form>
    <el-table
      v-loading="isLoading"
      element-loading-text="Loading"
      :data="tableData"
      size="mini"
      border
      stripe
      fit
      highlight-current-row
    >
      <el-table-column type="expand">
        <template slot-scope="props">
          <formpage :data="props.row" :isReadOnly="true"></formpage>
        </template>
      </el-table-column>
      <el-table-column
        v-for="(item, index) in tableHeader"
        :key="index"
        :prop="item.prop"
        :label="item.label"
        :align="item.align"
        :min-width="item.width"
        :show-overflow-tooltip="true"
      ></el-table-column>
      <el-table-column label="操作" align="center" width="160" fixed="right">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="success"
            @click="handleEdit(scope.$index, scope.row)"
            >编辑</el-button
          >
          <el-button
            size="mini"
            type="danger"
            @click="handleDelete(scope.$index, scope.row)"
            >删除</el-button
          >
        </template>
      </el-table-column>
    </el-table>
    <div class="page-wrapper">
      <el-pagination
        @current-change="handleCurrentChange"
        :current-page.sync="query.pagenum"
        background
        small
        :page-size="query.pagesize"
        :pager-count="5"
        layout="pager, prev, next, total"
        :total="total"
      ></el-pagination>
    </div>
    <formdialog
      ref="formdialog"
      :title="dialogTitle"
      :visible="dialogVisible"
      :width="'70%'"
      @close="dialogVisible = false"
      @confirm="submitForm"
    ></formdialog>
  </div>
</template>

<script>
import request from "@/utils/request";
import { mapTrim } from "@/utils/index";
// import { formatUTCDateTime } from "@/utils/utils";
import { exportJsonToExcel } from "@/utils/excel";

import formdialog from "./dialog";
import formpage from "./form";

const fieldList = [
  { label: "姓名", prop: "username", isShow: true, align: "center", width: "150" },
  { label: "性别", prop: "gender", isShow: true, align: "center", width: "60" },
  { label: "身份证号", prop: "identity_number", isShow: true, align: "center", width: "150" },
  { label: "联系方式", prop: "contact", isShow: true, align: "center", width: "100" },
  { label: "邮箱", prop: "email", isShow: true, align: "center", width: "150" },
  { label: "目前住址", prop: "address", isShow: true, align: "center", width: "150" },
  { label: "毕业院校", prop: "graduated_school", isShow: true, align: "center", width: "150" },
  { label: "行业及专业", prop: "industry_profession", isShow: true, align: "center", width: "150" },
  { label: "文化程度", prop: "education", isShow: true, align: "center", width: "80" },
  { label: "安全评价师等级", prop: "safe_occu_level", isShow: false, align: "center", width: "150" },
  { label: "安全评价师专业", prop: "safe_occu_level_profe", isShow: false, align: "center", width: "150" },
  { label: "技术职称", prop: "technical_titles", isShow: false, align: "center", width: "150" },
  { label: "注册安全工程师", prop: "is_reg_safe_engineer", isShow: false, align: "center", width: "150" },
  { label: "评审员等级", prop: "reviewer_level", isShow: false, align: "center", width: "150" },
  { label: "评审行业", prop: "review_industry", isShow: false, align: "center", width: "150" },
  { label: "评审员证书编号", prop: "reviewer_cert_number", isShow: false, align: "center", width: "150" },
  { label: "省专家库人员", prop: "is_prov_exp_db_staff", isShow: false, align: "center", width: "150" },
  { label: "行业及专业", prop: "industry_profession", isShow: false, align: "center", width: "150" },
  { label: "专家证书编号", prop: "exp_cert_number", isShow: false, align: "center", width: "150" },
  { label: "所在区域", prop: "area", isShow: false, align: "center", width: "150" },
  { label: "报告撰写能力", prop: "report_writing_ability", isShow: false, align: "center", width: "150" },
  { label: "技术专家范围", prop: "tech_experts_range", isShow: false, align: "center", width: "150" },
  { label: "合作方式", prop: "cooperation_method", isShow: false, align: "center", width: "150" },
  { label: "收费水平", prop: "fee_level", isShow: false, align: "center", width: "150" },
  { label: "人员评价", prop: "person_evaluation", isShow: false, align: "center", width: "150" },
  { label: "来源", prop: "origin", isShow: false, align: "center", width: "150" },
  { label: "培训领域", prop: "training_field", isShow: false, align: "center", width: "150" },
  { label: "咨询范围", prop: "consult_scope", isShow: false, align: "center", width: "150" },
  { label: "分类", prop: "category", isShow: false, align: "center", width: "150" }
]

const tableHeader = fieldList.filter(item => {
  if (item.isShow) return item
})

export default {
  name: "Resources",
  components: {
    formdialog,
    formpage,
  },
  data() {
    return {
      total: 0,
      tableData: [],
      isLoading: false,
      checkList: tableHeader.map(item => item.label),
      headerList: fieldList.map(item => item.label),
      query: {
        uuid: null,
        technical_titles: null,
        profession: null,
        safe_occu_level: null,
        safe_occu_level_profe: null,
        is_reg_safe_engineer: null,
        is_prov_exp_db_staff: null,
        review_industry: null,
        report_writing_ability: null,
        training_field: null,
        consult_scope: null,
        pagesize: 15,
        pagenum: 1,
      },
      dialogTitle: "",
      dialogVisible: false,
      queryList: [],
      urlPrefix: "/api/v1/evm_store/techResources",
      tableHeader: tableHeader,
      options: [
        {
          label: "是",
          value: "是",
        },
        {
          label: "否",
          value: "否",
        },        
      ]
    };
  },
  methods: {
    addItem(params) {
      return request({
        url: this.urlPrefix + `/add`,
        method: "post",
        data: params,
      });
    },
    getItemList(params) {
      return request({
        url: this.urlPrefix + `/list`,
        method: "post",
        data: params,
      });
    },
    updateItem(id, params) {
      return request({
        url: `${this.urlPrefix}/update/${id}`,
        method: "post",
        data: params,
      });
    },
    deleteItem(id) {
      return request({
        url: `${this.urlPrefix}/delete/${id}`,
        method: "post",
      });
    },
    fetchDataList() {
      this.getItemList({ "scope_type": "list" })
        .then((res) => {
          this.queryList = res.data
        })
        .catch((err) => {
          console.log(err.message)
        })
    },
    fetchData(params) {
      this.isLoading = true;
      this.getItemList(
        Object.assign(
          {
            pagenum: this.query.pagenum,
            pagesize: this.query.pagesize,
          },
          params
        )
      )
        .then((res) => {
          this.total = res.count;
          this.tableData = res.data;
        })
        .catch((err) => {
          if (err.code == 204) {
            this.$message.success(err.message);
          } else {
            // this.$message.error(err.message)
            console.log(err.message);
          }
        })
        .finally(() => {
          this.isLoading = false;
        });
    },
    handleSizeChange(e) {
      this.query.pagesize = e;
      this.fetchData(mapTrim(this.query));
    },
    handleCurrentChange(e) {
      this.query.pagenum = e;
      this.fetchData(mapTrim(this.query));
    },
    handleEdit(index, row) {
      this.dialogTitle = "编辑";
      this.dialogVisible = true;
      this.$refs["formdialog"].update(row);
    },
    handleDelete(index, row) {
      this.$alert(
        "您确定要删除么?删除操作将不可恢复。如需取消操作,请点击右上角关闭按钮。",
        "删除提醒",
        {
          confirmButtonText: "确定",
          callback: (action) => {
            if (action == "confirm")
              this.deleteItem(row.uuid)
                .then((res) => {
                  console.log(res);
                  this.total -= 1;
                  this.$delete(this.tableData, index);
                  this.$message({
                    type: "success",
                    message: `成功删除第${index + 1}行`,
                  });
                })
                .catch((err) => {
                  this.$message.error(err.message);
                });
          },
        }
      );
    },
    handleDownload() {
      const loading = this.$loading({
        lock: true,
        text: 'Loading',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      })
       this.getItemList({ "scope_type": "list", "props": this.tableHeader.map(item => item.prop) })
        .then((res) => {
          exportJsonToExcel({
            header: this.tableHeader,
            headerLabel: "label",
            headerProp: "prop",
            jsonData: res.data,
            filename: Date.now()
          })
        })
        .catch((err) => {
          this.$message.warning(err.message)
        }).finally(() => {
          loading.close()
        })
    },
    submitForm(formdata) {
      if (this.dialogTitle === "添加") {
        formdata.area = formdata.address;
        this.addItem(mapTrim(formdata))
          .then((res) => {
            console.log(res);
            this.$message({ type: "success", message: "添加成功" });
            this.fetchData();
          })
          .catch((err) => {
            this.$message.error(err.message);
          });
      } else if (this.dialogTitle === "编辑") {
        this.updateItem(formdata.uuid, mapTrim(formdata))
          .then((res) => {
            console.log(res);
            this.$message({ type: "success", message: "更新成功" });
            this.fetchData();
          })
          .catch((err) => {
            this.$message.error(err.message);
          });
      }
    },
    onCheckboxChange(evt) {
      let header = []
      evt.forEach(f => {
        for(let i = 0 ; i < fieldList.length; i++) {
          if (fieldList[i].label === f) {
            header.push(fieldList[i])
            break
          }
        }
      })
      this.tableHeader = header
    },
    onAdd() {
      this.dialogTitle = "添加";
      this.dialogVisible = true;
    },
    onQuery() {
      this.query.pagenum = 1;
      this.query.pagesize = 15;
      this.fetchData(mapTrim(this.query));
    },
    onReset(formName) {
      this.$refs[formName].resetFields();
      this.query.pagenum = 1;
      this.query.pagesize = 15;
      this.fetchData();
    },
  },
  mounted() {},
  created() {
    this.fetchData();
    this.fetchDataList();
  },
};
</script>

<style lang="less" scoped>
.app-container {
  & > div.page-wrapper {
    margin: 10px 0px;
  }
}
</style>