T62 增加 SYB 每小时自动同步并精简商品页入口 #75

Closed
opened 2026-08-24 15:41:12 +08:00 by ila · 3 comments
Owner

原始需求摘要

用户于 2026-08-24 确认:

  1. 当前 SYB 数据由 Admin 手工触发导入,希望增加每隔 1 小时自动同步。
  2. 去掉 SYB 商品页的“导入”和“同步记录”按钮。
  3. 将筛选、选择数量和操作组件收拢到搜索输入框同一行。

目标与范围

  • Server:把现有后台导入提取为手动接口和定时任务共用的内部服务。
  • Jobs:复用 go-admin 的 ExecJob 定时任务框架,增加内建 GoAutoSYBHourlySync。
  • Database:以版本化数据迁移新增一条默认启用的 sys_job 记录。
  • Web:移除 SYB 商品页手工导入入口和同步记录快捷按钮,清理不可达导入弹窗代码,收紧桌面筛选栏。
  • 同步记录页面、路由与手动导入 Admin API 保留;不涉及 Android、PDD、采购状态或支付。

已确认方案

定时规则

  • 默认 Cron:0 5 * * * *,即每小时第 5 分钟执行一次;使用带秒 Cron 语法。
  • 时区:Asia/Shanghai。
  • 每次同步今天和昨天两个自然日,补偿跨日后出现或更新的数据。
  • 重复数据继续按现有「订单号 + 明细 ID」幂等覆盖。
  • 操作人记录为“系统定时同步”,操作人 ID 为 0。
  • 单次失败不在同一小时自动重试;等待下一次调度。
  • 人工同步正在运行时,本次定时调度跳过;定时同步运行时,人工接口继续返回“已有导入任务”。
  • 没有启用店铺、凭据缺失时,必须在 SYB 登录/OCR/外部网络调用前停止并记录安全日志。
  • 保留现有 30 分钟单次超时、内存互斥和 syb_sync_run.active_slot 跨进程互斥。

代码结构

  • 提取一个不依赖 Gin/JWT 的内部启动服务,统一执行日期校验、店铺预检、凭据检查、互斥、同步记录创建和后台执行。
  • HTTP Handler 只负责权限、绑定参数和把当前管理员身份传给内部服务。
  • ExecJob 必须直接调用内部服务,不通过 HTTP 请求,也不伪造管理员 Token。
  • go-admin Job 执行器补充当前数据库上下文的安全传递;不改变既有示例任务行为。
  • 调度碰到已有任务属于“跳过”而非失败,不创建重复同步记录。

数据迁移

新增一个仅写默认任务配置的数据迁移:

  • job_name:SYB 每小时自动同步
  • job_group:GoAuto
  • job_type:2(ExecJob)
  • invoke_target:GoAutoSYBHourlySync
  • cron_expression:0 5 * * * *
  • args:{"lookbackDays":2,"timezone":"Asia/Shanghai"}
  • concurrent:禁止并发语义
  • status:启用

迁移按 invoke_target 幂等创建:已有同目标任务时不覆盖管理员后来修改的 Cron、参数或启停状态。迁移不改变现有表结构。

SYB 商品页

桌面正常宽度使用同一行:

已选择 N 条 | 店铺 | 订单号 | 解析状态 | 查询 | 重置 | 创建采购
  • 删除“导入”和“同步记录”工具栏按钮。
  • 删除手工导入弹窗及其不可达 Web 状态、监听和方法;服务端手工导入 API 保留作为应急能力。
  • 同步记录页面和导航保留;正在/最近同步横幅仍可进入详情。
  • 页面打开时异步读取最近一条同步记录;若正在执行则继续轮询,完成后刷新商品列表。
  • 桌面宽度强制收拢为一行;窄屏允许自然换行,不引入横向页面滚动。
  • 不改变店铺联想、订单号多行查询、采购预检和创建采购行为。

设计证据

这是现有页面的工具栏精简及既有后台任务能力扩展,不新增独立页面。用户已确认上述一行低保真布局,复用现有 Element Plus 表单、同步横幅和 go-admin 定时任务页面;无需新增 QuantUX/HTML。

