# 平台数据详情页数据展示逻辑

## 概述

平台数据详情页（`/analytics/platform-detail/:platform`）用于展示指定平台在指定时间范围内的详细统计数据，包括汇总统计、每日汇总数据和账号详细数据。

## 数据流程

### 1. 前端数据请求

**文件位置**: `client/src/views/Analytics/PlatformDetail/index.vue`

**请求接口**: `GET /api/work-day-statistics/platform-detail`

**请求参数**:
- `platform`: 平台类型（必填，如：douyin、xiaohongshu、baijiahao、weixin_video）
- `startDate`: 开始日期（必填，格式：YYYY-MM-DD）
- `endDate`: 结束日期（必填，格式：YYYY-MM-DD）

**请求示例**:
```typescript
const data = await request.get('/api/work-day-statistics/platform-detail', {
  params: {
    platform: 'douyin',
    startDate: '2026-01-27',
    endDate: '2026-01-27',
  },
});
```

### 2. 后端数据处理

**文件位置**: 
- 路由: `server/src/routes/workDayStatistics.ts`
- 服务: `server/src/services/WorkDayStatisticsService.ts`

**处理流程**:

1. **获取平台账号列表**
   - 根据 `userId` 和 `platform` 查询该平台下的所有账号
   - 如果没有账号，返回空数据

2. **计算每日汇总数据**
   - 遍历日期范围内的每一天
   - 对每个账号：
     - 获取该账号的所有作品ID
     - 计算该日期的增量数据：
       - **播放量增量** = 当日累计播放量 - 前一日累计播放量
       - **评论量增量** = 当日累计评论量 - 前一日累计评论量
       - **点赞量增量** = 当日累计点赞量 - 前一日累计点赞量
       - **涨粉量** = 当日粉丝数 - 前一日粉丝数
     - 将所有账号的增量数据累加到对应日期

3. **计算账号详细数据**
   - 对每个账号：
     - 计算整个时间范围内的增量数据：
       - **播放量增量** = 结束日期累计播放量 - 开始日期累计播放量
       - **评论量增量** = 结束日期累计评论量 - 开始日期累计评论量
       - **点赞量增量** = 结束日期累计点赞量 - 开始日期累计点赞量
       - **涨粉量** = 结束日期粉丝数 - 开始日期粉丝数
     - 获取更新时间（该账号在时间范围内的最新更新时间）

4. **计算汇总统计**
   - 将所有账号的增量数据累加：
     - `totalAccounts`: 账号总数
     - `viewsCount`: 总播放量增量
     - `commentsCount`: 总评论量增量
     - `likesCount`: 总点赞量增量
     - `fansIncrease`: 总涨粉量

### 3. 后端响应格式

```typescript
{
  success: true,
  data: {
    summary: {
      totalAccounts: number;        // 账号总数
      totalIncome: number;           // 总收益（目前为 0）
      viewsCount: number;            // 总播放量增量
      commentsCount: number;         // 总评论量增量
      likesCount: number;            // 总点赞量增量
      fansIncrease: number;          // 总涨粉量
      recommendationCount: number | null; // 推荐量（部分平台支持）
    };
    dailyData: Array<{
      date: string;                  // 日期（YYYY-MM-DD）
      income: number;                // 收益（目前为 0）
      recommendationCount: number | null; // 推荐量
      viewsCount: number;            // 播放量增量
      commentsCount: number;         // 评论量增量
      likesCount: number;            // 点赞量增量
      fansIncrease: number;          // 涨粉量
    }>;
    accounts: Array<{
      id: number;                    // 账号ID
      nickname: string;               // 账号昵称
      username: string;              // 账号用户名
      avatarUrl: string | null;      // 头像URL
      platform: string;              // 平台类型
      income: number | null;         // 收益（目前为 null）
      recommendationCount: number | null; // 推荐量
      viewsCount: number | null;     // 播放量增量（可能为 null）
      commentsCount: number;         // 评论量增量
      likesCount: number;            // 点赞量增量
      fansIncrease: number;          // 涨粉量
      updateTime: string;            // 更新时间（MM-DD HH:mm）
    }>;
  }
}
```

### 4. 前端数据展示

**文件位置**: `client/src/views/Analytics/PlatformDetail/index.vue`

**数据解包**:
- `request` 拦截器会自动解包响应，将 `{ success: true, data: {...} }` 转换为 `{...}`
- 前端直接使用解包后的数据

**数据赋值**:
```typescript
// 更新汇总数据
if (data.summary) {
  summaryData.value = {
    totalAccounts: data.summary.totalAccounts ?? 0,
    viewsCount: data.summary.viewsCount ?? 0,
    commentsCount: data.summary.commentsCount ?? 0,
    likesCount: data.summary.likesCount ?? 0,
    fansIncrease: data.summary.fansIncrease ?? 0,
  };
}

// 更新每日数据
dailyData.value = Array.isArray(data.dailyData) ? data.dailyData : [];

// 更新账号列表
accountList.value = Array.isArray(data.accounts) ? data.accounts : [];
```

