<template>
  <basic-container>
    <avue-crud
      :option="option"
      :table-loading="loading"
      :data="data"
      ref="crud"
      v-model="form"
      :permission="permissionList"
      :before-open="beforeOpen"
      @row-del="rowDel"
      @row-update="rowUpdate"
      @row-save="rowSave"
      @search-change="searchChange"
      @search-reset="searchReset"
      @selection-change="selectionChange"
      @current-change="currentChange"
      @size-change="sizeChange"
      @refresh-change="refreshChange"
      @on-load="onLoad"
    >
      <template slot="menuLeft">
        <el-button
          type="danger"
          size="small"
          icon="el-icon-delete"
          v-if="permission.role_delete"
          plain
          @click="handleDelete"
        >删 除
        </el-button>
        <el-button
          size="small"
          icon="el-icon-setting"
          @click="handleRole"
          v-if="userInfo.role_name.includes('admin')"
          plain
        >权限设置
        </el-button>
      </template>
    </avue-crud>
    <el-dialog
      title="角色权限配置"
      append-to-body
      :visible.sync="box"
      width="610px"
    >
      <el-tabs type="border-card">
        <el-tab-pane label="后管菜单权限">
          <el-tree
            :data="menuGrantList"
            show-checkbox
            node-key="id"
            ref="treeMenu"
            :default-checked-keys="menuTreeObj"
            :props="props"
          >
          </el-tree>
        </el-tab-pane>

        <el-tab-pane label="客户端菜单权限">
          <el-tree
            :data="menuClientList"
            show-checkbox
            node-key="id"
            ref="treeClientMenu"
            :default-checked-keys="menuClientObj"
            :props="props"
          >
          </el-tree>
        </el-tab-pane>

        <el-tab-pane label="档案菜单权限">
          <el-tree
            :data="archivesMenuList"
            show-checkbox
            node-key="id"
            ref="treeArchivestMenu"
            :default-checked-keys="archivesmenuObj"
            :props="props"
          >
          </el-tree>
        </el-tab-pane>

        <el-tab-pane label="内控菜单权限">
          <el-tree
            :data="hacMenuList"
            show-checkbox
            node-key="id"
            ref="treeHacMenu"
            :default-checked-keys="hacmenuObj"
            :props="props"
          >
          </el-tree>
        </el-tab-pane>

        <el-tab-pane label="征拆菜单权限">
          <el-tree
            :data="larMenuList"
            show-checkbox
            node-key="id"
            ref="treelarMenu"
            :default-checked-keys="larmenuObj"
            :props="props"
          >
          </el-tree>
        </el-tab-pane>
        <el-tab-pane label="计量支付菜单权限">
          <el-tree
            :data="meteringList"
            show-checkbox
            node-key="id"
            ref="treeMeteMenu"
            :default-checked-keys="meteringObj"
            :props="props"
          >
          </el-tree>
        </el-tab-pane>
        <el-tab-pane label="安全管理菜单权限">
          <el-tree
            :data="safeList"
            show-checkbox
            node-key="id"
            ref="treeSafeMenu"
            :default-checked-keys="safeObj"
            :props="props"
          >
          </el-tree>
        </el-tab-pane>
        <el-tab-pane label="表单权限">
          <el-tree
            :data="tableOwnerList"
            show-checkbox
            node-key="id"
            ref="tableOwners"
            :default-checked-keys="tableOwnerObj"
            :props="props"
          >
          </el-tree>
        </el-tab-pane>

        <el-tab-pane label="数据权限">
          <el-tree
            :data="dataScopeGrantList"
            show-checkbox
            node-key="id"
            ref="treeDataScope"
            :default-checked-keys="dataScopeTreeObj"
            :props="props"
          >
          </el-tree>
        </el-tab-pane>
        <el-tab-pane label="接口权限">
          <el-tree
            :data="apiScopeGrantList"
            show-checkbox
            node-key="id"
            ref="treeApiScope"
            :default-checked-keys="apiScopeTreeObj"
            :props="props"
          >
          </el-tree>
        </el-tab-pane>

      </el-tabs>

      <span
        slot="footer"
        class="dialog-footer"
      >
        <el-button @click="box = false">取 消</el-button>
        <el-button
          type="primary"
          @click="submit"
        >确 定</el-button>
      </span>
    </el-dialog>
  </basic-container>
