Newer
Older
smart-metering-front / src / components / dialog / selectEmployeesDialog.vue
dutingting on 18 Jan 2023 6 KB 代码规范
<!-- 选择成员 -->
<script setup>
import { computed, getCurrentInstance, onMounted, reactive, ref, watch } from 'vue'
import { getUserList } from '@/api/system/user'
import { getDeptTreeList } from '@/api/system/dept'

import { toTreeList } from '@/utils/structure'
import SearchArea from '@/components/SearchArea/index.vue'
const props = defineProps({
  visible: {
    type: Boolean,
    default: false,
  },
  data: {
    type: Array,
    default: () => [],
  },
})
const emits = defineEmits(['update:visible', 'change'])
const table = ref()
// 树配置
const defaultProps = {
  children: 'children',
  label: 'name',
}
const select = ref()
// 表格表头
const columns = [
  // { text: '账号', value: 'account', align: 'center' },
  { text: '真实姓名', value: 'name', align: 'center' },
  { text: '所在组织机构', value: 'deptName', align: 'center' },
  // { text: '角色', value: 'roleName', align: 'center' },
  // { text: '手机号', value: 'phone', align: 'center' },
  // { text: '注册时间', value: 'createtime', align: 'center' },
]
// 表格数据
const list = ref([])
// 组织机构树数据
const treeData = ref([])
const tagNames = { 已冻结: 'danger', 启用: 'success' }

const loading = ref(false)
const total = ref(0)
// 查询参数
const listQuery = reactive({
  keywords: '',
  beginTime: '',
  endTime: '',
  deptId: '',
  offset: 1,
  limit: 10,
  sort: 'id',
  deptType: '',
})
const { proxy } = getCurrentInstance()
const checkedList = ref([])
// 多选的数据
const multipleTable = ref([])
const closeDialog = () => {
  emits('update:visible', false)
}
const visibleDialog = computed({
  get() {
    return props.visible
  },
  set(val) {
    closeDialog()
  },
})
watch(() => props.visible, (val) => {
  if (!val) {
    console.log(table.value)
    table.value.clearMulti()
  }
})
const saveDialog = () => {
  const checkedList = multipleTable.value.map(item => ({
    ...item,
    type: 2, // type是啥
    // targetId: item.roleId,
    // name: item.roleName,
    targetId: item.id,
    name: item.name,
  }))
  emits('change', checkedList)
}

// 获取列表数据
const fetchData = (flag) => {
  select.value = ''
  getUserList(listQuery).then((res) => {
    list.value = res.data.rows
    total.value = res.data.total
  })
}
// 点击树形结构
const handleNodeClick = (data) => {
  listQuery.deptId = data.id
  fetchData('click')
}
// 多选
const multiSelect = (val) => {
  console.log('多选成员')
  console.log(val)
  multipleTable.value = val
}
// 获取组织列表树数据
const fetchTreeData = () => {
  getDeptTreeList(listQuery).then((res) => {
    treeData.value = toTreeList<TreeStructure>(res.data, '0', true)
  }).catch(() => {
  })
}
// 查询数据
const search = () => {
  fetchData('search')
}
// 页数发生变化后的操作,可能是页码变化,可能是每页容量变化,此函数必写
const changePage = (val) => {
  if (val && val.size) {
    listQuery.limit = val.size
  }
  if (val && val.page) {
    listQuery.offset = val.page
  }
  fetchData('')
}
onMounted(() => {
  // 获取树形结构数据
  // fetchTreeData()
  // 获取列表数据
  fetchData('click')
})
</script>

<template>
  <div class="select-emplotees-dialog">
    <el-dialog v-model="visibleDialog" title="选择成员" max-width="80%" append-to-body custom-class="chengyuan-dialog promoter_person">
      <!-- <div class="person_body clear chengyuan"> -->
      <!-- 左侧组织机构 -->
      <!-- <div class="left-container">
        <div style="height: 100%;">
          <el-card class="box-card" shadow="always">
            <template #header>
              <div class="clearfix">
                <span>组织机构</span>
              </div>
            </template>
            <el-tree
              :data="treeData" :props="defaultProps" default-expand-all
              :expand-on-click-node="false" @node-click="handleNodeClick"
            />
          </el-card>
        </div>
      </div> -->
      <!-- 右侧表格 -->
      <div ref="tableContainer" class="table-area">
        <!-- 筛选条件 -->
        <search-area @search="search">
          <search-item>
            <el-input v-model.trim="listQuery.keywords" placeholder="账户/真实姓名/手机号" clearable />
          </search-item>
        </search-area>
        <!-- 表头标题 -->
        <table-container>
          <!-- 查询结果Table显示 -->
          <normal-table
            ref="table"
            :data="list" :total="total" :columns="columns" :query="listQuery"
            :list-loading="loadingTable" :is-showmulti-select="true" @change="changePage" @multiSelect="multiSelect"
          >
            <template #preColumns>
              <el-table-column label="#" width="55" align="center">
                <template #default="scope">
                  {{ (listQuery.offset - 1) * listQuery.limit + scope.$index + 1 }}
                </template>
              </el-table-column>
            </template>
            <template #columns>
              <el-table-column label="状态" align="center" width="80">
                <template #default="scope">
                  <el-tag :type="(tagNames)[scope.row.statusName]">
                    {{ scope.row.statusName }}
                  </el-tag>
                </template>
              </el-table-column>
            </template>
          </normal-table>
        </table-container>
      </div>
      <!-- </div> -->
      <template #footer>
        <el-button @click="closeDialog">
          取 消
        </el-button>
        <el-button type="primary" @click="saveDialog">
          确 定
        </el-button>
      </template>
    </el-dialog>
  </div>
</template>

<style lang="scss">
@import "@/css/dialog.css";

.chengyuan-dialog {
  .el-table .cell {
    white-space: nowrap;
  }

  .el-dialog__body {
    display: flex;
    overflow: auto;
  }
}
</style>

<style lang="scss" scoped>
.chengyuan-dialog {
  width: 100%;

  .left-container {
    white-space: nowrap;
    height: 100%;
    // width: 22%;
  }

  .table-area {
    // width: 78%;
    flex: 1;
    overflow: auto;

    .pagination {
      margin-top: 10px;
      width: 100%;
      display: flex;
      flex-direction: column;
      align-items: center;
    }
  }
}
</style>