fix(collection): 当前页采集同任务重试再次识别商品触发空状态校验失败(已上线,待验收) #255

Open
opened 2026-09-10 14:22:25 +08:00 by ila · 3 comments
Owner

来源与目标

2026-09-10 用户反馈当前页采集失败后重试报服务端处理失败;确认最小修复方案后要求“create task and do it”。恢复同一个采集任务重新识别同一商品并继续执行,不创建替代任务或删除商品。

基线与根因

核验基线 main ca997f61087875802f8b57e074ced0af79c4b0ac。范围仅 Server current-page IdentifyCurrentPage 的已绑定商品分支。重置保留商品绑定而清空本次识别信息;分支对空 CollectionTask 调用 Updates,BeforeSave 接收空 status,报 unsupported collection task status。内存 SQLite DryRun 已复现;同请求直接幂等回放不经过此分支。

依赖、范围与方案

关联 #155 同任务重新采集。现有重试机制已实现,无新增依赖;可与 Android 面板诊断独立进行,但不并行修改同一文件。
仅 server/app/goauto/task/current_page.go 与相关 Go 测试。使用事务中已锁定的真实 record 作为更新模型,仅更新 identify_request_id / identity_resolved_at(保留既有更新时间行为);不改变任务状态、设备、租约、商品绑定、规则或并发槽,不跳过模型校验。维持商品不一致、错误设备、终态拒绝和请求幂等行为。
不改 Android/Web、接口结构、数据库结构、权限或状态机;不处理首次规格面板强证据不足,需另行现场诊断。

设计证据

恢复既有行为的非 UI 缺陷,不需原型。用户已确认上述最小流程;代码证据 current_page.go IdentifyCurrentPage、models/schema.go BeforeSave、lifecycle_service.go resetTask。实现前先加入回归并验证旧代码确实失败。

验收与验证

  • 首次识别→采集失败→同任务重置/领取→同商品新 requestId 识别成功,任务/商品 ID 不变。
  • 识别信息持久化;状态、设备、规则、商品、lease 与 guard slots 不变;旧 attempt 保留。
  • 相同请求回放不重复解析;不同商品、不同设备、已结束任务仍拒绝。
  • 继续提交成功采集结果;运行 task/model 受影响测试及服务端构建。
  • 真机与线上验证须独立授权发布后由用户重试,本次不操作线上数据或手机。

风险与授权

本次只修复受限字段更新,不调整锁序、并发算法、安全权限或迁移,不触发真实任务、下单、付款或删除。发布、重启、生产数据修改不在本次授权内;完成代码与测试后待授权部署。

文档影响

无长期文档影响:恢复已批准的同任务重试契约,不变更入口、API、配置、数据结构、状态或验证方式;跳过 Wiki 更新与同步,不导出任务快照。

工作流

当前环境无 Gitea MCP 工具,回退项目 Gitea API,凭据仅从忽略的安全配置读取,未输出。状态:开始实施;完成后提交、推送、回写证据,保持待验收。

