Bladeren bron

feat(考试管理): 重构考试和问卷表单,添加学期选择并优化课程加载逻辑

- 移除删除成功提示以简化交互
- 添加学期选择功能并关联课程加载
- 重构课程选择逻辑,基于学期动态加载
- 优化表单初始化逻辑和字段命名
- 禁用不必要的表单字段并优化API调用
tanshanming 7 maanden geleden
bovenliggende
commit
6aa28604fe

+ 139 - 27
src/views/exm/examinationManagement/form.vue

@@ -23,8 +23,22 @@
 					<a-button type="primary" @click="addPaper" style="width: 100px">选择试卷</a-button>
 				</a-input-group>
 			</a-form-item>
-			<a-form-item label="课程" name="chapterId">
-				<a-select v-model:value="form.chapterId" placeholder="请选择课程(可选)" allowClear>
+			<a-form-item label="学期" name="semesterId">
+				<a-select v-model:value="form.semesterId" placeholder="请选择学期" allowClear @change="handleSemesterChange">
+					<a-select-option v-for="item in semesterList" :key="item.id" :value="item.id">
+						{{ item.name }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<!-- <a-form-item label="专业" name="majorId">
+				<a-select v-model:value="form.majorId" placeholder="请选择专业" allowClear @change="handleMajorChange">
+					<a-select-option v-for="item in majorList" :key="item.id" :value="item.id">
+						{{ item.majorName }}
+					</a-select-option>
+				</a-select>
+			</a-form-item> -->
+			<a-form-item label="课程" name="courseId">
+				<a-select v-model:value="form.courseId" placeholder="请选择课程" allowClear :disabled="!form.semesterId">
 					<a-select-option v-for="item in courseList" :key="item.courseId" :value="item.courseId">
 						{{ item.courseName }}
 					</a-select-option>
@@ -77,6 +91,7 @@
 						v-model:value="paperPage.queryParam.paperType"
 						placeholder="请选择试卷类型"
 						@change="paperTypeChange"
+						disabled
 					>
 						<a-select-option v-for="item in paperTypeEnum" :key="item.key" :value="item.key">
 							{{ item.value }}
@@ -97,11 +112,11 @@
 				:pagination="false"
 				style="margin-top: 16px"
 			>
-				<template #bodyCell="{ column, record }">
+				<!-- <template #bodyCell="{ column, record }">
 					<template v-if="column.key === 'subjectId'">
 						{{ subjectEnumFormat(record.subjectId) }}
 					</template>
-				</template>
+				</template> -->
 			</a-table>
 			<a-pagination
 				v-show="paperPage.total > 0"
@@ -138,15 +153,19 @@
 	const { subjectEnumFormat } = examStore
 	const paperTypeEnum = computed(() => examStore.paperTypeEnum)
 	const formLoading = ref(false)
+	const semesterList = ref([])
+	const majorList = ref([])
 	const courseList = ref([])
 	const form = reactive({
 		id: null,
 		examName: '',
 		paperId: null,
-		chapterId: null,
+		courseId: null,
 		startTime: null,
 		endTime: null,
-		examStatus: 0
+		examStatus: 0,
+		semesterId: null
+		// majorId: null
 	})
 
 	const rules = {
@@ -175,8 +194,8 @@
 		selectedPaper: null,
 		showDialog: false,
 		queryParam: {
-			subjectId: null,
-			paperType: null,
+			paperId: null,
+			paperType: '6',
 			pageIndex: 1,
 			pageSize: 5
 		},
@@ -195,7 +214,51 @@
 			paperPage.selectedPaper = selectedRows[0] || null
 		}
 	})
+	// 学期变更处理函数
+	const handleSemesterChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value) {
+			loadCourseList()
+		}
+	}
+
+	// 专业变更处理函数
+	// const handleMajorChange = (value) => {
+	// 	form.courseId = null
+	// 	courseList.value = []
 
