<!--
 * @Author       : yuanrunwei
 * @Date         : 2021-12-04 14:23:58
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2022-01-14 16:12:41
 * @FilePath     : \spfm-market-front\src\pages\main\performance\components\sheet.vue
-->

<template>
  <div class="sheet-container">
    <div class="flex-justify-align-end margin-bottom-20">
      <el-button
        type="primary"
        @click="handleVisible"
        v-if="['template'].includes(attribute)"
        >权限设置</el-button
      >
      <el-button type="primary" @click="handleDownload">导出</el-button>
      <el-button type="primary" @click="handleFullscreen()">全屏显示</el-button>
      <template v-if="['edit'].includes(type)">
        <el-upload
          v-if="!id"
          class="margin-right-10 margin-left-10"
          action
          :on-change="handleChange"
          :show-file-list="false"
        >
          <el-button type="primary">上传</el-button>
        </el-upload>

        <el-button
          v-if="addFlag === '0'"
          type="primary"
          @click="handleSave"
          :disabled="handleForbid()"
          ><span>{{ id ? "提交" : "新增" }}</span
          ><span>{{
            handleForbid() ? `（请先设置权限）` : ""
          }}</span></el-button
        >
      </template>
    </div>
    <div id="luckysheet" class="sheet-container-block"></div>
    <simple-dialog
      title="权限设置"
      :visible="visible"
      :modal="false"
      width="1400px"
      @confirm="handleAuth"
      @cancel="handleVisible"
    >
      <el-form ref="form" :model="form" label-width="80px">
        <el-radio-group v-model="form.permission_type">
          <el-form-item>
            <el-radio :label="0"><span>无特殊权限</span></el-radio>
            <div>
              <span class="form-content">负责人</span>
              <el-select
                v-model="form.person"
                multiple
                placeholder="请选择负责人"
              >
                <el-option
                  v-for="({ label, value }, index) in charge_list"
                  :key="index"
                  :label="label"
                  :value="value"
                ></el-option>
              </el-select>
            </div>
            <!-- <div class="form-input">
              <span class="form-content"> 可编辑行：从</span>
              <el-input v-model="form.col_start" />
              <span class="form-content">到</span
              ><el-input v-model="form.col_end" />
            </div>
            <div class="form-input">
              <span class="form-content">可编辑列：从</span>
              <el-input v-model="form.row_start" />
              <span class="form-content">到</span>
              <el-input v-model="form.row_end" />
            </div> -->
          </el-form-item>
          <el-form-item>
            <el-radio :label="1"><span>特殊权限：</span></el-radio>
            <el-form-item
              label="负责人"
              prop="charge"
              v-for="(item, index) in form.charge"
              :key="index"
              :rules="{
                required: true,
                message: '负责人不能为空',
                trigger: 'blur',
              }"
            >
              <div class="flex">
                <el-select
                  class="margin-bottom-20 margin-right-10"
                  placeholder="请选择负责人"
                  v-model="item.person"
                  filterable
                >
                  <el-option
                    v-for="({ label, value }, index) in charge_list"
                    :key="index"
                    :label="label"
                    :value="value"
                  ></el-option>
                </el-select>
                <div class="form-select">
                  <span class="form-content">可编辑行：从</span>
                  <el-input v-model="item.col_start" />
                  <span class="form-content">到</span>
                  <el-input v-model="item.col_end" />
                </div>
                <div class="form-select">
                  <span class="form-content">可编辑列：从</span>
                  <el-input v-model="item.row_start" />
                  <span class="form-content">到</span>
                  <el-input v-model="item.row_end" />
                </div>
              </div>
            </el-form-item>
            <div>
              <el-button @click.prevent="handleCharge('add')">添加</el-button>
              <el-button
                v-if="form.charge.length - 1"
                @click.prevent="handleCharge('delete')"
                >删除</el-button
              >
            </div>
          </el-form-item>
        </el-radio-group>
        <!-- <el-form-item
                    label="可编辑列"
                    prop="array"
                    ><el-select
                        v-model="form.array"
                        placeholder="可编辑列"
                        multiple
                    >
                        <el-option
                            v-for="(value, index) in 10"
                            :key="index"
                            :label="index + 1"
                            :value="index + 1"
                        >
                        </el-option> </el-select
                ></el-form-item>
                <el-form-item
                    label="权限规则"
                    prop="type"
                    :rules="{
                        required: true,
                        message: '权限规则不能为空',
                        trigger: 'change',
                    }"
                >
                    <el-select v-model="form.type">
                        <el-option
                            v-for="item in type_options"
                            :key="item.value"
                            :label="item.label"
                            :value="item.value"
                        ></el-option> </el-select
                ></el-form-item>
                <el-form-item
                    label="负责人"
                    prop="charge"
                    :rules="{
                        required: true,
                        message: '负责人不能为空',
                        trigger: 'blur',
                    }"
                >
                    <div
                        class="flex-justify-start"
                        v-for="(item, index) in form.charge"
                        :key="index"
                    >
                        <el-select
                            v-model="item.key"
                            class="margin-bottom-20 margin-right-10 flex-1"
                            placeholder="请选择指定列/行"
                            multiple
                        >
                            <el-option
                                v-for="(value, index) in 10"
                                :key="index"
                                :label="index + 1"
                                :value="index + 1"
                            >
                            </el-option>
                        </el-select>
                        <el-select
                            class="margin-bottom-20"
                            placeholder="请选择负责人"
                            v-model="item.value"
                            filterable
                        >
                            <el-option
                                v-for="({ label, value }, index) in charge_list"
                                :key="index"
                                :label="label"
                                :value="value"
                            ></el-option>
                        </el-select>
                    </div>

                    <div>
                        <el-button @click.prevent="handleCharge('add')"
                            >添加</el-button
                        >
                        <el-button
                            v-if="form.charge.length - 1"
                            @click.prevent="handleCharge('delete')"
                            >删除</el-button
                        >
                    </div>
                </el-form-item> -->
      </el-form>
      <template v-if="id" v-slot:footer><div></div></template>
    </simple-dialog>
    <simpleDialog
      title="审批"
      :visible="manager_approve"
      :modal="false"
      @cancel="handleApprove"
    >
      <template v-slot:footer>
        <div>
          <el-button @click.prevent="handleApprove('1')">结束</el-button>
          <el-button @click.prevent="handleApprove('4')" type="primary"
            >转副总审批</el-button
          >
          <el-button @click.prevent="handleApprove('3')" type="primary"
            >转总经理审批</el-button
          >
        </div>
      </template>
    </simpleDialog>
  </div>
