课表优化
This commit is contained in:
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(
|
||||
|
||||
Reference in new issue
Block a user