本阶段迁移已完成。
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 parent
4df6303153
commit
fea91a19af
24 files changed
+2209
-35
No files matched your search
+9
-2
@@ -14,7 +14,7 @@
|
|||||||
- [x] 考生业务
|
- [x] 考生业务
|
||||||
- [x] 管理后台、审批流和考务编排
|
- [x] 管理后台、审批流和考务编排
|
||||||
- [x] 考生志愿填报与招生录取查询
|
- [x] 考生志愿填报与招生录取查询
|
||||||
- [ ] Excel、文书和缓存
|
- [x] Excel、文书和缓存
|
||||||
- [ ] 容器入口切换及 Node.js 后端移除
|
- [ ] 容器入口切换及 Node.js 后端移除
|
||||||
|
|
||||||
## 本地运行
|
## 本地运行
|
||||||
@@ -54,7 +54,14 @@ $env:AUTH_NATIVE_ENABLED = 'true'
|
|||||||
$env:CANDIDATE_NATIVE_ENABLED = 'true'
|
$env:CANDIDATE_NATIVE_ENABLED = 'true'
|
||||||
```
|
```
|
||||||
|
|
||||||
管理后台第一至十三批已经覆盖基础读取、组织账户、批量建号、流程定义与收件箱、通知公示、考点审批、报名缴费、考试维护、准考证编排和成绩管理。第十四批补齐指标资格确认、招生学校账号、志愿设置、招生计划审核、分数优先投档、逐轮录取公示、报到补录审批、退档监督和成绩预览提交;管理后台、审批流及考务编排的业务 API 至此全部由 ASP.NET Core 原生处理。Excel 文件解析、文书生成和缓存替换仍作为独立迁移阶段。
|
管理后台第一至十三批已经覆盖基础读取、组织账户、批量建号、流程定义与收件箱、通知公示、考点审批、报名缴费、考试维护、准考证编排和成绩管理。第十四批补齐指标资格确认、招生学校账号、志愿设置、招生计划审核、分数优先投档、逐轮录取公示、报到补录审批、退档监督和成绩预览提交;管理后台、审批流及考务编排的业务 API 至此全部由 ASP.NET Core 原生处理。
|
||||||
|
|
||||||
|
Excel、文书和缓存阶段已经完成:
|
||||||
|
|
||||||
|
- ClosedXML 原生处理班级、管理员、报名号配额及结果、考生、缴费、考点考场、成绩、志愿、录取、报到和正式录取名册工作簿;模板保留必填提示、数据验证、冻结标题、筛选与数值格式。
|
||||||
|
- 成绩 Excel 上传先生成预检结果,不直接发布成绩;报到 Excel 只更新本校当前可维护批次,并返回逐行变更摘要。
|
||||||
|
- 录取通知书模板由 ASP.NET Core 原生读取与保存;成绩单、准考证和录取通知书继续由现有前端排版导出,但其业务数据、防伪码和验真接口均已脱离 Node.js。
|
||||||
|
- 公开首页和考生成绩改用 Redis 命名空间版本缓存;Redis 未配置或暂不可用时使用有界进程内缓存。考试、组织、通知、招生和成绩写入后会立即失效对应命名空间,`GET /health/migration` 会报告缓存状态。
|
||||||
|
|
||||||
管理端各功能域均可独立切换;在兼容运行期仍要求原生认证和共享 Redis:
|
管理端各功能域均可独立切换;在兼容运行期仍要求原生认证和共享 Redis:
|
||||||
|
|
||||||
|
|||||||
@@ -1111,6 +1111,37 @@ try {
|
|||||||
$resultExport.RawContentLength -lt 1000) {
|
$resultExport.RawContentLength -lt 1000) {
|
||||||
throw 'Native result workbook export is invalid'
|
throw 'Native result workbook export is invalid'
|
||||||
}
|
}
|
||||||
|
foreach ($excelResource in @('classes', 'class_admins', 'account_quotas', 'candidates', 'payments', 'centers')) {
|
||||||
|
$excelExport = Invoke-WebRequest -Uri "$nativeAuthBaseUrl/api/admin/excel/$excelResource" -WebSession $nativeSession
|
||||||
|
if ($excelExport.Headers['X-EIS-Implementation'] -ne 'aspnet-core' -or
|
||||||
|
$excelExport.Headers['Content-Type'] -notmatch 'spreadsheetml' -or
|
||||||
|
$excelExport.RawContentLength -lt 1000) {
|
||||||
|
throw "Native '$excelResource' workbook export is invalid"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$accountResultTemplate = Invoke-WebRequest -Uri "$nativeAuthBaseUrl/api/admin/excel/account_results?template=1" -WebSession $nativeSession
|
||||||
|
if ($accountResultTemplate.Headers['X-EIS-Implementation'] -ne 'aspnet-core' -or
|
||||||
|
$accountResultTemplate.Headers['Content-Type'] -notmatch 'spreadsheetml' -or
|
||||||
|
$accountResultTemplate.RawContentLength -lt 1000) {
|
||||||
|
throw "Native 'account_results' workbook template is invalid"
|
||||||
|
}
|
||||||
|
foreach ($ledgerKind in @('preferences', 'placements')) {
|
||||||
|
$ledgerExport = Invoke-WebRequest -Uri "$nativeAuthBaseUrl/api/admin/admissions/$ledgerKind/export" -WebSession $nativeSession
|
||||||
|
if ($ledgerExport.Headers['X-EIS-Implementation'] -ne 'aspnet-core' -or
|
||||||
|
$ledgerExport.Headers['Content-Type'] -notmatch 'spreadsheetml' -or
|
||||||
|
$ledgerExport.RawContentLength -lt 1000) {
|
||||||
|
throw "Native admission '$ledgerKind' ledger workbook export is invalid"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$admissionSchoolSession = [Microsoft.PowerShell.Commands.WebRequestSession]::new()
|
||||||
|
$admissionSchoolLoginBody = @{ username = 'admission_1_admin'; password = '12345678' } | ConvertTo-Json -Compress
|
||||||
|
Invoke-RestMethod -Uri "$nativeAuthBaseUrl/api/auth/login" -Method Post -ContentType 'application/json' -Body $admissionSchoolLoginBody -WebSession $admissionSchoolSession | Out-Null
|
||||||
|
foreach ($admissionSchoolRoute in @('notice-template', 'reporting', 'placements')) {
|
||||||
|
$admissionSchoolResponse = Invoke-WebRequest -Uri "$nativeAuthBaseUrl/api/admission/$admissionSchoolRoute" -WebSession $admissionSchoolSession
|
||||||
|
if ($admissionSchoolResponse.Headers['X-EIS-Implementation'] -ne 'aspnet-core') {
|
||||||
|
throw "Native admission-school route '$admissionSchoolRoute' did not use ASP.NET Core"
|
||||||
|
}
|
||||||
|
}
|
||||||
$legacyResultsAfterWrites = Invoke-WebRequest -Uri "$legacyBaseUrl$resultsUri" -WebSession $session
|
$legacyResultsAfterWrites = Invoke-WebRequest -Uri "$legacyBaseUrl$resultsUri" -WebSession $session
|
||||||
$nativeResultsAfterWrites = Invoke-WebRequest -Uri "$nativeAuthBaseUrl$resultsUri" -WebSession $nativeSession
|
$nativeResultsAfterWrites = Invoke-WebRequest -Uri "$nativeAuthBaseUrl$resultsUri" -WebSession $nativeSession
|
||||||
Assert-JsonEquivalent -Expected $legacyResultsAfterWrites.Content -Actual $nativeResultsAfterWrites.Content -Label 'Result writes follow-up'
|
Assert-JsonEquivalent -Expected $legacyResultsAfterWrites.Content -Actual $nativeResultsAfterWrites.Content -Label 'Result writes follow-up'
|
||||||
|
|||||||
@@ -17,4 +17,16 @@ public interface IAdminAdmissionService
|
|||||||
Task<AdminEndpointResult> RunActionAsync(string sessionToken, string examId, string action, JsonObject body, CancellationToken cancellationToken);
|
Task<AdminEndpointResult> RunActionAsync(string sessionToken, string examId, string action, JsonObject body, CancellationToken cancellationToken);
|
||||||
Task<AdminEndpointResult> ReviewReportingAsync(string sessionToken, string recordId, JsonObject body, CancellationToken cancellationToken);
|
Task<AdminEndpointResult> ReviewReportingAsync(string sessionToken, string recordId, JsonObject body, CancellationToken cancellationToken);
|
||||||
Task<AdminEndpointResult> ReviewWithdrawalAsync(string sessionToken, string placementId, JsonObject body, CancellationToken cancellationToken);
|
Task<AdminEndpointResult> ReviewWithdrawalAsync(string sessionToken, string placementId, JsonObject body, CancellationToken cancellationToken);
|
||||||
|
Task<AdminEndpointResult> GetAdmissionSchoolNoticeTemplateAsync(string sessionToken, CancellationToken cancellationToken);
|
||||||
|
Task<AdminEndpointResult> SaveAdmissionSchoolNoticeTemplateAsync(string sessionToken, JsonObject body, CancellationToken cancellationToken);
|
||||||
|
Task<AdminEndpointResult> GetAdmissionSchoolReportingAsync(string sessionToken, CancellationToken cancellationToken);
|
||||||
|
Task<AdminDocumentResult> ExportAdmissionSchoolReportingAsync(string sessionToken, string examId, CancellationToken cancellationToken);
|
||||||
|
Task<AdminEndpointResult> ImportAdmissionSchoolReportingAsync(string sessionToken, string examId, byte[] content, CancellationToken cancellationToken);
|
||||||
|
Task<AdminEndpointResult> GetAdmissionSchoolPlacementsAsync(string sessionToken, CancellationToken cancellationToken);
|
||||||
|
Task<AdminDocumentResult> ExportAdmissionSchoolPlacementsAsync(string sessionToken, string examId, CancellationToken cancellationToken);
|
||||||
|
Task<AdminDocumentResult> ExportAdminLedgerAsync(
|
||||||
|
string sessionToken,
|
||||||
|
string kind,
|
||||||
|
IReadOnlyDictionary<string, string> filters,
|
||||||
|
CancellationToken cancellationToken);
|
||||||
}
|
}
|
||||||
Loaded 3 of 24 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user