SYB 商品「创建时间」筛选改用来源货运单创建时间并补齐历史数据 #352

Open
opened 2026-09-30 09:32:26 +08:00 by ila · 2 comments
Owner

来源与需求(2026-09-30)

用户发现线上 Admin → SYB 商品按「创建时间」选 2026-09-28~29 仍出现 27 日订单;确认:页面标签不改名,筛选应使用 SYB 来源的商品所属货运单创建时间,不是 GoAuto 明细首次入库时间。先建单,本次不授权实施、数据库迁移、历史回填或发布。

当前事实与复核基线

  • 代码基线 bf06b2d500c9a875ea8aa9aa07b56275434c096d,2026-09-30 核对 web/src/views/goauto/syb-products/index.vue、server/app/goauto/sybimport/{handler,service,sync,apply}.go、server/app/goauto/sybclient/client.go、server/app/goauto/models/schema.go。
  • 前端已有日期范围组件,发送 createdFrom/createdTo;服务端当前过滤 syb_product.created_at。该字段由 GoAuto 首次 tx.Create 写入;重同步按 (order_code,detail_id) 更新且保留首次入库时间。
  • SYB /am/stock/list 的筛选字段是货运单 t_stock.created(日期请求 dvalue);货运单 StockRow.Raw 带来源字段,但目前 applyStockDetail 只传 code/stockID/shopName,syb_product 未保存来源时间。商品明细原始 details[] 抽查 5 条未发现独立 created 类字段;不能声称明细本身有创建时间。
  • 线上只读核对:以当前日期条件及默认「需 PDD 采购」查询 575 条,100 条订单号以 260927 开头,其 GoAuto createdAt 在 9 月 28 日(例如 00:05);接口返回记录的 createdAt 均在 28~29 日,现有过滤按入库时间工作,而非来源日期。订单号前缀仅作定位,不作为日期事实。
  • Gitea MCP 在本会话不可用;依仓库规则回退已配置的 Gitea API 建单,未输出凭据。

目标

  1. 保持 Admin「创建时间」标签、日期范围控件、createdFrom/createdTo 参数与其他筛选组合交互不变;后端日期筛选改为商品所属 SYB 货运单 t_stock.created 的本地日期,含起止日。
  2. 同步新增和重同步均持久化来源创建时间;保留 syb_product.created_at 作为 GoAuto 入库审计时间,不改写、不拿订单号前缀或入库时间冒充来源时间。
  3. 历史数据提供可恢复、可计数的补齐方案:实施前统计缺失量和来源字段可取得比例;从 SYB 已确认的原始来源重新获取/按日期有界重同步,禁止无界全量请求。无法取得来源时间者保持缺失并明确报告,不静默落到 GoAuto created_at。

非目标

  • 不更名 UI、改分页/采购/采集/退货业务、不重写订单号、不改变 SYB 源记录、不新增支付/下单动作。
  • 不把货运单创建时间称为商品明细独立创建时间;若未来要按明细自身时间筛选,需另行证实 SYB 字段并建单。

实施方案与风险边界(待实施时核对)

  • Server/DB:增加可空、可索引的来源货运单创建时间字段,解析 StockRow.Raw["created"],验证格式、缺失值与 stock_id 对应,随 ApplyDetail 写入。查询改用来源字段的左闭右开日期区间;明确 SYB 原始 created 为 UTC+8 本地时间的口径并做边界测试,避免服务端/MySQL/browser 时区导致跨日。源时间变化时按有证据的重同步更新,GoAuto 审计 created_at 不变。
  • 历史补齐:迁移仅增加字段;有界、可重复的补齐或按日期重同步与迁移分开执行,先预览缺失/影响数量,不能从订单号前缀推断。正式环境执行迁移、源接口重拉与发布须再次取得用户明确授权。
  • Web:原则上复用现有组件,不更名、不新增页面。只做必要回归验证;若字段缺失需要界面提示或改变空态,先补设计证据并请求确认。
  • 共享契约/长期文档:更新 SYB 商品列表 createdFrom/createdTo 的来源时间语义、数据结构与同步规则;先更新线上 Wiki、回读 revision,再单轮镜像 sync/check。

前置依赖 / 可并行 / 交付单元

  • 前置:无功能依赖;实施前重新核对线上部署版本、源 created 字段样本和现有迁移编号,避免与并行迁移冲突。
  • Server/DB 为主,Web 复用现有 UI,仅契约与回归;与修改 syb_product 或 SYB 同步日期/列表的工单不可并行迁移或发布,其他互不相关任务可并行。
  • 设计证据:明确复用现有 Admin「创建时间」日期范围控件,UI 结构不变,用户 2026-09-30 明确要求不更名;数据/接口方案在本单审核后实施,无新页面原型要求。

