新增 SYB 异常采购规格 AI 解析定时任务 #198

Open
opened 2026-09-02 20:50:27 +08:00 by ila · 2 comments
Owner

阶段

待验收。实现提交 aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc 已推送;2026-09-02 已在线执行追加迁移 1788354164329 并发布为 20260902-aa2ecc6-r1,GoAuto/Nginx 已重启且健康检查通过;系统任务保持关闭,尚未执行真实 AI 批处理验收。

原始需求摘要

  • 来源:用户,2026-09-02。
  • 目标:SYB 货运单商品因采购规格解析 uncertain 或 failed 而显示“采购规格解析存疑,请先人工修正并确认”时,由定时任务使用 AI 在安全边界内尝试解析,减少逐条人工修正。
  • 已确认方向:新增独立的 SYB 异常规格 AI 解析任务;完成后再由 #195 处理蝦皮规格到 PDD 规格的匹配。

当前事实与问题边界

  • sybimport.Parse 目前仅按确定性规则拆分 RawJSON.productSpec,没有 AI 路径。
  • purchase.previewFromDataset 只信任 parse_status=success 或 manually_confirmed=true;未确认的 uncertain/failed 会阻止创建采购。
  • #195 GoAutoShopeeSpecAutoMatch 处理的是“蝦皮规格 → PDD 规格”,扫描单位是蝦皮商品,不能纠正 SYB 明细中的目标颜色/尺码,也不能消除本报错。
  • #190 放宽的是 SYB 页面批量 PDD 规格匹配资格,不等于确认 SYB 解析结果;不能把错误目标值直接当作可信采购规格。

目标范围

  1. 新增独立系统任务 GoAutoSYBSpecAIParse,按批次扫描未人工确认的 parse_status IN ('uncertain','failed') SYB 明细。
  2. 每条先重跑现有确定性解析;只有仍异常且存在可判断输入时才调用 AI。
  3. AI 仅在关联蝦皮商品当前颜色/尺码候选的封闭集合中返回原始值;通过置信度、理由、角色完整性、候选归属和输入指纹复核后才自动确认。
  4. AI 确认后更新该 SYB 明细的派生目标颜色/尺码和 AI 确认状态;不冒充人工确认,不改写原始 RawJSON。
  5. 结果可被现有采购预检视为可信,并按既有路径进入后续蝦皮→PDD 规格匹配;不自动创建采集任务、采购任务或订单。
  6. 默认 Cron 为每小时第 5 分钟、每批最多 20 条;迁移写入的系统任务默认关闭,由管理员验收后明确启用。#195 默认第 15 分钟,可形成先解析、后映射的顺序。

非目标

  • 不让 #195 兼任 SYB 解析,不修改其以蝦皮商品为单位的运行/工作表。
  • 不处理 productSpec 为空、关联蝦皮商品缺失、蝦皮规格候选缺失或候选角色不明确的记录;这些仍需人工处理。
  • 不覆盖 manually_confirmed=true;不修改已有采购任务的不可变规格快照。
  • 不创建采购任务、PDD 订单,不执行 Agent 动作或付款。
  • 本单不新增独立管理页面或新的人工立即执行入口;任务启停和 Cron 复用现有系统任务管理。

AI 输入与安全边界

  • 发送内容仅限:单条 productSpec、关联蝦皮商品的颜色候选、尺码候选;不发送订单号、店铺、价格、地址、账号、完整 RawJSON、PDD 页面数据或个人信息。
  • AI 结果必须逐字属于对应蝦皮候选;禁止返回集合外值、改写候选或猜测缺失数据。
  • 至少一个目标维度有明确候选;商品实际只有一个规格角色时允许只确认该角色,存在两个角色时两者都必须有效。
  • AI 必须返回置信度与非空理由,并达到现有服务端 autoConfirmMinConfidence;低置信度、歧义、无结果或上下文漂移保持异常状态。
  • Provider 原始响应和 API Key 不写日志、任务表、工单或文档;只保存限长脱敏结果与稳定错误码。

数据与状态方案