## 来源与目标 2026-09-10 用户反馈当前页采集失败后重试报服务端处理失败;确认最小修复方案后要求“create task and do it”。恢复同一个采集任务重新识别同一商品并继续执行,不创建替代任务或删除商品。 ## 基线与根因 核验基线 main ca997f61087875802f8b57e074ced0af79c4b0ac。范围仅 Server current-page IdentifyCurrentPage 的已绑定商品分支。重置保留商品绑定而清空本次识别信息;分支对空 CollectionTask 调用 Updates,BeforeSave 接收空 status,报 unsupported collection task status。内存 SQLite DryRun 已复现;同请求直接幂等回放不经过此分支。 ## 依赖、范围与方案 关联 #155 同任务重新采集。现有重试机制已实现,无新增依赖;可与 Android 面板诊断独立进行,但不并行修改同一文件。 仅 server/app/goauto/task/current_page.go 与相关 Go 测试。使用事务中已锁定的真实 record 作为更新模型,仅更新 identify_request_id / identity_resolved_at(保留既有更新时间行为);不改变任务状态、设备、租约、商品绑定、规则或并发槽,不跳过模型校验。维持商品不一致、错误设备、终态拒绝和请求幂等行为。 不改 Android/Web、接口结构、数据库结构、权限或状态机;不处理首次规格面板强证据不足,需另行现场诊断。 ## 设计证据 恢复既有行为的非 UI 缺陷,不需原型。用户已确认上述最小流程;代码证据 current_page.go IdentifyCurrentPage、models/schema.go BeforeSave、lifecycle_service.go resetTask。实现前先加入回归并验证旧代码确实失败。 ## 验收与验证 - 首次识别→采集失败→同任务重置/领取→同商品新 requestId 识别成功,任务/商品 ID 不变。 - 识别信息持久化;状态、设备、规则、商品、lease 与 guard slots 不变;旧 attempt 保留。 - 相同请求回放不重复解析;不同商品、不同设备、已结束任务仍拒绝。 - 继续提交成功采集结果;运行 task/model 受影响测试及服务端构建。 - 真机与线上验证须独立授权发布后由用户重试,本次不操作线上数据或手机。 ## 风险与授权 本次只修复受限字段更新,不调整锁序、并发算法、安全权限或迁移,不触发真实任务、下单、付款或删除。发布、重启、生产数据修改不在本次授权内;完成代码与测试后待授权部署。 ## 文档影响 无长期文档影响:恢复已批准的同任务重试契约,不变更入口、API、配置、数据结构、状态或验证方式;跳过 Wiki 更新与同步,不导出任务快照。 ## 工作流 当前环境无 Gitea MCP 工具,回退项目 Gitea API,凭据仅从忽略的安全配置读取,未输出。状态:开始实施;完成后提交、推送、回写证据,保持待验收。
Author
Owner

实现完成,待部署与验收(2026-09-10)

  • 提交并推送:2cb78ad8cd5ff95438fd27dd0b554908159c8363,分支 fix/255-current-page-reidentify,基线 ca997f6。独立 worktree 干净,未改用户原工作区、main 或线上服务。
  • 最终修复:IdentifyCurrentPage 已绑定同商品分支使用事务锁定的 record 作为 GORM 更新模型,保留 BeforeSave 校验,仅更新识别元数据和常规 UpdatedAt。不改变状态、商品/设备绑定、规则快照、租约、并发槽或锁序。不新增任务、商品、接口字段、迁移或权限。
  • 先红后绿:新增 TestCurrentPageReidentifyAfterSameTaskRetry 在旧生产代码上真实失败,错误 unsupported collection task status "";应用最小修复后通过。
  • 新回归覆盖完整首次识别→失败提交→同任务 reset→claim/start→同商品新请求识别→幂等回放→采集成功结果提交。核对任务与商品各仅一条、旧失败 attempt 保留;字段级比较确认除识别信息/UpdatedAt 外均不变;不同设备、不同商品、终态新请求仍拒绝且不写入。
  • 验证通过:go test -p 1 ./app/goauto/task ./app/goauto/models(models 无测试文件);go test -p 1 ./...;go build -p 1 ./...;gofmt、git diff --check。沿用已知 Windows 编译资源限制采用串行 -p 1,未跳过测试包。
  • 测试使用内存 SQLite 和合成数据,直接商品链接本地解析,不访问 PDD、不使用生产数据库。未执行线上 MySQL/真机闭环,不声称首次规格面板识别问题已解决。
  • 无长期文档影响:恢复既有同任务重采和身份确认契约,入口/业务语义/API/配置/数据结构/运维均不变;按规则跳过 Wiki 更新和同步,不导出任务快照。
  • 未合并 main、未部署或重启。待用户授权发布 Server 后,在原失败任务上人工重试验证;无需更新 APK。工单保持开放待验收。
  • Gitea MCP 不可用,本次创建与证据回写使用项目安全配置的 Gitea API,无凭据输出。
