缺陷:#148 遗漏采购规格匹配工作项增量迁移导致 Admin API 启动失败 #149

Closed
opened 2026-08-29 14:04:04 +08:00 by ila · 2 comments
Owner

来源与关联

  • 用户于 2026-08-29 反馈 Supervisor 启动 goauto-admin-api 失败,并要求“建缺陷工单关联 #148,做”。
  • 关联:#148,提交 11c407d feat(#148): match purchase specs asynchronously。
  • 现场证据:启动迁移跳过既有 30 个版本后,校验报缺少表 purchase_spec_match_work_item,Supervisor 因自动重启持续处于 Starting。

根因

#148 新增 PurchaseSpecMatchWorkItem 并登记到 GoAuto 模型迁移清单,但遗漏 server/cmd/migrate/migration/version-local/ 的正式增量版本文件。已有数据库不会重跑已记录的旧版本,因此新表没有创建;启动后的表完整性校验按设计阻止 API 带缺表运行。

目标

  1. 新增可重复安全执行的正式增量迁移,创建 purchase_spec_match_work_item 及 #148 工作流需要的约束和索引。
  2. 增加已有历史迁移记录场景下的升级测试,避免只在空库/AutoMigrate 测试中通过。
  3. 在本机执行迁移并确认 API 通过 Supervisor 稳定运行。
  4. 不改变 #148 已确认的业务流程、UI、接口和状态语义。

非目标

  • 不修改 Android。
  • 不调整 AI 匹配、重试、人工选择业务逻辑。
  • 不绕过迁移校验,不使用 SkipMigration 作为修复。
  • 不手工创建脱离版本记录的数据库表。

交付单元与风险

  • Server、数据库迁移、Supervisor 本机运行验证。
  • 属于追加数据库迁移;用户已在本次指令中明确要求建单并实施。
  • 不删除、不覆盖现有业务数据。

实施方案

  1. 参照现有 version-local 模式增加唯一时间戳版本迁移。
  2. 迁移使用模型建表并补齐唯一键与领取/调度查询所需索引;约束与模型保持一致。
  3. 增加迁移测试,覆盖已有 sys_migration 历史记录但目标表缺失时能执行新版本并通过 VerifyTables。
  4. 执行受影响 Go 测试与迁移验证。
  5. 重启 goauto-admin-api,验证 Supervisor 为 Running、8010 监听及健康响应。

验收

  • 已有数据库执行时显示新执行 1 个迁移,不再报缺少目标表。
  • purchase_spec_match_work_item 存在,唯一约束及必要调度索引存在。
  • 再次执行迁移可安全跳过,不重复建表。
  • 受影响服务端测试通过。
  • Supervisor 中 goauto-admin-api 稳定为 Running,API 健康检查成功。
  • 提交推送并回写提交、测试、迁移和运行证据。

设计与文档影响

  • 恢复 #148 已确认的数据模型落地,不新增 UI,也不改变已确认架构和业务规则,无需新增原型。
  • #148 已更新长期 Wiki;本缺陷仅补齐遗漏的迁移执行文件,无新的长期文档事实,跳过 Wiki 更新和同步。
## 来源与关联 - 用户于 2026-08-29 反馈 Supervisor 启动 `goauto-admin-api` 失败,并要求“建缺陷工单关联 #148,做”。 - 关联:#148,提交 `11c407d feat(#148): match purchase specs asynchronously`。 - 现场证据:启动迁移跳过既有 30 个版本后,校验报缺少表 `purchase_spec_match_work_item`,Supervisor 因自动重启持续处于 Starting。 ## 根因 #148 新增 `PurchaseSpecMatchWorkItem` 并登记到 GoAuto 模型迁移清单,但遗漏 `server/cmd/migrate/migration/version-local/` 的正式增量版本文件。已有数据库不会重跑已记录的旧版本,因此新表没有创建;启动后的表完整性校验按设计阻止 API 带缺表运行。 ## 目标 1. 新增可重复安全执行的正式增量迁移,创建 `purchase_spec_match_work_item` 及 #148 工作流需要的约束和索引。 2. 增加已有历史迁移记录场景下的升级测试,避免只在空库/AutoMigrate 测试中通过。 3. 在本机执行迁移并确认 API 通过 Supervisor 稳定运行。 4. 不改变 #148 已确认的业务流程、UI、接口和状态语义。 ## 非目标 - 不修改 Android。 - 不调整 AI 匹配、重试、人工选择业务逻辑。 - 不绕过迁移校验,不使用 SkipMigration 作为修复。 - 不手工创建脱离版本记录的数据库表。 ## 交付单元与风险 - Server、数据库迁移、Supervisor 本机运行验证。 - 属于追加数据库迁移;用户已在本次指令中明确要求建单并实施。 - 不删除、不覆盖现有业务数据。 ## 实施方案 1. 参照现有 version-local 模式增加唯一时间戳版本迁移。 2. 迁移使用模型建表并补齐唯一键与领取/调度查询所需索引;约束与模型保持一致。 3. 增加迁移测试,覆盖已有 sys_migration 历史记录但目标表缺失时能执行新版本并通过 VerifyTables。 4. 执行受影响 Go 测试与迁移验证。 5. 重启 `goauto-admin-api`,验证 Supervisor 为 Running、8010 监听及健康响应。 ## 验收 - [ ] 已有数据库执行时显示新执行 1 个迁移,不再报缺少目标表。 - [ ] `purchase_spec_match_work_item` 存在,唯一约束及必要调度索引存在。 - [ ] 再次执行迁移可安全跳过,不重复建表。 - [ ] 受影响服务端测试通过。 - [ ] Supervisor 中 `goauto-admin-api` 稳定为 Running,API 健康检查成功。 - [ ] 提交推送并回写提交、测试、迁移和运行证据。 ## 设计与文档影响 - 恢复 #148 已确认的数据模型落地,不新增 UI,也不改变已确认架构和业务规则,无需新增原型。 - #148 已更新长期 Wiki;本缺陷仅补齐遗漏的迁移执行文件,无新的长期文档事实,跳过 Wiki 更新和同步。
Author
Owner

