修复历史 SYB 店铺标准化键导致过滤失效 #213

Open
opened 2026-09-04 10:36:09 +08:00 by ila · 2 comments
Owner

需求摘要

管理员已确认:SYB 货运单列表中的「樂齡樂活美學館|銀髮居家熟齡悅己壯世代優雅生活」应命中后台已启用店铺并正常导入。实际发现页把它标为“新发现”,同步跳过。

当前事实与根因

  • 2026-09-04 的只读 SYB 店铺发现显示该名称有 4 张货运单,状态为 new。
  • Admin 中存在同名且启用的店铺。
  • 两侧名称逐字符一致;按现行 sybshop.Normalize(首尾空白、全半角、大小写)后的键一致。
  • DiscoverShops 以数据库 syb_shop.normalized_name 建映射,故可判定该历史记录的存储键未按当前规则标准化,导致发现与同步过滤均无法命中。

目标 / 非目标

  • 目标:提供幂等、可审计的历史 normalized_name 回填机制;启动/迁移后使现存店铺按 Normalize(display_name) 匹配;补齐回归测试。
  • 非目标:不改变店铺显示名称、启用状态、历史 SYB 商品、任务或订单;不保存 SYB 原始响应;不执行任何支付或采购动作。

影响与设计

  • 子项目:server/;数据库既有数据修复。
  • 方案:在安全的 schema/启动迁移路径中仅更新 normalized_name 与 Normalize(display_name) 不同且不存在规范化键冲突的存活店铺;若存在冲突,启动必须明确失败并保留数据,不静默合并或删除。写路径继续保持现有标准化逻辑。
  • 风险:更新生产/本地数据库属于数据写入。代码完成后,执行本地回填前须由管理员再次明确确认;线上数据另行授权。

验收

  1. 历史全角分隔符等名称回填后,EnabledNames 与 DiscoverShops 均命中同一标准化键。
  2. 回填可重复执行且不额外改动已正确行。
  3. 规范化键冲突时不覆盖数据并返回明确错误。
  4. 受影响 Go 测试通过;不覆盖工作区无关改动。

验证与文档

  • 长期业务规则/运行数据修复机制变化:更新 Wiki 对应 SYB 店铺过滤规则,在线回读后同步镜像。
  • 真正执行本地数据回填、影响行数和结果单独记录;未获确认不执行。

依赖与并行

  • 无代码依赖;可与其他未触及 server/app/goauto/sybshop 文件的工作并行。
## 需求摘要 管理员已确认:SYB 货运单列表中的「樂齡樂活美學館|銀髮居家熟齡悅己壯世代優雅生活」应命中后台已启用店铺并正常导入。实际发现页把它标为“新发现”,同步跳过。 ## 当前事实与根因 - 2026-09-04 的只读 SYB 店铺发现显示该名称有 4 张货运单,状态为 `new`。 - Admin 中存在同名且启用的店铺。 - 两侧名称逐字符一致;按现行 `sybshop.Normalize`(首尾空白、全半角、大小写)后的键一致。 - `DiscoverShops` 以数据库 `syb_shop.normalized_name` 建映射,故可判定该历史记录的存储键未按当前规则标准化,导致发现与同步过滤均无法命中。 ## 目标 / 非目标 - 目标:提供幂等、可审计的历史 `normalized_name` 回填机制;启动/迁移后使现存店铺按 `Normalize(display_name)` 匹配;补齐回归测试。 - 非目标:不改变店铺显示名称、启用状态、历史 SYB 商品、任务或订单;不保存 SYB 原始响应;不执行任何支付或采购动作。 ## 影响与设计 - 子项目:`server/`;数据库既有数据修复。 - 方案:在安全的 schema/启动迁移路径中仅更新 `normalized_name` 与 `Normalize(display_name)` 不同且不存在规范化键冲突的存活店铺;若存在冲突,启动必须明确失败并保留数据,不静默合并或删除。写路径继续保持现有标准化逻辑。 - 风险:更新生产/本地数据库属于数据写入。代码完成后,执行本地回填前须由管理员再次明确确认;线上数据另行授权。 ## 验收 1. 历史全角分隔符等名称回填后,`EnabledNames` 与 `DiscoverShops` 均命中同一标准化键。 2. 回填可重复执行且不额外改动已正确行。 3. 规范化键冲突时不覆盖数据并返回明确错误。 4. 受影响 Go 测试通过;不覆盖工作区无关改动。 ## 验证与文档 - 长期业务规则/运行数据修复机制变化:更新 Wiki 对应 SYB 店铺过滤规则,在线回读后同步镜像。 - 真正执行本地数据回填、影响行数和结果单独记录;未获确认不执行。 ## 依赖与并行 - 无代码依赖;可与其他未触及 `server/app/goauto/sybshop` 文件的工作并行。
Author
Owner

