peixue-dev/Archive/[一次性]收益统计修复完成-2026-01-31.md

4.3 KiB
Raw Blame History

收益统计修复完成 - 2026-01-31

修复内容

问题

总收益222元比本月收益1774元不符合逻辑。

原因

  1. 本月/季度/年度收益统计时没有筛选订单状态,包含了所有状态的订单
  2. 月份判断只比较月份不比较年份,会把去年同月的订单也算进来

修复方案

统一原则:所有收益统计都只计算 status=4已完成的订单

修改的文件

1. ProviderController.java

修改1今日收益统计

// 添加状态筛选
todayWrapper.eq(com.peidu.entity.Order::getTeacherId, providerId)
           .eq(com.peidu.entity.Order::getStatus, 4)  // 只统计已完成订单
           .between(com.peidu.entity.Order::getCreateTime, todayStart, todayEnd);

修改2本月/季度/年度收益统计

// 添加状态筛选
w.eq(com.peidu.entity.Order::getTeacherId, providerId)
 .eq(com.peidu.entity.Order::getStatus, 4)  // 只统计已完成订单
 .between(com.peidu.entity.Order::getCreateTime, start, end);

修改3添加日志

log.info("查询{}统计: 时间范围={} 到 {}, 订单数量={}", type, start, end, periodOrders.size());
log.info("返回{}统计: courseCount={}, earnings={}, duration={}h", 
        type, courseCount, earnings, durationMinutes / 60);

2. ProviderServiceImpl.java

修改1修复月份判断

// 修改前:只比较月份
.filter(order -> order.getCreateTime().getMonth() == LocalDateTime.now().getMonth())

// 修改后:同时比较年份和月份
.filter(order -> {
    LocalDateTime createTime = order.getCreateTime();
    return createTime != null 
        && createTime.getYear() == now.getYear() 
        && createTime.getMonth() == now.getMonth();
})

修改2添加日志

log.info("开始统计收益: providerId={}", providerId);
log.info("查询到已完成订单数量: {}", orders.size());
log.info("总收益: {}", totalEarnings);
log.info("本月收益: {}", monthEarnings);

修复后的逻辑

收益统计规则

  1. 总收益 = 所有时间已完成订单的总金额
  2. 本月收益 = 本月已完成订单的总金额
  3. 本季度收益 = 本季度已完成订单的总金额
  4. 本年收益 = 本年已完成订单的总金额
  5. 今日收益 = 今日已完成订单的总金额

数据关系

总收益 >= 本年收益 >= 本季度收益 >= 本月收益 >= 今日收益

验证方法

1. 查看后端日志

重启后端服务后,访问收益页面,查看日志输出:

开始统计收益: providerId=xxx
查询到已完成订单数量: xxx
总收益: xxx
本月收益: xxx
查询month统计: 时间范围=xxx 到 xxx, 订单数量=xxx
返回month统计: courseCount=xxx, earnings=xxx, duration=xxxh

2. 检查数据库

-- 查看服务商的所有已完成订单
SELECT 
    id,
    teacher_id,
    status,
    pay_amount,
    create_time,
    YEAR(create_time) as year,
    MONTH(create_time) as month
FROM `order`
WHERE teacher_id = ? AND status = 4
ORDER BY create_time DESC;

-- 统计总收益
SELECT SUM(pay_amount) as total_earnings
FROM `order`
WHERE teacher_id = ? AND status = 4;

-- 统计本月收益
SELECT SUM(pay_amount) as month_earnings
FROM `order`
WHERE teacher_id = ? 
  AND status = 4
  AND YEAR(create_time) = YEAR(NOW())
  AND MONTH(create_time) = MONTH(NOW());

3. 前端验证

  1. 打开收益查看页面
  2. 检查总收益 >= 本月收益
  3. 切换到"本季度"、"本年"标签,验证数据合理性

注意事项

  1. 订单状态定义

    • status = 4 表示已完成
    • 其他状态(待支付、待服务、服务中等)不计入收益
  2. 时间范围

    • 使用订单的 create_time 字段判断时间范围
    • 本月当前月份的第1天00:00:00 到当前时间
    • 本季度当前季度第一个月的第1天00:00:00 到当前时间
    • 本年当前年份的1月1日00:00:00 到当前时间
  3. 数据一致性

    • 确保所有收益统计使用相同的筛选条件
    • 总收益应该始终 >= 任何时间段的收益

相关文件

  • peidu/backend/src/main/java/com/peidu/controller/ProviderController.java
  • peidu/backend/src/main/java/com/peidu/service/impl/ProviderServiceImpl.java

修复时间2026-01-31