已完成本轮迁移:管理后台、审批流和考务编排的业务 API 已全部由 ASP.NET Core 10 原生处理。

主要完成:
管理端招生工作台、指标资格、招生学校账号。
招生计划审核、分数优先多志愿投档、退档监督。
逐轮录取公示、报到审批、补录轮次推进、最低录取线公示。
成绩预览导入与管理员账号禁止物理删除。
新增迁移开关及健康状态:[MIGRATION.md (line 57)](C:\\Users\\BI\\Documents\\EIS-dotnet\\MIGRATION.md:57)
核心实现:[AdminAdmissionService.cs (line 10)](C:\\Users\\BI\\Documents\\EIS-dotnet\\src\\Eis.Infrastructure\\Administration\\AdminAdmissionService.cs:10)
原生路由:[NativeAdminReadEndpoints.cs (line 209)](C:\\Users\\BI\\Documents\\EIS-dotnet\\src\\Eis.Web\\Administration\\NativeAdminReadEndpoints.cs:209)
This commit is contained in:
2026-07-23 13:08:17 +08:00 Unverified
parent d47c614b53
commit 4df6303153
14 changed files with 1810 additions and 13 deletions
@@ -181,6 +181,9 @@ public static class NativeAdminReadEndpoints
endpoints.MapPost("/api/admin/results/bulk",
(HttpContext context, JsonObject body, IAdminResultService service, CancellationToken cancellationToken) =>
Execute(context, service.SaveBulkAsync(Token(context), body, cancellationToken)));
endpoints.MapPost("/api/admin/results/import",
(HttpContext context, JsonObject body, IAdminResultService service, CancellationToken cancellationToken) =>
Execute(context, service.ImportAsync(Token(context), body, cancellationToken)));
endpoints.MapPost("/api/admin/feature-scores/bulk",
(HttpContext context, JsonObject body, IAdminResultService service, CancellationToken cancellationToken) =>
Execute(context, service.SaveFeatureBulkAsync(Token(context), body, cancellationToken)));
@@ -202,6 +205,55 @@ public static class NativeAdminReadEndpoints
context.Request.Query["examId"].ToString(),
cancellationToken)));
}
if (options.NativeAdmissionsEnabled)
{
endpoints.MapGet("/api/admin/admissions",
(HttpContext context, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.GetAsync(Token(context), cancellationToken)));
endpoints.MapGet("/api/admin/indicator-qualifications",
(HttpContext context, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.GetQualificationsAsync(Token(context), cancellationToken)));
endpoints.MapPut("/api/admin/indicator-qualifications/{examId}/bulk",
(HttpContext context, string examId, JsonObject body, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.SaveQualificationsAsync(Token(context), examId, body, cancellationToken)));
endpoints.MapPut("/api/admin/indicator-qualifications/{examId}/{userId}",
(HttpContext context, string examId, string userId, JsonObject body, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.SaveQualificationAsync(Token(context), examId, userId, body, cancellationToken)));
endpoints.MapPost("/api/admin/admission-school-accounts",
(HttpContext context, JsonObject body, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.CreateAccountAsync(Token(context), body, cancellationToken)));
endpoints.MapPatch("/api/admin/admission-school-accounts/{accountId}",
(HttpContext context, string accountId, JsonObject body, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.UpdateAccountAsync(Token(context), accountId, body, cancellationToken)));
endpoints.MapPost("/api/admin/admission-school-accounts/{accountId}/reset-password",
(HttpContext context, string accountId, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.ResetAccountPasswordAsync(Token(context), accountId, cancellationToken)));
endpoints.MapPut("/api/admin/admissions/{examId}/setting",
(HttpContext context, string examId, JsonObject body, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.SaveSettingAsync(Token(context), examId, body, cancellationToken)));
endpoints.MapPost("/api/admin/admission-plans",
(HttpContext context, JsonObject body, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.SavePlanAsync(Token(context), body, cancellationToken)));
endpoints.MapPatch("/api/admin/admission-plans/{planId}",
(HttpContext context, string planId, JsonObject body, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.ReviewPlanAsync(Token(context), planId, body, cancellationToken)));
endpoints.MapPost("/api/admin/admissions/{examId}/{action:regex(^(match|finalize|supplementary)$)}",
(HttpContext context, string examId, string action, JsonObject body, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.RunActionAsync(Token(context), examId, action, body, cancellationToken)));
endpoints.MapPatch("/api/admin/admission-reporting/{recordId}",
(HttpContext context, string recordId, JsonObject body, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.ReviewReportingAsync(Token(context), recordId, body, cancellationToken)));
endpoints.MapPatch("/api/admin/admission-withdrawals/{placementId}",
(HttpContext context, string placementId, JsonObject body, IAdminAdmissionService service, CancellationToken cancellationToken) =>
Execute(context, service.ReviewWithdrawalAsync(Token(context), placementId, body, cancellationToken)));
}
if (options.NativeReadsEnabled)
{
endpoints.MapDelete("/api/admin/admins/{**path}", NativeDeleteNotAllowed);
endpoints.MapDelete("/api/admin/candidates/{**path}", NativeDeleteNotAllowed);
endpoints.MapDelete("/api/admin/candidate-accounts/{**path}", NativeDeleteNotAllowed);
}
return endpoints;
}
@@ -234,4 +286,13 @@ public static class NativeAdminReadEndpoints
private static string Token(HttpContext context) =>
context.Request.Cookies.TryGetValue("hz_session", out var token) ? token : string.Empty;
private static IResult NativeDeleteNotAllowed(HttpContext context)
{
context.Response.Headers.CacheControl = "no-store";
context.Response.Headers["X-EIS-Implementation"] = "aspnet-core";
return Results.Json(
new JsonObject { ["ok"] = false, ["message"] = "账户不得删除;考生账户请由校方归档,管理员账户可停用" },
statusCode: StatusCodes.Status405MethodNotAllowed);
}
}
+12 -1
View File
@@ -57,7 +57,8 @@ var adminMigrationOptions = AdminMigrationOptions.FromEnvironment(
builder.Configuration.GetValue<bool>("AdminMigration:NativeWorkflowOperationsEnabled"),
builder.Configuration.GetValue<bool>("AdminMigration:NativeExamManagementEnabled"),
builder.Configuration.GetValue<bool>("AdminMigration:NativeArrangementsEnabled"),
builder.Configuration.GetValue<bool>("AdminMigration:NativeResultsEnabled"));
builder.Configuration.GetValue<bool>("AdminMigration:NativeResultsEnabled"),
builder.Configuration.GetValue<bool>("AdminMigration:NativeAdmissionsEnabled"));
builder.Services.AddEisInfrastructure(
DatabaseOptions.FromEnvironment(applicationRoot, builder.Environment.IsProduction()),
DocumentVerificationOptions.FromEnvironment(builder.Environment.IsProduction()),
@@ -124,6 +125,7 @@ app.MapGet("/health/migration", async (LegacyApiProxy proxy, CancellationToken c
nativeExamManagementEnabled = adminMigrationOptions.NativeExamManagementEnabled,
nativeArrangementsEnabled = adminMigrationOptions.NativeArrangementsEnabled,
nativeResultsEnabled = adminMigrationOptions.NativeResultsEnabled,
nativeAdmissionsEnabled = adminMigrationOptions.NativeAdmissionsEnabled,
nativeRoutes = (adminMigrationOptions.NativeReadsEnabled
? new[] { "GET context", "GET dashboard", "GET schools", "GET school-organization", "GET admins", "GET exams" }
: [])
@@ -175,6 +177,15 @@ app.MapGet("/health/migration", async (LegacyApiProxy proxy, CancellationToken c
"PATCH score appeals", "GET result Excel export"
}
: [])
.Concat(adminMigrationOptions.NativeAdmissionsEnabled
? new[]
{
"GET admissions/indicator qualifications", "PUT qualification single/bulk",
"POST/PATCH/reset admission-school accounts", "PUT admission settings",
"POST/PATCH admission plans", "POST admission match/finalize/supplementary",
"PATCH admission reporting/withdrawals"
}
: [])
.ToArray()
},
features = MigrationFeatureCatalog.Current(authenticationOptions.NativeEnabled, candidateMigrationOptions.NativeEnabled)
+2 -1
View File
@@ -22,7 +22,8 @@
"NativeWorkflowOperationsEnabled": false,
"NativeExamManagementEnabled": false,
"NativeArrangementsEnabled": false,
"NativeResultsEnabled": false
"NativeResultsEnabled": false,
"NativeAdmissionsEnabled": false
},
"Logging": {
"LogLevel": {