SYB 明细确认来源

  • 为 syb_product 增加 AI 确认事实(建议 ai_confirmed、置信度、限长理由、确认时间和输入指纹)。
  • parse_status 继续记录确定性解析器的结果,不把 AI 结果冒充 success;manually_confirmed 继续只表示人工决定。
  • 采购可信条件调整为:确定性 success、人工确认或有效 AI 确认三者之一。
  • 人工修正优先级最高,保存人工结果时清理旧 AI 确认;SYB 同步导致 productSpec 或关联规格上下文变化时旧 AI 确认必须失效。

运行与工作项

  • 新增 syb_spec_ai_parse_run:触发来源、requestId、状态、批量上限、扫描/符合/处理/确认/未匹配/失败计数、脱敏错误、全局活动槽和租约。
  • 新增 syb_spec_ai_parse_work_item:按 SYB 商品唯一,保存输入指纹、状态、尝试次数、下次尝试时间、租约、稳定错误码与脱敏结果。
  • 指纹至少覆盖 productSpec、蝦皮规格候选、关联关系和 AI 设置更新时间。
  • 同一输入的低置信度/无结果不重复消耗 AI;输入变化后允许重新处理。
  • Provider 暂时不可用按至少 60 分钟退避、最多 3 次;进程中断后由过期租约安全恢复。
  • 多实例、Cron 重入时全局最多一个运行批次,同一 SYB 明细最多一个工作项执行。

调度与依赖

  • 复用现有 sys_job、ExecWithDB 和 #195 已验证的活动槽/租约/工作项模式,但使用独立表和独立调用目标。
  • 依赖当前线上 #195/#197 基线提交 f27ec1630788ac9a6a8287caf65e486ba3e3abce。
  • 不允许与 #195 共用以 shopee_product_id 为唯一键的工作项。
  • 是否可并行:实现内部可分测试,但上线顺序必须先数据库迁移,再发布服务;定时任务默认关闭。

设计证据

  • 本单为后端、数据和定时任务变化,不新增页面,按规则不强制 UI 原型。
  • 复用现有系统任务管理页启停/Cron;SYB 详情已有“解析状态/解析说明”区域,返回 AI 确认字段和脱敏说明,不改变页面结构。
  • 若实施中需要新增 AI 标签、运行摘要或手动按钮,必须先补标注截图并由用户确认,不混入当前范围。

预计影响

  • server/app/goauto/sybimport/:AI 解析服务、资格、确认写入及同步/人工覆盖规则。
  • server/app/goauto/aimatching/:增加封闭候选的 SYB 解析请求/响应,不复用 PDD 映射语义。
  • server/app/goauto/models/、server/app/goauto/migrations/:字段、运行表和工作项表。
  • server/app/jobs/:注册 GoAutoSYBSpecAIParse。
  • server/cmd/migrate/migration/version-local/:追加迁移与默认关闭系统任务。
  • server/app/goauto/purchase/:可信规格判断纳入有效 AI 确认。
  • 共享接口仅在既有 SYB 商品响应增加只读 AI 确认信息;不新增 Android 接口。

验收标准

  • 只扫描未人工确认的异常解析记录;确定性成功和人工确认记录不被覆盖。
  • 每条先确定性重解析,仍异常才调用 AI。
  • 空 productSpec、无关联蝦皮商品、无候选或角色歧义不调用 AI且保持人工处理。
  • AI 只能确认候选集合内的颜色/尺码;低置信度、理由缺失、越界值及输入漂移均不写入。
  • AI 确认后采购预检不再返回 SYB_PARSE_FAILED,但后续 PDD 映射、价格、任务、订单及支付门禁保持不变。
  • 人工修正覆盖 AI;输入变化使旧 AI 确认失效;已有采购任务快照不变。
  • 同一输入的无结果不重复调用;临时失败有限重试;多实例最多一个批次和一个逐条工作项。
  • 迁移幂等,不覆盖管理员后来修改的 Cron、参数或启停状态;初始任务关闭。
  • 不创建采集/采购任务、订单,不执行付款或 Android 动作。
  • 服务端、迁移、并发和相关采购回归测试通过。
  • 长期 Wiki 在线更新、回读 revision、sync 与 sync --check 完成。

