docs(education): update migration status and add EDU-017~033 tickets

This commit is contained in:
2026-08-01 12:17:00 +08:00
parent 453193e857
commit 0eba587459
50 changed files with 1120 additions and 407 deletions

View File

@@ -3,7 +3,7 @@
- **Status:** implemented
- **Type:** bounded vertical capability
- **Phase:** 4
- **Decision:** Education owns tenant-local classes and student/teacher relationships to existing Member identities. System RBAC remains the action-authorization boundary; class roles never become System roles. No platform tenant-ignore endpoint or supervision model is introduced in this slice.
- **Decision:** Education owns tenant-local classes, student/teacher relationships, learning-risk rules, and follow-up tasks. System RBAC, AdminUser, departments, and data-permission policy remain authoritative; Member owns student accounts. Class roles never become System roles.
## Tenant-admin outcome
@@ -25,7 +25,10 @@ Tenant administrators manage classes, student education relationships, invitatio
- Management permissions are independent: `education:class:create`, `education:class:query`, `education:class-member:query`, and `education:class-invitation:create`. Permissions are provisioned separately by System RBAC and are not represented in class relationships.
- All aggregate tenant IDs come from `TenantContextHolder`; tenant-qualified mapper predicates and PostgreSQL triggers reject cross-tenant relationships.
- Invitation creation is idempotent per tenant, actor, and key with request-hash conflict detection. Acceptance locks the invitation, checks invitee and expiry, and writes relationship plus audit in one transaction.
- This bounded slice intentionally excludes account creation, password handling, platform tenant-ignore operations, education profile duplication, and supervision relationships.
- This capability intentionally excludes account creation, password handling, platform tenant-ignore operations, and education profile duplication.
- V4270 adds supervision without changing account ownership: risk evidence is aggregated from existing Education practice, wrong-question, session, and vocabulary tables; Member and System data are API projections only.
- Classes, rules, and follow-ups carry only `dept_id`/`owner_user_id` authorization projections and are registered with RuoYi `DeptDataPermissionRule` for department/self row scope.
- Risk preview, rule authoring, idempotent task generation, and optimistic task handling have independent System permissions. `(tenant_id, batch_key, student_user_id)` is the retry-safe generation key; atomic PostgreSQL conflict-ignore and a subsequent scoped read return the same committed task to concurrent callers without recovering from a failed transaction.
## Role and permission semantics
@@ -42,6 +45,9 @@ Tenant administrators manage classes, student education relationships, invitatio
- [x] Invitation acceptance is idempotent and auditable.
- [x] Platform-admin tenant-ignore operations are explicit and permission guarded (none are exposed by this bounded capability).
- [x] Database changes use `flyway-postgresql`.
- [x] Risk preview and follow-up reads respect tenant plus System department/self data scope, including an unfiltered-class CTE aggregation path verified against a real `LoginUser`/`DeptDataPermissionRespDTO` PostgreSQL context.
- [x] Supervision assignees are validated by `AdminUserApi`, and students are enriched by `MemberUserApi`.
- [x] Follow-up generation and handling are duplicate-safe and stale-write-safe.
## Risk and rollback