Files
ycc-proxy-server/报告查询链路和代理分配逻辑检查报告.md
2025-12-02 19:57:10 +08:00

6.9 KiB
Raw Blame History

报告查询链路和代理分配逻辑检查报告

一、报告查询链路检查

1.1 整体流程

用户支付订单
  ↓
支付回调(支付宝/微信)
  ↓
更新订单状态为 "paid"
  ↓
发送异步任务 SendQueryTask(order.Id)
  ↓
异步任务处理 PaySuccessNotifyUserHandler.ProcessTask
  ├─ 创建报告记录query表
  ├─ 生成授权书
  ├─ 调用API请求服务获取报告数据
  ├─ 更新报告状态为 "success"
  ├─ 调用代理处理 AgentService.AgentProcess
  └─ 删除Redis缓存

1.2 链路检查结果

链路基本通顺,但存在以下问题:

问题1代理处理失败时的处理逻辑 - 已修复

原问题

  • 代理处理在报告生成成功后同步执行
  • 如果代理处理失败,会触发 handleError,但报告已经生成成功

修复方案

  1. 创建了独立的代理处理异步任务 Handlerapp/main/api/internal/queue/agentProcess.go
  2. 修改 paySuccessNotify.go 改为发送异步任务,不再阻塞报告流程
  3. 代理处理失败时只记录日志,不影响报告使用
  4. 保留了手动重试接口供管理员使用

修复后的代码

// 报告生成成功后,发送代理处理异步任务(不阻塞报告流程)
if asyncErr := l.svcCtx.AsynqService.SendAgentProcessTask(order.Id); asyncErr != nil {
    // 代理处理任务发送失败,只记录日志,不影响报告流程
    logx.Errorf("发送代理处理任务失败订单ID: %d, 错误: %v", order.Id, asyncErr)
}

1.3 支付回调链路

支付回调链路正常

  • 支付宝回调:AlipayCallbackLogic.handleQueryOrderPayment
  • 微信回调:WechatPayCallbackLogic.handleQueryOrderPayment
  • 支付成功后正确发送异步任务

二、代理分配逻辑检查

2.1 代理收益计算

代理收益计算逻辑正确

计算公式

实际底价 = 基础底价 + 等级加成
提价成本 = (设定价格 - 提价阈值) × 提价手续费比例当设定价格 > 提价阈值时
代理收益 = 设定价格 - 实际底价 - 提价成本

位置app/main/api/internal/service/agentService.go:131-132

验证

  • 使用产品配置的底价(从 agent_product_config 表读取)
  • 等级加成从配置表读取(支持动态配置)
  • 提价成本计算逻辑正确

2.2 等级加成返佣分配

2.2.1 黄金代理等级加成3元

实现正确

  • 全部给钻石上级
  • 找不到钻石上级时,返佣归平台

位置app/main/api/internal/service/agentService.go:233-244

2.2.2 普通代理等级加成6元

已按照新规则修复

新规则(已确认并实现):

  1. 直接上级是钻石:等级加成全部给钻石上级
  2. 直接上级是黄金:一部分给黄金上级(配置:normal_to_gold_rebate默认3元剩余给钻石上级
  3. 直接上级是普通
    • 一部分给直接上级普通(配置:normal_to_normal_rebate默认2元
    • 剩余金额:
      • 有钻石上级:剩余全部给钻石上级
      • 只有黄金上级:最多给黄金上级(配置:normal_to_gold_rebate_max默认3元超出归平台
      • 都没有:全部归平台

代码实现app/main/api/internal/service/agentService.go:254-368

  • 按照新规则完全重写
  • 支持从配置表读取返佣金额(如果配置不存在使用默认值)
  • 跳过多层普通代理,直接查找钻石/黄金上级

配置项

  • normal_to_normal_rebate普通代理给直接上级普通的金额默认2元
  • normal_to_gold_rebate普通代理给直接上级黄金的金额默认3元
  • normal_to_gold_rebate_max普通代理给黄金上级的最大金额默认3元

2.3 代理收益分配流程

分配流程正确

流程

  1. 检查是否是代理订单
  2. 检查订单是否已处理(防重复)
  3. 获取代理信息和产品配置
  4. 使用事务处理(保证原子性):
    • 计算代理收益
    • 更新代理订单状态
    • 发放代理佣金到代理钱包
    • 分配等级加成返佣给上级链

位置app/main/api/internal/service/agentService.go:76-156

2.4 事务处理和错误处理

事务处理正确

验证

  • 使用 AgentWalletModel.Trans 事务处理
  • 所有数据库操作在同一事务中
  • 任何步骤失败都会回滚

位置app/main/api/internal/service/agentService.go:109

2.5 防重复处理

防重复处理正确

验证

  • 检查 agent_order.ProcessStatus == 1 判断是否已处理
  • 已处理的订单直接返回,不重复处理

位置app/main/api/internal/service/agentService.go:87-91


三、其他发现

3.1 重试机制

已有手动重试接口

位置

  • 接口:POST /api/v1/admin/order/retry-agent-process/:id
  • Logicapp/main/api/internal/logic/admin_order/adminretryagentprocesslogic.go

功能

  • 管理员可以手动触发代理处理重试
  • 可以处理代理处理失败的情况

3.2 代理处理失败时的错误处理

当前行为

  • 代理处理失败会触发 handleError
  • handleError 会尝试退款(如果报告状态为 pending
  • 但报告已经生成成功,可能不会触发退款

建议

  • 代理处理失败不应该触发退款(因为报告已经成功生成)
  • 应该记录错误日志,供管理员手动重试

四、总结和建议

4.1 需要确认的问题

  1. 普通代理等级加成返佣分配规则
    • 文档和代码实现不一致
    • 需要确认正确的业务规则

4.2 建议改进

  1. 代理处理失败的处理

    • 建议将代理处理改为独立的异步任务,或至少确保失败不影响报告使用
    • 失败时只记录日志,不触发退款
  2. 文档更新

    • 根据最终确认的业务规则,更新文档或代码
  3. 日志增强

    • 在代理处理失败时记录更详细的日志,方便排查问题

4.3 整体评价

  • 报告查询链路基本通顺
  • 代理收益计算逻辑正确
  • 事务处理和防重复处理正确
  • ⚠️ 普通代理等级加成返佣分配规则需要确认
  • ⚠️ 代理处理失败时的处理逻辑可以优化

五、代码位置索引

报告查询链路

  • 支付回调:app/main/api/internal/logic/pay/alipaycallbacklogic.go:56-106
  • 异步任务:app/main/api/internal/queue/paySuccessNotify.go:35-178
  • 报告查询:app/main/api/internal/logic/query/querylistlogic.go

代理分配逻辑

  • 代理处理入口:app/main/api/internal/service/agentService.go:76-156
  • 收益计算:app/main/api/internal/service/agentService.go:131-132
  • 等级加成返佣:app/main/api/internal/service/agentService.go:226-328
  • 普通代理返佣分配:app/main/api/internal/service/agentService.go:254-328