49c0e5559c
Co-Authored-By: Claude Code <noreply@anthropic.com>
2.0 KiB
2.0 KiB
询盘推送 UniService · 改动记录(2026-09-28)
设计: docs/superpowers/specs/2026-09-28-lead-push-to-uniservice-design.md 契约: docs/AI_INQUIRY_PUSH_API.md(UniService v1) 实施计划: docs/superpowers/plans/2026-09-28-lead-push-to-uniservice.md
改动面
- 新表
lead_push_logs(app/models/database.py): 推送审计,状态 pending/success/failed/skipped,outcome 记 accepted/duplicated - 新服务 app/services/lead_push_service.py: dispatch(SAVEPOINT 隔离, 吞异常,与 SMTP 成败解耦)→ fire(commit 后 create_task,任务不读库 只写结果)→ _run_push(httpx + 分类重试: 5xx/传输退避 3 次、401/400 快败、200 逐条解析含 duplicated、非 JSON 200 诚实落 failed)
- 接线 app/services/conversation.py:
_maybe_send_lead_email三发信 分支各调一次 dispatch(lead/returning/correction 跟随邮件类型); 主事务 commit 后 fire;fire-after-commit 顺序有变异检测级测试钉住 - 启动清扫: main.py lifespan → sweep_stale_pending(30 分钟 stale → failed "interrupted by restart");engine connect_args timeout=30 (后台写结果撞 SMTP 窗口锁时忙等上限抬高,等待在工作线程不阻塞事件循环)
- 配置: PUSH_ENABLED(默认 false)/PUSH_API_URL/PUSH_API_KEY/ PUSH_EXTERNAL_KEY_PREFIX/PUSH_TIMEOUT_SECONDS/PUSH_MAX_ATTEMPTS/ PUSH_RETRY_BACKOFF_BASE(.env.example 同步)
暂缓项
- admin 查询接口 GET /api/admin/push-logs(设计 §9): 用户定夺先完成 推送链路,后续补;期间查结果直接开 data/cc_ai_kefu.db 的 lead_push_logs 表
上线/联调步骤
.env填PUSH_API_KEY=<UniService 开通分配>,PUSH_ENABLED=true,重启服务生效- 产生 1-2 条真实询盘(客户留手机号/邮箱)→ 查 lead_push_logs 表:
select status,outcome,response_status,error_message,created_at from lead_push_logs order by created_at desc limit 5; - 与 UniService 核对 accepted/duplicated/failed 与归档内容 (首验: 手机号国际区号格式——对方要求带区号,不符整条被拒)
- 核对无误转正式运行