T50 修复 SYB 同步预创建失败无法定位 #52

Closed
opened 2026-08-20 16:00:43 +08:00 by ila · 4 comments
Owner

基本信息

  • 类型:缺陷修复 / 服务端可观测性
  • 交付单元:server,按需同步 Wiki 文档
  • 来源:用户反馈 SYB 同步提示“服务端处理失败”
  • 提出时间:2026-08-20
  • 前置:#49 店铺预检、#50 后台同步记录
  • 是否可并行:否;直接修改 SYB 导入创建链路

现象与证据

  • 页面发起 SYB 同步时只显示“服务端处理失败”。
  • MySQL 中没有新增 syb_sync_run 失败记录,证明失败发生在后台任务创建之前。
  • 当前实现会丢弃内部 Cause:响应仅返回通用提示,预创建失败也没有同步记录,无法事后区分店铺预检查询失败和运行记录创建失败。
  • 最新 #51 只修改 Web 布局,与服务端同步逻辑无关。

目标

保持普通用户看到的提示简单,不泄露 SQL、凭据、Cookie、Token 或外部响应;同时让开发维护者能通过稳定错误码与服务端日志定位根因。

方案

  1. 店铺预检数据库查询失败:返回稳定错误码 SYNC_SHOP_PREFLIGHT_FAILED,用户提示仍为“服务端处理失败”,服务端记录阶段名与底层错误。
  2. 创建 syb_sync_run 失败且不是“已有任务运行”业务冲突:返回稳定错误码 SYNC_RUN_CREATE_FAILED,用户提示仍为“服务端处理失败”,服务端记录阶段名与底层错误。
  3. “没有启用店铺”“已有任务运行”等可预期业务错误保持原有提示与状态码。
  4. 日志不记录请求体、SYB 凭据、Cookie、验证码、Token 或原始响应。
  5. 不改变同步任务状态机、数据库结构、导入幂等和外部 SYB 调用行为。

验收标准

  • 两个预创建内部失败阶段返回不同且稳定的错误码,HTTP 仍为 500,用户提示保持简单。
  • 服务端日志包含阶段标识与底层原因,且不包含敏感配置或请求数据。
  • 业务错误码及提示不回归。
  • 单元测试覆盖两个内部失败阶段及脱敏边界。
  • 服务端相关测试与构建通过。

风险与文档影响

  • 无数据库迁移,无数据清理,无真实 SYB 请求。
  • 错误码属于 Admin API 行为,需要在 SYB 后台导入长期文档中记录;不影响 Android Agent API 契约。
## 基本信息 - 类型:缺陷修复 / 服务端可观测性 - 交付单元:server,按需同步 Wiki 文档 - 来源:用户反馈 SYB 同步提示“服务端处理失败” - 提出时间:2026-08-20 - 前置:#49 店铺预检、#50 后台同步记录 - 是否可并行:否;直接修改 SYB 导入创建链路 ## 现象与证据 - 页面发起 SYB 同步时只显示“服务端处理失败”。 - MySQL 中没有新增 `syb_sync_run` 失败记录,证明失败发生在后台任务创建之前。 - 当前实现会丢弃内部 `Cause`:响应仅返回通用提示,预创建失败也没有同步记录,无法事后区分店铺预检查询失败和运行记录创建失败。 - 最新 #51 只修改 Web 布局,与服务端同步逻辑无关。 ## 目标 保持普通用户看到的提示简单,不泄露 SQL、凭据、Cookie、Token 或外部响应;同时让开发维护者能通过稳定错误码与服务端日志定位根因。 ## 方案 1. 店铺预检数据库查询失败:返回稳定错误码 `SYNC_SHOP_PREFLIGHT_FAILED`,用户提示仍为“服务端处理失败”,服务端记录阶段名与底层错误。 2. 创建 `syb_sync_run` 失败且不是“已有任务运行”业务冲突:返回稳定错误码 `SYNC_RUN_CREATE_FAILED`,用户提示仍为“服务端处理失败”,服务端记录阶段名与底层错误。 3. “没有启用店铺”“已有任务运行”等可预期业务错误保持原有提示与状态码。 4. 日志不记录请求体、SYB 凭据、Cookie、验证码、Token 或原始响应。 5. 不改变同步任务状态机、数据库结构、导入幂等和外部 SYB 调用行为。 ## 验收标准 - [ ] 两个预创建内部失败阶段返回不同且稳定的错误码,HTTP 仍为 500,用户提示保持简单。 - [ ] 服务端日志包含阶段标识与底层原因,且不包含敏感配置或请求数据。 - [ ] 业务错误码及提示不回归。 - [ ] 单元测试覆盖两个内部失败阶段及脱敏边界。 - [ ] 服务端相关测试与构建通过。 ## 风险与文档影响 - 无数据库迁移,无数据清理,无真实 SYB 请求。 - 错误码属于 Admin API 行为,需要在 SYB 后台导入长期文档中记录;不影响 Android Agent API 契约。
Author
Owner

