<template>
  <!-- 会议申请详情 -->
  <div class="form-container">
    <el-form :model="form" :rules="rules" ref="form" label-width="auto">
      <blocks title="基本信息">
        <el-row :gutter="24">
          <el-col :span="12">
            <el-form-item label="会议名称:" prop="name" style="height: 45px">
              <el-input
                v-model="form.name"
                size="small"
                maxlength="15"
                :disabled="isOpt ? (optionType == 0 ? true : false) : true"
              ></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="会议内容:" style="height: 45px">
              <el-input
                v-model="form.content"
                size="small"
                maxlength="50"
                :disabled="isOpt ? (optionType == 0 ? true : false) : true"
              ></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="地点:" style="height: 45px" prop="relationId">
              <el-select
                v-model="form.relationId"
                clearable
                placeholder="请选择会议室列表"
                size="small"
                style="width: 100%"
                :disabled="isOpt ? (optionType == 0 ? true : false) : true"
              >
                <el-option
                  v-for="item in meetRooms"
                  :key="item.id"
                  :label="item.roomName"
                  :value="item.id"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item
              label="会议开始时间:"
              style="height: 45px"
              prop="startTime"
            >
              <el-date-picker
                v-model="form.startTime"
                type="datetime"
                size="small"
                placeholder="年/月/日"
                style="width: 100%"
                @change="startTimeChange"
                :disabled="isOpt ? (optionType == 0 ? true : false) : true"
              >
              </el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item
              label="会议结束时间:"
              style="height: 45px; width: 100%"
              prop="endTime"
            >
              <el-date-picker
                v-model="form.endTime"
                type="datetime"
                size="small"
                placeholder="年/月/日"
                style="width: 100%"
                @change="endTimeChange"
                :disabled="isOpt ? (optionType == 0 ? true : false) : true"
              >
              </el-date-picker>
            </el-form-item>
          </el-col>
          <!-- <el-col :span="5">
            <el-form-item label="会议时长:">
              <span>3小时</span>
            </el-form-item>
          </el-col> -->
          <!-- <el-col :span="8">
            <el-form-item label="参会人员:" required>
              <el-input
                v-model="form.deptStaff"
                size="small"
                :disabled="isOpt ? (optionType == 0 ? true : false) : true"
              ></el-input>
            </el-form-item>
          </el-col> -->
          <el-col :span="8">
            <el-form-item label="参会部门:" prop="dept" style="height: 45px">
              <el-select
                v-model="form.dept"
                multiple
                collapse-tags
                filterable
                placeholder="请选择参会部门"
                style="width: 100%"
                size="mini"
                :disabled="isOpt ? (optionType == 0 ? true : false) : true"
                @change="superviseDeptChange"
              >
                <el-option
                  v-for="item in option"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item
              label="参会人员:"
              prop="deptStaff"
              style="height: 45px"
            >
              <el-select
                v-model="form.deptStaff"
                multiple
                filterable
                collapse-tags
                :disabled="isOpt ? (optionType == 0 ? true : false) : true"
                placeholder="请选择参会人员"
                style="width: 100%"
                size="mini"
                @change="superviseUserChange"
              >
                <el-option-group
                  v-for="group in superviseUsers"
                  :key="group.id"
                  :label="group.label"
                >
                  <el-option
                    v-for="item in group.users"
                    :key="item.id"
                    :label="item.realName"
                    :value="item.id"
                  >
                  </el-option>
                </el-option-group>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="参会人数:" style="height: 45px">
              <el-input
                v-model="form.totalPrice"
                size="small"
                disabled
              ></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item
              label="申请部门:"
              prop="useDept"
              style="height: 45px"
            >
              <el-select
                v-model="form.useDept"
                filterable
                collapse-tags
                placeholder="请选择申请部门"
                size="small"
                style="width: 100%"
                disabled
              >
                <el-option
                  v-for="item in departments"
                  :key="item.id"
                  :label="item.name"
                  :value="item.id"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item
              label="申请人:"
              prop="personLiable"
              style="height: 45px"
            >
              <el-input
                v-model="form.personLiable"
                size="small"
                disabled
              ></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item
              label="申请时间:"
              prop="registerTime"
              style="height: 45px"
            >
              <el-date-picker
                v-model="form.registerTime"
                type="datetime"
                placeholder="选择日期时间"
                style="width: 100%"
                size="small"
                disabled
              >
              </el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="发送通知:" style="height: 45px">
              <el-select
                v-model="form.typeOne"
                size="small"
                style="width: 100%"
                clearable
                :disabled="isOpt ? (optionType == 0 ? true : false) : true"
              >
                <el-option
                  v-for="item in optionMes"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
      </blocks>

      <blocks title="附件">
        <el-row :gutter="24">
          <el-col
            v-for="(file, index) in existsFiles"
            :key="index"
            class="tf-col"
            :span="8"
          >
            <div class="file">
              <div
                class="file-name"
                @click="downloadFile(file)"
                :style="isOpt && optionType != 0 ? '' : 'width:100%;'"
              >
                {{ file.fileName }}
              </div>
              <div
                v-if="isOpt ? optionType != 0 : false"
                class="btn-file"
                @click="deleteFile(file)"
              >
                x
              </div>
            </div>
          </el-col>
        </el-row>
        <upload
          ref="upload"
          :files="files"
          v-if="isOpt ? (optionType == 0 ? false : true) : false"
        ></upload>
      </blocks>

      <blocks title="处理信息">
        <examineForm
          ref="examine"
          :cfgParam="{ isOpt, optionType }"
          :step="step"
          :steps="steps"
          :process="process"
          :editData="editData"
          :allDeptAndUser="allDeptAndUser"
        ></examineForm>
      </blocks>
    </el-form>
    <!-- 详情 -->
    <el-dialog
      class="tf-dialog"
      :title="title"
      :visible.sync="dialogFormVisible"
      width="1200px"
      top="60px"
      style="padding: 10px"
      append-to-body
    >
      <vehicle-transfer
        v-if="dialogFormVisible"
        ref="transfer"
        :currSelects="tableData"
      ></vehicle-transfer>
      <div slot="footer" class="dialog-footer" style="text-align: center">
        <el-button @click="cancelSubmit" size="small">取 消</el-button>
        <el-button type="primary" @click="submitData" size="small"
          >提 交</el-button
        >
      </div>
    </el-dialog>
  </div>
