# 收益统计修复完成 - 2026-01-31 ## 修复内容 ### 问题 总收益(222元)比本月收益(1774元)低,不符合逻辑。 ### 原因 1. 本月/季度/年度收益统计时没有筛选订单状态,包含了所有状态的订单 2. 月份判断只比较月份不比较年份,会把去年同月的订单也算进来 ### 修复方案 **统一原则:所有收益统计都只计算 status=4(已完成)的订单** ## 修改的文件 ### 1. ProviderController.java #### 修改1:今日收益统计 ```java // 添加状态筛选 todayWrapper.eq(com.peidu.entity.Order::getTeacherId, providerId) .eq(com.peidu.entity.Order::getStatus, 4) // 只统计已完成订单 .between(com.peidu.entity.Order::getCreateTime, todayStart, todayEnd); ``` #### 修改2:本月/季度/年度收益统计 ```java // 添加状态筛选 w.eq(com.peidu.entity.Order::getTeacherId, providerId) .eq(com.peidu.entity.Order::getStatus, 4) // 只统计已完成订单 .between(com.peidu.entity.Order::getCreateTime, start, end); ``` #### 修改3:添加日志 ```java log.info("查询{}统计: 时间范围={} 到 {}, 订单数量={}", type, start, end, periodOrders.size()); log.info("返回{}统计: courseCount={}, earnings={}, duration={}h", type, courseCount, earnings, durationMinutes / 60); ``` ### 2. ProviderServiceImpl.java #### 修改1:修复月份判断 ```java // 修改前:只比较月份 .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:添加日志 ```java 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. 检查数据库 ```sql -- 查看服务商的所有已完成订单 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*