调整人员: AI Assistant
调整时间: 2025-08-05 15:30:00
调整类型: 功能重构
根据用户需求,重新设计奖学金申请的新增功能,从单个学生申请模式改为班主任批量申请模式。
原有模式(不符合需求):
新业务模式(符合实际需求):
文件: web/src/views/jcbt/scholarship/application/index.vue
新增内容:
<!-- 班主任批量申请奖学金对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="1000px" append-to-body>
<!-- 第一步:选择申报批次 -->
<el-card class="mb-4">
<template #header>
<span>第一步:选择申报批次</span>
</template>
<!-- 批次选择和可申请奖学金显示 -->
</el-card>
<!-- 第二步:班级信息(自动填充) -->
<el-card class="mb-4" v-if="classInfo.className">
<template #header>
<span>第二步:班级信息</span>
</template>
<!-- 学院、专业、班级、年级信息自动显示 -->
</el-card>
<!-- 第三步:选择申请学生 -->
<el-card v-if="form.batchId">
<template #header>
<div class="flex justify-between items-center">
<span>第三步:选择申请学生</span>
<div>
<el-button type="text" @click="selectAll">全选</el-button>
<el-button type="text" @click="selectNone">清空</el-button>
<span class="ml-4 text-sm text-gray-500">
已选择 {{ selectedStudents.length }} 名学生
</span>
</div>
</div>
</template>
<!-- 学生搜索和选择表格 -->
</el-card>
</el-dialog>
特点:
// 批次相关
const batchOptions = ref([]);
const availableScholarshipTypes = ref([]);
// 班级信息(自动获取)
const classInfo = ref({
teacherId: '',
collegeName: '',
majorName: '',
className: '',
grade: '',
teacherName: '',
classId: '',
deptId: ''
});
// 学生选择
const selectedStudents = ref([]);
const studentSearchKeyword = ref('');
const form = ref<ScholarshipApplicationForm>({
batchId: '', // 新增批次ID字段
// ... 其他字段保持不变
});
import {
// ... 原有导入
getClassInfoByTeacher, // 获取班主任班级信息
getClassStudents, // 获取班级学生列表
getScholarshipTypesByBatch, // 根据批次获取奖学金类型
batchSubmitByTeacher // 班主任批量提交
} from '@/api/jcbt/scholarshipApplication';
import { listScholarshipBatch } from '@/api/jcbt/scholarshipBatch';
/** 初始化班主任班级信息 */
const initTeacherClassInfo = async () => {
try {
const userId = proxy?.$store.state.user.id;
const res = await getClassInfoByTeacher(userId);
if (res.data) {
classInfo.value = res.data;
}
} catch (error) {
console.error('获取班级信息失败:', error);
}
};
/** 获取批次列表 */
const getBatchOptions = async () => {
try {
const res = await listScholarshipBatch({
pageNum: 1,
pageSize: 100,
status: '1' // 只获取启用的批次
});
batchOptions.value = res.rows || [];
} catch (error) {
console.error('获取批次列表失败:', error);
}
};
/** 批次变化处理 */
const handleBatchChange = async (batchId: string) => {
if (!batchId) {
availableScholarshipTypes.value = [];
return;
}
try {
const res = await getScholarshipTypesByBatch(batchId);
availableScholarshipTypes.value = res.data || [];
// 获取班级学生列表
if (classInfo.value.classId) {
const studentsRes = await getClassStudents(classInfo.value.classId);
studentList.value = studentsRes.data || [];
}
} catch (error) {
console.error('获取奖学金类型失败:', error);
proxy?.$modal.msgError('获取奖学金类型失败');
}
};
/** 学生奖学金类型变化 */
const handleStudentScholarshipTypeChange = (student: any) => {
const scholarshipType = availableScholarshipTypes.value.find(type => type.id === student.scholarshipTypeId);
if (scholarshipType) {
student.amount = scholarshipType.amount;
}
};
/** 学生奖学金等级变化 */
const handleStudentScholarshipLevelChange = (student: any) => {
const scholarshipType = availableScholarshipTypes.value.find(type => type.id === student.scholarshipTypeId);
if (scholarshipType && student.scholarshipLevel) {
student.amount = scholarshipType.amount;
}
};
/** 提交按钮 */
const submitForm = () => {
if (!selectedStudents.value.length) {
proxy?.$modal.msgError('请选择要申请的学生');
return;
}
// 检查所有选中学生是否都已选择奖学金类型和等级
const incompleteStudents = selectedStudents.value.filter(student =>
!student.scholarshipTypeId || !student.scholarshipLevel
);
if (incompleteStudents.length > 0) {
proxy?.$modal.msgError('请为所有选中的学生选择奖学金类型和等级');
return;
}
proxy?.$modal.confirm(`确认为选中的 ${selectedStudents.value.length} 名学生提交奖学金申请吗?`).then(async () => {
submitLoading.value = true;
try {
const batchData = {
batchId: form.value.batchId,
classId: classInfo.value.classId,
students: selectedStudents.value.map(student => ({
studentId: student.id,
scholarshipTypeId: student.scholarshipTypeId,
scholarshipLevel: student.scholarshipLevel,
amount: student.amount,
remark: student.remark
}))
};
await batchSubmitByTeacher(batchData);
proxy?.$modal.msgSuccess('批量申请提交成功');
dialog.visible = false;
await getList();
} catch (error) {
console.error(error);
proxy?.$modal.msgError('提交失败,请重试');
} finally {
submitLoading.value = false;
}
});
};
当前存在一些TypeScript类型和导入路径的编译错误,需要进一步修复:
此次调整完全重构了奖学金申请的新增功能,从不符合实际业务需求的单个申请模式改为符合实际场景的班主任批量申请模式。新的设计更贴合实际业务流程,大大提高了操作效率和数据准确性。
主要改进:
技术实现: