224 lines
6.2 KiB
Vue
224 lines
6.2 KiB
Vue
|
|
<template>
|
|||
|
|
<ele-page>
|
|||
|
|
<!-- 搜索表单 -->
|
|||
|
|
<ele-card :body-style="{ paddingTop: '8px' }">
|
|||
|
|
<!-- 表格 -->
|
|||
|
|
<ele-pro-table
|
|||
|
|
ref="tableRef"
|
|||
|
|
row-key="key"
|
|||
|
|
:columns="columns"
|
|||
|
|
:datasource="datasource"
|
|||
|
|
:show-overflow-tooltip="true"
|
|||
|
|
v-model:selections="selections"
|
|||
|
|
:highlight-current-row="true"
|
|||
|
|
:export-config="{ fileName: '试卷人员分配' }"
|
|||
|
|
cache-key="systemPersonTable"
|
|||
|
|
>
|
|||
|
|
<template #toolbar>
|
|||
|
|
|
|||
|
|
<el-button
|
|||
|
|
v-permission="'system:person:add'"
|
|||
|
|
type="primary"
|
|||
|
|
class="ele-btn-icon"
|
|||
|
|
|
|||
|
|
@click="openEdit()"
|
|||
|
|
>
|
|||
|
|
分配场次
|
|||
|
|
</el-button>
|
|||
|
|
<el-button
|
|||
|
|
v-permission="'system:person:remove'"
|
|||
|
|
type="danger"
|
|||
|
|
class="ele-btn-icon"
|
|||
|
|
|
|||
|
|
@click="removeBatch()"
|
|||
|
|
>
|
|||
|
|
删除
|
|||
|
|
</el-button>
|
|||
|
|
<el-button
|
|||
|
|
v-permission="'system:person:export'"
|
|||
|
|
class="ele-btn-icon"
|
|||
|
|
|
|||
|
|
@click="exportData"
|
|||
|
|
>
|
|||
|
|
导出
|
|||
|
|
</el-button>
|
|||
|
|
</template>
|
|||
|
|
<template #action="{ row }">
|
|||
|
|
<el-link
|
|||
|
|
v-permission="'system:person:edit'"
|
|||
|
|
type="primary"
|
|||
|
|
:underline="false"
|
|||
|
|
@click="openEdit(row)"
|
|||
|
|
>
|
|||
|
|
修改
|
|||
|
|
</el-link>
|
|||
|
|
<el-divider
|
|||
|
|
v-permission="['system:person:edit', 'system:person:remove']"
|
|||
|
|
direction="vertical"
|
|||
|
|
/>
|
|||
|
|
<el-link
|
|||
|
|
v-permission="'system:person:remove'"
|
|||
|
|
type="danger"
|
|||
|
|
:underline="false"
|
|||
|
|
@click="removeBatch(row)"
|
|||
|
|
>
|
|||
|
|
删除
|
|||
|
|
</el-link>
|
|||
|
|
</template>
|
|||
|
|
</ele-pro-table>
|
|||
|
|
</ele-card>
|
|||
|
|
<!-- 编辑弹窗 -->
|
|||
|
|
<person-edit v-model="showEdit" :task-Id="taskId" @done="reload" />
|
|||
|
|
</ele-page>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script setup>
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
// import {
|
|||
|
|
// PlusOutlined,
|
|||
|
|
// DeleteOutlined,
|
|||
|
|
// DownloadOutlined
|
|||
|
|
// } from '@/components/icons';
|
|||
|
|
import PersonEdit from './components/person-edit.vue';
|
|||
|
|
import { pagePersons, removePersons, exportPersons } from '@/api/system/person';
|
|||
|
|
import { pageStus, removeStus, exportStus } from '@/api/system/stu';
|
|||
|
|
const message = useMessage() // 消息弹窗
|
|||
|
|
|
|||
|
|
defineOptions({ name: 'SystemPerson' });
|
|||
|
|
const props = defineProps({
|
|||
|
|
taskId: {
|
|||
|
|
type: String,
|
|||
|
|
default: '',
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
|
|||
|
|
|
|||
|
|
const tableRef = ref(null);
|
|||
|
|
const selections = ref([]);
|
|||
|
|
const current = ref(null);
|
|||
|
|
const showEdit = ref(false);
|
|||
|
|
const showSet = ref(false);
|
|||
|
|
|
|||
|
|
/** 班级映射表:deptId => { deptName, teacherName } */
|
|||
|
|
const classMap = ref({});
|
|||
|
|
|
|||
|
|
/** 表格列配置 */
|
|||
|
|
const columns = ref([
|
|||
|
|
{ type: 'selection', columnKey: 'selection', width: 50, align: 'center', fixed: 'left' },
|
|||
|
|
{ type: 'index', columnKey: 'index', width: 50, align: 'center', fixed: 'left' },
|
|||
|
|
{ prop: 'stuCode', label: '学生编码', align: 'center', minWidth: 110 },
|
|||
|
|
{ prop: 'stuUsername', label: '学生账号', align: 'center', minWidth: 110 },
|
|||
|
|
|
|||
|
|
|
|||
|
|
{
|
|||
|
|
prop: 'stuClass',
|
|||
|
|
label: '学生班级',
|
|||
|
|
align: 'center',
|
|||
|
|
minWidth: 110,
|
|||
|
|
slot: 'stuClass' // 👈 使用自定义 slot 显示班级 + 悬浮教师名
|
|||
|
|
},
|
|||
|
|
{ prop: 'status', label: '帐号状态(0正常 1停用)', align: 'center', minWidth: 110 },
|
|||
|
|
{ prop: 'batch', label: '分配场次', align: 'center', minWidth: 110 }
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
/** 表格数据源:处理学生 + 班级 */
|
|||
|
|
const datasource = async ({ pages, where }) => {
|
|||
|
|
// 获取学生和班级信息
|
|||
|
|
const { examStuList, teacherClassDtos } = await pageStus({ ...where, ...pages });
|
|||
|
|
|
|||
|
|
// 如果没有数据,直接返回空列表
|
|||
|
|
if (!examStuList || !teacherClassDtos) {
|
|||
|
|
message.error('数据加载失败');
|
|||
|
|
return [];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
console.log("examStuList:", examStuList);
|
|||
|
|
console.log("teacherClassDtos:", teacherClassDtos);
|
|||
|
|
|
|||
|
|
// 构建班级映射表,使用 dept_id 作为 key
|
|||
|
|
const classMap = {};
|
|||
|
|
teacherClassDtos.forEach(item => {
|
|||
|
|
classMap[item.dept_id] = {
|
|||
|
|
deptName: item.dept_name,
|
|||
|
|
teacherName: item.nick_name || item.user_name || '未知教师'
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 将映射表存储到 `classMap`,供后续使用
|
|||
|
|
classMap.value = classMap;
|
|||
|
|
|
|||
|
|
// 合并学生信息和班级信息
|
|||
|
|
const processedList = examStuList.map(stu => {
|
|||
|
|
// 使用 stuClass 匹配 teacherClassDtos 的 dept_id
|
|||
|
|
const classInfo = classMap[stu.stuClass] || {}; // 如果找不到匹配,返回默认值
|
|||
|
|
return {
|
|||
|
|
...stu,
|
|||
|
|
deptName: classInfo.deptName || '未知班级', // 如果没有班级信息,显示默认值
|
|||
|
|
teacherName: classInfo.teacherName || '未知教师' // 如果没有教师信息,显示默认值
|
|||
|
|
};
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
console.log("processedList:", processedList);
|
|||
|
|
return processedList; // 返回合并后的学生信息
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
/** 搜索 */
|
|||
|
|
const reload = (where) => {
|
|||
|
|
tableRef.value?.reload?.({ page: 1, where });
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/** 打开编辑弹窗 */
|
|||
|
|
const openEdit = (row) => {
|
|||
|
|
current.value = row ?? null;
|
|||
|
|
showEdit.value = true;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/** 打开班级设置弹窗 */
|
|||
|
|
const openSet = (row) => {
|
|||
|
|
current.value = row ?? null;
|
|||
|
|
showSet.value = true;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/** 删除学生(单条或多条) */
|
|||
|
|
const removeBatch = (row) => {
|
|||
|
|
const rows = row == null ? selections.value : [row];
|
|||
|
|
if (!rows.length) {
|
|||
|
|
message.error('请至少选择一条数据');
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
ElMessageBox.confirm(
|
|||
|
|
`是否确认删除学生编码为"${rows.map((d) => d.stuCode).join()}"的数据项?`,
|
|||
|
|
'系统提示',
|
|||
|
|
{ type: 'warning', draggable: true }
|
|||
|
|
)
|
|||
|
|
.then(() => {
|
|||
|
|
const loading = message.loading({ message: '请求中..', plain: true });
|
|||
|
|
removeStus(rows.map((d) => d.stuId))
|
|||
|
|
.then(() => {
|
|||
|
|
loading.close();
|
|||
|
|
message.success('删除成功');
|
|||
|
|
reload();
|
|||
|
|
})
|
|||
|
|
.catch((e) => {
|
|||
|
|
loading.close();
|
|||
|
|
message.error(e.message);
|
|||
|
|
});
|
|||
|
|
})
|
|||
|
|
.catch(() => {});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/** 导出数据 */
|
|||
|
|
const exportData = () => {
|
|||
|
|
const loading = message.loading({ message: '请求中..', plain: true });
|
|||
|
|
tableRef.value?.fetch?.(({ where }) => {
|
|||
|
|
exportStus(where)
|
|||
|
|
.then(() => loading.close())
|
|||
|
|
.catch((e) => {
|
|||
|
|
loading.close();
|
|||
|
|
message.error(e.message);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
</script>
|