状态覆盖:

  • 正常:最近同步成功,商品列表读取最新数据。
  • 运行中:显示现有同步横幅并轮询。
  • 调度重叠:跳过本次,不启动第二个任务。
  • 没有店铺/凭据:不进行 SYB/OCR 外部调用。
  • 同步失败:同步记录明确失败,下一小时再执行。
  • 最近同步记录加载失败:不阻断商品列表。
  • 窄屏:筛选组件自然换行。

验收标准

  • 迁移后 sys_job 只有一条 GoAutoSYBHourlySync 默认启用记录,重复迁移不重复、不覆盖人工修改。
  • 每小时第 5 分钟按上海时区同步今天和昨天。
  • 自动和人工同步复用同一服务、互斥和同步记录,自动记录显示“系统定时同步”。
  • 自动任务不通过 HTTP/JWT;失败不立即重试;重叠时安全跳过。
  • 无启用店铺或凭据时不调用 SYB/OCR。
  • SYB 商品页不再显示“导入”和“同步记录”按钮,手工导入弹窗代码已清理。
  • 桌面筛选栏按确认顺序保持同一行,窄屏正常换行。
  • 页面能显示并轮询自动同步记录,记录加载失败不阻断商品列表。
  • 现有筛选、重新解析、采购预检和采购入口不回归。
  • Server 单元/集成测试、Jobs 测试、Web ESLint/构建和 Playwright 回归通过。
  • Wiki-first 更新架构、业务规则、配置/部署说明并同步本地镜像;DevHarness 严格检查通过。

依赖、风险与文档影响

  • 依赖现有 SYB 后台同步、syb_sync_run 唯一执行槽、SYB 店铺预检及 go-admin Jobs。
  • 数据迁移属于高风险门禁;创建工单后必须再次取得用户明确授权,才能编写或执行迁移及继续实施。
  • 定时同步可能在 SYB 会话失效时调用已配置 OCR;不得扩大 OCR 数据范围或记录验证码图片。
  • 长期文档:Architecture and Code Map、Business Rules and Glossary、Configuration and Deployment;如共享接口行为未改变,不修改 Agent API Contract。