实施完成,待验收

提交:afa29f1 fix(#149): add purchase match work item migration,已推送 main,本地与 origin/main 一致。

修复

  • 新增正式增量版本 1787983400000_purchase_spec_match_work_item,让已经记录旧迁移的数据库执行 #148 新模型建表。
  • 新增旧 Schema 升级回归测试:先创建不包含新工作项的历史模型集合和既有迁移记录,再执行新版本,校验目标表、迁移记录、唯一键、调度索引及 VerifyTables。
  • 未修改 #148 业务逻辑、接口、UI 或 Android。

自动化验证

  • go test -count=1 ./cmd/migrate/migration/version-local ./app/goauto/migrations ./app/goauto/purchase/...:通过。
  • .\scripts\verify.ps1 -Component server:通过(go test ./... 与 go build)。
  • git diff --check:通过。

本机迁移与运行验证

  • 首次正式启动:新执行 1 个,跳过 30 个。
  • 再次启动:新执行 0 个,跳过 31 个,证明版本可安全跳过。
  • MySQL 实查:
    • 表 purchase_spec_match_work_item:1;
    • 迁移版本 1787983400000:1;
    • 唯一索引 ux_purchase_match_task(purchase_task_id) 存在;
    • status、next_attempt_at、lease_expires_at 调度索引均存在。
  • Supervisor:goauto-admin-api Running。
  • 8010 正常监听;GET / 与 Swagger 均返回 HTTP 200。

文档与遗留

本单仅补齐 #148 已记录的迁移文件,无新的长期事实,按工单约定跳过 Wiki 更新与同步。未改动工作区既有未跟踪文件。

状态:实现完成,等待用户验收。

## 实施完成,待验收 提交:`afa29f1 fix(#149): add purchase match work item migration`,已推送 `main`,本地与 `origin/main` 一致。 ### 修复 - 新增正式增量版本 `1787983400000_purchase_spec_match_work_item`,让已经记录旧迁移的数据库执行 #148 新模型建表。 - 新增旧 Schema 升级回归测试:先创建不包含新工作项的历史模型集合和既有迁移记录,再执行新版本,校验目标表、迁移记录、唯一键、调度索引及 `VerifyTables`。 - 未修改 #148 业务逻辑、接口、UI 或 Android。 ### 自动化验证 - `go test -count=1 ./cmd/migrate/migration/version-local ./app/goauto/migrations ./app/goauto/purchase/...`:通过。 - `.\scripts\verify.ps1 -Component server`:通过(`go test ./...` 与 `go build`)。 - `git diff --check`:通过。 ### 本机迁移与运行验证 - 首次正式启动:`新执行 1 个,跳过 30 个`。 - 再次启动:`新执行 0 个,跳过 31 个`,证明版本可安全跳过。 - MySQL 实查: - 表 `purchase_spec_match_work_item`:1; - 迁移版本 `1787983400000`:1; - 唯一索引 `ux_purchase_match_task(purchase_task_id)` 存在; - `status`、`next_attempt_at`、`lease_expires_at` 调度索引均存在。 - Supervisor:`goauto-admin-api Running`。 - 8010 正常监听;`GET /` 与 Swagger 均返回 HTTP 200。 ### 文档与遗留 本单仅补齐 #148 已记录的迁移文件,无新的长期事实,按工单约定跳过 Wiki 更新与同步。未改动工作区既有未跟踪文件。 状态:实现完成,等待用户验收。
Author
Owner

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。

用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。
ila closed this issue 2026-08-29 20:44:17 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#149