fix(post-p95): 跨版本编辑必挂/编辑不吃截止闸/自填 subject 归一/报名号并发重号

P95 落地后的独立修复批,四条存量逻辑硬伤(填报入口层不动):

- 跨版本编辑必挂:客户端按当前发布版渲染、服务端按钉住旧版校验,升版后编辑永远
  400(含未知字段/缺必填)。改为编辑态吃 /my/detail 的钉住版 groups。
- 编辑不吃截止/停用闸:先占位、截止后随便改可绕过 deadline。editBySubmitter 补
  截止/停用/已删三闸,与 submit 同口径。
- 自填 subject 落 NULL:subject_id 为空的自填行进不了"关于我的"(/my/about 与
  ABOUT_ME 谓词都按 subject 查),V18"含代填"实际退化成"仅代填"。落库归一为
  coalesce(subjectId, submitterId);限次键本就是 coalesce,不受影响。
- answer_no 并发重号:count+1 的 count 与 insert 之间有并发窗口,报名号是对外凭证。
  加 uk_answer_no 兜底 + 撞号重算序号重试(3 次封顶),按异常消息列名区分撞的是
  报名号还是幂等键(MySQL/H2 通用)。

语义变更备案:自填行 subject 由 NULL 变本人,读矩阵"学生x面向学生=关于我"这一格
此后含自填行,可见集变大(DataScopeService/矩阵规则一字未动,变的是数据形状)。
三处断言随行为更新:AdminScopeIT、AnswerReadIT、MyAnswerIT(+ReadFixture 注释)。

验证:mvn 261 绿(+2 新用例:并发报名号不重复、编辑闸三态)。
This commit is contained in:
chenxing
2026-10-16 15:04:20 +08:00
parent a02f47ad5c
commit 7af6a98fc0
9 changed files with 135 additions and 12 deletions
+4
View File
@@ -40,6 +40,10 @@ CREATE TABLE `answer` (
PRIMARY KEY (`id`),
UNIQUE KEY `uk_answer_uuid` (`uuid`),
UNIQUE KEY `uk_answer_idem` (`idempotency_key`),
-- Bug#4 变更(本轮):报名号并发重号兜底。answer_no 是 count+1(当日已有号数)生成,
-- 同表单同日并发提交会算出同一个号;号是对外凭证,库级唯一才拦得住。
-- null 不参与唯一判定(未开报名号的表单该列恒 null,多行共存不受影响)。
UNIQUE KEY `uk_answer_no` (`sch_id`, `app_code`, `code`, `answer_no`),
KEY `idx_answer_form` (`sch_id`, `code`, `status`, `id`),
KEY `idx_answer_submitter` (`sch_id`, `submitter_id`),
KEY `idx_answer_subject` (`subject_id`),