feat(mes): 种子标签追溯配置改为字典驱动
追溯网址、生产经营者名称、进口商名称、是否进口种子四项配置原先只能改配置文件并重启服务,
而这几项恰是最常变动的运营信息。现改为优先取字典 mes_trace_config,管理员在「字典管理」
中改完约 1 分钟生效,无需改配置重启。配置文件保留为兜底默认值。
取值规则(四项各自独立判定):
- 字典有启用项且值非空且合法 → 用字典值
- 字典未建 / 无启用项 / 值为空 → 回退配置文件,属正常的「尚未配置」路径
- 追溯网址的字典值非空但不合法(占位符 / 本机 / 内网地址)→ 记 ERROR 并回退配置文件。
配置文件的值已被启动校验保证合法,回退不会印出不合规标签;反之若在此抛异常,
字典里一次手误就会让全平台标签导出停摆,代价更大
- 字典与配置文件都拿不到追溯网址 → 抛 PRO_QR_LABEL_TRACE_URL_NOT_CONFIGURED 拒绝导出
配套改动:
- 新增 MesTraceConfigResolver:读字典并合并配置文件兜底值,60 秒本地缓存
(数据库查询每 60 秒至多一次,与标签数量无关),任何路径都不向外抛异常——解析发生在
批量导出的高频循环里,一次数据库抖动不应中断整批导出。不用 DictFrameworkUtils 的原因:
它把字典投影成 List<String> 会丢弃 status 无法过滤禁用项,且其 dictDataApi 为自动配置
注入的静态字段,与本类首次调用无顺序保证
- 新增 MesTraceUrlValidator:配置文件与字典共用同一套合规校验,避免出现「配置文件拦得住、
字典绕得过」的缺口
- MesProQrLabelBuilder 增加配置来源 provider 钩子,静态调用点全部不变;袋码标签只取一次
快照,保证标签可读文本与二维码内容取到同一个网址(否则缓存刷新会让两者指向不同地址)
- MesTraceConfigController 改取生效快照:原先直读 MesProperties 绕过了标签构建器,
字典生效后管理端预览会与实际打印的标签不一致;响应新增 traceUrlSource 便于确认是否生效
- mes.allow-plain-qr-code 有意不纳入字典:它是「允许印出不含追溯网址的标签」的开关,
放进可后台编辑的字典等于给合规防线开后门
- 启动校验仍只针对配置文件,以保证数据库可用之前即可拦截不合规配置,且 @PostConstruct
阶段不访问数据库
另:新增字典初始化脚本 sql/mysql/mes_trace_config_init.sql(键值留空,上线零行为变化)、
前端联调方案 docs/mes_trace_config_dict_integration.md,补 25 个单元测试。
前端无需改动,管理端与 H5 溯源页均只消费接口下发值。
Co-Authored-By: Claude <noreply@anthropic.com>