完成模块4,4.1基础信息统计
This commit was merged in pull request #26.
This commit is contained in:
@@ -0,0 +1,452 @@
|
||||
# 数据统计模块 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
|
||||
Reference in New Issue
Block a user