本阶段迁移已完成。
Excel:班级、账号、考生、缴费、考场、成绩、志愿、录取、报到及正式录取名册均改为 ClosedXML 原生处理,支持模板、校验、筛选和导入预检。[SystemWorkbook.cs](C:\\Users\\BI\\Documents\\EIS-dotnet\\src\\Eis.Infrastructure\\Spreadsheets\\SystemWorkbook.cs) 文书:录取通知书模板、成绩单/准考证/通知书业务数据与防伪验真已脱离 Node;保留现有前端排版导出效果。[AdminAdmissionService.Documents.cs](C:\\Users\\BI\\Documents\\EIS-dotnet\\src\\Eis.Infrastructure\\Administration\\AdminAdmissionService.Documents.cs) 缓存:完成 Redis 命名空间版本缓存、有界本地回退、请求合并和并发失效保护;公开数据及成绩写入后立即失效。[ApplicationCache.cs](C:\\Users\\BI\\Documents\\EIS-dotnet\\src\\Eis.Infrastructure\\Caching\\ApplicationCache.cs) 迁移清单已更新为完成。[MIGRATION.md](C:\\Users\\BI\\Documents\\EIS-dotnet\\MIGRATION.md)
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System.Globalization;
|
||||
using System.Text.Json.Nodes;
|
||||
using Eis.Application.Candidate;
|
||||
using Eis.Infrastructure.Authentication;
|
||||
using Eis.Infrastructure.Security;
|
||||
using QRCoder;
|
||||
|
||||
@@ -21,6 +22,20 @@ internal sealed partial class CandidateService
|
||||
|
||||
var user = context.User!;
|
||||
var profile = context.Profile!;
|
||||
var body = await cache.RememberJsonAsync(
|
||||
"results",
|
||||
$"candidate:{Uri.EscapeDataString(user.Id)}",
|
||||
() => LoadResultsAsync(user, profile, verificationBaseUrl, cancellationToken),
|
||||
PositiveInteger(Environment.GetEnvironmentVariable("REDIS_RESULTS_CACHE_TTL_SECONDS"), 86400));
|
||||
return Success(body);
|
||||
}
|
||||
|
||||
private async Task<JsonObject> LoadResultsAsync(
|
||||
AuthenticationUser user,
|
||||
JsonObject profile,
|
||||
string verificationBaseUrl,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var snapshot = await snapshotLoader.LoadAsync(user.Id, cancellationToken, includeCohort: true);
|
||||
var registrationById = snapshot.Registrations.ToDictionary(item => item.Id, StringComparer.Ordinal);
|
||||
var results = snapshot.Results
|
||||
@@ -46,7 +61,7 @@ internal sealed partial class CandidateService
|
||||
summaries.Add(summary);
|
||||
}
|
||||
|
||||
return Success(new JsonObject
|
||||
return new JsonObject
|
||||
{
|
||||
["ok"] = true,
|
||||
["results"] = new JsonArray(results),
|
||||
@@ -56,9 +71,12 @@ internal sealed partial class CandidateService
|
||||
["name"] = Text(profile, "name").Length > 0 ? Text(profile, "name") : user.DisplayName,
|
||||
["candidateNumber"] = user.CandidateNumber ?? string.Empty
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
private static int PositiveInteger(string? value, int fallback) =>
|
||||
int.TryParse(value, out var parsed) && parsed > 0 ? Math.Min(parsed, 86400) : fallback;
|
||||
|
||||
public async Task<CandidateEndpointResult> CreateScoreAppealAsync(
|
||||
string sessionToken,
|
||||
string resultId,
|
||||
|
||||
Reference in New Issue
Block a user