# 数据统计模块 API 文档

> **文档版本**: v1.0  
> **创建日期**: 2026-06-09  
> **作者**: system  
> **状态**: 正式发布  

---

## 📋 目录

1. [概述](#概述)
2. [基础路径](#基础路径)
3. [统计数据接口](#统计数据接口)
   - [获取综合统计数据](#获取综合统计数据)
   - [获取会员统计数据](#获取会员统计数据)
   - [获取预约统计数据](#获取预约统计数据)
   - [获取签到统计数据](#获取签到统计数据)
   - [查询历史统计数据](#查询历史统计数据)
   - [导出统计数据](#导出统计数据)
4. [数据模型](#数据模型)
   - [StatisticsQuery（查询条件）](#StatisticsQuery查询条件)
   - [StatisticsSummary（统计汇总）](#StatisticsSummary统计汇总)
   - [MemberStatistics（会员统计）](#MemberStatistics会员统计)
   - [BookingStatistics（预约统计）](#BookingStatistics预约统计)
   - [SignInStatistics（签到统计）](#SignInStatistics签到统计)
5. [状态码说明](#状态码说明)
6. [业务规则](#业务规则)

---

## 概述

数据统计模块提供健身房会员、预约、签到数据的统计功能，支持按日、周、月周期统计，并提供Excel导出功能。采用 Spring WebFlux 响应式编程，统计结果通过 Redis 缓存提高查询性能。

## 基础路径

所有接口的基础路径为: `http://{host}:{port}/api/datacount`

---

## 统计数据接口

### 获取综合统计数据

| 属性 | 值 |
|------|-----|
| **HTTP方法** | GET |
| **接口路径** | `/api/datacount/summary` |
| **所属文件** | `DataStatisticsHandler.java` |

**请求参数**:

| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| statType | string | 否 | 空 | 统计类型筛选 |
| periodType | string | 否 | DAY | 统计周期：DAY/WEEK/MONTH |
| startTime | string | 否 | 自动计算 | 开始时间（ISO格式） |
| endTime | string | 否 | 自动计算 | 结束时间（ISO格式） |

**请求示例**:

```bash
# 1. 使用周期类型查询今日统计
GET /api/datacount/summary?periodType=DAY

# 2. 使用周期类型查询本周统计
GET /api/datacount/summary?periodType=WEEK

# 3. 使用周期类型查询本月统计
GET /api/datacount/summary?periodType=MONTH

# 4. 使用自定义时间范围查询
GET /api/datacount/summary?startTime=2026-06-01T00:00:00&endTime=2026-06-07T23:59:59

# 5. 带统计类型筛选
GET /api/datacount/summary?statType=member&periodType=WEEK
```

**成功响应** (200 OK):

```json
{
  "statDate": "2026-06-09",
  "generatedAt": "2026-06-09T10:30:00",
  "memberStatistics": {
    "statDate": "2026-06-09",
    "newMembers": 5,
    "activeMembers": 120,
    "totalMembers": 500,
    "signInMembers": 85,
    "bookingMembers": 45,
    "cancelMembers": 5
  },
  "bookingStatistics": {
    "statDate": "2026-06-09",
    "totalBookings": 60,
    "cancelBookings": 10,
    "attendBookings": 45,
    "absentBookings": 5,
    "attendRate": 75.0,
    "cancelRate": 16.67
  },
  "signInStatistics": {
    "statDate": "2026-06-09",
    "totalSignIns": 95,
    "successSignIns": 92,
    "failSignIns": 3,
    "successRate": 96.84,
    "signInTypeDistribution": {
      "QR_CODE": 60,
      "MANUAL": 25,
      "FACE": 10
    }
  }
}
```

---

### 获取会员统计数据

| 属性 | 值 |
|------|-----|
| **HTTP方法** | GET |
| **接口路径** | `/api/datacount/member` |
| **所属文件** | `DataStatisticsHandler.java` |

**请求参数**:

| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| periodType | string | 否 | DAY | 统计周期：DAY/WEEK/MONTH |
| startTime | string | 否 | 自动计算 | 开始时间 |
| endTime | string | 否 | 自动计算 | 结束时间 |

**请求示例**:

```bash
# 1. 查询今日会员统计
GET /api/datacount/member

# 2. 查询本周会员统计
GET /api/datacount/member?periodType=WEEK

# 3. 查询指定时间范围的会员统计
GET /api/datacount/member?startTime=2026-06-01T00:00:00&endTime=2026-06-30T23:59:59
```

**成功响应** (200 OK):

```json
{
  "statDate": "2026-06-09",
  "newMembers": 5,
  "activeMembers": 120,
  "totalMembers": 500,
  "signInMembers": 85,
  "bookingMembers": 45,
  "cancelMembers": 5
}
```

---

### 获取预约统计数据

| 属性 | 值 |
|------|-----|
| **HTTP方法** | GET |
| **接口路径** | `/api/datacount/booking` |
| **所属文件** | `DataStatisticsHandler.java` |

**请求参数**:

| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| periodType | string | 否 | DAY | 统计周期：DAY/WEEK/MONTH |
| startTime | string | 否 | 自动计算 | 开始时间 |
| endTime | string | 否 | 自动计算 | 结束时间 |

**请求示例**:

```bash
# 1. 查询今日预约统计
GET /api/datacount/booking

# 2. 查询本月预约统计
GET /api/datacount/booking?periodType=MONTH

# 3. 查询指定日期范围的预约统计
GET /api/datacount/booking?startTime=2026-06-01T00:00:00&endTime=2026-06-15T23:59:59
```

**成功响应** (200 OK):

```json
{
  "statDate": "2026-06-09",
  "totalBookings": 60,
  "cancelBookings": 10,
  "attendBookings": 45,
  "absentBookings": 5,
  "attendRate": 75.0,
  "cancelRate": 16.67
}
```

---

### 获取签到统计数据

| 属性 | 值 |
|------|-----|
| **HTTP方法** | GET |
| **接口路径** | `/api/datacount/signin` |
| **所属文件** | `DataStatisticsHandler.java` |

**请求参数**:

| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| periodType | string | 否 | DAY | 统计周期：DAY/WEEK/MONTH |
| startTime | string | 否 | 自动计算 | 开始时间 |
| endTime | string | 否 | 自动计算 | 结束时间 |

**请求示例**:

```bash
# 1. 查询今日签到统计
GET /api/datacount/signin

# 2. 查询本周签到统计
GET /api/datacount/signin?periodType=WEEK

# 3. 查询指定日期范围的签到统计
GET /api/datacount/signin?startTime=2026-06-01T00:00:00&endTime=2026-06-30T23:59:59
```

**成功响应** (200 OK):

```json
{
  "statDate": "2026-06-09",
  "totalSignIns": 95,
  "successSignIns": 92,
  "failSignIns": 3,
  "successRate": 96.84,
  "signInTypeDistribution": {
    "QR_CODE": 60,
    "MANUAL": 25,
    "FACE": 10
  }
}
```

---

### 查询历史统计数据

| 属性 | 值 |
|------|-----|
| **HTTP方法** | GET |
| **接口路径** | `/api/datacount/history` |
| **所属文件** | `DataStatisticsHandler.java` |

**请求参数**:

| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| statType | string | 否 | 空 | 统计类型：member/booking/signin |
| startTime | string | 是 | - | 开始日期（格式：yyyy-MM-dd） |
| endTime | string | 是 | - | 结束日期（格式：yyyy-MM-dd） |

**请求示例**:

```bash
# 1. 查询指定日期范围的签到历史统计
GET /api/datacount/history?statType=signin&startTime=2026-06-01&endTime=2026-06-30

# 2. 查询指定日期范围的会员历史统计
GET /api/datacount/history?statType=member&startTime=2026-06-01&endTime=2026-06-15

# 3. 查询指定日期范围的预约历史统计
GET /api/datacount/history?statType=booking&startTime=2026-06-01&endTime=2026-06-30

# 4. 查询所有类型的历史统计（不指定statType）
GET /api/datacount/history?startTime=2026-06-01&endTime=2026-06-07
```

**成功响应** (200 OK):

```json
[
  {
    "statDate": "2026-06-07",
    "totalSignIns": 88,
    "successSignIns": 86,
    "failSignIns": 2,
    "successRate": 97.73,
    "signInTypeDistribution": {
      "QR_CODE": 55,
      "MANUAL": 23,
      "FACE": 10
    }
  },
  {
    "statDate": "2026-06-08",
    "totalSignIns": 92,
    "successSignIns": 90,
    "failSignIns": 2,
    "successRate": 97.83,
    "signInTypeDistribution": {
      "QR_CODE": 58,
      "MANUAL": 24,
      "FACE": 10
    }
  }
]
```

---

### 导出统计数据

| 属性 | 值 |
|------|-----|
| **HTTP方法** | GET |
| **接口路径** | `/api/datacount/export` |
| **所属文件** | `DataStatisticsHandler.java` |

**请求参数**:

| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| periodType | string | 否 | DAY | 统计周期：DAY/WEEK/MONTH |
| startTime | string | 否 | 自动计算 | 开始时间 |
| endTime | string | 否 | 自动计算 | 结束时间 |

**请求示例**:

```bash
# 1. 导出今日统计数据
GET /api/datacount/export

# 2. 导出本周统计数据
GET /api/datacount/export?periodType=WEEK

# 3. 导出本月统计数据
GET /api/datacount/export?periodType=MONTH

# 4. 导出指定时间范围的统计数据
GET /api/datacount/export?startTime=2026-06-01T00:00:00&endTime=2026-06-30T23:59:59
```

**成功响应** (200 OK):

返回 Excel 文件（.xlsx），包含以下 Sheet：
- **会员统计**: 会员相关统计数据
- **预约统计**: 预约相关统计数据  
- **签到统计**: 签到相关统计数据

**Content-Type**: `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`

---

## 数据模型

### StatisticsQuery（查询条件）

| 字段名 | 类型 | 说明 |
|--------|------|------|
| statType | String | 统计类型筛选 |
| periodType | String | 统计周期：DAY/WEEK/MONTH |
| startTime | LocalDateTime | 开始时间 |
| endTime | LocalDateTime | 结束时间 |

### StatisticsSummary（统计汇总）

| 字段名 | 类型 | 说明 |
|--------|------|------|
| statDate | String | 统计日期 |
| generatedAt | String | 生成时间 |
| memberStatistics | MemberStatistics | 会员统计数据 |
| bookingStatistics | BookingStatistics | 预约统计数据 |
| signInStatistics | SignInStatistics | 签到统计数据 |

### MemberStatistics（会员统计）

| 字段名 | 类型 | 说明 |
|--------|------|------|
| statDate | String | 统计日期 |
| newMembers | Long | 新增会员数 |
| activeMembers | Long | 活跃会员数 |
| totalMembers | Long | 累计会员总数 |
| signInMembers | Long | 签到会员数 |
| bookingMembers | Long | 预约会员数 |
| cancelMembers | Long | 取消预约会员数 |

### BookingStatistics（预约统计）

| 字段名 | 类型 | 说明 |
|--------|------|------|
| statDate | String | 统计日期 |
| totalBookings | Long | 预约总数 |
| cancelBookings | Long | 取消预约数 |
| attendBookings | Long | 出席预约数 |
| absentBookings | Long | 缺席预约数 |
| attendRate | Double | 出席率（%） |
| cancelRate | Double | 取消率（%） |

### SignInStatistics（签到统计）

| 字段名 | 类型 | 说明 |
|--------|------|------|
| statDate | String | 统计日期 |
| totalSignIns | Long | 签到总次数 |
| successSignIns | Long | 成功签到次数 |
| failSignIns | Long | 失败签到次数 |
| successRate | Double | 签到成功率（%） |
| signInTypeDistribution | Map<String, Long> | 签到类型分布 |

---

## 状态码说明

| 状态码 | 说明 |
|--------|------|
| 200 | 请求成功 |
| 400 | 请求参数错误 |
| 500 | 服务器内部错误 |

---

## 业务规则

1. **统计周期**: 支持按日、周、月统计
   - DAY: 当天 00:00:00 - 当前时间
   - WEEK: 本周一 00:00:00 - 本周日 23:59:59
   - MONTH: 本月1日 00:00:00 - 本月最后一天 23:59:59

2. **数据保留**: 统计数据缓存30天，业务记录永久保存

3. **缓存策略**: 查询结果缓存1小时，统计数据缓存30天

4. **定时任务**: 
   - 每日凌晨2点执行前一天的日统计
   - 每周一凌晨3点执行上周的周统计
   - 每月1日凌晨3点执行上月的月统计
   - 每月15日凌晨4点清理30天前的旧数据

5. **数据导出**: 支持Excel格式导出，包含会员、预约、签到三个Sheet