## 实现完成,待部署与验收(2026-09-10) - 提交并推送:`2cb78ad8cd5ff95438fd27dd0b554908159c8363`,分支 `fix/255-current-page-reidentify`,基线 `ca997f6`。独立 worktree 干净,未改用户原工作区、main 或线上服务。 - 最终修复:IdentifyCurrentPage 已绑定同商品分支使用事务锁定的 `record` 作为 GORM 更新模型,保留 BeforeSave 校验,仅更新识别元数据和常规 UpdatedAt。不改变状态、商品/设备绑定、规则快照、租约、并发槽或锁序。不新增任务、商品、接口字段、迁移或权限。 - 先红后绿:新增 TestCurrentPageReidentifyAfterSameTaskRetry 在旧生产代码上真实失败,错误 `unsupported collection task status ""`;应用最小修复后通过。 - 新回归覆盖完整首次识别→失败提交→同任务 reset→claim/start→同商品新请求识别→幂等回放→采集成功结果提交。核对任务与商品各仅一条、旧失败 attempt 保留;字段级比较确认除识别信息/UpdatedAt 外均不变;不同设备、不同商品、终态新请求仍拒绝且不写入。 - 验证通过:`go test -p 1 ./app/goauto/task ./app/goauto/models`(models 无测试文件);`go test -p 1 ./...`;`go build -p 1 ./...`;gofmt、git diff --check。沿用已知 Windows 编译资源限制采用串行 -p 1,未跳过测试包。 - 测试使用内存 SQLite 和合成数据,直接商品链接本地解析,不访问 PDD、不使用生产数据库。未执行线上 MySQL/真机闭环,不声称首次规格面板识别问题已解决。 - 无长期文档影响:恢复既有同任务重采和身份确认契约,入口/业务语义/API/配置/数据结构/运维均不变;按规则跳过 Wiki 更新和同步,不导出任务快照。 - 未合并 main、未部署或重启。待用户授权发布 Server 后,在原失败任务上人工重试验证;无需更新 APK。工单保持开放待验收。 - Gitea MCP 不可用,本次创建与证据回写使用项目安全配置的 Gitea API,无凭据输出。
ila changed title from fix(collection): 当前页采集同任务重试再次识别商品触发空状态校验失败 to fix(collection): 当前页采集同任务重试再次识别商品触发空状态校验失败(已实现,待部署验收) 2026-09-10 14:27:11 +08:00
Author
Owner

2026-09-10 用户明确授权合并 main 并部署线上。main 已快进并推送至 2cb78ad;线上基线核对为 ca997f6,差异仅本工单两个 Server 文件。开始 Linux Server 构建及独立 release 发布,保留现有 Web/配置/持久化目录,重启 goauto.service;不执行数据库迁移、不调整任务开关、不触发真实采集或采购。发布前已确认各业务运行计数为 0,切换前再次核对;旧 release 保留用于异常回退。

2026-09-10 用户明确授权合并 main 并部署线上。main 已快进并推送至 2cb78ad;线上基线核对为 ca997f6,差异仅本工单两个 Server 文件。开始 Linux Server 构建及独立 release 发布,保留现有 Web/配置/持久化目录,重启 goauto.service;不执行数据库迁移、不调整任务开关、不触发真实采集或采购。发布前已确认各业务运行计数为 0,切换前再次核对;旧 release 保留用于异常回退。
Author
Owner