验证方式

  • Go:资格矩阵、单/双规格角色、候选封闭校验、置信度、指纹漂移、人工优先、同步失效、租约竞争、重试与迁移幂等测试。
  • 采购回归:AI 确认记录通过解析门禁,但仍受 PDD 映射、价格、活动任务、订单与支付安全门禁。
  • ./scripts/verify.ps1 -Component server
  • python dev_scripts/harness.py check --strict
  • 上线前保持任务关闭;部署后用少量脱敏测试数据手动调用服务层/受控调度验证,再由管理员决定是否启用 Cron。

风险与回退

  • 风险:AI 把错误规格确认为可信采购目标、批量成本、重复调用、同步后旧结果继续生效。
  • 控制:蝦皮候选封闭集合、置信度/理由、输入指纹、人工优先、默认关闭、批量上限、全局租约、有限重试和不自动创建采购任务。
  • 回退:关闭 GoAutoSYBSpecAIParse;服务回退时保留运行审计,采购可信条件不再使用 AI 确认。不得删除原始 RawJSON 或人工确认。

文档影响

  • 更新 Architecture-and-Code-Map:新增 AI 解析服务、数据表和任务入口。
  • 更新 Business-Rules-and-Glossary:SYB 解析确认来源、AI 边界及两阶段顺序。
  • 更新 Android-Agent-API-Contract:仅更新 Admin/SYB 响应契约;明确 Android 无变化。
  • 更新 Deployment-and-Operations:任务默认关闭、Cron、批量限制、启停、重试和排错。
  • 默认不创建任务快照或 Wiki 任务归档。