验收与测试

  1. 给定 SYB created=2026-09-27 23:xx、GoAuto 入库 2026-09-28 00:xx,筛选 28~29 日不返回;给定 SYB 28 日 00:00 和 29 日 23:59:59 均返回,30 日 00:00 不返回。
  2. 组合店铺、订单号、解析状态、处理阶段、采购类型、分页与总数均按新时间字段一致;页面标签仍是「创建时间」。
  3. 新增/重同步、历史补齐幂等;源时间缺失/格式异常明确计数/处置,不用 created_at 假补;重复同步保持 GoAuto 审计创建时间。
  4. 单元/集成及本地数据库迁移测试通过;线上发布前有迁移前后缺失量、日期边界和抽样对照证据。未授权不得执行正式迁移、历史批量补齐或发布。

文档影响

有长期影响:SYB 商品列表日期参数语义、来源字段、同步与历史补齐规则;实施时更新对应 Wiki/API/架构页面。工单仅建单阶段不改 Wiki。

## 来源与需求(2026-09-30) 用户发现线上 Admin → SYB 商品按「创建时间」选 2026-09-28~29 仍出现 27 日订单;确认:**页面标签不改名**,筛选应使用 SYB 来源的商品所属货运单创建时间,不是 GoAuto 明细首次入库时间。先建单,本次不授权实施、数据库迁移、历史回填或发布。 ## 当前事实与复核基线 - 代码基线 `bf06b2d500c9a875ea8aa9aa07b56275434c096d`,2026-09-30 核对 `web/src/views/goauto/syb-products/index.vue`、`server/app/goauto/sybimport/{handler,service,sync,apply}.go`、`server/app/goauto/sybclient/client.go`、`server/app/goauto/models/schema.go`。 - 前端已有日期范围组件,发送 `createdFrom/createdTo`;服务端当前过滤 `syb_product.created_at`。该字段由 GoAuto 首次 `tx.Create` 写入;重同步按 `(order_code,detail_id)` 更新且保留首次入库时间。 - SYB `/am/stock/list` 的筛选字段是货运单 `t_stock.created`(日期请求 `dvalue`);货运单 `StockRow.Raw` 带来源字段,但目前 `applyStockDetail` 只传 code/stockID/shopName,`syb_product` 未保存来源时间。商品明细原始 `details[]` 抽查 5 条未发现独立 created 类字段;不能声称明细本身有创建时间。 - 线上只读核对:以当前日期条件及默认「需 PDD 采购」查询 575 条,100 条订单号以 `260927` 开头,其 GoAuto `createdAt` 在 9 月 28 日(例如 00:05);接口返回记录的 `createdAt` 均在 28~29 日,现有过滤按入库时间工作,而非来源日期。订单号前缀仅作定位,不作为日期事实。 - Gitea MCP 在本会话不可用;依仓库规则回退已配置的 Gitea API 建单,未输出凭据。 ## 目标 1. 保持 Admin「创建时间」标签、日期范围控件、`createdFrom/createdTo` 参数与其他筛选组合交互不变;后端日期筛选改为商品所属 **SYB 货运单 `t_stock.created`** 的本地日期,含起止日。 2. 同步新增和重同步均持久化来源创建时间;保留 `syb_product.created_at` 作为 GoAuto 入库审计时间,不改写、不拿订单号前缀或入库时间冒充来源时间。 3. 历史数据提供可恢复、可计数的补齐方案:实施前统计缺失量和来源字段可取得比例;从 SYB 已确认的原始来源重新获取/按日期有界重同步,禁止无界全量请求。无法取得来源时间者保持缺失并明确报告,不静默落到 GoAuto `created_at`。 ## 非目标 - 不更名 UI、改分页/采购/采集/退货业务、不重写订单号、不改变 SYB 源记录、不新增支付/下单动作。 - 不把货运单创建时间称为商品明细独立创建时间;若未来要按明细自身时间筛选,需另行证实 SYB 字段并建单。 ## 实施方案与风险边界(待实施时核对) - Server/DB:增加可空、可索引的来源货运单创建时间字段,解析 `StockRow.Raw["created"]`,验证格式、缺失值与 `stock_id` 对应,随 `ApplyDetail` 写入。查询改用来源字段的左闭右开日期区间;明确 SYB 原始 `created` 为 UTC+8 本地时间的口径并做边界测试,避免服务端/MySQL/browser 时区导致跨日。源时间变化时按有证据的重同步更新,GoAuto 审计 `created_at` 不变。 - 历史补齐:迁移仅增加字段;有界、可重复的补齐或按日期重同步与迁移分开执行,先预览缺失/影响数量,不能从订单号前缀推断。正式环境执行迁移、源接口重拉与发布须再次取得用户明确授权。 - Web:原则上复用现有组件,不更名、不新增页面。只做必要回归验证;若字段缺失需要界面提示或改变空态,先补设计证据并请求确认。 - 共享契约/长期文档:更新 SYB 商品列表 `createdFrom/createdTo` 的来源时间语义、数据结构与同步规则;先更新线上 Wiki、回读 revision,再单轮镜像 sync/check。 ## 前置依赖 / 可并行 / 交付单元 - 前置:无功能依赖;实施前重新核对线上部署版本、源 `created` 字段样本和现有迁移编号,避免与并行迁移冲突。 - Server/DB 为主,Web 复用现有 UI,仅契约与回归;与修改 `syb_product` 或 SYB 同步日期/列表的工单不可并行迁移或发布,其他互不相关任务可并行。 - 设计证据:明确复用现有 Admin「创建时间」日期范围控件,UI 结构不变,用户 2026-09-30 明确要求不更名;数据/接口方案在本单审核后实施,无新页面原型要求。 ## 验收与测试 1. 给定 SYB `created=2026-09-27 23:xx`、GoAuto 入库 `2026-09-28 00:xx`,筛选 28~29 日**不返回**;给定 SYB 28 日 00:00 和 29 日 23:59:59 均返回,30 日 00:00 不返回。 2. 组合店铺、订单号、解析状态、处理阶段、采购类型、分页与总数均按新时间字段一致;页面标签仍是「创建时间」。 3. 新增/重同步、历史补齐幂等;源时间缺失/格式异常明确计数/处置,不用 `created_at` 假补;重复同步保持 GoAuto 审计创建时间。 4. 单元/集成及本地数据库迁移测试通过;线上发布前有迁移前后缺失量、日期边界和抽样对照证据。未授权不得执行正式迁移、历史批量补齐或发布。 ## 文档影响 有长期影响:SYB 商品列表日期参数语义、来源字段、同步与历史补齐规则;实施时更新对应 Wiki/API/架构页面。工单仅建单阶段不改 Wiki。
Author
Owner