2026-09-10 已授权合并 main 与线上部署,待验收

  • main 已快进并推送至 2cb78ad8cd5ff95438fd27dd0b554908159c8363,远端回读一致;运行工作区干净。相对原线上 ca997f6 仅本工单两个 Server 文件,无 Android/Web/迁移差异。
  • 合并后 task 测试通过;Linux amd64、CGO_ENABLED=0、trimpath 构建通过(Go 1.26.5)。二进制大小 86942235 bytes,SHA-256 605100afdd96ae594031bbec4f84d82ec1b5247902c5d516d227aa7f2d4c6281;上传与运行进程 /proc/PID/exe 摘要一致。
  • 新 release /home/goauto/releases/20260910-2cb78ad-255;沿用原配置、Web/dist、template 和 var/static 持久化目标。原子切换 current 后重启 goauto.service,验证 PID 27437、active,内部 API 健康 200,Nginx 首页与发布文件一致。
  • 外部 http://185.216.248.75:9527/ 与 /api/v1/health 均 HTTP 200。未改 Nginx 配置、不需重启 Nginx。未重启本地 Supervisor 服务。
  • 切换前确认 SYB 同步、采集、采购和两类 AI 批任务 running 数均 0。未执行数据库迁移;sys_migration 全部版本、sys_job 启停值和 AI 超时前后相同。没有触发采集、采购、同步、创建订单或付款,也没有手动修改生产任务状态。
  • 上一 release /home/goauto/releases/20260910-ca997f6-253 保留,可按既有运维流程回退;本次无回退发生、无数据删除。
  • 文档影响不变:本次仅发布版本替换,部署拓扑/命令/配置/API/业务契约不变,版本绑定证据留在工单;不更新 Wiki、不重复同步镜像。
  • 请用户在 Agent 原失败任务上手动重试验收,无需更新 APK。本次验证不等于真机采集成功,首次规格面板识别问题仍为独立未验证项。工单保持开放待验收。
  • Gitea MCP 不可用,继续使用项目安全配置的 Gitea API 回写,未输出凭据。
## 2026-09-10 已授权合并 main 与线上部署,待验收 - main 已快进并推送至 `2cb78ad8cd5ff95438fd27dd0b554908159c8363`,远端回读一致;运行工作区干净。相对原线上 ca997f6 仅本工单两个 Server 文件,无 Android/Web/迁移差异。 - 合并后 task 测试通过;Linux amd64、CGO_ENABLED=0、trimpath 构建通过(Go 1.26.5)。二进制大小 86942235 bytes,SHA-256 `605100afdd96ae594031bbec4f84d82ec1b5247902c5d516d227aa7f2d4c6281`;上传与运行进程 /proc/PID/exe 摘要一致。 - 新 release `/home/goauto/releases/20260910-2cb78ad-255`;沿用原配置、Web/dist、template 和 var/static 持久化目标。原子切换 current 后重启 `goauto.service`,验证 PID 27437、active,内部 API 健康 200,Nginx 首页与发布文件一致。 - 外部 `http://185.216.248.75:9527/` 与 `/api/v1/health` 均 HTTP 200。未改 Nginx 配置、不需重启 Nginx。未重启本地 Supervisor 服务。 - 切换前确认 SYB 同步、采集、采购和两类 AI 批任务 running 数均 0。未执行数据库迁移;sys_migration 全部版本、sys_job 启停值和 AI 超时前后相同。没有触发采集、采购、同步、创建订单或付款,也没有手动修改生产任务状态。 - 上一 release `/home/goauto/releases/20260910-ca997f6-253` 保留,可按既有运维流程回退;本次无回退发生、无数据删除。 - 文档影响不变:本次仅发布版本替换,部署拓扑/命令/配置/API/业务契约不变,版本绑定证据留在工单;不更新 Wiki、不重复同步镜像。 - 请用户在 Agent 原失败任务上手动重试验收,无需更新 APK。本次验证不等于真机采集成功,首次规格面板识别问题仍为独立未验证项。工单保持开放待验收。 - Gitea MCP 不可用,继续使用项目安全配置的 Gitea API 回写,未输出凭据。
ila changed title from fix(collection): 当前页采集同任务重试再次识别商品触发空状态校验失败(已实现,待部署验收) to fix(collection): 当前页采集同任务重试再次识别商品触发空状态校验失败(已上线,待验收) 2026-09-10 14:32:37 +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#255