返回 Bug 清单
BUG-0397project-13高已修复database-schema

占位符别名按 id 字典序动态推导,新增一家 id 靠前的记录会让数百道题的指向静默改错

发现:2026-10-03验证:2026-10-09置信度:90%

症状

新增一家公司后,数百道题里出现的公司名悄悄换成了另一家;没有报错、没有测试失败,只有人工比对才能发现。

根因

companies 表没有 alias 列,占位符别名 {{COMPANY_A}} 的含义由「按 id 字典序的第 i 家的字母」在运行时推导。任何新增/停用公司都会改变这个序列,导致既有别名整体漂移——引用量最大的 COMPANY_A 被 454 道题引用(2897 处),一旦漂移就静默改指新公司,且不报任何错。

修复方案

①companies 加 alias 列(显式持久化,长度 20);②SymbolResolver 第一轮注册显式 alias,第二轮才为未配置的公司回退字母序并打 WARN 列出未配公司 id;重复 alias 时保留先注册者并 WARN,不静默串号;③CompanyAliasBackfillRunner(@Order(15)) 在启动时按 id 字典序把 A…Z 回填到空值公司,与回填前的运行时分配完全一致,保证题目显示零变化;④CompanyController 的 create/update 校验 alias 只允许 [A-Z0-9_]{1,20} 且全局唯一,创建时未指定则自动分配未占用别名,26 个用尽则明确报错;⑤新增 alias-overview 接口返回每个别名的引用处数/涉及题数/样例题。

错误签名

SymbolResolver 用 String.valueOf((char) ('A' + i)) 按 id 排序分配 COMPANY_A/B/C;新增 id=C000 后 COMPANY_A 由 C001 变为 C000

技术信息

来源项目

project-13

涉及文件

backend/src/main/java/com/project-13/entity/Company.java, backend/src/main/java/com/project-13/service/SymbolResolver.java, backend/src/main/java/com/project-13/config/CompanyAliasBackfillRunner.java +2

标签

隐式派生, 顺序依赖, 占位符漂移, 数据寻址, project-13...