## 原始需求摘要 用户于 2026-08-24 确认: 1. 当前 SYB 数据由 Admin 手工触发导入,希望增加每隔 1 小时自动同步。 2. 去掉 SYB 商品页的“导入”和“同步记录”按钮。 3. 将筛选、选择数量和操作组件收拢到搜索输入框同一行。 ## 目标与范围 - Server:把现有后台导入提取为手动接口和定时任务共用的内部服务。 - Jobs:复用 go-admin 的 ExecJob 定时任务框架,增加内建 `GoAutoSYBHourlySync`。 - Database:以版本化数据迁移新增一条默认启用的 `sys_job` 记录。 - Web:移除 SYB 商品页手工导入入口和同步记录快捷按钮,清理不可达导入弹窗代码,收紧桌面筛选栏。 - 同步记录页面、路由与手动导入 Admin API 保留;不涉及 Android、PDD、采购状态或支付。 ## 已确认方案 ### 定时规则 - 默认 Cron:`0 5 * * * *`,即每小时第 5 分钟执行一次;使用带秒 Cron 语法。 - 时区:`Asia/Shanghai`。 - 每次同步今天和昨天两个自然日,补偿跨日后出现或更新的数据。 - 重复数据继续按现有「订单号 + 明细 ID」幂等覆盖。 - 操作人记录为“系统定时同步”,操作人 ID 为 0。 - 单次失败不在同一小时自动重试;等待下一次调度。 - 人工同步正在运行时,本次定时调度跳过;定时同步运行时,人工接口继续返回“已有导入任务”。 - 没有启用店铺、凭据缺失时,必须在 SYB 登录/OCR/外部网络调用前停止并记录安全日志。 - 保留现有 30 分钟单次超时、内存互斥和 `syb_sync_run.active_slot` 跨进程互斥。 ### 代码结构 - 提取一个不依赖 Gin/JWT 的内部启动服务,统一执行日期校验、店铺预检、凭据检查、互斥、同步记录创建和后台执行。 - HTTP Handler 只负责权限、绑定参数和把当前管理员身份传给内部服务。 - ExecJob 必须直接调用内部服务,不通过 HTTP 请求,也不伪造管理员 Token。 - go-admin Job 执行器补充当前数据库上下文的安全传递;不改变既有示例任务行为。 - 调度碰到已有任务属于“跳过”而非失败,不创建重复同步记录。 ### 数据迁移 新增一个仅写默认任务配置的数据迁移: - `job_name`:SYB 每小时自动同步 - `job_group`:GoAuto - `job_type`:2(ExecJob) - `invoke_target`:`GoAutoSYBHourlySync` - `cron_expression`:`0 5 * * * *` - `args`:`{"lookbackDays":2,"timezone":"Asia/Shanghai"}` - `concurrent`:禁止并发语义 - `status`:启用 迁移按 `invoke_target` 幂等创建:已有同目标任务时不覆盖管理员后来修改的 Cron、参数或启停状态。迁移不改变现有表结构。 ### SYB 商品页 桌面正常宽度使用同一行: ```text 已选择 N 条 | 店铺 | 订单号 | 解析状态 | 查询 | 重置 | 创建采购 ``` - 删除“导入”和“同步记录”工具栏按钮。 - 删除手工导入弹窗及其不可达 Web 状态、监听和方法;服务端手工导入 API 保留作为应急能力。 - 同步记录页面和导航保留;正在/最近同步横幅仍可进入详情。 - 页面打开时异步读取最近一条同步记录;若正在执行则继续轮询,完成后刷新商品列表。 - 桌面宽度强制收拢为一行;窄屏允许自然换行,不引入横向页面滚动。 - 不改变店铺联想、订单号多行查询、采购预检和创建采购行为。 ## 设计证据 这是现有页面的工具栏精简及既有后台任务能力扩展,不新增独立页面。用户已确认上述一行低保真布局,复用现有 Element Plus 表单、同步横幅和 go-admin 定时任务页面;无需新增 QuantUX/HTML。 状态覆盖: - 正常:最近同步成功,商品列表读取最新数据。 - 运行中:显示现有同步横幅并轮询。 - 调度重叠:跳过本次,不启动第二个任务。 - 没有店铺/凭据:不进行 SYB/OCR 外部调用。 - 同步失败:同步记录明确失败,下一小时再执行。 - 最近同步记录加载失败:不阻断商品列表。 - 窄屏:筛选组件自然换行。 ## 验收标准 - [ ] 迁移后 `sys_job` 只有一条 `GoAutoSYBHourlySync` 默认启用记录,重复迁移不重复、不覆盖人工修改。 - [ ] 每小时第 5 分钟按上海时区同步今天和昨天。 - [ ] 自动和人工同步复用同一服务、互斥和同步记录,自动记录显示“系统定时同步”。 - [ ] 自动任务不通过 HTTP/JWT;失败不立即重试;重叠时安全跳过。 - [ ] 无启用店铺或凭据时不调用 SYB/OCR。 - [ ] SYB 商品页不再显示“导入”和“同步记录”按钮,手工导入弹窗代码已清理。 - [ ] 桌面筛选栏按确认顺序保持同一行,窄屏正常换行。 - [ ] 页面能显示并轮询自动同步记录,记录加载失败不阻断商品列表。 - [ ] 现有筛选、重新解析、采购预检和采购入口不回归。 - [ ] Server 单元/集成测试、Jobs 测试、Web ESLint/构建和 Playwright 回归通过。 - [ ] Wiki-first 更新架构、业务规则、配置/部署说明并同步本地镜像;DevHarness 严格检查通过。 ## 依赖、风险与文档影响 - 依赖现有 SYB 后台同步、`syb_sync_run` 唯一执行槽、SYB 店铺预检及 go-admin Jobs。 - 数据迁移属于高风险门禁;创建工单后必须再次取得用户明确授权,才能编写或执行迁移及继续实施。 - 定时同步可能在 SYB 会话失效时调用已配置 OCR;不得扩大 OCR 数据范围或记录验证码图片。 - 长期文档:Architecture and Code Map、Business Rules and Glossary、Configuration and Deployment;如共享接口行为未改变,不修改 Agent API Contract。
Author
Owner

#75 已实施并推送,当前保持待验收。