实现与验证(待验收)

  • 已实现 ReconcileNormalizedNames:只处理存活 SYB 店铺,按 Normalize(display_name) 回填;先检测目标键冲突,冲突即事务失败;用临时唯一键支持历史键交换;重复执行无改动。
  • 新增版本迁移 1787983900000,在同一事务中执行回填并写入迁移版本。
  • 测试:go test -count=1 ./app/goauto/sybshop ./cmd/migrate/migration/version-local 通过。
  • 代码提交并推送:1ac50064bd61c49b21a72bb7866817188aee0401。
  • Wiki 已更新并在线回读 revision be8bb1a263cb944ce923e717e119e8f295c4c073。主工作区 docs/12-syb-erp-interface.md 有既有未提交改动,harness.py sync 为保护该文件停止;未覆盖该改动。干净工作树的同步与检查已验证可读取新 Wiki。

待执行的高风险步骤

本地迁移会写入 syb_shop.normalized_name。代码已准备好,但尚未执行本地迁移或重启服务,等待管理员明确确认。执行前会先报告精确影响行数;线上环境须单独授权。

## 实现与验证(待验收) - 已实现 `ReconcileNormalizedNames`:只处理存活 SYB 店铺,按 `Normalize(display_name)` 回填;先检测目标键冲突,冲突即事务失败;用临时唯一键支持历史键交换;重复执行无改动。 - 新增版本迁移 `1787983900000`,在同一事务中执行回填并写入迁移版本。 - 测试:`go test -count=1 ./app/goauto/sybshop ./cmd/migrate/migration/version-local` 通过。 - 代码提交并推送:`1ac50064bd61c49b21a72bb7866817188aee0401`。 - Wiki 已更新并在线回读 revision `be8bb1a263cb944ce923e717e119e8f295c4c073`。主工作区 `docs/12-syb-erp-interface.md` 有既有未提交改动,`harness.py sync` 为保护该文件停止;未覆盖该改动。干净工作树的同步与检查已验证可读取新 Wiki。 ## 待执行的高风险步骤 本地迁移会写入 `syb_shop.normalized_name`。代码已准备好,但尚未执行本地迁移或重启服务,等待管理员明确确认。执行前会先报告精确影响行数;线上环境须单独授权。
Author
Owner

本地迁移已获管理员授权并于 2026-09-04 10:56 执行成功。版本 1787983900000 已写入;事务回填了 3 条存活店铺匹配键,目标店铺 id=2 保持启用,
ormalized_name 已从全角竖线规范为半角 |。执行后只读核验:目标记录存在且迁移版本记录数为 1。未重启服务,未改显示名称、启用状态、SYB 商品、任务或订单。

本地迁移已获管理员授权并于 2026-09-04 10:56 执行成功。版本 1787983900000 已写入;事务回填了 3 条存活店铺匹配键,目标店铺 id=2 保持启用, ormalized_name 已从全角竖线规范为半角 |。执行后只读核验:目标记录存在且迁移版本记录数为 1。未重启服务,未改显示名称、启用状态、SYB 商品、任务或订单。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#213