## 阶段 待验收。实现提交 `aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc` 已推送;2026-09-02 已在线执行追加迁移 `1788354164329` 并发布为 `20260902-aa2ecc6-r1`,GoAuto/Nginx 已重启且健康检查通过;系统任务保持关闭,尚未执行真实 AI 批处理验收。 ## 原始需求摘要 - 来源:用户,2026-09-02。 - 目标:SYB 货运单商品因采购规格解析 `uncertain` 或 `failed` 而显示“采购规格解析存疑,请先人工修正并确认”时,由定时任务使用 AI 在安全边界内尝试解析,减少逐条人工修正。 - 已确认方向:新增独立的 SYB 异常规格 AI 解析任务;完成后再由 #195 处理蝦皮规格到 PDD 规格的匹配。 ## 当前事实与问题边界 - `sybimport.Parse` 目前仅按确定性规则拆分 `RawJSON.productSpec`,没有 AI 路径。 - `purchase.previewFromDataset` 只信任 `parse_status=success` 或 `manually_confirmed=true`;未确认的 `uncertain/failed` 会阻止创建采购。 - #195 `GoAutoShopeeSpecAutoMatch` 处理的是“蝦皮规格 → PDD 规格”,扫描单位是蝦皮商品,不能纠正 SYB 明细中的目标颜色/尺码,也不能消除本报错。 - #190 放宽的是 SYB 页面批量 PDD 规格匹配资格,不等于确认 SYB 解析结果;不能把错误目标值直接当作可信采购规格。 ## 目标范围 1. 新增独立系统任务 `GoAutoSYBSpecAIParse`,按批次扫描未人工确认的 `parse_status IN ('uncertain','failed')` SYB 明细。 2. 每条先重跑现有确定性解析;只有仍异常且存在可判断输入时才调用 AI。 3. AI 仅在关联蝦皮商品当前颜色/尺码候选的封闭集合中返回原始值;通过置信度、理由、角色完整性、候选归属和输入指纹复核后才自动确认。 4. AI 确认后更新该 SYB 明细的派生目标颜色/尺码和 AI 确认状态;不冒充人工确认,不改写原始 `RawJSON`。 5. 结果可被现有采购预检视为可信,并按既有路径进入后续蝦皮→PDD 规格匹配;不自动创建采集任务、采购任务或订单。 6. 默认 Cron 为每小时第 5 分钟、每批最多 20 条;迁移写入的系统任务默认关闭,由管理员验收后明确启用。#195 默认第 15 分钟,可形成先解析、后映射的顺序。 ## 非目标 - 不让 #195 兼任 SYB 解析,不修改其以蝦皮商品为单位的运行/工作表。 - 不处理 `productSpec` 为空、关联蝦皮商品缺失、蝦皮规格候选缺失或候选角色不明确的记录;这些仍需人工处理。 - 不覆盖 `manually_confirmed=true`;不修改已有采购任务的不可变规格快照。 - 不创建采购任务、PDD 订单,不执行 Agent 动作或付款。 - 本单不新增独立管理页面或新的人工立即执行入口;任务启停和 Cron 复用现有系统任务管理。 ## AI 输入与安全边界 - 发送内容仅限:单条 `productSpec`、关联蝦皮商品的颜色候选、尺码候选;不发送订单号、店铺、价格、地址、账号、完整 RawJSON、PDD 页面数据或个人信息。 - AI 结果必须逐字属于对应蝦皮候选;禁止返回集合外值、改写候选或猜测缺失数据。 - 至少一个目标维度有明确候选;商品实际只有一个规格角色时允许只确认该角色,存在两个角色时两者都必须有效。 - AI 必须返回置信度与非空理由,并达到现有服务端 `autoConfirmMinConfidence`;低置信度、歧义、无结果或上下文漂移保持异常状态。 - Provider 原始响应和 API Key 不写日志、任务表、工单或文档;只保存限长脱敏结果与稳定错误码。 ## 数据与状态方案 ### SYB 明细确认来源 - 为 `syb_product` 增加 AI 确认事实(建议 `ai_confirmed`、置信度、限长理由、确认时间和输入指纹)。 - `parse_status` 继续记录确定性解析器的结果,不把 AI 结果冒充 `success`;`manually_confirmed` 继续只表示人工决定。 - 采购可信条件调整为:确定性 `success`、人工确认或有效 AI 确认三者之一。 - 人工修正优先级最高,保存人工结果时清理旧 AI 确认;SYB 同步导致 `productSpec` 或关联规格上下文变化时旧 AI 确认必须失效。 ### 运行与工作项 - 新增 `syb_spec_ai_parse_run`:触发来源、requestId、状态、批量上限、扫描/符合/处理/确认/未匹配/失败计数、脱敏错误、全局活动槽和租约。 - 新增 `syb_spec_ai_parse_work_item`:按 SYB 商品唯一,保存输入指纹、状态、尝试次数、下次尝试时间、租约、稳定错误码与脱敏结果。 - 指纹至少覆盖 `productSpec`、蝦皮规格候选、关联关系和 AI 设置更新时间。 - 同一输入的低置信度/无结果不重复消耗 AI;输入变化后允许重新处理。 - Provider 暂时不可用按至少 60 分钟退避、最多 3 次;进程中断后由过期租约安全恢复。 - 多实例、Cron 重入时全局最多一个运行批次,同一 SYB 明细最多一个工作项执行。 ## 调度与依赖 - 复用现有 `sys_job`、`ExecWithDB` 和 #195 已验证的活动槽/租约/工作项模式,但使用独立表和独立调用目标。 - 依赖当前线上 #195/#197 基线提交 `f27ec1630788ac9a6a8287caf65e486ba3e3abce`。 - 不允许与 #195 共用以 `shopee_product_id` 为唯一键的工作项。 - 是否可并行:实现内部可分测试,但上线顺序必须先数据库迁移,再发布服务;定时任务默认关闭。 ## 设计证据 - 本单为后端、数据和定时任务变化,不新增页面,按规则不强制 UI 原型。 - 复用现有系统任务管理页启停/Cron;SYB 详情已有“解析状态/解析说明”区域,返回 AI 确认字段和脱敏说明,不改变页面结构。 - 若实施中需要新增 AI 标签、运行摘要或手动按钮,必须先补标注截图并由用户确认,不混入当前范围。 ## 预计影响 - `server/app/goauto/sybimport/`:AI 解析服务、资格、确认写入及同步/人工覆盖规则。 - `server/app/goauto/aimatching/`:增加封闭候选的 SYB 解析请求/响应,不复用 PDD 映射语义。 - `server/app/goauto/models/`、`server/app/goauto/migrations/`:字段、运行表和工作项表。 - `server/app/jobs/`:注册 `GoAutoSYBSpecAIParse`。 - `server/cmd/migrate/migration/version-local/`:追加迁移与默认关闭系统任务。 - `server/app/goauto/purchase/`:可信规格判断纳入有效 AI 确认。 - 共享接口仅在既有 SYB 商品响应增加只读 AI 确认信息;不新增 Android 接口。 ## 验收标准 - [ ] 只扫描未人工确认的异常解析记录;确定性成功和人工确认记录不被覆盖。 - [ ] 每条先确定性重解析,仍异常才调用 AI。 - [ ] 空 `productSpec`、无关联蝦皮商品、无候选或角色歧义不调用 AI且保持人工处理。 - [ ] AI 只能确认候选集合内的颜色/尺码;低置信度、理由缺失、越界值及输入漂移均不写入。 - [ ] AI 确认后采购预检不再返回 `SYB_PARSE_FAILED`,但后续 PDD 映射、价格、任务、订单及支付门禁保持不变。 - [ ] 人工修正覆盖 AI;输入变化使旧 AI 确认失效;已有采购任务快照不变。 - [ ] 同一输入的无结果不重复调用;临时失败有限重试;多实例最多一个批次和一个逐条工作项。 - [ ] 迁移幂等,不覆盖管理员后来修改的 Cron、参数或启停状态;初始任务关闭。 - [ ] 不创建采集/采购任务、订单,不执行付款或 Android 动作。 - [ ] 服务端、迁移、并发和相关采购回归测试通过。 - [ ] 长期 Wiki 在线更新、回读 revision、`sync` 与 `sync --check` 完成。 ## 验证方式 - Go:资格矩阵、单/双规格角色、候选封闭校验、置信度、指纹漂移、人工优先、同步失效、租约竞争、重试与迁移幂等测试。 - 采购回归:AI 确认记录通过解析门禁,但仍受 PDD 映射、价格、活动任务、订单与支付安全门禁。 - `./scripts/verify.ps1 -Component server` - `python dev_scripts/harness.py check --strict` - 上线前保持任务关闭;部署后用少量脱敏测试数据手动调用服务层/受控调度验证,再由管理员决定是否启用 Cron。 ## 风险与回退 - 风险:AI 把错误规格确认为可信采购目标、批量成本、重复调用、同步后旧结果继续生效。 - 控制:蝦皮候选封闭集合、置信度/理由、输入指纹、人工优先、默认关闭、批量上限、全局租约、有限重试和不自动创建采购任务。 - 回退:关闭 `GoAutoSYBSpecAIParse`;服务回退时保留运行审计,采购可信条件不再使用 AI 确认。不得删除原始 RawJSON 或人工确认。 ## 文档影响 - 更新 Architecture-and-Code-Map:新增 AI 解析服务、数据表和任务入口。 - 更新 Business-Rules-and-Glossary:SYB 解析确认来源、AI 边界及两阶段顺序。 - 更新 Android-Agent-API-Contract:仅更新 Admin/SYB 响应契约;明确 Android 无变化。 - 更新 Deployment-and-Operations:任务默认关闭、Cron、批量限制、启停、重试和排错。 - 默认不创建任务快照或 Wiki 任务归档。
Author
Owner