**展示区域**:

1. **汇总统计卡片**（第 57-93 行）
   - 账号总数
   - 播放(阅读)量
   - 评论量
   - 点赞量
   - 涨粉量

2. **每日汇总数据表格**（第 95-113 行）
   - 时间列：显示日期
   - 播放(阅读)量列：显示每日增量
   - 评论量列：显示每日增量
   - 点赞量列：显示每日增量
   - 涨粉量列：显示每日增量

3. **账号详细数据表格**（第 115-163 行）
   - 账号列：显示头像和昵称
   - 平台列：显示平台名称
   - 播放(阅读)量列：显示账号增量（如果为 null 显示"获取失败"）
   - 评论量列：显示账号增量
   - 点赞量列：显示账号增量
   - 涨粉量列：显示账号增量
   - 更新时间列：显示最后更新时间
   - 操作列：提供"详情"按钮跳转到账号详情页

## 数据计算逻辑

### 播放量/评论量/点赞量计算

**数据来源**: `work_day_statistics` 表

**计算方式**:
1. 对于每个作品，获取指定日期的最新累计数据
2. 计算增量 = 当日累计值 - 前一日累计值
3. 将所有作品的增量累加

**SQL 逻辑**:
```sql
-- 获取指定日期的最新累计数据
SELECT
  COALESCE(SUM(wds.play_count), 0) AS views,
  COALESCE(SUM(wds.like_count), 0) AS likes,
  COALESCE(SUM(wds.comment_count), 0) AS comments
FROM work_day_statistics wds
INNER JOIN (
  SELECT wds2.work_id, MAX(wds2.record_date) AS record_date
  FROM work_day_statistics wds2
  WHERE wds2.work_id IN (...)
    AND wds2.record_date <= ?
  GROUP BY wds2.work_id
) latest
ON latest.work_id = wds.work_id AND latest.record_date = wds.record_date
```

### 粉丝数计算

**数据来源**: `user_day_statistics` 表

**计算方式**:
1. 获取指定日期的粉丝数记录
2. 如果没有记录，获取 <= 指定日期的最近一条记录
3. 计算增量 = 当日粉丝数 - 前一日粉丝数

**查询逻辑**:
```typescript
// 获取当日粉丝数
const dayUserStat = await userDayStatisticsRepository
  .createQueryBuilder('uds')
  .where('uds.account_id = :accountId', { accountId })
  .andWhere('DATE(uds.record_date) = :d', { d: dateStr })
  .getOne();

// 如果没有记录，获取最近一条
const recentUserStat = await userDayStatisticsRepository
  .createQueryBuilder('uds')
  .where('uds.account_id = :accountId', { accountId })
  .andWhere('DATE(uds.record_date) <= :d', { d: dateStr })
  .orderBy('uds.record_date', 'DESC')
  .getOne();
```

## 常见问题

### 1. 为什么数据不显示？

**可能原因**:
1. **平台参数缺失**: 检查路由参数或查询参数中是否有 `platform`
2. **日期参数错误**: 检查 `startDate` 和 `endDate` 格式是否正确
3. **账号不存在**: 该平台下没有账号数据
4. **数据为空**: 该时间范围内没有统计数据

**调试方法**:
- 打开浏览器控制台，查看日志输出
- 检查网络请求，查看接口返回的数据
- 确认后端日志，查看数据查询结果

### 2. 为什么播放量显示为 null？

**原因**: 
- 该账号在指定时间范围内没有作品数据
- 或者作品数据获取失败

**处理**: 
- 前端会显示"获取失败"文本
- 检查该账号是否有作品，以及作品统计数据是否正常

### 3. 为什么增量数据为 0？

**可能原因**:
1. **时间范围问题**: 如果开始日期和结束日期相同，且该日期没有数据，增量可能为 0
2. **数据未更新**: 该时间范围内的数据还没有统计
3. **确实没有增量**: 该时间范围内确实没有新增数据

**检查方法**:
- 查看每日汇总数据，确认是否有数据
- 检查账号的更新时间，确认数据是否已同步

### 4. 数据更新频率

**数据来源**:
- 作品统计数据：通过定时任务或手动触发更新
- 账号粉丝数据：通过定时任务或手动触发更新

**更新时间**:
- 账号列表中的 `updateTime` 字段显示该账号在时间范围内的最新更新时间

## 修复记录

### 2026-01-28

**问题**: 数据不显示

**原因**: 
- 前端数据赋值逻辑使用了 `||` 运算符，导致 0 值被误判为 falsy
- 当 `data.summary` 存在但某些字段为 0 时，会使用默认值而不是实际值

**修复**:
- 改用 `??` 运算符（空值合并运算符）
- 添加类型检查和数组检查
- 改进日志输出，便于调试

**修改文件**:
- `client/src/views/Analytics/PlatformDetail/index.vue` (第 324-340 行)
