课表优化

This commit is contained in:
biss committed 2026-08-11 16:56:23 +08:00
1 parent e8482b26f2
commit cd4ffa1d85
7 files changed
+569 -34

No files matched your search

@@ -171,6 +171,77 @@ public sealed class TimetableManagementController(
return File(bytes, ExcelWorkbookHelper.ContentType, fileName);
}
[HttpPost("export/batch.xlsx")]
public async Task<ActionResult> ExportBatch(
TimetableBatchExportRequest request,
CancellationToken cancellationToken)
{
var resourceIds = request.ResourceIds.Distinct().ToArray();
if (resourceIds.Length is 0 or > 100)
return ValidationProblem("请选择 1 至 100 个课表对象进行导出。", statusCode: StatusCodes.Status400BadRequest);
var timetables = new List<TimetableData>(resourceIds.Length);
foreach (var resourceId in resourceIds)
{
var result = await LoadAuthorizedAsync(
request.ResourceType,
resourceId,
request.AcademicTermId,
request.SchedulePlanId,
cancellationToken);
if (result.Result is null) return result.Error!;
timetables.Add(result.Result);
}
var bytes = TimetableExcelExporter.Create(timetables);
var fileName = $"课表批量导出-{FileName(timetables[0].Term.Name)}.xlsx";
return File(bytes, ExcelWorkbookHelper.ContentType, fileName);
}
[HttpGet("export.pdf")]
public async Task<ActionResult> ExportPdf(
TimetableResourceType resourceType,
Guid resourceId,
Guid academicTermId,
Guid? schedulePlanId,
CancellationToken cancellationToken)
{
var result = await LoadAuthorizedAsync(
resourceType,
resourceId,
academicTermId,
schedulePlanId,
cancellationToken);
if (result.Result is null) return result.Error!;
return PdfFile(result.Result);
}
[HttpPost("export/batch.pdf")]
public async Task<ActionResult> ExportBatchPdf(
TimetableBatchExportRequest request,
CancellationToken cancellationToken)
{
var resourceIds = request.ResourceIds.Distinct().ToArray();
if (resourceIds.Length is 0 or > 100)
return ValidationProblem("请选择 1 至 100 个课表对象进行导出。", statusCode: StatusCodes.Status400BadRequest);
var timetables = new List<TimetableData>(resourceIds.Length);
foreach (var resourceId in resourceIds)
{
var result = await LoadAuthorizedAsync(
request.ResourceType,
resourceId,
request.AcademicTermId,
request.SchedulePlanId,
cancellationToken);
if (result.Result is null) return result.Error!;
timetables.Add(result.Result);
}
var fileName = $"课表批量导出-{FileName(timetables[0].Term.Name)}.pdf";
return File(TimetablePdfExporter.Create(timetables), "application/pdf", fileName);
}
private async Task<(TimetableData? Result, ActionResult? Error)> LoadAuthorizedAsync(
TimetableResourceType resourceType,
Guid resourceId,
@@ -205,8 +276,20 @@ public sealed class TimetableManagementController(
value = value.Replace(character, '-');
return value.Trim();
}
private ActionResult PdfFile(TimetableData timetable) =>
File(
TimetablePdfExporter.Create(timetable),
"application/pdf",
$"{FileName(timetable.Subject.Name)}-{FileName(timetable.Term.Name)}-课表.pdf");
}
public sealed record TimetableBatchExportRequest(
TimetableResourceType ResourceType,
[property: Required, MinLength(1), MaxLength(100)] IReadOnlyCollection<Guid> ResourceIds,
Guid AcademicTermId,
Guid? SchedulePlanId);
[ApiController]
[Route("api/timetables")]
public sealed class FreeClassroomsController(