最终实施版(2026-08-29)。 本版在全栈复核后固定实施边界:不新增迁移;并发相同 requestId 只保证单任务,不虚假承诺跨实例 provider 单次调用;批量创建仅在最终 Create 阶段执行匹配;输入指纹使用规范化结构。历史评论仅作决策记录,冲突时以本正文为准。
260828G6YQNX6M
timeout of 10000ms exceeded
purchase.Service.Create
matcher.Resolve
BatchPreview
allowAI=false
BatchCreate
previewOne
Create
create_request_id
creationPlan
Resolve
CodeMappingRequired
go test ./app/goauto/purchase/... ./app/goauto/aimatching/...
待实施。
“先止血,再由 #148 异步治本”的拆分方向合理;外部 AI HTTP 位于数据库事务内也是必须处理的真实缺陷。但当前方案中的前端超时和批量路径事实不完整,不能按现文直接实施。
当前 AI 超时不是固定最多 15 秒:
因此把相关前端接口设为 30 秒,仍然无法满足正文“前端超时必须大于服务端最长耗时”的硬性要求。
请在正文中删除“建议 30 秒”,并明确选择以下一种可执行策略:
批量创建的最坏耗时还与商品数相关,不能用一个固定的 30 秒解决。
当前代码事实:
previewFromDataset(..., allowAI=false)
previewOne()
Create()
请补充:
如果先在事务外调用 AI、之后才在事务内检查 create_request_id,幂等重放仍会产生无意义的外部请求;并发的相同 requestId 也可能重复调用 provider。
请明确执行顺序:
验收需增加:
除代码检查外,建议使用阻塞的假 matcher 证明:
正文中“浏览器超时后服务端可能成功”属于合理风险,但实施证据需结合当前反向代理和请求上下文取消行为验证,不能只作为推断。
#147 应保留的永久价值是:
单纯把前端等待时间调大属于临时缓解;#148 完成后创建接口应立即返回,不再依赖长客户端超时。请据此收紧 #147,避免实现一套很快被 #148 删除的大范围同步等待逻辑。
本单不涉及数据库迁移,且不改变页面结构,可继续免原型;但上述正文事实和验收项修订完成前,不建议进入实施。
提交:c9e9539 fix(#147): move purchase matching outside transaction,已推送 main。
c9e9539 fix(#147): move purchase matching outside transaction
main
go test -count=1 ./app/goauto/purchase/... ./app/goauto/aimatching/...
PURCHASE_SPEC_MAPPING_REQUIRED
npm run build:prod
:export
:deep
git diff --check
无长期文档影响:接口、数据库、状态机和配置项未变,按工单跳过 Wiki。
用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。
No dependencies set.
The note is not visible to the blocked user.
来源与范围
260828G6YQNX6M的采购任务时报timeout of 10000ms exceeded。已复核事实
purchase.Service.Create当前在数据库事务内调用matcher.Resolve,并在此前锁定 SYB 行。BatchPreview使用allowAI=false;BatchCreate当前先previewOne(允许 AI)再Create,同一条目可能调用 provider 两次。create_request_id有唯一索引,但当前幂等检查在事务内。目标
明确非目标与并发边界
固定实施方案
创建流程
create_request_id;存在则直接返回 replay,禁止调用 matcher。creationPlan:任务类型、SYB/Shopee/PDD 关联、目标规格、候选规格、确认映射、本地匹配或 provider 结果,以及规范化输入指纹。Resolve保留“本地确定性优先、必要时 provider 一次”的既有逻辑。CodeMappingRequired,不写旧匹配结果、不自动重试 provider。指纹契约
批量路径
BatchCreate的 preview 阶段只做确定性校验和价格准备,不允许 provider;最终统一由Create执行至多一次匹配。BatchPreview保持不调用 provider。前端临时缓解
BatchPreview、备货创建不加长。验收
CodeMappingRequired,不写旧结果。验证
go test ./app/goauto/purchase/... ./app/goauto/aimatching/...文档与风险
状态
待实施。
全栈审核意见:方向成立,但正文需修订后再实施
结论
“先止血,再由 #148 异步治本”的拆分方向合理;外部 AI HTTP 位于数据库事务内也是必须处理的真实缺陷。但当前方案中的前端超时和批量路径事实不完整,不能按现文直接实施。
一、30 秒建议仍会超时倒挂
当前 AI 超时不是固定最多 15 秒:
因此把相关前端接口设为 30 秒,仍然无法满足正文“前端超时必须大于服务端最长耗时”的硬性要求。
请在正文中删除“建议 30 秒”,并明确选择以下一种可执行策略:
批量创建的最坏耗时还与商品数相关,不能用一个固定的 30 秒解决。
二、批量路径需要按真实调用链修正
当前代码事实:
BatchPreview使用previewFromDataset(..., allowAI=false),批量预检本身不调用外部 AI,因此不应无差别加长超时。BatchCreate对每个商品先调用previewOne();该路径允许 AI。随后又调用Create(),后者可能再次调用 AI。请补充:
三、两阶段匹配必须先处理幂等
如果先在事务外调用 AI、之后才在事务内检查
create_request_id,幂等重放仍会产生无意义的外部请求;并发的相同 requestId 也可能重复调用 provider。请明确执行顺序:
create_request_id,已存在时立即返回,禁止调用 AI;create_request_id;CodeMappingRequired,不写入过期结果。验收需增加:
四、事务边界测试应覆盖真实锁行为
除代码检查外,建议使用阻塞的假 matcher 证明:
正文中“浏览器超时后服务端可能成功”属于合理风险,但实施证据需结合当前反向代理和请求上下文取消行为验证,不能只作为推断。
五、与 #148 的交付边界
#147 应保留的永久价值是:
单纯把前端等待时间调大属于临时缓解;#148 完成后创建接口应立即返回,不再依赖长客户端超时。请据此收紧 #147,避免实现一套很快被 #148 删除的大范围同步等待逻辑。
门禁结论
本单不涉及数据库迁移,且不改变页面结构,可继续免原型;但上述正文事实和验收项修订完成前,不建议进入实施。
创建采购任务超时:AI 匹配移出事务并修正前后端超时倒挂to 创建采购任务:AI 调用移出事务、幂等前置与批量去重(超时仅临时缓解)实施完成,待验收
提交:
c9e9539 fix(#147): move purchase matching outside transaction,已推送main。实现
验证
go test -count=1 ./app/goauto/purchase/... ./app/goauto/aimatching/...:通过。PURCHASE_SPEC_MAPPING_REQUIRED,任务数为 0。npm run build:prod:通过;现有 LightningCSS:export/:deep和 chunk size 警告未扩大。git diff --check:通过。文档
无长期文档影响:接口、数据库、状态机和配置项未变,按工单跳过 Wiki。
用户于 2026-08-29 明确确认本工单通过验收。验收结论已记录,现关闭工单。没有新的长期事实变化,本次不重复同步 Wiki。