</template>

<script>
import blocks from "@/views/mbsys/components/Blocks.vue";
import examineForm from "@/views/mbsys/components/examineForm.vue";
import vehicleTransfer from "@/views/mbsys/components/vehicleTransfer.vue";
import upload from "@/views/mbsys/components/upload.vue";
import { getCompanyAll, getFiles, getAllUserInfo } from "@/api/base";
import { getMatterTypes, getSupplier } from "@/api/mbsys/materialmanage";
import { getconferenceroom } from "@/api/mbsys/collaborative.js";
import { config } from "../../../components/cfgOrderProcess";
import { parseTime } from "@/utils/index";

export default {
  components: { blocks, examineForm, upload, vehicleTransfer },
  props: {
    /**
     * 是否为当前状态
     */
    isOpt: {
      type: Boolean,
      required: true,
    },
    /**
     * 当前状态操作方式0:查看,1:新增,2:修改
     */
    optionType: {
      type: Number,
      required: true,
    },
    /**
     * 当前步骤
     */
    step: {
      type: Object,
      required: true,
    },
    /**
     * 流程所有
     */
    steps: {
      type: Array,
      required: true,
    },

    /**
     * 流程配置信息
     */
    process: {
      type: Object,
      required: true,
    },

    /**
     * 编辑\查询数据
     */
    editData: {
      type: Object,
      required: true,
    },
    /**
     * 所有部门和用户
     */
    allDeptAndUser: {
      type: Array,
      required: true,
    },
  },
  data() {
    return {
      // pickerOptions0: {
      //   disabledDate: (time) => {
      //     //如果已经已知结束日期,就把结束日期之后的日期禁用
      //     if (this.form.endTime) {
      //       return time.getTime() > new Date(this.form.endTime).getTime();
      //     } else {
      //       //否则 就把当前日期之后的日期禁用掉
      //       return time.getTime() > Date.now();
      //     }
      //   },
      // },
      // pickerOptions1: {
      //   disabledDate: (time) => {
      //     //如果已知开始日期,就把开始日期之前的日期禁用掉
      //     if (this.form.startTime) {
      //       return time.getTime() < new Date(this.form.startTime).getTime();
      //     }
      //   },
      // },
      config: config,
      curUser: null,
      optionMes: [
        {
          label: "是",
          value: 0,
        },
        {
          label: "否",
          value: 1,
        },
      ],
      title: "添加物资类型",
      categoryType: [],
      form: {
        name: "", //采购名称
        content: "",
        useDept: "",
        relationId: "", //申请时间
        startTime: "", //开始时间
        endTime: "", //结束时间
        dept: "",
        deptStaff: "",
        dept: "", //督办部门
        totalPrice: "", //督办人员
        typeOne: "",
      },

      files: [], //上传附件
      allDept: [], //所有部门
      existsFiles: [], //已上传附件
      param: {},
      dialogFormVisible: false,
      departments: [],
      meetRooms: [],
      tableData: [],
      Materials: [],
      otherCost: [], //其他费用
      option: [],
      superviseUsers: [], //督办人员
      allSuperviseUsers: [], //所有督办人员
      itemKey: 1,
      rules: {
        name: [{ required: true, message: "填写会议名称" }],
        relationId: [{ required: true, message: "请选择会议室" }],
        dept: [{ required: true, message: "请选择参会部门" }],
        deptStaff: [{ required: true, message: "请选择参会人员" }],
        useDept: [{ required: true, message: "请选择申请部门" }],
        personLiable: [{ required: true, message: "请选择申请人" }],
        startTime: [{ required: true, message: "请选择会议开始时间" }],
        endTime: [{ required: true, message: "请选择会议结束时间" }],
      },
    };
  },

  async created() {
    if (this.config && this.config.hasOwnProperty("metrialCategories"))
      this.categoryType = this.config.metrialCategories;
    //获取部门
    getCompanyAll().then((res) => {
      if (res.code == 1) {
        this.departments = res.result;
      }
    });
    //获取会议室列表
    getconferenceroom().then((res) => {
      if (res.code === 1) {
        this.meetRooms = res.result.records;
      }
    });

    /**
     * 查询所有用户所有部门和所有人
     */
    getAllUserInfo().then((res) => {
      const data = res.result;
      for (const i in data) {
        data[i].value = data[i].id;
        data[i].label = data[i].name;
        if (data[i].users) {
          data[i].children = data[i].users;
          for (const j in data[i].children) {
            data[i].children[j].value = data[i].children[j].id;
            data[i].children[j].label = data[i].children[j].realName;
          }
        }
      }
      this.option = data;
    });

    //如果当前状态为可编辑状态获取当前申购部门和申购人
    if (this.isOpt && JSON.stringify(this.editData) === "{}") {
      this.curUser = this.$store.state.user;
      this.form.personLiable = this.curUser.realName;
      this.form.useDept = parseInt(this.curUser.departmentId);
      this.form.registerTime = parseTime(new Date(), "{y}-{m}-{d} {h}:{i}:{s}");
    } else {
      this.paramMappingToFrom();
    }
  },
  mounted() {},
  methods: {
    /**
     * 映射出表单参数
     */
    paramMappingToFrom() {
      if (!(JSON.stringify(this.editData) === "{}")) {
        this.form["name"] = this.editData.name; //采购单名称
        this.form["useDept"] = this.editData.registerDept; //申购部门
        this.form["personLiable"] = this.editData.registerStaffName; //申购人
        this.form["totalPrice"] = this.editData.totalPrice; //申购人
        this.form["remark"] = this.editData.remark; //备注
        this.form["registerTime"] = parseTime(
          new Date(this.editData.registerTime),
          "{y}-{m}-{d} {h}:{i}:{s}"
        ); //申购时间
        this.form["startTime"] = parseTime(
          new Date(this.editData.startTime),
          "{y}-{m}-{d} {h}:{i}:{s}"
        ); //开始时间
        this.form["endTime"] = parseTime(
          new Date(this.editData.endTime),
          "{y}-{m}-{d} {h}:{i}:{s}"
        ); //结束时间

        if (this.editData.hasOwnProperty("processNodeVos")) {
          //找到步骤相关数据
          let processNodeVos = this.editData.processNodeVos.filter(
            (pn) => pn.processStep == this.step.stepOrder
          );
          if (processNodeVos.length > 0) {
            this.form["typeOne"] = processNodeVos[0].typeOne; //通知
            this.form["content"] = processNodeVos[0].documentVo.content; //会议内容
            this.form["relationId"] =
              processNodeVos[0].relationInfoVo[0].relationId; //会议室地址
            let dept = [];
            let deptStaff = [];
            processNodeVos[0].processStaffVos.forEach((item) => {
              dept.push(item.dept);
              deptStaff.push(item.deptStaffName);
            });
            this.form["dept"] = this.unique(dept);
            this.form["deptStaff"] = deptStaff;
            //附件
            if (processNodeVos[0].hasOwnProperty("files")) {
              const files = processNodeVos[0].files;
              if (files) {
                this.existsFiles = [];
                files.forEach((file) => {
                  this.existsFiles.push(file);
                });
              }
            }
          }
        }
      }
    },
    unique(arr) {
      return Array.from(new Set(arr));
    },
    /**
     * 申购时间改变
     */
    startTimeChange(value) {
      this.form.startTime = parseTime(
        new Date(value),
        "{y}-{m}-{d} {h}:{i}:{s}"
      ); //申购时间
    },
    /**
     * 申购时间改变
     */
    endTimeChange(value) {
      this.form.endTime = parseTime(new Date(value), "{y}-{m}-{d} {h}:{i}:{s}"); //申购时间
    },

    //监督部门改变
    superviseDeptChange(value) {
      this.superviseUsers = [];
      this.allSuperviseUsers = [];
      //情况督办人员
      this.form.deptStaff = [];
      value.forEach((item) => {
        const obj = this.option.find((it) => it.id == item);
        if (obj && obj.hasOwnProperty("users") && obj.users.length > 0)
          this.allSuperviseUsers = this.allSuperviseUsers.concat(obj.users);
      });
      this.superviseUsers = this.option.filter(
        (item) => value.indexOf(item.id) > -1
      );
      this.form.staffDtos = [];
      //设置督办人为空
      this.superviseUsers.forEach((item) => {
        this.form.staffDtos.push({
          dept: item.id,
          staffType: 1,
          deptStaff: "",
        });
      });
      this.form.totalPrice = this.form.deptStaff.length;
    },

    //督办人员改变
    superviseUserChange(value) {
      this.form.staffDtos = [];
      value.forEach((item) => {
        const obj = this.allSuperviseUsers.find((p) => p.id == item);
        if (obj)
          this.form.staffDtos.push({
            dept: obj.departmentId,
            staffType: 1,
            deptStaff: obj.id,
          });
      });
      this.form.totalPrice = this.form.deptStaff.length;
    },

    /**
     * 下载文件
     * @file 文件信息
     */
    downloadFile(file) {
      if (
        file &&
        file.hasOwnProperty("filePath") &&
        file.hasOwnProperty("fileName")
      ) {
        const token = this.$store.state.user.token;
        const fileName = file.fileName;
        getFiles({
          access_token: token,
          fileName: fileName,
          remotePath: file.filePath,
        }).then((src) => {
          const reader = new FileReader();
          reader.readAsDataURL(src);
          reader.onload = (e) => {
            const a = document.createElement("a");
            a.download = fileName;
            // 后端设置的文件名称在res.headers的 "content-disposition": "form-data; name=\"attachment\"; filename=\"20181211191944.zip\"",
            a.href = e.target.result;
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
          };
        });
      }
    },

    /**
     * 删除文件
     * @file 文件信息
     */
    deleteFile(file) {
      this.$confirm(
        "此操作将永久删除【" + file.fileName + "】文件, 是否继续?",
        "提示",
        {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning",
        }
      )
        .then(() => {
          this.existsFiles = this.existsFiles.filter(
            (item) => item.id != file.id
          );
        })
        .catch(() => {
          this.$message({
            type: "info",
            message: "已取消删除",
          });
        });
    },

    /**
     * 根据物资类别编号获取物资类别名称
     */
    getCategoryName(code) {
      const obj = this.categoryType.find((item) => item.code == code);
      return obj.name;
    },

    /***
     * 删除物料信息
     */
    delMaterial(row) {
      this.tableData = this.tableData.filter((item) => item.id != row.id);
    },

    /**
     * 获取上传的审核信息
     */
    getExamineInfo() {
      return this.$refs["examine"].submitForm();
    },
    submitData() {
      this.dialogFormVisible = false;
      this.tableData = this.$refs.transfer.submitData();
    },

    /**
     * 取消按钮事件
     */
    cancelSubmit() {
      this.dialogFormVisible = false;
    },

    /**
     * 提交表单数据
     */
    submitForm() {
      let flag = false;
      this.$refs["form"].validate((valid) => {
        flag = valid;
        if (valid) {
          return true;
        } else {
          return false;
        }
      });
      const files = this.$refs["upload"].submitFiles();
      let existsFilesId = "";
      this.existsFiles.forEach((item, index) => {
        existsFilesId =
          existsFilesId +
          (index < this.existsFiles - 1 ? item.id + "," : item.id);
      });
      if (flag) {
        const examine = this.$refs["examine"].submitForm();
        // this.form.startTime = parseTime(
        //   new Date(this.form.startTime),
        //   "{y}-{m}-{d} {h}:{i}:{s}"
        // );
        // this.form.endTime = parseTime(
        //   new Date(this.form.endTime),
        //   "{y}-{m}-{d} {h}:{i}:{s}"
        // );
        return {
          form: this.form,
          vehicles: this.tableData,
          examine: examine,
          existsFilesId: existsFilesId,
          files: files,
        };
      } else return null;
    },
  },
};
</script>

