Files
pengchen-exam-vue/src/views/system/task/exam/components/steps/step5/index.vue
2025-04-23 17:12:26 +08:00

224 lines
6.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>