<template> <div> <el-card class="box-card"> <template #header> <div class="card-header"> <div class="system-menu-search"> <el-input size="default" v-model="state.param2.keyword" placeholder="请输入关键词" style="max-width: 180px"> </el-input> <el-button size="default" type="primary" class="ml10" @click="getTableData()"> <el-icon> <ele-Search /> </el-icon> 查询 </el-button> </div> <div> <el-button type="primary" @click="onOpenAddEmployee('add')">新增员工</el-button> <el-button type="primary" @click="pass()">审核</el-button> <el-button type="danger" @click="repass()">反审核</el-button> <el-button type="success" @click="importExcel()">导入</el-button> <el-button type="success" @click="exportExcel()"> 导出 <!-- <a :href="state.download_file_url" target="target" download>导出</a> --> </el-button> <el-button type="danger" @click="del()">删除</el-button> </div> </div> </template> <el-row> <el-col :span="6"> <div class="card-header ml5 mr5 mt5 mb5"> <span class="dept-all" @click="deptAll()">全部部门</span> <el-button link type="primary" @click="onOpenAddDept('add')">添加</el-button> </div> <el-tree :data="state.data" :props="defaultProps" @node-click="handleNodeClick" :draggable="false"> <template #default="{ node, data }"> <span class="custom-tree-node"> <span>{{ node.label }}</span> <span> <a class="a1" @click="onOpenEditDept('edit',data)"> 编辑 </a> <a class="a2" @click="remove(node, data)"> 删除 </a> </span> </span> </template> </el-tree> </el-col> <el-col :span="18"> <el-table ref="multipleTableRef" :data="state.tableData" style="width: 100%" @selection-change="handleSelectionChange" > <el-table-column type="selection" width="55" /> <el-table-column type="index" label="序号" width="60" /> <el-table-column property="name" label="员工姓名" /> <el-table-column property="id_card" label="证件号码" /> <el-table-column property="department.name" label="部门" /> <el-table-column property="phone" label="电话" width="120" /> <el-table-column property="valid" label="状态" width="90"> <template #default="scope"> <el-button link type="danger" size="default" v-if="scope.row.valid == 0">禁用</el-button> <el-button link type="primary" size="default" v-if="scope.row.valid == 1">启用</el-button> </template> </el-table-column> <el-table-column label="审核状态" width="120"> <template #default="scope"> <el-button link type="danger" v-if="scope.row.is_pass==-1">审核不通过</el-button> <el-button link type="info" v-if="scope.row.is_pass==0">待审核</el-button> <el-button link type="success" v-if="scope.row.is_pass==1">审核通过</el-button> </template> </el-table-column> <el-table-column fixed="right" label="操作" width="160"> <template #default="scope"> <div class="disflex"> <!-- :disabled="scope.row.is_pass==1" --> <el-button link type="primary" size="small" @click="onOpenEditEmployee('edit',scope.row)" :disabled="scope.row.is_pass==1">编辑</el-button> <el-button link type="primary" size="small" @click="onOpenDetail(scope.row.id)">详情</el-button> <el-button link type="primary" size="small"> <el-dropdown @command="handleCommand"> <span class="el-dropdown-link"> <span class="dropdown-text">更多</span> <el-icon class="el-icon--right"> <arrow-down /> </el-icon> </span> <template #dropdown> <el-dropdown-menu> <el-dropdown-item command="取消审核" @click="rePassOne(scope.row)">取消审核</el-dropdown-item> <!-- <el-dropdown-item command="工资设置">工资设置</el-dropdown-item> --> <el-dropdown-item command="重置登录密码" @click="onOpenResetPassword(scope.row)">重置登录密码</el-dropdown-item> <!-- <el-dropdown-item command="查看计件">查看计件</el-dropdown-item> --> <el-dropdown-item command="查看员工" @click="onOpenDetail(scope.row.id)">查看员工</el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </el-button> </div> </template> </el-table-column> </el-table> <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" class="mt15" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="state.param2.page" background v-model:page-size="state.param2.list_rows" layout="total, sizes, prev, pager, next, jumper" :total="state.total" > </el-pagination> </el-col> </el-row> </el-card> <DeptEditDialog ref="deptEditDialogRef" @refresh="getTableData()" /> <DeptDialog ref="deptDialogRef" @refresh="getTableData()" /> <ResetPasswordDialog ref="resetPasswordDialogRef" @refresh="getTableData()" /> <DetailDialog ref="detailDialogRef" @refresh="getTableData()" /> <ImportExcelDialog ref="importExcelDialogRef" @refresh="getTableData()" /> <ExportExcelDialog ref="exportExcelDialogRef" @refresh="getTableData()" /> </div> </template> <script lang="ts" setup name="underlyingDepartment"> import { ref, reactive, onMounted, defineAsyncComponent } from 'vue'; import { ElTable, ElMessage, ElMessageBox } from 'element-plus'; import { ArrowDown, Download } from '@element-plus/icons-vue'; import type Node from 'element-plus/es/components/tree/src/model/node'; import Department from '/@/api/department/department.ts'; import config from '/@/config.ts'; const DeptEditDialog = defineAsyncComponent(() => import('/@/views/underlying/department/departEdit.vue')); const deptEditDialogRef = ref(); // 打开新增部门弹窗 const onOpenAddDept = (type: string) => { deptEditDialogRef.value.openDialog(type); }; const onOpenEditDept = (type: string, data: Tree) => { deptEditDialogRef.value.openDialog(type, data); } const DeptDialog = defineAsyncComponent(() => import('/@/views/underlying/department/edit.vue')); const deptDialogRef = ref(); // 打开新增员工弹窗 const onOpenAddEmployee = (type: string) => { deptDialogRef.value.openDialog(type); }; // 打开编辑员工弹窗 const onOpenEditEmployee = (type: string, row: any) => { row = JSON.parse(JSON.stringify(row)); console.log('row',row); deptDialogRef.value.openDialog(type, row); }; const DetailDialog = defineAsyncComponent(() => import('/@/views/underlying/department/detail.vue')); const detailDialogRef = ref(); // 打开详情弹窗 const onOpenDetail = (id: number) => { detailDialogRef.value.openDialog(id); }; interface Tree { label: string name: string children?: Tree[] department_id: number leader_id: number valid: number } const handleNodeClick = (data: Tree) => { console.log(data); state.param2.department_id = JSON.parse(JSON.stringify(data)).id; console.log('state.param2.department_id',state.param2.department_id); getAdminList(); } const data: Tree[] = [ { label: '研发部 1', name: '研发部 1', department_id: 1, leader_id: 1, valid: 1, children: [ { label: '研发部 1-1', name: '研发部 1-1', department_id: 1, leader_id: 1, valid: 1, children: [ { label: '研发部 1-1-1', name: '研发部 1-1-1', department_id: 1, leader_id: 1, valid: 1, }, ], }, ], }, { label: '运营部 2', name: '运营部 2', department_id: 1, leader_id: 1, valid: 1, children: [ { label: '运营部 2-1', name: '运营部 2-1', department_id: 1, leader_id: 1, valid: 1, children: [ { label: '运营部 2-1-1', name: '运营部 2-1-1', department_id: 1, leader_id: 1, valid: 1, }, ], }, { label: '运营部 2-2', name: '运营部 2-2', department_id: 1, leader_id: 1, valid: 1, children: [ { label: '运营部 2-2-1', name: '运营部 2-2-1', department_id: 1, leader_id: 1, valid: 1, }, ], }, ], }, { label: '生产部 3', name: '生产部 3', department_id: 1, leader_id: 1, valid: 1, children: [ { label: '生产部 3-1', name: '生产部 3-1', department_id: 1, leader_id: 1, valid: 1, children: [ { label: '生产部 3-1-1', name: '生产部 3-1-1', department_id: 1, leader_id: 1, valid: 1, }, ], }, { label: '生产部 3-2', name: '生产部 3-2', department_id: 1, leader_id: 1, valid: 1, children: [ { label: '生产部 3-2-1', name: '生产部 3-2-1', department_id: 1, leader_id: 1, valid: 1, }, ], }, ], }, ] const defaultProps = { children: 'children', label: 'label', } interface User { id: number head_img: string gender: number name: string department_id: number id_card: string age: number phone: string valid: number role_id: number create_time: string update_time: string is_pass: number pass_time: string } const multipleTableRef = ref<InstanceType<typeof ElTable>>() const multipleSelection = ref<User[]>([]) const toggleSelection = (rows?: User[]) => { if (rows) { rows.forEach((row) => { // TODO: improvement typing when refactor table // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error multipleTableRef.value!.toggleRowSelection(row, undefined) }) } else { multipleTableRef.value!.clearSelection() } } const handleSelectionChange = (val: User[]) => { multipleSelection.value = val console.log('multipleSelection',multipleSelection.value); } const ResetPasswordDialog = defineAsyncComponent(() => import('/@/views/underlying/department/resetPassword.vue')); const resetPasswordDialogRef = ref(); const onOpenResetPassword = (row:any) => { resetPasswordDialogRef.value.openDialog(row); } const handleCommand = (command: string) => { console.log('command',command); } const del = () => { console.log('multipleSelection.value',multipleSelection.value); if(multipleSelection.value.length==0){ return ElMessage.warning("请选择要操作的列表"); } let name = []; let noName = []; state.ids = []; for(let i=0;i<multipleSelection.value.length;i++){ if(multipleSelection.value[i].is_pass==1){ noName.push(multipleSelection.value[i].name); }else{ name.push(multipleSelection.value[i].name); state.ids.push(multipleSelection.value[i].id); } } if(noName.length>0){ return ElMessage.warning(`员工名称:“${noName}”不允许删除,请先反审核再操作`); } ElMessageBox.confirm(`此操作将永久删除员工名称:“${name}”,是否继续?`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }) .then(() => { console.log('ids',JSON.stringify(state.ids).split('[')[1].split(']')[0]); delOnce('del',JSON.stringify(state.ids).split('[')[1].split(']')[0]); // getTableData(); // ElMessage.success('删除成功'); }) .catch(() => {}); } const remove = (node: Node, data: Tree) => { console.log('node', node); console.log('data', data); ElMessageBox.confirm(`此操作将永久删除部门名称:“${data.name}”,是否继续?`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }) .then(() => { delOnce('remove',data.id); // getTableData(); // ElMessage.success('删除成功'); }) .catch(() => {}); // ElMessage(`click on 删除 ${data.name}`); } const delOnce = async(type: string, ids: number | string) => { let res: any = null; if(type=='del'){ res = await Department.delAdmin(ids); if(res.code != 0){ return ElMessage.error(res.msg); } }else if(type=='remove'){ res = await Department.del(ids); if(res.code != 0){ return ElMessage.error(res.msg); } }else{ return ElMessage.warning("操作有误"); } getTableData(); ElMessage.success(res.msg); } const pass = () => { console.log('multipleSelection.value',multipleSelection.value.length); if(multipleSelection.value.length==0){ return ElMessage.warning("请选择要操作的列表"); } let name = []; let noName= []; state.ids = []; for(let i=0;i<multipleSelection.value.length;i++){ if(multipleSelection.value[i].is_pass==1){ noName.push(multipleSelection.value[i].name); }else{ name.push(multipleSelection.value[i].name); state.ids.push(multipleSelection.value[i].id); } } if(noName.length>0){ return ElMessage.warning(`员工名称:“${noName}”已审核通过,无需重复操作`); } ElMessageBox.confirm(`此操作将审核:“${name}”,是否继续?`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }) .then(() => { console.log('ids',JSON.stringify(state.ids).split('[')[1].split(']')[0]); requestPass('pass',JSON.stringify(state.ids).split('[')[1].split(']')[0]); // getTableData(); // ElMessage.success('删除成功'); }) .catch(() => {}); } const repass = () => { console.log('multipleSelection.value',multipleSelection.value.length); if(multipleSelection.value.length==0){ return ElMessage.warning("请选择要操作的列表"); } let name = []; let noName= []; state.ids = []; for(let i=0;i<multipleSelection.value.length;i++){ if(multipleSelection.value[i].is_pass==0){ noName.push(multipleSelection.value[i].name); }else{ name.push(multipleSelection.value[i].name); state.ids.push(multipleSelection.value[i].id); } } if(noName.length>0){ return ElMessage.warning(`员工名称:“${noName}”已处于反审核状态,无需重复操作`); } ElMessageBox.confirm(`此操作将反审核:“${name}”,是否继续?`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }) .then(() => { console.log('ids',JSON.stringify(state.ids).split('[')[1].split(']')[0]); requestPass('rePass',JSON.stringify(state.ids).split('[')[1].split(']')[0]); // getTableData(); // ElMessage.success('删除成功'); }) .catch(() => {}); } const requestPass = async(type: string, ids: number | string) => { let res: any = null; if(type=='pass'){ res = await Department.passAdmin(ids); if(res.code != 0){ return ElMessage.error(res.msg); } }else if(type=='rePass'){ res = await Department.rePassAdmin(ids); if(res.code != 0){ return ElMessage.error(res.msg); } }else{ return ElMessage.warning("操作有误"); } getTableData(); ElMessage.success(res.msg); } const rePassOne = (row:any) => { if(row.is_pass==0){ return ElMessage.warning("该记录已处于反审核状态,无需重复操作"); } ElMessageBox.confirm(`此操作将反审核:“${row.name}”,是否继续?`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', }) .then(() => { requestPass('rePass',row.id); }) .catch(() => {}); } const ImportExcelDialog = defineAsyncComponent(() => import('/@/views/underlying/department/import.vue')); const importExcelDialogRef = ref(); const importExcel = () => { importExcelDialogRef.value.openDialog(); } const ExportExcelDialog = defineAsyncComponent(() => import('/@/views/underlying/department/export.vue')); const exportExcelDialogRef = ref(); const exportExcel = async() => { let res = await Department.export(); if(res.code != 0){ return ElMessage.error(res.msg); } state.download_file_url = config.file +'/'+ res.data.path; console.log('state.download_file_url',state.download_file_url); exportExcelDialogRef.value.openDialog(state.download_file_url); } const deptAll = () => { state.param2 = { keyword: '', page: 1, list_rows: 10, department_id: 0, }; getTableData(); } const state = reactive({ tableData: [], total: 0, loading: false, param1: { keyword: '', }, param2: { keyword: '', page: 1, list_rows: 10, department_id: 0, }, ids:<any> [], data: [], download_file_url: '', }); const initDept = async() => { let res = await Department.init(); if(res.code != 0){ return ElMessage.error(res.msg); } } const getDeptList = async() => { let res = await Department.list(state.param1); if(res.code != 0){ return ElMessage.error(res.msg); } state.data = res.data; getAdminList(); } const getAdminList = async() => { console.log("getAdminList"); let res = await Department.listAdmin(state.param2); if(res.code != 0){ return ElMessage.error(res.msg); } state.tableData = res.data.data; state.total = res.data.total; } // 初始化表格数据 const getTableData = () => { getDeptList(); state.loading = true; setTimeout(() => { state.loading = false; }, 500); }; // 分页改变 const onHandleSizeChange = (val: number) => { state.param2.list_rows = val; getTableData(); }; // 分页改变 const onHandleCurrentChange = (val: number) => { state.param2.page = val; getTableData(); }; // 页面加载时 onMounted(() => { initDept(); getTableData(); }); </script> <style lang="scss" scoped> .card-header { display: flex; justify-content: space-between; align-items: center; .dept-all{ cursor: pointer; } .dept-all:hover{ cursor: pointer; color: #409EFF; } } .box-card { margin: 10px; } .disflex{ display: flex; } .example-showcase .el-dropdown-link { cursor: pointer; color: var(--el-color-primary); display: flex; align-items: center; } .dropdown-text{ color: #409EFF; font-size: 12px; } .custom-tree-node { flex: 1; display: flex; align-items: center; justify-content: space-between; font-size: 14px; padding-right: 8px; .a1{ color: #409EFF; } .a2{ color: #F56C6C; margin-left: 8px } } </style>