#352 实施回写(待验收;未迁移/未发布,2026-09-30)

  • 分支 fix/352-syb-source-created 已推送,基于 bf06b2d;提交 f9c48a0(实现)、b4186a9 与 31ff045(Wiki 镜像)、1f3ce61(迁移测试)。未合并 main。
  • 新增可空索引字段 syb_product.syb_stock_created_at,从 SYB 货运单列表 created(t_stock.created,UTC+8)取值;新增/重同步写入,GoAuto created_at 不变。列表 createdFrom/createdTo 改用来源字段的左闭右开区间;前端「创建时间」控件和标签未修改。来源字段缺失/格式错误会包含货运单 ID 明确报错并使当日同步部分失败,已写行保留,不猜补。
  • 历史补齐方案:迁移前记录 SELECT COUNT(*) FROM syb_product 作为待补上界,并在已知同步日期范围内小批核验 SYB 列表的 created 可取得比例;迁移仅加列/索引,历史值仍为 NULL。迁移后记录 SELECT COUNT(*) AS missing FROM syb_product WHERE syb_stock_created_at IS NULL;按已确认的 SYB 历史日期范围使用现有同步入口分段重拉(每段最多 31 天,仍受单次货运单数上限约束,超限继续缩窗)。每段记录同步任务 ID、成功/部分成功/失败、前后 missing 计数及来源抽样;同段失败后可重跑,按现有唯一键幂等覆盖。未启用店铺或来源仍缺失的记录保持 NULL 并单列报告,不用订单号前缀或 GoAuto 入库时间假补。正式发布前检查日期边界与缺失量,避免历史行在日期筛选中静默消失。
  • 验证:针对性 SYB 筛选/边界/组合条件、同步幂等/来源时间、迁移保持历史行的 SQLite 测试通过;go build ./... 通过;git diff --check 通过。完整 sybimport 包测试存在既有失败,例如 TestReparseUpdatesStatusWhenRuleImproves 在未改动基线也失败(预期 uncertain、实际 success),不属于本单。未执行 MySQL/线上迁移和生产历史回填。
  • Wiki 已先在线更新并回读:Business-Rules-and-Glossary 76037bfdf5e986c478055e7338c21ee1ba561bad、Android-Agent-API-Contract f92513e7184fe704d2b9d1c6606b16a86d8d3fb8、Architecture-and-Code-Map 04a4bcf81f2f2912d101d1aa1c2d8eb802c5719e;镜像 sync 与 sync --check 通过。契约明确标注待迁移/发布。Gitea MCP 本会话不可用,按仓库规则使用已配置 Gitea API。

下一步授权点:合并 main、在目标 MySQL 执行追加迁移 1789810000000_syb_stock_created_at.go、按上述有界区间补历史、发布并抽样验收。当前未获这些高风险操作授权,工单保持待验收/开放。

