252235-重写Transfer手续费统计逻辑.md 3.8 KB

重写Transfer手续费统计逻辑

任务时间: 2025-06-25 22:35
任务类型: 功能重构
状态: ✅ 已完成

任务概述

重写Transfer模块的手续费统计逻辑,将原来基于last_processed_order_id的增量统计改为基于时间范围的全量统计,解决重新统计时统计范围不一致的问题。

问题分析

原有问题

  1. 重新统计范围错误:重新统计指定日期时,会删除该日期的统计记录,但getLastProcessedOrderId()方法返回的是其他日期的最后处理订单ID,导致查询范围错误
  2. 逻辑复杂:基于订单ID的增量统计逻辑复杂,容易出现边界问题
  3. 数据一致性风险:依赖订单ID的连续性,如果订单ID不连续可能导致遗漏

解决方案

改为按当天时间范围(00:00:00 - 23:59:59)统计所有已完成订单,简化逻辑并确保数据准确性。

完成的修改

1. 数据库结构修改

  • 移除字段:删除transfer_fee_daily_stats表的last_processed_order_id字段
  • 删除索引:移除相关索引idx_last_processed_order_id
  • 更新视图:重新创建v_transfer_fee_app_summary视图,移除对该字段的引用

2. 模型层修改

  • TransferFeeDailyStats模型
    • 移除last_processed_order_id字段定义
    • 删除getLastProcessedOrderId()方法
    • 更新getAppSummary()方法,移除对该字段的查询

3. 逻辑层重写

  • FeeStatisticsLogic类
    • 重写processAppStatistics()方法,改为时间范围查询
    • 更新validateStatistics()方法,使用相同的时间范围逻辑
    • 查询条件:whereBetween('completed_at', [$startTime, $endTime])

4. 命令类更新

  • FeeStatisticsCommand类
    • 更新显示结果的表格,移除"最后处理订单ID"列
    • 保持其他功能不变(重新统计、验证等)

5. 文档更新

  • 更新相关文档,反映新的统计逻辑
  • 修改设计说明,从"增量统计"改为"时间范围统计"

核心代码变更

统计逻辑核心变更

// 原逻辑:基于订单ID增量统计
$lastProcessedOrderId = TransferFeeDailyStats::getLastProcessedOrderId($app->id);
$orders = TransferOrder::where('transfer_app_id', $app->id)
    ->where('status', TransferStatus::COMPLETED)
    ->where('id', '>', $lastProcessedOrderId)
    ->whereDate('completed_at', $date)
    ->get();

// 新逻辑:基于时间范围全量统计
$startTime = $date . ' 00:00:00';
$endTime = $date . ' 23:59:59';
$orders = TransferOrder::where('transfer_app_id', $app->id)
    ->where('status', TransferStatus::COMPLETED)
    ->whereBetween('completed_at', [$startTime, $endTime])
    ->get();

测试验证

1. 正常统计测试

php artisan transfer:fee-statistics --date=2025-06-25

✅ 成功统计,显示结果正确

2. 重新统计测试

php artisan transfer:fee-statistics --date=2025-06-25 --rerun

✅ 重新统计功能正常,统计范围准确

3. 数据验证测试

php artisan transfer:fee-statistics --date=2025-06-25 --validate

✅ 验证功能正常,数据一致性检查通过

优势对比

新方案优势

  1. 逻辑简单:直接按时间范围查询,逻辑清晰
  2. 数据准确:不依赖订单ID连续性,确保统计完整
  3. 重新统计可靠:每次都是全量统计,结果一致
  4. 易于理解:时间范围统计更符合业务直觉

性能考虑

  • 查询性能:completed_at字段有索引,查询效率良好
  • 数据量:按日统计,单日数据量可控
  • 重复统计:支持重新统计,但建议仅在必要时使用

总结

本次重构成功解决了原有统计逻辑的问题,提高了系统的可靠性和可维护性。新的时间范围统计方式更加直观和准确,为后续的功能扩展奠定了良好基础。