实施完成,待验收(2026-09-02)

Gitea MCP 在当前环境不可用,本次按仓库规则回退已配置的 Gitea API;凭据仅从忽略文件读取,未写入代码、日志、工单或文档。

实现

  • 分支:feat/198-syb-ai-parse
  • 提交:aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc
  • 新增 GoAutoSYBSpecAIParse,默认 Cron 0 5 * * * *、batchLimit=20、迁移后默认关闭。
  • 每条先确定性重解析;仅对非空 productSpec、已关联蝦皮且具有唯一角色候选集合的异常行调用 AI。
  • Provider 请求只包含 productSpec 和蝦皮颜色/尺码候选;返回值必须逐字属于候选,并达到现有自动确认阈值且理由非空。
  • parse_status 保留规则解析结论;新增独立 AI 确认、置信度、理由、时间和隐藏指纹。采购门禁只信任仍命中当前蝦皮候选的 AI 结果。
  • 人工修正会清除并覆盖 AI;重复 SYB 同步保留人工值,完全相同输入保留 AI 值,来源/关联变化清除旧 AI。
  • 新增全局活动槽、批次租约和逐 SYB 行工作项;低置信度/无结果同一输入不重复,Provider 暂时失败至少 60 分钟后重试且最多 3 次。
  • 不新增 Android 接口,不创建采集/采购任务、订单,不执行 Agent 动作或付款。