+	// 	// 如果学期和专业都已选择,则查询课程列表
+	// 	if (value && form.semesterId) {
+	// 		loadCourseList()
+	// 	}
+	// }
+
+	// 加载课程列表
+	const loadCourseList = () => {
+		// 添加加载状态
+		const courseLoading = message.loading('正在加载课程列表...', 0)
+		// 根据选择的学期和专业加载课程列表
+		resourceAuditApi
+			.courseAllList({
+				semesterId: form.semesterId
+			})
+			.then((res) => {
+				if (res.code === 200) {
+					courseList.value = res.data
+				} else {
+					message.error('加载课程列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载课程列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				courseLoading()
+			})
+	}
 	// 禁用开始时间大于今天的日期
 	const disabledStartDate = (current) => {
 		// 禁用大于今天的日期
@@ -204,7 +267,7 @@
 
 	// 试卷类型变更
 	const paperTypeChange = () => {
-		paperPage.queryParam.subjectId = null
+		paperPage.queryParam.paperId = null
 		form.paperId = null
 		selectedPaperName.value = ''
 	}
@@ -227,7 +290,7 @@
 		}
 		delete params.pageIndex
 		delete params.pageSize
-		const data = await examPaperApi.pageList(params)
+		const data = await examPaperApi.selectExamList(params)
 		const re = data
 		paperPage.tableData = re.records
 		paperPage.total = re.total
@@ -296,12 +359,16 @@
 		form.id = lastId
 		form.examName = ''
 		form.paperId = null
-		form.chapterId = null
+		form.semesterId = null // 重置学期
+		// form.majorId = null // 重置专业
+		form.courseId = null
 		form.startTime = null
 		form.endTime = null
 		form.examStatus = 0
 		selectedPaperName.value = ''
 		paperPage.queryParam.paperType = null
+		majorList.value = [] // 清空专业列表
+		courseList.value = [] // 清空课程列表
 	}
 
 	// 初始化
@@ -309,25 +376,70 @@
 		const id = props.id
 		if (id && parseInt(id) !== 0) {
 			formLoading.value = true
-			examManagerApi.select(id).then((re) => {
-				Object.assign(form, {
-					...re,
-					startTime: re.startTime ? dayjs(re.startTime) : null,
-					endTime: re.endTime ? dayjs(re.endTime) : null
+			examManagerApi
+				.select(id)
+				.then((re) => {
+					Object.assign(form, {
+						...re,
+						startTime: re.startTime ? dayjs(re.startTime) : null,
+						endTime: re.endTime ? dayjs(re.endTime) : null
+					})
+					// 如果有试卷ID,需要获取试卷名称显示
+					if (re.paperId) {
+						paperPage.queryParam.paperId = re.paperId
+						// 这里可以根据需要调用接口获取试卷名称
+						examPaperApi.select(re.paperId).then((r) => {
+							selectedPaperName.value = r.name
+						})
+					}
+
+					// 如果是编辑模式,需要根据已有数据加载相应的课程列表
+					if (re.semesterId) {
+						// 直接加载课程列表
+						loadCourseList()
+					}
+
+					formLoading.value = false
+				})
+				.catch((err) => {
+					message.error('加载考试信息失败:' + (err.message || '网络错误'))
+					formLoading.value = false
 				})
-				// 如果有试卷ID,需要获取试卷名称显示
-				if (re.paperId) {
-					// 这里可以根据需要调用接口获取试卷名称
-					selectedPaperName.value = '已选择试卷'
+		}
+		// 加载学期列表
+		const semesterLoading = message.loading('正在加载学期列表...', 0)
+		resourceAuditApi
+			.semesterDownList()
+			.then((res) => {
+				if (res.code === 200) {
+					semesterList.value = res.data
+				} else {
+					message.error('加载学期列表失败:' + (res.msg || '未知错误'))
 				}
-				formLoading.value = false
 			})
-		}
-		resourceAuditApi.courseAllList().then((re) => {
-			if (re.code === 200) {
-				courseList.value = re.data
-			}
-		})
+			.catch((err) => {
+				message.error('加载学期列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				semesterLoading()
+			})
+		// 加载专业
+		// const majorLoading = message.loading('正在加载专业列表...', 0)
+		// resourceAuditApi
+		// 	.majordownList()
+		// 	.then((res) => {
+		// 		if (res.code === 200) {
+		// 			majorList.value = res.data
+		// 		} else {
+		// 			message.error('加载专业列表失败:' + (res.msg || '未知错误'))
+		// 		}
+		// 	})
+		// 	.catch((err) => {
+		// 		message.error('加载专业列表失败:' + (err.message || '网络错误'))
+		// 	})
+		// 	.finally(() => {
+		// 		majorLoading()
+		// 	})
 	})
 </script>
 

+ 1 - 2
src/views/exm/examinationManagement/index.vue

@@ -80,7 +80,7 @@
 </template>
 
 <script setup>
-	import { ref, reactive, onMounted, computed } from 'vue'
+	import { ref, reactive, onMounted } from 'vue'
 	import { message, Modal } from 'ant-design-vue'
 	import examManagerApi from '@/api/exam/paper/examManager.js'
 	import TaskEdit from './form.vue'
@@ -155,7 +155,6 @@
 			onOk: async () => {
 				try {
 					await examManagerApi.deleteExam([{ id: record.id }])
-					message.success('删除成功')
 					fetchList()
 				} catch (e) {
 					message.error(e.msg || '删除失败')

+ 135 - 29
src/views/exm/questionnaireManagement/form.vue

@@ -23,8 +23,22 @@
 					<a-button type="primary" @click="addPaper" style="width: 100px">选择试卷</a-button>
 				</a-input-group>
 			</a-form-item>
-			<a-form-item label="课程" name="chapterId">
-				<a-select v-model:value="form.chapterId" placeholder="请选择课程(可选)" allowClear @change="chapterChange">
+			<a-form-item label="学期" name="semesterId">
+				<a-select v-model:value="form.semesterId" placeholder="请选择学期" allowClear @change="handleSemesterChange">
+					<a-select-option v-for="item in semesterList" :key="item.id" :value="item.id">
+						{{ item.name }}
+					</a-select-option>
+				</a-select>
+			</a-form-item>
+			<!-- <a-form-item label="专业" name="majorId">
+				<a-select v-model:value="form.majorId" placeholder="请选择专业" allowClear @change="handleMajorChange">
+					<a-select-option v-for="item in majorList" :key="item.id" :value="item.id">
+						{{ item.majorName }}
+					</a-select-option>
+				</a-select>
+			</a-form-item> -->
+			<a-form-item label="课程" name="courseId">
+				<a-select v-model:value="form.courseId" placeholder="请选择课程" allowClear :disabled="!form.semesterId">
 					<a-select-option v-for="item in courseList" :key="item.courseId" :value="item.courseId">
 						{{ item.courseName }}
 					</a-select-option>
@@ -77,6 +91,7 @@
 						v-model:value="paperPage.queryParam.paperType"
 						placeholder="请选择试卷类型"
 						@change="paperTypeChange"
+						disabled
 					>
 						<a-select-option v-for="item in paperTypeEnum" :key="item.key" :value="item.key">
 							{{ item.value }}
@@ -97,11 +112,11 @@
 				:pagination="false"
 				style="margin-top: 16px"
 			>
-				<template #bodyCell="{ column, record }">
+				<!-- <template #bodyCell="{ column, record }">
 					<template v-if="column.key === 'subjectId'">
 						{{ subjectEnumFormat(record.subjectId) }}
 					</template>
-				</template>
+				</template> -->
 			</a-table>
 			<a-pagination
 				v-show="paperPage.total > 0"
@@ -138,15 +153,19 @@
 	const { subjectEnumFormat } = examStore
 	const paperTypeEnum = computed(() => examStore.paperTypeEnum)
 	const formLoading = ref(false)
+	const semesterList = ref([])
+	const majorList = ref([])
 	const courseList = ref([])
 	const form = reactive({
 		id: null,
 		examName: '',
 		paperId: null,
-		chapterId: null,
+		courseId: null,
 		startTime: null,
 		endTime: null,
-		examStatus: 0
+		examStatus: 0,
+		semesterId: null
+		// majorId: null
 	})
 
 	const rules = {
@@ -175,8 +194,8 @@
 		selectedPaper: null,
 		showDialog: false,
 		queryParam: {
-			subjectId: null,
-			paperType: null,
+			paperId: null,
+			paperType: '5',
 			pageIndex: 1,
 			pageSize: 5
 		},
@@ -195,10 +214,51 @@
 			paperPage.selectedPaper = selectedRows[0] || null
 		}
 	})
-	const chapterChange = async () => {
-		form.chapterId = ''
+	// 学期变更处理函数
+	const handleSemesterChange = (value) => {
+		form.courseId = null
+		courseList.value = []
+
+		// 如果学期和专业都已选择,则查询课程列表
+		if (value) {
+			loadCourseList()
+		}
 	}
 
+	// 专业变更处理函数
+	// const handleMajorChange = (value) => {
+	// 	form.courseId = null
+	// 	courseList.value = []
+
+	// 	// 如果学期和专业都已选择,则查询课程列表
+	// 	if (value && form.semesterId) {
+	// 		loadCourseList()
+	// 	}
+	// }
+
+	// 加载课程列表
+	const loadCourseList = () => {
+		// 添加加载状态
+		const courseLoading = message.loading('正在加载课程列表...', 0)
+		// 根据选择的学期和专业加载课程列表
+		resourceAuditApi
+			.courseAllList({
+				semesterId: form.semesterId
+			})
+			.then((res) => {
+				if (res.code === 200) {
+					courseList.value = res.data
+				} else {
+					message.error('加载课程列表失败:' + (res.msg || '未知错误'))
+				}
+			})
+			.catch((err) => {
+				message.error('加载课程列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				courseLoading()
+			})
+	}
 	// 禁用开始时间大于今天的日期
 	const disabledStartDate = (current) => {
 		// 禁用大于今天的日期
@@ -207,7 +267,7 @@
 
 	// 试卷类型变更
 	const paperTypeChange = () => {
-		paperPage.queryParam.subjectId = null
+		paperPage.queryParam.paperId = null
 		form.paperId = null
 		selectedPaperName.value = ''
 	}
@@ -230,7 +290,7 @@
 		}
 		delete params.pageIndex
 		delete params.pageSize
-		const data = await examPaperApi.pageList(params)
+		const data = await examPaperApi.selectExamList(params)
 		const re = data
 		paperPage.tableData = re.records
 		paperPage.total = re.total
@@ -299,12 +359,16 @@
 		form.id = lastId
 		form.examName = ''
 		form.paperId = null
-		form.chapterId = null
+		form.semesterId = null // 重置学期
+		// form.majorId = null // 重置专业
+		form.courseId = null
 		form.startTime = null
 		form.endTime = null
 		form.examStatus = 0
 		selectedPaperName.value = ''
 		paperPage.queryParam.paperType = null
+		majorList.value = [] // 清空专业列表
+		courseList.value = [] // 清空课程列表
 	}
 
 	// 初始化
@@ -312,25 +376,67 @@
 		const id = props.id
 		if (id && parseInt(id) !== 0) {
 			formLoading.value = true
-			examManagerApi.select(id).then((re) => {
-				Object.assign(form, {
-					...re,
-					startTime: re.startTime ? dayjs(re.startTime) : null,
-					endTime: re.endTime ? dayjs(re.endTime) : null
+			examManagerApi
+				.select(id)
+				.then((re) => {
+					Object.assign(form, {
+						...re,
+						startTime: re.startTime ? dayjs(re.startTime) : null,
+						endTime: re.endTime ? dayjs(re.endTime) : null
+					})
+					// 如果有试卷ID,需要获取试卷名称显示
+					if (re.paperId) {
+						// 这里可以根据需要调用接口获取试卷名称
+						examPaperApi.select(re.paperId).then((r) => {
+							selectedPaperName.value = r.name
+						})
+					}
+					// 如果是编辑模式,需要根据已有数据加载相应的课程列表
+					if (re.semesterId) {
+						// 直接加载课程列表
+						loadCourseList()
+					}
+					formLoading.value = false
 				})
-				// 如果有试卷ID,需要获取试卷名称显示
-				if (re.paperId) {
-					// 这里可以根据需要调用接口获取试卷名称
-					selectedPaperName.value = '已选择试卷'
+				.catch((err) => {
+					message.error('加载考试信息失败:' + (err.message || '网络错误'))
+					formLoading.value = false
+				})
+		}
+		// 加载学期列表
+		const semesterLoading = message.loading('正在加载学期列表...', 0)
+		resourceAuditApi
+			.semesterDownList()
+			.then((res) => {
+				if (res.code === 200) {
+					semesterList.value = res.data
+				} else {
+					message.error('加载学期列表失败:' + (res.msg || '未知错误'))
 				}
-				formLoading.value = false
 			})
-		}
-		resourceAuditApi.courseAllList().then((re) => {
-			if (re.code === 200) {
-				courseList.value = re.data
-			}
-		})
+			.catch((err) => {
+				message.error('加载学期列表失败:' + (err.message || '网络错误'))
+			})
+			.finally(() => {
+				semesterLoading()
+			})
+		// 加载专业
+		// const majorLoading = message.loading('正在加载专业列表...', 0)
+		// resourceAuditApi
+		// 	.majordownList()
+		// 	.then((res) => {
+		// 		if (res.code === 200) {
+		// 			majorList.value = res.data
+		// 		} else {
+		// 			message.error('加载专业列表失败:' + (res.msg || '未知错误'))
+		// 		}
+		// 	})
+		// 	.catch((err) => {
+		// 		message.error('加载专业列表失败:' + (err.message || '网络错误'))
+		// 	})
+		// 	.finally(() => {
+		// 		majorLoading()
+		// 	})
 	})
 </script>
 

+ 0 - 1
src/views/exm/questionnaireManagement/index.vue

@@ -155,7 +155,6 @@
 			onOk: async () => {
 				try {
 					await examManagerApi.deleteExam([{ id: record.id }])
-					message.success('删除成功')
 					fetchList()
 				} catch (e) {
 					message.error(e.msg || '删除失败')