<style lang="scss" scoped>
.form-container {
  width: 100%;
  padding: 0 10px;
  box-sizing: border-box;
  bottom: 0;

  .el-pagination {
    margin-top: 16px;
  }

  .addBtn {
    height: 30px;
    font-size: 22px;
    color: #409eff;
    font-weight: bold;
    text-align: center;
    border: 1px solid #ebeef5;
    border-top: 0px;
    cursor: pointer;
  }
  .addBtn:hover {
    background: #ebeef5;
  }
  .tf-input-table {
    >>> .el-table__body-wrapper {
      max-height: 110px;
      overflow-y: auto !important;
    }
  }

  .tf-input-border {
    >>> input {
      border: 0 solid;
    }
  }

  .tf-col {
    .file {
      border: 1px solid #ebeef5;
      height: 40px;
      width: calc(100% - 20px);
      .file-name {
        width: calc(100% - 40px);
        float: left;
        padding: 0 10px;
        height: 40px;
        line-height: 40px;
      }
      .file-name:hover {
        background-color: #ebeef5;
        cursor: pointer;
      }
      .btn-file {
        width: 40px;
        float: left;
        height: 40px;
        line-height: 40px;
        text-align: center;
        background-color: #ebeef5;
      }
      .btn-file:hover {
        color: #abbac7;
        cursor: pointer;
      }
    }
  }
}
.el-table {
  >>> .el-table__body {
    tr {
      &:nth-child(2n) {
        background-color: #f0f9eb;
      }
      td {
        height: 23px;
        line-height: 23px;
        padding: 2px 1px !important;
        .el-button {
          padding: 0;
        }
      }
    }
  }
}
.el-dialog__wrapper {
  >>> .el-form-item {
    margin-bottom: 15px !important;
  }
  .item-title {
    width: 100%;
    height: 30px;
    line-height: 30px;
    margin-bottom: 10px;
    font-weight: 600;
    &::before {
      content: "";
      display: inline-block;
      width: 5px;
      height: 18px;
      vertical-align: text-bottom;
      background-color: #2d74e7;
      margin-right: 5px;
    }
  }
}
.tf-dialog {
  >>> .el-dialog__header {
    background: #2d74e7;
    .el-dialog__title {
      color: aliceblue !important;
    }
    .el-dialog__close {
      color: aliceblue !important;
    }
  }
  >>> .el-dialog__body {
    padding: 10px;
  }
}
>>> .el-form-item__error {
  margin-top: -7px;
}
</style>