追加迁移

  • server/cmd/migrate/migration/version-local/1788354164329_syb_spec_ai_parse.go
  • 增加 syb_product AI 确认字段。
  • 新增 syb_spec_ai_parse_run、syb_spec_ai_parse_work_item。
  • 幂等播种默认关闭的系统任务,重复执行不覆盖管理员后来修改的 Cron、参数或启停状态。
  • 本次只实现并通过 SQLite 迁移测试;未连接本机/线上 MySQL执行迁移,未发布或启用任务。

验证

  • go test ./...:通过。
  • ./scripts/verify.ps1 -Component server:通过(完整测试及 Go build)。
  • go vet ./...:通过。
  • go test -race ./app/goauto/aimatching ./app/goauto/sybimport ./app/goauto/purchase:通过。
  • python dev_scripts/harness.py check --strict:通过。
  • git diff --cached --check / 提交前差异检查:通过。
  • 覆盖封闭候选、Provider 请求最小化、低置信度不重复、最多三次退避、全局单运行槽、人工优先、相同输入幂等、来源变化失效、候选消失 fail-closed 和迁移幂等。

Wiki

已在线更新并回读:

  • Architecture-and-Code-Map:568d40fd882dc520e247226c4dd4d5c6b03122d9
  • Business-Rules-and-Glossary:a60c48f56ec7cad6f886df78a644fbabb92d288f
  • Android-Agent-API-Contract:75cebdfb2408d35e59d05d5755068b6d8cd126f5
  • Deployment-and-Operations:6b6458ea30bc2140ad39dbf0c28c0d5896ee7618

已执行唯一一轮 sync 和一轮 sync --check,均成功。同步同时带回与 #198 无关的 docs/12-syb-erp-interface.md 既有远端变化,已保留为未暂存修改,未混入本提交。

待人工验收/上线

  1. 代码评审并验收 #198。
  2. 若要部署,需另行明确授权在目标数据库执行迁移并发布服务。
  3. 部署后先保持 GoAutoSYBSpecAIParse 关闭,以少量脱敏记录验证,再由管理员决定是否启用 Cron;#195 可保持每小时第 15 分钟形成后续映射阶段。