实施完成,等待验收

实现

  • 店铺预检数据库失败返回 SYNC_SHOP_PREFLIGHT_FAILED,HTTP 500,用户提示保持“服务端处理失败”。
  • 创建后台同步记录失败返回 SYNC_RUN_CREATE_FAILED,HTTP 500;“已有任务运行”等业务错误保持原行为。
  • 两个阶段分别记录 shop_preflight / sync_run_create 与安全错误原因。
  • 日志清洗 password、token、Authorization Bearer、Cookie、MySQL DSN 和 URL 用户密码,清除控制字符并限制 1000 字符;响应不返回底层原因。
  • 未修改数据库结构、同步状态机、导入幂等、店铺规则或外部 SYB 调用。

验证

  • go test ./app/goauto/sybimport:通过。
  • scripts/verify.ps1 -Component server:全量 Go 测试与构建通过。
  • 新增测试覆盖两个预创建失败阶段、稳定错误码、HTTP/用户提示不变、日志脱敏和长度上限。
  • git diff --check:通过。
  • python dev_scripts/harness.py check --strict:通过。
  • python dev_scripts/harness.py sync --check:Wiki 与核心镜像一致。
  • 未再次发起真实 SYB 同步,避免重复外部请求和写入数据。

提交与文档

  • 代码与镜像:32edb91a31dcd4d4ed8374b6f6efc8944a92288f
  • Wiki:8506167d120ed2e80de7e1953629185e1a6271e5
  • 长期规则已记录两个错误码与日志安全边界;Android Agent API 不受影响。

验收方式

重启服务端后再次发起一次 SYB 同步:成功时流程不变;若仍在任务创建前失败,页面仍显示通俗提示,浏览器响应中的 code 和服务端日志阶段即可准确区分根因。

工单保持开启,等待用户验收。

## 实施完成,等待验收 ### 实现 - 店铺预检数据库失败返回 `SYNC_SHOP_PREFLIGHT_FAILED`,HTTP 500,用户提示保持“服务端处理失败”。 - 创建后台同步记录失败返回 `SYNC_RUN_CREATE_FAILED`,HTTP 500;“已有任务运行”等业务错误保持原行为。 - 两个阶段分别记录 `shop_preflight` / `sync_run_create` 与安全错误原因。 - 日志清洗 password、token、Authorization Bearer、Cookie、MySQL DSN 和 URL 用户密码,清除控制字符并限制 1000 字符;响应不返回底层原因。 - 未修改数据库结构、同步状态机、导入幂等、店铺规则或外部 SYB 调用。 ### 验证 - `go test ./app/goauto/sybimport`:通过。 - `scripts/verify.ps1 -Component server`:全量 Go 测试与构建通过。 - 新增测试覆盖两个预创建失败阶段、稳定错误码、HTTP/用户提示不变、日志脱敏和长度上限。 - `git diff --check`:通过。 - `python dev_scripts/harness.py check --strict`:通过。 - `python dev_scripts/harness.py sync --check`:Wiki 与核心镜像一致。 - 未再次发起真实 SYB 同步,避免重复外部请求和写入数据。 ### 提交与文档 - 代码与镜像:`32edb91a31dcd4d4ed8374b6f6efc8944a92288f` - Wiki:`8506167d120ed2e80de7e1953629185e1a6271e5` - 长期规则已记录两个错误码与日志安全边界;Android Agent API 不受影响。 ### 验收方式 重启服务端后再次发起一次 SYB 同步:成功时流程不变;若仍在任务创建前失败,页面仍显示通俗提示,浏览器响应中的 `code` 和服务端日志阶段即可准确区分根因。 工单保持开启,等待用户验收。
Author
Owner

复现后的根因与追加修复范围

用户重启新版服务后再次同步,#52 日志准确记录:

