任务书 P95 W1/W2/W3/W7。发一张表单原本要 UserBase 超管加一条 /f/{code} 模块行并组授权, 实测成本不可接受(10 张表=10 次跨系统操作),人群判定收回表单中心自解析。 - FillAccessService:audience × 会话身份(roleIds ∪ currentRole)× 管理员两表 → 层集合 ADMIN/MANAGE/FILL/空=NONE,谓词 canFill/canProxy/isAdmin + topTier;与 DataScopeService 读矩阵、FormAdminGuard 管理端入口三条线正交,结论互不供给 - AnswerService.doSubmit:钉版解析之后插第 0 关(先鉴权后业务,幂等重落在闸门后); requireSubject 吸收行为表——教师×面向学生只能代填本校学生(P33 existsInSchool 保留), 层③代填仍沿 canManage 现路径,层①普通成员代填照旧拒 - GET /api/form/my/fillable:会话校 ∪ 平台级取域、复用 FormDefService.pickByShadowing 做 (app_code,code) 遮蔽去重、仅已发布未软删、NONE 不入集,行带 canFill + myTier 两件事, deadline 升序 null 在后;新增 MyModels.FillableRow - h2 登记脚本快应用段 5→4 行:删 /f/ 填报行与学生组授权,保留应用行/管理页面行/ path 空导入导出锚点/学校开通;H2 冻结延续,本轮未在任何环境执行 - 测试:FillAccessServiceTest 16(V48)+ AnswerFillGateIT 14(V49)+ FillableListIT 10(V50), mvn -B -o clean test 全量 259 绿(教师×面向学生的造数据通道按新口径改代填, 读矩阵与限次等断言判据一字未改) DataScopeService 与 FormAdminGuard 两个文件本轮未被改动(红线 1/2)。
- 新增 school_admin/form_admin 两表(sql/t10_admin_domain.sql,含 answer.submitter_sch_id 加列)与 AdminDomainController/AdminDomainService/SchoolUserTreeService - DataScopeService 范围体系按 P80 验收口径落地:入口只认模块行、查询域=会话校、两表只升范围;新增 SchoolScopeImplementor - fc:scope:all / SCOPE_ALL_CUSTOM_ID / anchorCustomIds / MODULE_DICT 锚点全链路退役,全仓引用归零;h2 登记脚本 6→5 行(快应用段逐字未动) - AnswerScopeQueryBuilder 校域不变式:answer.sch_id 恒=会话校,基础过滤 sch_id+app_code+code+is_deleted 不变 - FormAdminGuard:targetSchId=0(基础表单)仅超管可维护;FormAdminController/AnswerReadController 等按管理员范围收口 - 测试基线 190→219/0/0/0:DataScopeServiceTest 22、FormAdminGuardTest 14、AdminScopeIT 8、AdminDomainIT 10、AnswerReadIT 改写 1、FormBaseControllerTest 7 等
Perf200kProbe(20 万答卷/78 万索引行,独立库 bsch_formcenter_perf): - V10 量化:列表首屏 p95=22ms、三条件筛选 p95=313ms、深分页 keyset p95=31ms、 统计 p95=1~334ms、导出 2 万级 4.1~8.1s(冷缓冲池首跑 22.1s 已如实记档) - 铁律取证:org.hibernate.SQL 日志抓真实语句——第一段只 select id、不含 values_json; 翻页谓词是 answer.id<游标;EXPLAIN 显示首屏/计数走 idx_answer_form_time 且 using_index=true - P26:8 线程×250 并发实测 answer_no 重号率=1392/2000(69.6%,"不限次+报名号"组合) - P37:新答卷后 cached=true、升版后 cached=false(铁律④语义与实现一致) - P35/P31:information_schema 复核索引基数与 ROW_FORMAT=Dynamic(本机 8.0.45) - 类名不带 Test/IT → 不进 mvn test 门禁(190 用例仍是快门禁),手点 -Dtest 才跑 PerfTreeCallsProbe(控制器形状,复用同一份数据): - P44 请求级取树次数:列表/详情/导出=2、统计=3、筛选候选=1(P44 的"1~2 次"上界在统计路径实测为 3) - V10 请求级延迟:筛选 p95=163ms、导出 2297ms/1.15MB - P36 升版补建实测:19,600 行表单的发布=373,272ms 且本次补出 0 行—— P36 记档的"2 万级秒级"不成立,N+1 逐行探测是主因(数字交验收轮裁决是否触发 publish 处改造) sql/h2_userbase_app_and_modules.sql(H2 + 第一个快应用登记交接件): 中心应用六条模块行(手册 §2.2,含 path 空 fc:scope:all 锚点)+ 快应用五条模块行 (方案 §6.2 checklist,导入/导出为 path 空锚点)+ 组/角色授权与开通 + 验收查询 + 回滚段。 AI 不代跑(沿 flow-center 先例;H2 既定路径是超管在管理端录入,脚本为批量/复核形态)。 步骤 3.5 显式记录"快应用数据视图的后端守卫仍扫中心树"这一过渡口径(T9 报告 P78 附注)。 docs/T6-report.md 已按 P69 从本仓 docs/ 挪至 form-center/docs/(本提交不含该文件)。