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

150 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 收益统计修复完成 - 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*