1. 教室容量按 1/2 计算
- ExamArrangementService.cs: SelectRooms() 使用 Capacity / 2 选择房间、计算剩余座位和总容量
- MakeupExamArrangementService.cs: 数据库查询用 x.Capacity >= enrolledCount * 2(等价于 Capacity/2 >=
enrolledCount),消息显示有效座位数
2. 教学楼限制多选
- Domain: ExamSession 和 MakeupExamSession 新增 RequiredBuildingIds (JSON string),保留旧 RequiredBuildingId 向后兼容
- Service: RoomGroupKey 改为字符串键确保值相等;GroupKey() 合并新旧字段
- Controller: 请求 DTO 增加 RequiredBuildingIds (Guid 数组),响应包含该字段
- DB: MySQL 迁移 + SQLite migrator 添加新列
- Frontend: <el-select> 改为 multiple,新增 parseBuildingIds() 解析服务器返回的 JSON
3. 导出签名单后台任务
- 新增: ExamSignInExportJob 实体、ExamSignInExportJobProcessor、ExamSignInExportJobStatus 枚举
- BackgroundJobKind: 新增 ExamSignInExport = 5
- RabbitMQ: routing key exam.sign-in-export,队列 jiaowu.background-jobs.exam.sign-in-export
- API: POST /sign-in-export 创建任务返回 202;GET /sign-in-exports/{jobId} 查询状态;GET
/sign-in-exports/{jobId}/download 下载文件
- Frontend: 导出改为异步任务 + 轮询 + 自动下载,显示进度条
- 恢复: OutboxPublisher 启动时恢复未完成的任务,重试超限自动标记失败
This commit is contained in:
@@ -171,6 +171,7 @@ function openSession(existing?: any) {
|
||||
startPeriod: existing?.startPeriod ?? (firstSlot?.periodNumber ?? 1),
|
||||
periodCount: existing?.periodCount ?? 2,
|
||||
requiredBuildingId: existing?.requiredBuildingId ?? undefined,
|
||||
requiredBuildingIds: parseBuildingIds(existing?.requiredBuildingIds),
|
||||
requiredInvigilatorCount: existing?.requiredInvigilatorCount ?? 2,
|
||||
invigilatorIds: existing?.invigilatorIds ?? [],
|
||||
notes: existing?.notes ?? '',
|
||||
@@ -193,6 +194,7 @@ async function saveSession() {
|
||||
startPeriod: payload.startPeriod,
|
||||
periodCount: payload.periodCount,
|
||||
requiredBuildingId: payload.requiredBuildingId,
|
||||
requiredBuildingIds: payload.requiredBuildingIds,
|
||||
requiredInvigilatorCount: payload.requiredInvigilatorCount,
|
||||
notes: payload.notes,
|
||||
})
|
||||
@@ -357,8 +359,12 @@ function classroomLabel(room: any) {
|
||||
return `${room.name} · ${room.capacity}座 · ${room.buildingName}`
|
||||
}
|
||||
function filteredRooms() {
|
||||
if (!sessionForm.requiredBuildingId) return rooms.value
|
||||
return rooms.value.filter((r: any) => r.buildingId === sessionForm.requiredBuildingId)
|
||||
if (!sessionForm.requiredBuildingIds || sessionForm.requiredBuildingIds.length === 0) return rooms.value
|
||||
return rooms.value.filter((r: any) => sessionForm.requiredBuildingIds.includes(r.buildingId))
|
||||
}
|
||||
function parseBuildingIds(raw: string | undefined | null): string[] {
|
||||
if (!raw) return []
|
||||
try { return JSON.parse(raw) } catch { return [] }
|
||||
}
|
||||
|
||||
function openEnrollment(session: any) {
|
||||
@@ -782,7 +788,7 @@ onBeforeUnmount(() => {
|
||||
</div>
|
||||
<div class="form-grid">
|
||||
<el-form-item label="教学楼限制">
|
||||
<el-select v-model="sessionForm.requiredBuildingId" clearable placeholder="不限教学楼">
|
||||
<el-select v-model="sessionForm.requiredBuildingIds" multiple clearable placeholder="不限教学楼">
|
||||
<el-option v-for="x in buildings" :key="x.id" :label="x.name" :value="x.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
Reference in New Issue
Block a user