Files
kami_backend/docs/ORDER_REFACTOR_SUMMARY.md
danial e6ccd423b7 refactor(otel): 简化OTel配置与错误处理
- 移除不必要的配置字段和复杂错误类型
- 简化trace和log初始化逻辑,保留核心功能
- 使用标准Go错误替代自定义错误结构
- 启用默认批处理和消息丢弃机制- 保留gzip压缩和自动重连功能- 更新相关文档路径引用
- 添加OTel简化增强实现说明文档
2025-11-09 01:09:50 +08:00

5.0 KiB
Raw Permalink Blame History

京东订单创建逻辑重构总结

📋 任务清单

  • 添加 Cookie 失败重试机制
  • 优化京东订单复用逻辑(刷新失败自动创建新订单)
  • 拆分 order.go 文件,优化代码结构
  • 完善历史记录(刷新失败、订单失效等)
  • 修复 ShouldExtractCard 逻辑问题
  • 所有测试通过

📁 文件变更

新建文件

  1. order_create.go (214 行)

    • 订单创建主逻辑
    • Cookie 失败重试机制(最多 10 次)
    • 自动切换可用 Cookie
  2. order_query.go (170 行)

    • 订单查询相关接口
    • GetOrder、ListOrder、GetOrderStatus、GetPaymentUrl
  3. order_jd.go (537 行)

    • 京东订单管理
    • 批量检查支付状态
    • 卡密提取
    • 订单过期清理
  4. order_utils.go (332 行)

    • 通用辅助方法
    • 数据库查询/更新
    • 京东接口调用
    • Cookie 失败处理
  5. JD_ORDER_CREATE_REFACTOR_REPORT.md (342 行)

    • 详细的重构报告文档

修改文件

  1. internal/consts/jd_cookie.go
    • 添加 CookieChangeTypeRefreshFail 常量(注释标记为新增)
    • 添加 CookieChangeTypeReplaced 常量(注释标记为新增)
    • 添加 JdOrderChangeTypeInvalid 常量(注释标记为新增)

删除文件

  1. order.go (原 700+ 行文件已拆分)

🔑 核心改进

// 最多尝试 10 次,自动切换不同的 Cookie
func (s *sJdCookie) createNewJdOrderWithRetry(...) {
    const maxRetryCount = 10
    var triedCookies []string
    
    for retryCount := 0; retryCount < maxRetryCount; retryCount++ {
        // 获取可用 Cookie
        // 检查是否已尝试过
        // 调用京东下单
        // 失败则切换下一个 Cookie
    }
}

优势

  • 🔄 自动重试,提升订单创建成功率
  • 🔀 智能切换 Cookie避免单点失败
  • 📝 记录所有尝试过的 Cookie避免重复
  • 📊 详细日志,便于问题排查

2. 订单复用优化

// 刷新支付链接失败后,自动创建新订单
if refreshErr != nil {
    // 标记为失效
    _ = s.UpdateJdOrderStatus(ctx, jdOrderId, int(consts.JdOrderStatusExpired), "刷新支付链接失败")
    
    // 记录历史
    _ = s.RecordJdOrderHistory(ctx, jdOrderId, string(consts.JdOrderChangeTypeInvalid), "", wxPayUrl)
    _ = s.RecordCookieHistory(ctx, cookieId, string(consts.CookieChangeTypeRefreshFail), 0, 0, orderId, 0)
    
    // 清空,触发创建新订单
    jdOrderId = ""
    cookieId = ""
    wxPayUrl = ""
}

// 如果没有成功复用,创建新订单(带重试)
if jdOrderId == "" {
    jdOrderId, cookieId, wxPayUrl, err = s.createNewJdOrderWithRetry(ctx, orderId, amount, category)
}

优势

  • 🎯 降级处理,保证订单创建成功
  • 📝 完整的历史记录
  • 🔍 便于追踪问题

3. 代码结构优化

文件 职责 行数
order_create.go 订单创建与重试 214
order_query.go 订单查询 170
order_jd.go 京东订单管理 537
order_utils.go 通用工具方法 332

优势

  • 📦 职责清晰,易于维护
  • 🔍 快速定位代码位置
  • 🧪 便于单元测试

🧪 测试结果

=== RUN   TestShouldExtractCard
--- PASS: TestShouldExtractCard (0.00s)
=== RUN   TestBatchCheckPaymentStatusConfig
--- PASS: TestBatchCheckPaymentStatusConfig (0.00s)
=== RUN   TestCacheKeyGeneration
--- PASS: TestCacheKeyGeneration (0.00s)
PASS
ok      kami/internal/logic/jd_cookie     0.825s

所有测试通过!

🐛 Bug 修复

修复了 ShouldExtractCard 方法的逻辑问题:

修复前

// 只允许待支付状态提取卡密
if jdOrder.Status != int(consts.JdOrderStatusPending) {
    return false
}

修复后

// 允许待支付或已支付状态提取卡密
if jdOrder.Status != int(consts.JdOrderStatusPending) && 
   jdOrder.Status != int(consts.JdOrderStatusPaid) {
    return false
}

📊 性能影响

  • 减少不必要的数据库查询
  • 历史记录异步写入(不阻塞主流程)
  • 充分利用 Redis 缓存
  • ⚠️ 重试机制可能增加响应时间(但提升成功率)

🚀 部署建议

  1. 灰度发布

    • 先在测试环境验证
    • 小流量验证后再全量发布
  2. 监控指标

    • 订单创建成功率
    • Cookie 使用分布
    • 重试次数统计
    • 平均响应时间
  3. 回滚方案

    • 代码已删除旧的 order.go
    • 可从 Git 历史恢复

📝 后续优化建议

  1. 动态重试次数:根据可用 Cookie 数量动态调整
  2. 智能 Cookie 选择:根据历史成功率优先选择
  3. 异步处理:订单创建改为异步,提升响应速度
  4. 熔断机制:连续失败自动熔断

📚 相关文档


重构完成时间2025-10-11
重构人员Qoder AI
测试状态 通过