</template>

<script>
import luckyexcel from "luckyexcel";
import { exportExcel } from "../common/export";
import simpleDialog from "./dialog.vue";
export default {
  components: {
    simpleDialog,
  },
  props: {
    type: {
      type: String,
      default: "view", // view 查看 edit 编辑
    },
    attribute: {
      type: String,
      default: "template", // template 模板 order 工单 file 文件
    },
    id: {
      default: null,
    },
  },
  data() {
    return {
      form: {
        charge: [
          {
            person: [],
            col_start: "",
            col_end: "",
            row_start: "",
            row_end: "",
          },
        ],

        array: [],
        type: null,

        permission_type: null,
        col_start: "",
        col_end: "",
        row_start: "",
        row_end: "",
      },
      // 可提交标志
      addFlag: "0",
      isDisable: true,
      issued_id: null,
      template_id: null,
      visible: false,
      manager_approve: false,
      row_list: [],
      column_list: [],
      charge_list: [],
      type_options: [
        {
          value: 1,
          label: "按行",
        },
        // {
        //     value: 2,
        //     label: "按列",
        // },
      ],
    };
  },
  methods: {
    handleInit() {
      if (this.id) {
        this.handleQuery();
      } else {
        this.handleCreate();
      }
    },
    // // 权限选择
    // handleRadio(e){
    //     console.log(e,'e');
    // },
    handleAllow({ row, column }) {
      return (
        (!this.form.permission_type && this.type === "edit") ||
        (this.row_list.includes(row) && this.column_list.includes(column))
      );
    },
    async handleQuery() {
      let url = "";
      let key = "";
      switch (this.attribute) {
        case "template":
          url = "/market/CMKFileTemplate/QueryCMKFileTemplateById";
          key = "templateId";
          break;
        case "order":
          url = "/market/CMKIssued/CMKQueryIssuedById";
          key = "id";
          break;
        case "file":
          url = "/market/CMKIssued/CMKIssuedProcessByUser";
          key = "id";
          break;
      }
      const {
        data: {
          templateContent,
          templateName,
          issuedId,
          templateId,
          list,
          addFlag,
        },
      } = await this.$http({
        url,
        method: "post",
        headers: {
          "Content-Type": "application/json",
        },
        data: {
          [key]: this.id,
        },
      });
      this.template_id = templateId;
      this.issued_id = issuedId;
      this.addFlag = addFlag;
      console.log(addFlag, "addFlag");
      if (list && list.length) {
        const { type } = list[0];
        if (type === "1") {
          // 公共权限
          // const { allowEditingColumns, rowNum } = list[0];
          this.form = {
            permission_type: Number(type) - 1,
            person: list.map((el) => {
              return `${el.principalId},${el.principalName}`;
            }),
            charge: [
              {
                person: "",
                col_start: "",
                col_end: "",
                row_start: "",
                row_end: "",
              },
            ],
          };
        } else {
          // 特殊权限
          this.form = {
            permission_type: Number(type) - 1,
            col_start: "",
            col_end: "",
            row_start: "",
            row_end: "",
            charge: list.map((el) => ({
              person: el.principalId + "," + el.principalName,
              col_start: el.allowEditingColumns.split(",")[0],
              col_end:
                el.allowEditingColumns.split(",")[
                  el.allowEditingColumns.split(",").length - 1
                ],
              row_start: el.rowNum.split(",")[0],
              row_end: el.rowNum.split(",")[el.rowNum.split(",").length - 1],
            })),
          };
        }
        // this.form = {
        //   ...this.form,
        //   type: type,
        //   array: allowEditingColumns ? allowEditingColumns.split(",") : [],
        //   charge: list.map(({ principalId, principalName, rowNum }) => ({
        //     value: `${principalId},${principalName}`,
        //     key: rowNum.split(","),
        //   })),
        // };
        // this.form = {};
        this.row_list =
          this.type === "edit" && list[0].rowNum
            ? list[0].rowNum
                .split(",")
                .map((element) => JSON.parse(element) - 1)
            : [];
        this.column_list =
          this.type === "edit" && list[0].allowEditingColumns
            ? list[0].allowEditingColumns
                .split(",")
                .map((element) => JSON.parse(element) - 1)
            : [];
      }
      this.handleCreate({
        json: templateContent ? JSON.parse(templateContent) : {},
        name: templateName,
        type: "json",
      });
    },
    handleForbid() {
      // const object = {};
      const { permission_type } = this.form;
      if (permission_type === 0) {
        // 公共权限 暂时不用可编辑行和列
        const { person } = this.form;
        if (person.length) {
          return false;
        }
        return true;
      } else if (permission_type === 1) {
        // 特殊权限
        let flag = 1;
        const { charge } = this.form;
        charge.forEach((el) => {
          if (
            Object.values(el).filter((v) => {
              return v !== "";
            }).length === 5
          ) {
            flag = flag * 1;
          } else {
            flag = flag * 0;
          }
        });
        return !flag;
      } else {
        return true;
      }
      //  form: {
      //   charge: [
      //     {
      //       person: "",
      //       col_start: "",
      //       col_End: "",
      //       row_start: "",
      //       row_end: "",
      //     },
      //   ],
      //   array: [],
      //   type: null,
      //   permission_type: 0,
      //   col_start: "",
      //   col_end: "",
      //   row_start: "",
      //   row_end: "",
      // },

      // charge.map(({ key }) => {
      //   console.log(key);
      //   // if (key && value) {
      //   //   object[key] = value;
      //   // }
      // });
      // return !(Object.keys(object).length && type);
    },
    async handleCreate({ file, json, type, name } = {}) {
      let that = this;
      const options = {
        container: "luckysheet",
        lang: "zh",
        showsheetbar: false,
        hook: {
          cellEditBefore: function ([
            { row_focus: row, column_focus: column },
          ]) {
            if (!that.handleAllow({ row, column })) {
              that.$message.error("您没有编辑权限");
            }
          },
          cellUpdateBefore: function (row, column) {
            if (!that.handleAllow({ row, column })) {
              return false;
            }
          },
          cellRenderAfter: function (cell, position) {
            const { r: row, c: column } = position;
            if (cell) {
              if (!that.handleAllow({ row, column })) {
                cell.bg = "#d5d5d5";
              } else {
                cell.bg = "#ffffff";
              }
            }
          },
        },
      };
      switch (type) {
        case "file":
          if (file) {
            await new Promise((resolve) => {
              luckyexcel.transformExcelToLucky(file, (export_json) => {
                options.data = [
                  ...export_json.sheets.map((element) => ({
                    ...element,
                    zoomRatio: 0.75,
                  })),
                ];
                options.title = export_json.info.name;
                resolve();
              });
            });
          }
          break;
        case "json":
          if (json) {
            options.data = [
              {
                ...json,
                zoomRatio: 0.75,
              },
            ];
            options.title = name;
          }
          break;
      }
      window.luckysheet.create(options);

      let clock = setInterval(() => {
        if (window.luckysheet) {
          window.luckysheet.refresh();
          clearInterval(clock);
        }
      }, 1000);
    },
    async handleChange(response) {
      this.handleCreate({ file: response.raw, type: "file" });
    },
    handleDownload() {
      exportExcel(
        window.luckysheet.getAllSheets(),
        window.luckysheet.getWorkbookName()
      );
    },
    async handleAddAuth({ id }) {
      // const object = {};
      const { permission_type } = this.form;
      console.log(id, permission_type);
      let reqdata = {
        templateId: id,
        type: permission_type ? 2 : 1,
      };
      if (!permission_type) {
        //  公共权限
        const { person } = this.form;
        const principalId = [];
        const principalName = [];
        person.forEach((el) => {
          principalId.push(el.split(",")[0]);
          principalName.push(el.split(",")[1]);
        });
        reqdata.principalId = principalId.join(",");
        reqdata.principalName = principalName.join(",");
      } else {
        const { charge } = this.form;
        //  特殊权限
        reqdata.specialAuth = charge.map((el) =>
          JSON.stringify({
            allowEditingColumns: this.paramsArr(el.col_start, el.col_end),
            rowNum: this.paramsArr(el.row_start, el.row_end),
            principalId: el.person.split(",")[0],
            principalName: el.person.split(",")[1],
          })
        );
      }
      await this.$http({
        url: this.id
          ? "/market/CMKFileTemplateAuthority/CMKFileTemplateAuthorityUpdate"
          : "/market/CMKFileTemplateAuthority/CMKFileTemplateAuthorityAdd",
        method: "post",
        headers: {
          "Content-Type": "application/json",
        },
        data: reqdata,
      });
      this.$message.success("操作成功");
    },
    async handleSave() {
      let edit_url = "";
      switch (this.attribute) {
        case "template":
          edit_url = "";
          break;
        case "order":
          edit_url = "";
          break;
        case "file":
          edit_url = "/market/CMKIssued/CMKIssuedSubmit";
          break;
      }
      const sheet_name = window.luckysheet.getSheet().name;
      const data = window.luckysheet.getSheet(sheet_name);
      const workbook_name = window.luckysheet.getWorkbookName();
      if (!this.id) {
        // 新增时添加权限
        const {
          data: { body },
        } = await this.$http({
          url: "/market/CMKFileTemplate/CMKFileTemplateAdd", // 新增
          method: "post",
          headers: {
            "Content-Type": "application/json",
          },
          data: {
            id: this.template_id,
            templateContent: JSON.stringify(data),
            templateName: workbook_name,
            issuedId: this.issued_id,
          },
        });
        this.handleAddAuth({ id: body });
        this.$emit("save");
      } else {
        // 职位
        let duty = JSON.parse(sessionStorage.userInfo).duty;
        if (duty === "7") {
          this.manager_approve = true;
        } else {
          // 员工提交
          await this.$http({
            url: edit_url, // 新增
            method: "post",
            headers: {
              "Content-Type": "application/json",
            },
            data: {
              id: this.template_id,
              templateContent: JSON.stringify(data),
              templateName: workbook_name,
              issuedId: this.issued_id,
            },
          });
          this.$emit("save");
        }
      }
    },
    handleAuth() {
      this.$refs["form"].validate((valid) => {
        if (valid) {
          if (this.handleForbid()) {
            this.$message.error("请完善可编辑信息");
            return false;
          }
          this.handleVisible();
          if (this.id) {
            this.handleAddAuth({ id: this.id });
          } else {
            this.$message.success("设置成功");
          }
        }
      });
    },
    // 通用方法用于转化全局
    paramsArr(start, end) {
      const arr = [];
      console.log(start, end);
      for (let i = Number(start); i <= Number(end); i++) {
        arr.push(i);
      }
      return arr.join(",");
    },
    filterName(id, arr) {
      return arr.filter((el) => el.secLeaderLogin === id)[0].secLeaderName;
    },
    handleCharge(type) {
      switch (type) {
        case "add":
          this.form.charge.push({
            person: "",
          });
          this.handleForbid();
          break;
        case "delete":
          this.form.charge.pop();
          this.handleForbid();
          break;
      }
    },
    handleVisible() {
      console.log(this.form, "aada");
      this.visible = !this.visible;
    },
    async handleApprove(type) {
      if (type) {
        const sheet_name = window.luckysheet.getSheet().name;
        const data = window.luckysheet.getSheet(sheet_name);
        const workbook_name = window.luckysheet.getWorkbookName();
        await this.$http({
          url: "/market/CMKIssued/CMKIssuedSubmit", // 新增
          method: "post",
          headers: {
            "Content-Type": "application/json",
          },
          data: {
            id: this.template_id,
            templateContent: JSON.stringify(data),
            templateName: workbook_name,
            issuedId: this.issued_id,
          },
        });
        let params = { id: this.issued_id };
        switch (type) {
          case "1":
            params = {
              ...params,
              operateName: "结束",
              status: 3,
            };
            break;
          case "4":
            params = {
              ...params,
              operateName: "转副总审批",
              reviewType: 2,
            };
            break;
          case "3":
            params = {
              ...params,
              operateName: "转总经理审批",
              reviewType: 3,
            };
            break;
        }
        await this.$http({
          url: "/market/CMKIssued/CMKIssuedCheck", // 新增
          method: "post",
          headers: {
            "Content-Type": "application/json",
          },
          data: params,
        });
        this.$message({
          type: "success",
          message: "审批成功",
        });
        this.manager_approve = false;
        this.$emit("save");
      } else {
        this.manager_approve = false;
      }
    },
    handleFullscreen() {
      const element = document.body;
      const is_fullscreen =
        document.fullScreen ||
        document.mozFullScreen ||
        document.webkitIsFullScreen;
      if (!is_fullscreen) {
        //进入全屏,多重短路表达式
        (element.requestFullscreen && element.requestFullscreen()) ||
          (element.mozRequestFullScreen && element.mozRequestFullScreen()) ||
          (element.webkitRequestFullscreen &&
            element.webkitRequestFullscreen()) ||
          (element.msRequestFullscreen && element.msRequestFullscreen());
      } else {
        //退出全屏,三目运算符
        document.exitFullscreen
          ? document.exitFullscreen()
          : document.mozCancelFullScreen
          ? document.mozCancelFullScreen()
          : document.webkitExitFullscreen
          ? document.webkitExitFullscreen()
          : "";
      }
    },
    handleChargeList() {
      this.$http({
        url: "/market/techcentergj/queryLeaderList",
        method: "post",
        headers: {
          "Content-Type": "application/json",
        },
        data: {},
      }).then((response) => {
        this.charge_list = response.data.map((element) => ({
          label: `${element.ou} ${element.secLeaderName}`,
          value: `${element.secLeaderLogin},${element.secLeaderName}`,
        }));
      });
    },
  },
  mounted() {
    this.handleInit();
    this.handleChargeList();
  },
};
</script>

<style lang="scss" scope>
.sheet-container {
  position: fixed;
  width: calc(100% - 40px);
  height: 100%;
  &-block {
    overflow: hidden;
    position: absolute;
    width: 100%;
    height: 75%;
  }
}
.form {
  &-input {
    margin-top: 5px;
    .el-input {
      width: 150px;
      .el-input__inner {
        height: 30px !important;
        line-height: 30px !important;
      }
    }
  }
  &-content {
    margin: 0px 10px;
  }
  &-select {
    .el-input {
      width: 100px;
      .el-input__inner {
        height: 30px !important;
        line-height: 30px !important;
      }
    }
  }
}
</style>