## 实施完成,待验收(2026-09-02) Gitea MCP 在当前环境不可用,本次按仓库规则回退已配置的 Gitea API;凭据仅从忽略文件读取,未写入代码、日志、工单或文档。 ### 实现 - 分支:`feat/198-syb-ai-parse` - 提交:`aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc` - 新增 `GoAutoSYBSpecAIParse`,默认 Cron `0 5 * * * *`、`batchLimit=20`、迁移后默认关闭。 - 每条先确定性重解析;仅对非空 `productSpec`、已关联蝦皮且具有唯一角色候选集合的异常行调用 AI。 - Provider 请求只包含 `productSpec` 和蝦皮颜色/尺码候选;返回值必须逐字属于候选,并达到现有自动确认阈值且理由非空。 - `parse_status` 保留规则解析结论;新增独立 AI 确认、置信度、理由、时间和隐藏指纹。采购门禁只信任仍命中当前蝦皮候选的 AI 结果。 - 人工修正会清除并覆盖 AI;重复 SYB 同步保留人工值,完全相同输入保留 AI 值,来源/关联变化清除旧 AI。 - 新增全局活动槽、批次租约和逐 SYB 行工作项;低置信度/无结果同一输入不重复,Provider 暂时失败至少 60 分钟后重试且最多 3 次。 - 不新增 Android 接口,不创建采集/采购任务、订单,不执行 Agent 动作或付款。 ### 追加迁移 - `server/cmd/migrate/migration/version-local/1788354164329_syb_spec_ai_parse.go` - 增加 `syb_product` AI 确认字段。 - 新增 `syb_spec_ai_parse_run`、`syb_spec_ai_parse_work_item`。 - 幂等播种默认关闭的系统任务,重复执行不覆盖管理员后来修改的 Cron、参数或启停状态。 - 本次只实现并通过 SQLite 迁移测试;未连接本机/线上 MySQL执行迁移,未发布或启用任务。 ### 验证 - `go test ./...`:通过。 - `./scripts/verify.ps1 -Component server`:通过(完整测试及 Go build)。 - `go vet ./...`:通过。 - `go test -race ./app/goauto/aimatching ./app/goauto/sybimport ./app/goauto/purchase`:通过。 - `python dev_scripts/harness.py check --strict`:通过。 - `git diff --cached --check` / 提交前差异检查:通过。 - 覆盖封闭候选、Provider 请求最小化、低置信度不重复、最多三次退避、全局单运行槽、人工优先、相同输入幂等、来源变化失效、候选消失 fail-closed 和迁移幂等。 ### Wiki 已在线更新并回读: - Architecture-and-Code-Map:`568d40fd882dc520e247226c4dd4d5c6b03122d9` - Business-Rules-and-Glossary:`a60c48f56ec7cad6f886df78a644fbabb92d288f` - Android-Agent-API-Contract:`75cebdfb2408d35e59d05d5755068b6d8cd126f5` - Deployment-and-Operations:`6b6458ea30bc2140ad39dbf0c28c0d5896ee7618` 已执行唯一一轮 `sync` 和一轮 `sync --check`,均成功。同步同时带回与 #198 无关的 `docs/12-syb-erp-interface.md` 既有远端变化,已保留为未暂存修改,未混入本提交。 ### 待人工验收/上线 1. 代码评审并验收 #198。 2. 若要部署,需另行明确授权在目标数据库执行迁移并发布服务。 3. 部署后先保持 `GoAutoSYBSpecAIParse` 关闭,以少量脱敏记录验证,再由管理员决定是否启用 Cron;#195 可保持每小时第 15 分钟形成后续映射阶段。
Author
Owner

线上迁移与发布完成(待验收)

已按用户 2026-09-02 明确授权执行在线追加迁移并发布;定时任务保持关闭。

版本与构建

  • 提交:aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc
  • 发布目录:/home/goauto/releases/20260902-aa2ecc6-r1
  • 当前链接:/home/goauto/current -> /home/goauto/releases/20260902-aa2ecc6-r1
  • Linux amd64 服务端构建通过;管理端 pnpm run build:prod 通过。构建存在既有 CSS 伪类及大 chunk 警告,但没有构建错误。
  • 服务端二进制 SHA-256:aec6c3190ab36fb667b45d6c14f88e68da51dd0eb99234a87bd3e1ae5c1c51bc
  • 发布包 SHA-256:1ab9d485ba69f79a6308cafacada1c41d744f67b73aecffe1a0564eeeccab0b4

数据库备份与迁移

  • 迁移前确认:版本、两张目标表、五个目标字段及目标系统任务均不存在。
  • 备份:/home/goauto/backups/pre-198-20260902-aa2ecc6.sql(22,096,187 bytes,SHA-256 48b858b83ebe29127783eb3927ddd04b370f596ac4a2c90ee05c19d574f53ac1)。
  • 在线迁移:1788354164329_syb_spec_ai_parse.go,结果为新执行 1 个、跳过已应用 35 个。
  • 迁移后确认:sys_migration 恰有 1 条 1788354164329;syb_spec_ai_parse_run、syb_spec_ai_parse_work_item 均存在;syb_product 的 5 个 AI 字段均存在。
  • 系统任务:job_id=5,GoAutoSYBSpecAIParse,Cron 0 5 * * * *,参数 {"batchLimit":20},status=1(关闭)。服务重启后再次回读仍为关闭。

发布与在线验证

  • 原版本:20260902-f27ec16-r1;采用新 release 目录和原子 symlink 切换,保留旧版本用于回退。
  • GoAuto 于 22:17:32 CST 重启,Nginx 配置检查通过并于 22:17:34 CST 重启;两者均为 active。
  • 运行进程实际指向新目录下的 goauto-server;重启后近 10 分钟日志未发现 panic/fatal/failed/error。
  • 外部入口 http://185.216.248.75:9527/:首页 200、index.html 200 且内容一致、主 JS 200、/api/v1/health 200;未登录 SYB 商品接口返回 HTTP 200 + 业务码 401,认证边界正常。
  • 首轮发布脚本因健康接口响应体为空而在读取临时文件时给出退出码 1;独立复核确认健康状态、版本切换和两项服务重启均已成功,该退出码不是线上服务故障。

