Newer
Older
cockpit_hxrq_front / src / views / system / dept / mergeDept.vue
StephanieGitHub on 30 Apr 2021 6 KB MOD:完善岗位、员工管理
<template>
  <el-dialog :visible.sync="dialogFormVisible" title="合并部门" width="60%" append-to-body>
    <div>
      <el-row>
        <el-col :span="12">
          <div style="margin-bottom:20px;">
            <div style="margin-bottom:20px; font-size: 16px">请选择要合并的部门:</div>
            <el-input :value="oldDeptNames" size="small" placeholder="至少选择1个,最多5个"/>
          </div>
          <el-scrollbar class="deptScroll">
            <el-tree
              v-loading = "treeLoading"
              ref="tree1"
              :data="deptTree"
              :props="defaultProps"
              :default-expand-all="true"
              :expand-on-click-node="false"
              :check-on-click-node="true"
              :check-strictly="true"
              node-key="id"
              show-checkbox
              class="filter-tree"
              @check-change="oldDeptCheckChange"
            />
          </el-scrollbar>
        </el-col>
        <el-col :span="1">
          <el-divider direction="vertical"/>
        </el-col>
        <el-col :span="11">
          <div style="margin-bottom:20px;">
            <div style="margin-bottom:20px; font-size: 16px">请选择要合并到的部门:</div>
            <el-input :value="newDept?newDept.name:''" size="small" placeholder="只能选择1个"/>
          </div>
          <el-scrollbar class="deptScroll">
            <el-tree
              v-loading = "treeLoading"
              ref="tree2"
              :data="newDeptTree"
              :props="defaultProps"
              :default-expand-all="true"
              :expand-on-click-node="false"
              :check-on-click-node="true"
              :check-strictly="true"
              node-key="id"
              show-checkbox
              class="single-tree"
              @check-change="newDeptCheckChange"
            />
          </el-scrollbar>
        </el-col>
      </el-row>
    </div>

    <div slot="footer" class="dialog-footer">
      <el-button :loading="btnLoading" type="primary" @click="saveData">合并部门</el-button>
      <el-button @click="cancel">取消</el-button>
    </div>
  </el-dialog>
</template>

<script>
import { toTreeList } from '@/utils/structure'
import SelectTree from '@/components/SelectTree/singleSelect'
import { getDeptTreeList, mergeDept } from '@/api/system/dept'
import DeptSelect from '@/components/DeptSelect'

export default {
  name: 'MergeDept',
  components: { DeptSelect, SelectTree },
  data() {
    return {
      dialogFormVisible: false, // 对话框是否显示
      dialogStatus: '', // 对话框类型:create,update
      deptForm: {
        oldDeptIds: [],
        newDeptId: ''
      }, // 表单
      oldDepts: [],
      newDept: null,
      deptTree: null,
      newDeptTree: null,
      defaultProps: {
        children: 'children',
        label: 'name'
      },
      treeLoading: false,
      btnLoading: false // 保存按钮的加载中状态
    }
  },
  computed: {
    oldDeptNames() {
      const list = this.oldDepts.map(item => item.name)
      return list.join(', ')
    }
  },
  methods: {
    // 初始化对话框
    initDialog: function() {
      this.dialogFormVisible = true
      this.fetchDeptTree()
    },
    // 获取组织结构树
    fetchDeptTree() {
      this.treeLoading = true
      getDeptTreeList(this.listQuery).then(response => {
        const deptTree = toTreeList(response.data.list, '0', true)
        this.deptTree = deptTree
        this.newDeptTree = JSON.parse(JSON.stringify(deptTree)) // 复制出一棵树
        this.deptTree[0].disabled = true
        this.treeLoading = false
      })
    },
    oldDeptCheckChange(data, checked) {
      if (checked) {
        this.oldDepts.push(data)
      } else {
        const index = this.oldDepts.findIndex(item => item.id === data.id)
        this.oldDepts.splice(index, 1)
      }
    },
    newDeptCheckChange(data, checked) {
      if (checked) {
        var labvalojb = data // 暂存选中节点
        this.newDept = data
        this.$refs.tree2.setCheckedKeys([]) // 删除所有选中节点
        this.$refs.tree2.setCheckedNodes([labvalojb]) // 选中已选中节点
      }
    },
    // 重置表单
    resetForm() {
      this.deptForm = {
        oldDeptIds: [],
        newDeptId: ''
      }
    },
    // 保存数据
    saveData: function() {
      // 先校验
      if (this.validate()) {
        this.deptForm = {
          oldDeptIds: this.oldDepts.map(item => item.id),
          newDeptId: this.newDept.id
        }
        this.$confirm('合并部门后可能会影响到角色权限,部分需要重新配置,是否确认合并?', '确认信息', {
          distinguishCancelAndClose: true,
          confirmButtonText: '合并',
          cancelButtonText: '放弃'
        })
          .then(() => {
            mergeDept(this.deptForm).then(response => {
              if (response.code === 200) {
                this.$message.success('合并成功')
                this.btnLoading = false
                this.resetForm()
                this.$nextTick(() => {
                  this.$refs['dataForm'].clearValidate()
                })
                this.dialogFormVisible = false
                this.$emit('watchChild')
              }
            }).catch(_ => { // 异常情况,loading置为false
              this.btnLoading = false
            })
          })
          .catch(action => {
          })
      }
    },
    validate() {
      if (this.oldDepts.length === 0) {
        this.$message.warning('请选择待合并部门')
        return false
      }
      if (this.oldDepts.length > 5) {
        this.$message.warning('一次合并部门不能超过5个')
        return false
      }
      if (this.newDept === null) {
        this.$message.warning('请选择要合并到的部门')
        return false
      }
      const index = this.oldDepts.findIndex(item => item.id === this.newDept.id)
      if (index > -1) {
        this.$message.warning('两边部门不能重复')
        return false
      }
      return true
    },
    cancel: function() {
      this.dialogFormVisible = false
      this.$emit('watchChild')
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss" scoped>
  .el-scrollbar{
    height: 330px;
  }
  .el-select{
    width: 100%;
  }
  .single-tree{
    el-checkbox__inner{
      border-radius: 10px;
    }
  }
</style>
<style>
  .deptScroll .el-scrollbar__wrap{
    overflow-x: hidden;
    background-color: #fff;
    padding: 0px;
  }
</style>