stage=sync_run_create cause=Error 1054 (42S22): Unknown column 'created' in 'field list'

只读核对确认:当前 SYBSyncRun.Created / Updated 被 GORM 默认映射为 created / updated,而本机既有 MySQL 表使用 created_count / updated_count。SQLite 测试从当前模型自动建表,未暴露既有 MySQL 表结构漂移。

用户确认按最小方案修复:

  • 仅给两个模型字段增加 column:created_count / column:updated_count 显式映射。
  • 不修改数据库表,不新增迁移,不清理数据。
  • 增加模型 schema 回归测试,固定两个 DBName,避免 SQLite 再次掩盖列名漂移。
  • 运行服务端全量测试与构建;不自动发起真实 SYB 同步。
## 复现后的根因与追加修复范围 用户重启新版服务后再次同步,#52 日志准确记录: `stage=sync_run_create cause=Error 1054 (42S22): Unknown column 'created' in 'field list'` 只读核对确认:当前 `SYBSyncRun.Created` / `Updated` 被 GORM 默认映射为 `created` / `updated`,而本机既有 MySQL 表使用 `created_count` / `updated_count`。SQLite 测试从当前模型自动建表,未暴露既有 MySQL 表结构漂移。 用户确认按最小方案修复: - 仅给两个模型字段增加 `column:created_count` / `column:updated_count` 显式映射。 - 不修改数据库表,不新增迁移,不清理数据。 - 增加模型 schema 回归测试,固定两个 DBName,避免 SQLite 再次掩盖列名漂移。 - 运行服务端全量测试与构建;不自动发起真实 SYB 同步。
Author
Owner

根因修复完成,等待再次验收

根因

新版诊断日志确认创建 syb_sync_run 时 MySQL 返回 Error 1054: Unknown column 'created' in 'field list'。模型默认列名 created / updated 与既有 MySQL 表 created_count / updated_count 不一致。

最小修复

  • SYBSyncRun.Created 显式映射 created_count。
  • SYBSyncRun.Updated 显式映射 updated_count。
  • 进度更新和终态更新的 map 键同步改为现有 MySQL 列名。
  • 新增 schema 回归测试,固定两个字段的 GORM DBName。
  • 无数据库迁移、无表结构修改、无数据清理。

验证

  • go test ./app/goauto/migrations ./app/goauto/sybimport:通过。
  • scripts/verify.ps1 -Component server:全量 Go 测试与构建通过。
  • git diff --check:通过。
  • 未发起真实 SYB 同步。

提交:903280fadac32a24e394713546f20a0b080bac53

文档影响:仅修正内部 ORM 与既有数据库列的映射,不改变业务规则或 API,无需再次更新 Wiki。

请重启服务端后重新发起一次 SYB 同步验收;工单继续保持开启。

## 根因修复完成,等待再次验收 ### 根因 新版诊断日志确认创建 `syb_sync_run` 时 MySQL 返回 `Error 1054: Unknown column 'created' in 'field list'`。模型默认列名 `created` / `updated` 与既有 MySQL 表 `created_count` / `updated_count` 不一致。 ### 最小修复 - `SYBSyncRun.Created` 显式映射 `created_count`。 - `SYBSyncRun.Updated` 显式映射 `updated_count`。 - 进度更新和终态更新的 map 键同步改为现有 MySQL 列名。 - 新增 schema 回归测试,固定两个字段的 GORM `DBName`。 - 无数据库迁移、无表结构修改、无数据清理。 ### 验证 - `go test ./app/goauto/migrations ./app/goauto/sybimport`:通过。 - `scripts/verify.ps1 -Component server`:全量 Go 测试与构建通过。 - `git diff --check`:通过。 - 未发起真实 SYB 同步。 提交:`903280fadac32a24e394713546f20a0b080bac53` 文档影响:仅修正内部 ORM 与既有数据库列的映射,不改变业务规则或 API,无需再次更新 Wiki。 请重启服务端后重新发起一次 SYB 同步验收;工单继续保持开启。
Author
Owner

??? 2026-08-20 ???????????:Task-52-SYB-sync-diagnostics;Wiki revision:a627417c412e44fbc6b0816f15395e131760522f??????

??? 2026-08-20 ???????????:Task-52-SYB-sync-diagnostics;Wiki revision:a627417c412e44fbc6b0816f15395e131760522f??????
ila closed this issue 2026-08-20 16:34:23 +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#52