未执行项与安全边界

  • 按授权未启用 Cron,也未手工触发真实 AI 批处理;因此真实 Provider 调用、少量异常 SYB 数据解析结果及后续 #195 串联仍待人工验收阶段验证。
  • 本次未创建采集任务、采购任务或订单,未执行 Android 动作和付款。

Gitea MCP 在当前会话不可用,按仓库规则回退 Gitea API;首次 API 读取曾超时,连接恢复后已重新读取工单并完成本次回写。

## 线上迁移与发布完成(待验收) 已按用户 2026-09-02 明确授权执行在线追加迁移并发布;定时任务保持关闭。 ### 版本与构建 - 提交:`aa2ecc6ef791d1ebbd9c4f0ee64c84816de046cc` - 发布目录:`/home/goauto/releases/20260902-aa2ecc6-r1` - 当前链接:`/home/goauto/current -> /home/goauto/releases/20260902-aa2ecc6-r1` - Linux amd64 服务端构建通过;管理端 `pnpm run build:prod` 通过。构建存在既有 CSS 伪类及大 chunk 警告,但没有构建错误。 - 服务端二进制 SHA-256:`aec6c3190ab36fb667b45d6c14f88e68da51dd0eb99234a87bd3e1ae5c1c51bc` - 发布包 SHA-256:`1ab9d485ba69f79a6308cafacada1c41d744f67b73aecffe1a0564eeeccab0b4` ### 数据库备份与迁移 - 迁移前确认:版本、两张目标表、五个目标字段及目标系统任务均不存在。 - 备份:`/home/goauto/backups/pre-198-20260902-aa2ecc6.sql`(22,096,187 bytes,SHA-256 `48b858b83ebe29127783eb3927ddd04b370f596ac4a2c90ee05c19d574f53ac1`)。 - 在线迁移:`1788354164329_syb_spec_ai_parse.go`,结果为新执行 1 个、跳过已应用 35 个。 - 迁移后确认:`sys_migration` 恰有 1 条 `1788354164329`;`syb_spec_ai_parse_run`、`syb_spec_ai_parse_work_item` 均存在;`syb_product` 的 5 个 AI 字段均存在。 - 系统任务:`job_id=5`,`GoAutoSYBSpecAIParse`,Cron `0 5 * * * *`,参数 `{"batchLimit":20}`,`status=1`(关闭)。服务重启后再次回读仍为关闭。 ### 发布与在线验证 - 原版本:`20260902-f27ec16-r1`;采用新 release 目录和原子 symlink 切换,保留旧版本用于回退。 - GoAuto 于 22:17:32 CST 重启,Nginx 配置检查通过并于 22:17:34 CST 重启;两者均为 `active`。 - 运行进程实际指向新目录下的 `goauto-server`;重启后近 10 分钟日志未发现 panic/fatal/failed/error。 - 外部入口 `http://185.216.248.75:9527/`:首页 200、`index.html` 200 且内容一致、主 JS 200、`/api/v1/health` 200;未登录 SYB 商品接口返回 HTTP 200 + 业务码 401,认证边界正常。 - 首轮发布脚本因健康接口响应体为空而在读取临时文件时给出退出码 1;独立复核确认健康状态、版本切换和两项服务重启均已成功,该退出码不是线上服务故障。 ### 未执行项与安全边界 - 按授权未启用 Cron,也未手工触发真实 AI 批处理;因此真实 Provider 调用、少量异常 SYB 数据解析结果及后续 #195 串联仍待人工验收阶段验证。 - 本次未创建采集任务、采购任务或订单,未执行 Android 动作和付款。 Gitea MCP 在当前会话不可用,按仓库规则回退 Gitea API;首次 API 读取曾超时,连接恢复后已重新读取工单并完成本次回写。
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#198