</template>

<script>
  import {add, getList, getRole, getRoleTreeById, grant, grantTree, remove, update} from "@/api/system/role";
  import {getPostList} from "@/api/system/post";
  import {mapGetters} from "vuex";
  import website from '@/config/website';

  export default {
    data() {
      return {
        form: {},
        box: false,
        props: {
          label: "title",
          value: "key"
        },
        menuGrantList: [],
        archivesMenuList:[],
        larMenuList:[],
        hacMenuList:[],
        meteringList:[],//计量
        safeList:[],//安全管理
        dataScopeGrantList: [],
        menuClientList: [],
        apiScopeGrantList: [],
        tableOwnerList: [],
        apiGrantList: [],
        menuTreeObj: [],
        menuClientObj: [],
        archivesmenuObj:[],
        larmenuObj:[],
        hacmenuObj:[],
        meteringObj:[],
        safeObj:[],
        tableOwnerObj: [],
        dataScopeTreeObj: [],
        apiScopeTreeObj: [],
        selectionList: [],
        query: {},
        loading: true,
        page: {
          pageSize: 10,
          currentPage: 1,
          total: 0
        },
        option: {
          tip: false,
          simplePage: true,
          searchShow: true,
          searchMenuSpan: 6,
          tree: true,
          border: true,
          index: true,
          selection: true,
          viewBtn: true,
          dialogWidth: 900,
          dialogClickModal: false,
          column: [
            {
              label: "角色名称",
              prop: "roleName",
              search: true,
              span: 24,
              rules: [
                {
                  required: true,
                  message: "请输入角色名称",
                  trigger: "blur"
                }
              ]
            },
            {
              label: "所属租户",
              prop: "tenantId",
              type: "tree",
              dicUrl: "/api/blade-system/tenant/select",
              addDisplay: false,
              editDisplay: false,
              viewDisplay: website.tenantMode,
              span: 24,
              props: {
                label: "tenantName",
                value: "tenantId"
              },
              hide: !website.tenantMode,
              search: website.tenantMode,
              rules: [{
                required: true,
                message: "请输入所属租户",
                trigger: "click"
              }]
            },
            {
              label: "角色别名",
              prop: "roleAlias",
              search: true,
              span: 24,
              rules: [
                {
                  required: true,
                  message: "请输入角色别名",
                  trigger: "blur"
                }
              ]
            },
            {
              label: "上级角色",
              prop: "parentId",
              dicData: [],
              type: "tree",
              hide: true,
              span: 24,
              props: {
                label: "title"
              },
              rules: [
                {
                  required: false,
                  message: "请选择上级角色",
                  trigger: "click"
                }
              ]
            },
            {
              label: "角色排序",
              prop: "sort",
              type: "number",
              span: 24,
              rules: [
                {
                  required: true,
                  message: "请输入角色排序",
                  trigger: "blur"
                }
              ]
            }
          ]
        },
        data: []
      };
    },
    computed: {
      ...mapGetters(["userInfo", "permission"]),
      permissionList() {
        return {
          addBtn: this.vaildData(this.permission.role_add, false),
          viewBtn: this.vaildData(this.permission.role_view, false),
          delBtn: this.vaildData(this.permission.role_delete, false),
          editBtn: this.vaildData(this.permission.role_edit, false)
        };
      },
      ids() {
        let ids = [];
        this.selectionList.forEach(ele => {
          ids.push(ele.id);

        });
        return ids.join(",");
      },
      idsArray() {
        console.log(this.selectionList,'this.selectionList');
        let ids = [];
        this.selectionList.forEach(ele => {
          ids.push(ele.id);
        });
        return ids;
      }
    },
    methods: {
      initData(roleId) {
        getRoleTreeById(roleId).then(res => {
          const column = this.findObject(this.option.column, "parentId");
          column.dicData = res.data.data;
        });
        let tenantId = website.tenantId;
        getPostList(tenantId).then(res => {
          const column = this.findObject(this.option.column, "pId");
          column.dicData = res.data.data;
        });
      },

      submit() {
        const menuList = this.$refs.treeMenu.getCheckedKeys();
        const menuClientList = this.$refs.treeClientMenu.getCheckedKeys();
        const menuArchivesList = this.$refs.treeArchivestMenu.getCheckedKeys();
        const menuHacList=this.$refs.treeHacMenu.getCheckedKeys();
        const menuLarList= this.$refs.treelarMenu.getCheckedKeys();
        const menuMeteList= this.$refs.treeMeteMenu.getCheckedKeys();
        const menuSafeList= this.$refs.treeSafeMenu.getCheckedKeys();
        const menuListHanlf = this.$refs.treeMenu.getHalfCheckedKeys();
        const menuClientListHanlf = this.$refs.treeClientMenu.getHalfCheckedKeys();
        const menuArchivesListHalf = this.$refs.treeArchivestMenu.getHalfCheckedKeys();
        const menuLarsListHalf = this.$refs.treelarMenu.getHalfCheckedKeys();
        const menuHacListHalf = this.$refs.treeHacMenu.getHalfCheckedKeys();
        const menuMeteListHalf = this.$refs.treeMeteMenu.getHalfCheckedKeys();
        const menuSafeListHalf = this.$refs.treeSafeMenu.getHalfCheckedKeys();
        const dataScopeList = this.$refs.treeDataScope.getCheckedKeys();
        const apiScopeList = this.$refs.treeApiScope.getCheckedKeys();
        const tableOwnersList = this.$refs.tableOwners.getCheckedKeys();

        let menuAll = [];
        let menuClientAll = [];
        let menuArchivesAll = [];
        let menuHacAll = [];
        let menuLarAll = [];
        let menuMeteAll=[]
        let menuSafeAll=[]
        menuList.forEach((id)=>{
          menuAll.push(id+'---all')
        })
        menuListHanlf.forEach((id)=>{
          menuAll.push(id+'---hanlf')
        })

        menuClientList.forEach((id)=>{
          menuClientAll.push(id+'---all')
        })
        menuClientListHanlf.forEach((id)=>{
          menuClientAll.push(id+'---hanlf')
        })
         menuArchivesList.forEach((id)=>{
          menuArchivesAll.push(id+'---all')
        })
        menuArchivesListHalf.forEach((id)=>{
          menuArchivesAll.push(id+'---hanlf')
        })

        menuHacList.forEach((id)=>{
          menuHacAll.push(id+'---all')
        })
        menuHacListHalf.forEach((id)=>{
          menuHacAll.push(id+'---hanlf')
        })

        menuLarList.forEach((id)=>{
          menuLarAll.push(id+'---all')
        })
        menuLarsListHalf.forEach((id)=>{
          menuLarAll.push(id+'---hanlf')
        })
        
        menuMeteList.forEach((id)=>{
          menuMeteAll.push(id+'---all')
        })
        menuMeteListHalf.forEach((id)=>{
          menuMeteAll.push(id+'---hanlf')
        })
        menuSafeList.forEach((id)=>{
          menuSafeAll.push(id+'---all')
        })
        menuSafeListHalf.forEach((id)=>{
          menuSafeAll.push(id+'---hanlf')
        })
        grant(this.idsArray, menuAll, menuClientAll,menuArchivesAll,menuHacAll,menuLarAll,menuMeteAll, menuSafeAll,dataScopeList, apiScopeList, tableOwnersList).then(() => {
          this.box = false;
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          this.onLoad(this.page);
        });
      },

      rowSave(row, done, loading) {
        add(row).then(() => {
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          done();
        }, error => {
          window.console.log(error);
          loading();
        });
      },

      rowUpdate(row, index, done, loading) {
        update(row).then(() => {
          this.onLoad(this.page);
          this.$message({
            type: "success",
            message: "操作成功!"
          });
          done();
        }, error => {
          window.console.log(error);
          loading();
        });
      },

      rowDel(row) {
        this.$confirm("确定将选择数据删除?", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        })
          .then(() => {
            return remove(row.id);
          })
          .then(() => {
            this.onLoad(this.page);
            this.$message({
              type: "success",
              message: "操作成功!"
            });
          });
      },

      searchReset() {
        this.query = {};
        this.onLoad(this.page);
      },
      searchChange(params, done) {
        this.query = params;
        this.page.currentPage = 1;
        this.onLoad(this.page, params);
        done();
      },
      selectionChange(list) {
        this.selectionList = list;
      },
      selectionClear() {
        this.selectionList = [];
        this.$refs.crud.toggleSelection();
      },
      beforeOpen(done, type) {
        if (["add", "edit"].includes(type)) {
          this.initData(this.form.id);
        }
        done();
      },

      handleRole() {
        if (this.selectionList.length !== 1) {
          this.$message.warning("只能选择一条数据");
          return;
        }
        this.menuTreeObj = [];
        this.menuClientObj = [];
        this.archivesmenuObj=[];
        this.larmenuObj=[]
        this.hacmenuObj=[];
        this.meteringObj=[];
        this.safeObj=[]
        this.dataScopeTreeObj = [];
        this.apiScopeTreeObj = [];
        this.tableOwnerObj = [];
        grantTree()
          .then(res => {
            this.menuGrantList = res.data.data.menu;
            this.archivesMenuList= res.data.data.archivesMenu;
            this.larMenuList= res.data.data.larMenu;
            this.meteringList=res.data.data.measureMenu;
            this.safeList=res.data.data.secureMenu;
            this.hacMenuList=res.data.data.hacMenu;
            this.menuClientList = res.data.data.usermenu;
            this.tableOwnerList = res.data.data.tableOwners;
            this.dataScopeGrantList = res.data.data.dataScope;
            this.apiScopeGrantList = res.data.data.apiScope;
            getRole(this.ids).then(res => {
              let menuTreeObj = [];
              res.data.data.menu.forEach((item)=>{
                let arr = item.split("---");
                if(arr[1] == 'all'){
                  menuTreeObj.push(arr[0])
                }
              });
              this.menuTreeObj = menuTreeObj;

              let menuClientObj = [];
              let archivesmenuObj=[];
              let larmenuObj=[]
              let hacmenuObj=[]
              let meteringObj=[]
              let safeObj=[]
              res.data.data.usermenu.forEach((item)=>{
                let arr = item.split("---");
                if(arr[1] == 'all'){
                  menuClientObj.push(arr[0])
                  archivesmenuObj.push(arr[0])
                  hacmenuObj.push(arr[0])
                  larmenuObj.push(arr[0])
                  meteringObj.push(arr[0])
                  safeObj.push(arr[0])
                }
              });
              this.menuClientObj = menuClientObj;
              this.archivesmenuObj=archivesmenuObj
              this.hacmenuObj=hacmenuObj
              this.larmenuObj=larmenuObj
              this.meteringObj=meteringObj
              this.safeObj=safeObj

              this.tableOwnerObj = res.data.data.tableOwners;
              this.dataScopeTreeObj = res.data.data.dataScope;
              this.apiScopeTreeObj = res.data.data.apiScope;
              this.box = true;
            });
          });
      },

      handleDelete() {
        if (this.selectionList.length === 0) {
          this.$message.warning("请选择至少一条数据");
          return;
        }
        this.$confirm("确定将选择数据删除?", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
        })
          .then(() => {
            return remove(this.ids);
          })
          .then(() => {
            this.onLoad(this.page);
            this.$message({
              type: "success",
              message: "操作成功!"
            });
            this.$refs.crud.toggleSelection();
          });
      },
      currentChange(currentPage) {
        this.page.currentPage = currentPage;
      },
      sizeChange(pageSize) {
        this.page.pageSize = pageSize;
      },
      refreshChange() {
        this.onLoad(this.page, this.query);
      },
      onLoad(page, params = {}) {
        this.loading = true;
        getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
          this.data = res.data.data;
          this.loading = false;
          this.selectionClear();
        });
      }
    }
  };
</script>