实现:

  • 新增每小时第 5 分钟执行的 GoAutoSYBHourlySync,按 Asia/Shanghai 同步当天和前一天。
  • 手动 API 与定时任务共用 StartImport;上次仍运行时定时触发跳过,失败不立即重试。
  • 新增幂等 sys_job 数据迁移,保留管理员之后对 Cron/启停的修改。
  • SYB 商品页移除“导入”“同步记录”和导入弹窗;工具栏桌面端保持同一行,页面自动显示并轮询最新同步状态,完成后刷新商品。
  • Android Agent 未修改,不涉及创建订单或支付。

迁移:

  • 已按用户确认在本机 MySQL 执行。
  • 首次:新增 1 个迁移版本;再次:新增 0、跳过 19,确认幂等。
  • 验证期间未启动 Admin API,没有触发真实 SYB 访问。

验证:

  • go test ./...、go build ./... 通过。
  • Web lint 0 errors(30 个上游既有 warnings),生产构建通过。
  • 相关 Playwright 8 passed。
  • Wiki sync --verify、DevHarness strict、git diff --check 通过。

提交:a2cc9a1(已推送 main)
任务归档:Task-75-SYB-Hourly-Sync,revision ee6f7c146ac2df1c14bfde25fedbb4ee11bee12c。

验收需重启 Admin API,使调度器加载新任务;随后检查 SYB 商品页,并在下一次每小时第 5 分钟确认生成“系统定时同步”记录。

#75 已实施并推送,当前保持待验收。 实现: - 新增每小时第 5 分钟执行的 `GoAutoSYBHourlySync`,按 Asia/Shanghai 同步当天和前一天。 - 手动 API 与定时任务共用 `StartImport`;上次仍运行时定时触发跳过,失败不立即重试。 - 新增幂等 `sys_job` 数据迁移,保留管理员之后对 Cron/启停的修改。 - SYB 商品页移除“导入”“同步记录”和导入弹窗;工具栏桌面端保持同一行,页面自动显示并轮询最新同步状态,完成后刷新商品。 - Android Agent 未修改,不涉及创建订单或支付。 迁移: - 已按用户确认在本机 MySQL 执行。 - 首次:新增 1 个迁移版本;再次:新增 0、跳过 19,确认幂等。 - 验证期间未启动 Admin API,没有触发真实 SYB 访问。 验证: - `go test ./...`、`go build ./...` 通过。 - Web lint 0 errors(30 个上游既有 warnings),生产构建通过。 - 相关 Playwright 8 passed。 - Wiki `sync --verify`、DevHarness strict、`git diff --check` 通过。 提交:`a2cc9a1`(已推送 main) 任务归档:[Task-75-SYB-Hourly-Sync](https://git.ilapage.cn/OPC/goauto/wiki/Task-75-SYB-Hourly-Sync.-),revision `ee6f7c146ac2df1c14bfde25fedbb4ee11bee12c`。 验收需重启 Admin API,使调度器加载新任务;随后检查 SYB 商品页,并在下一次每小时第 5 分钟确认生成“系统定时同步”记录。
Author
Owner

需求在 #77 中进一步确认并已实施:#75 中“SYB 商品页显示/轮询自动同步记录并在完成后刷新”的验收项已被 #77 取代。当前目标为商品页完全不查询、展示或轮询同步状态;同步结果集中到独立“SYB 同步记录”,并从 GoAutoSYBHourlySync 定时任务进入执行记录。#75 的服务端定时同步、Cron、互斥、失败记录和同步记录 API 不变。实现提交:3261561。

需求在 #77 中进一步确认并已实施:#75 中“SYB 商品页显示/轮询自动同步记录并在完成后刷新”的验收项已被 #77 取代。当前目标为商品页完全不查询、展示或轮询同步状态;同步结果集中到独立“SYB 同步记录”,并从 `GoAutoSYBHourlySync` 定时任务进入执行记录。#75 的服务端定时同步、Cron、互斥、失败记录和同步记录 API 不变。实现提交:`3261561`。
Author
Owner

用户于 2026-08-28 明确确认本工单验收通过。按项目流程记录验收结论并关闭工单;本次仅更新工单状态,无新增长期文档事实,不重复同步 Wiki。

用户于 2026-08-28 明确确认本工单验收通过。按项目流程记录验收结论并关闭工单;本次仅更新工单状态,无新增长期文档事实,不重复同步 Wiki。
ila closed this issue 2026-08-28 15:07:34 +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#75