#352 实施回写(待验收;未迁移/未发布,2026-09-30) - 分支 `fix/352-syb-source-created` 已推送,基于 `bf06b2d`;提交 `f9c48a0`(实现)、`b4186a9` 与 `31ff045`(Wiki 镜像)、`1f3ce61`(迁移测试)。未合并 main。 - 新增可空索引字段 `syb_product.syb_stock_created_at`,从 SYB 货运单列表 `created`(`t_stock.created`,UTC+8)取值;新增/重同步写入,GoAuto `created_at` 不变。列表 `createdFrom/createdTo` 改用来源字段的左闭右开区间;前端「创建时间」控件和标签未修改。来源字段缺失/格式错误会包含货运单 ID 明确报错并使当日同步部分失败,已写行保留,不猜补。 - 历史补齐方案:迁移前记录 `SELECT COUNT(*) FROM syb_product` 作为待补上界,并在已知同步日期范围内小批核验 SYB 列表的 `created` 可取得比例;迁移仅加列/索引,历史值仍为 NULL。迁移后记录 `SELECT COUNT(*) AS missing FROM syb_product WHERE syb_stock_created_at IS NULL`;按已确认的 SYB 历史日期范围使用现有同步入口分段重拉(每段最多 31 天,仍受单次货运单数上限约束,超限继续缩窗)。每段记录同步任务 ID、成功/部分成功/失败、前后 missing 计数及来源抽样;同段失败后可重跑,按现有唯一键幂等覆盖。未启用店铺或来源仍缺失的记录保持 NULL 并单列报告,不用订单号前缀或 GoAuto 入库时间假补。正式发布前检查日期边界与缺失量,避免历史行在日期筛选中静默消失。 - 验证:针对性 SYB 筛选/边界/组合条件、同步幂等/来源时间、迁移保持历史行的 SQLite 测试通过;`go build ./...` 通过;`git diff --check` 通过。完整 `sybimport` 包测试存在既有失败,例如 `TestReparseUpdatesStatusWhenRuleImproves` 在未改动基线也失败(预期 uncertain、实际 success),不属于本单。未执行 MySQL/线上迁移和生产历史回填。 - Wiki 已先在线更新并回读:Business-Rules-and-Glossary `76037bfdf5e986c478055e7338c21ee1ba561bad`、Android-Agent-API-Contract `f92513e7184fe704d2b9d1c6606b16a86d8d3fb8`、Architecture-and-Code-Map `04a4bcf81f2f2912d101d1aa1c2d8eb802c5719e`;镜像 sync 与 sync --check 通过。契约明确标注待迁移/发布。Gitea MCP 本会话不可用,按仓库规则使用已配置 Gitea API。 下一步授权点:合并 main、在目标 MySQL 执行追加迁移 `1789810000000_syb_stock_created_at.go`、按上述有界区间补历史、发布并抽样验收。当前未获这些高风险操作授权,工单保持待验收/开放。
Author
Owner

#352 发布进度(2026-09-30)

用户授权“#352 合并和部署到线上”。已核对 origin/main 仍为 bf06b2d 且 #352 分支为其快进后继;将四个提交快进合并到 main,当前 main 为 1f3ce61。合并前重跑针对性 SYB 测试、迁移包测试及 go build ./... 均通过,工作区干净。线上只读核对:当前 release 为 /home/goauto/releases/20260929-340,goauto.service active;尚未切换 release 或重启。

阻塞:本工单发布版本会查询新列 syb_product.syb_stock_created_at,若未先执行追加迁移 1789810000000_syb_stock_created_at.go,新版 API 会报未知列。用户本次明确授权合并与部署,但未明确授权数据库迁移及历史 SYB 数据重拉;按仓库高风险门禁停在迁移前,不部署不兼容版本。等待用户明确授权该迁移及有界历史补齐(或明确选择暂不补历史并接受日期筛选暂不返回旧行)后继续。未修改线上数据库、历史行、定时任务或服务配置。

#352 发布进度(2026-09-30) 用户授权“#352 合并和部署到线上”。已核对 origin/main 仍为 `bf06b2d` 且 #352 分支为其快进后继;将四个提交快进合并到 main,当前 main 为 `1f3ce61`。合并前重跑针对性 SYB 测试、迁移包测试及 `go build ./...` 均通过,工作区干净。线上只读核对:当前 release 为 `/home/goauto/releases/20260929-340`,`goauto.service` active;尚未切换 release 或重启。 阻塞:本工单发布版本会查询新列 `syb_product.syb_stock_created_at`,若未先执行追加迁移 `1789810000000_syb_stock_created_at.go`,新版 API 会报未知列。用户本次明确授权合并与部署,但未明确授权数据库迁移及历史 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#352