1019 lines
23 KiB
Markdown
1019 lines
23 KiB
Markdown
# 数据统计模块 API 文档
|
||
|
||
> 模块:gym-dataCount
|
||
> 版本:1.0.0
|
||
> 更新日期:2026-06-06
|
||
|
||
## 概述
|
||
|
||
数据统计模块提供会员数据统计、预约数据统计和数据导出功能,支持按日期查询、日期范围查询和汇总统计。
|
||
|
||
---
|
||
|
||
## 基础信息
|
||
|
||
- **Base URL**: `/api/stats`
|
||
- **Content-Type**: `application/json`
|
||
- **响应格式**: JSON
|
||
|
||
---
|
||
|
||
## 1. 会员数据统计
|
||
|
||
### 1.1 获取指定日期的会员统计
|
||
|
||
获取某一天的会员数据统计信息。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/stats/member/date/{date}
|
||
```
|
||
|
||
**路径参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| date | string | 是 | 统计日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/member/date/2026-06-01"
|
||
```
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
{
|
||
"date": "2026-06-01",
|
||
"newMembers": 5,
|
||
"activeMembers": 0,
|
||
"retainedMembers": 0,
|
||
"totalMembers": 19,
|
||
"maleMembers": 10,
|
||
"femaleMembers": 9,
|
||
"cardPurchaseCount": 19,
|
||
"averageAge": 29.5
|
||
}
|
||
```
|
||
|
||
**响应字段说明**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|-----|------|------|
|
||
| date | string | 统计日期 |
|
||
| newMembers | integer | 当日新增会员数 |
|
||
| activeMembers | integer | 当日活跃会员数(有会员卡操作的会员) |
|
||
| retainedMembers | integer | 留存会员数 |
|
||
| totalMembers | integer | 总会员数(累计) |
|
||
| maleMembers | integer | 男性会员总数 |
|
||
| femaleMembers | integer | 女性会员总数 |
|
||
| cardPurchaseCount | integer | 当日购卡人数 |
|
||
| averageAge | number | 会员平均年龄 |
|
||
|
||
---
|
||
|
||
### 1.2 获取日期范围内的会员统计列表
|
||
|
||
获取指定日期范围内每天的会员统计数据。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/stats/member/range?startDate=2026-06-01&endDate=2026-06-05
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| startDate | string | 是 | 开始日期,格式:yyyy-MM-dd |
|
||
| endDate | string | 是 | 结束日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/member/range?startDate=2026-06-01&endDate=2026-06-03"
|
||
```
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
[
|
||
{
|
||
"date": "2026-06-01",
|
||
"newMembers": 5,
|
||
"activeMembers": 0,
|
||
"totalMembers": 19,
|
||
"maleMembers": 10,
|
||
"femaleMembers": 9,
|
||
"cardPurchaseCount": 19,
|
||
"averageAge": 29.5
|
||
},
|
||
{
|
||
"date": "2026-06-02",
|
||
"newMembers": 4,
|
||
"activeMembers": 0,
|
||
"totalMembers": 19,
|
||
"maleMembers": 10,
|
||
"femaleMembers": 9,
|
||
"cardPurchaseCount": 19,
|
||
"averageAge": 29.5
|
||
},
|
||
{
|
||
"date": "2026-06-03",
|
||
"newMembers": 3,
|
||
"activeMembers": 0,
|
||
"totalMembers": 19,
|
||
"maleMembers": 10,
|
||
"femaleMembers": 9,
|
||
"cardPurchaseCount": 19,
|
||
"averageAge": 29.5
|
||
}
|
||
]
|
||
```
|
||
|
||
---
|
||
|
||
### 1.3 获取会员统计汇总
|
||
|
||
获取指定日期范围内的会员数据汇总统计。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/stats/member/summary?startDate=2026-06-01&endDate=2026-06-30
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| startDate | string | 是 | 开始日期,格式:yyyy-MM-dd |
|
||
| endDate | string | 是 | 结束日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/member/summary?startDate=2026-06-01&endDate=2026-06-06"
|
||
```
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
{
|
||
"startDate": "2026-06-01",
|
||
"endDate": "2026-06-06",
|
||
"newMembers": 19,
|
||
"activeMembers": 0,
|
||
"totalMembers": 19,
|
||
"maleMembers": 10,
|
||
"femaleMembers": 9,
|
||
"cardPurchaseCount": 19,
|
||
"averageAge": 29.5
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 2. 预约数据统计
|
||
|
||
### 2.1 获取指定日期的预约统计
|
||
|
||
获取某一天的团课预约数据统计信息。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/stats/booking/date/{date}
|
||
```
|
||
|
||
**路径参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| date | string | 是 | 统计日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/booking/date/2026-06-01"
|
||
```
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
{
|
||
"date": "2026-06-01",
|
||
"totalBookings": 32,
|
||
"cancelledBookings": 5,
|
||
"attendedBookings": 27,
|
||
"bookingSuccessRate": 0.0,
|
||
"cancellationRate": 15.63,
|
||
"attendanceRate": 84.38,
|
||
"popularCourseName": "燃脂单车",
|
||
"popularCourseCount": 19,
|
||
"totalCourses": 3,
|
||
"fullCourses": 1
|
||
}
|
||
```
|
||
|
||
**响应字段说明**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|-----|------|------|
|
||
| date | string | 统计日期 |
|
||
| totalBookings | integer | 预约总数 |
|
||
| cancelledBookings | integer | 取消预约数 |
|
||
| attendedBookings | integer | 实际到场数 |
|
||
| bookingSuccessRate | number | 预约成功率(保留) |
|
||
| cancellationRate | number | 取消率(百分比) |
|
||
| attendanceRate | number | 到场率(百分比) |
|
||
| popularCourseName | string | 最热门课程名称 |
|
||
| popularCourseCount | integer | 热门课程预约数 |
|
||
| totalCourses | integer | 当日团课总数 |
|
||
| fullCourses | integer | 满员课程数 |
|
||
|
||
---
|
||
|
||
### 2.2 获取日期范围内的预约统计列表
|
||
|
||
获取指定日期范围内每天的预约统计数据。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/stats/booking/range?startDate=2026-06-01&endDate=2026-06-05
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| startDate | string | 是 | 开始日期,格式:yyyy-MM-dd |
|
||
| endDate | string | 是 | 结束日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/booking/range?startDate=2026-06-01&endDate=2026-06-03"
|
||
```
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
[
|
||
{
|
||
"date": "2026-06-01",
|
||
"totalBookings": 32,
|
||
"cancelledBookings": 5,
|
||
"attendedBookings": 27,
|
||
"cancellationRate": 15.63,
|
||
"attendanceRate": 84.38,
|
||
"popularCourseName": "燃脂单车",
|
||
"popularCourseCount": 19,
|
||
"totalCourses": 3,
|
||
"fullCourses": 1
|
||
},
|
||
{
|
||
"date": "2026-06-02",
|
||
"totalBookings": 30,
|
||
"cancelledBookings": 3,
|
||
"attendedBookings": 27,
|
||
"cancellationRate": 10.00,
|
||
"attendanceRate": 90.00,
|
||
"popularCourseName": "流瑜伽",
|
||
"popularCourseCount": 10,
|
||
"totalCourses": 3,
|
||
"fullCourses": 0
|
||
},
|
||
{
|
||
"date": "2026-06-03",
|
||
"totalBookings": 35,
|
||
"cancelledBookings": 4,
|
||
"attendedBookings": 31,
|
||
"cancellationRate": 11.43,
|
||
"attendanceRate": 88.57,
|
||
"popularCourseName": "哈他瑜伽",
|
||
"popularCourseCount": 12,
|
||
"totalCourses": 3,
|
||
"fullCourses": 2
|
||
}
|
||
]
|
||
```
|
||
|
||
---
|
||
|
||
### 2.3 获取预约统计汇总
|
||
|
||
获取指定日期范围内的预约数据汇总统计。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/stats/booking/summary?startDate=2026-06-01&endDate=2026-06-30
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| startDate | string | 是 | 开始日期,格式:yyyy-MM-dd |
|
||
| endDate | string | 是 | 结束日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/booking/summary?startDate=2026-06-01&endDate=2026-06-06"
|
||
```
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
{
|
||
"startDate": "2026-06-01",
|
||
"endDate": "2026-06-06",
|
||
"totalBookings": 172,
|
||
"cancelledBookings": 16,
|
||
"attendedBookings": 156,
|
||
"cancellationRate": 9.30,
|
||
"attendanceRate": 90.70
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 3. 签到数据统计
|
||
|
||
### 3.1 获取签到统计
|
||
|
||
获取指定日期范围内的签到统计数据。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/checkIn/statistics
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| startDate | string | 是 | 开始日期,格式:yyyy-MM-dd |
|
||
| endDate | string | 是 | 结束日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/checkIn/statistics?startDate=2026-06-01&endDate=2026-06-06"
|
||
```
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
{
|
||
"startDate": "2026-06-01",
|
||
"endDate": "2026-06-06",
|
||
"totalSignInCount": 156,
|
||
"successSignInCount": 148,
|
||
"failedSignInCount": 8,
|
||
"successRate": 94.87,
|
||
"avgDailySignIn": 26,
|
||
"mostSignInDay": "2026-06-03",
|
||
"mostSignInCount": 32,
|
||
"qrCodeSignInCount": 120,
|
||
"manualSignInCount": 28,
|
||
"faceSignInCount": 8
|
||
}
|
||
```
|
||
|
||
**响应字段说明**
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|-----|------|------|
|
||
| startDate | string | 统计开始日期 |
|
||
| endDate | string | 统计结束日期 |
|
||
| totalSignInCount | integer | 签到总次数 |
|
||
| successSignInCount | integer | 成功签到次数 |
|
||
| failedSignInCount | integer | 失败签到次数 |
|
||
| successRate | number | 签到成功率(百分比) |
|
||
| avgDailySignIn | integer | 日均签到数 |
|
||
| mostSignInDay | string | 签到最多的日期 |
|
||
| mostSignInCount | integer | 单日最多签到数 |
|
||
| qrCodeSignInCount | integer | 扫码签到次数 |
|
||
| manualSignInCount | integer | 手动签到次数 |
|
||
| faceSignInCount | integer | 人脸识别签到次数 |
|
||
|
||
---
|
||
|
||
### 3.2 获取每日签到统计
|
||
|
||
获取指定日期范围内每天的签到统计列表。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/checkIn/daily-stats?startDate=2026-06-01&endDate=2026-06-05
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| startDate | string | 是 | 开始日期,格式:yyyy-MM-dd |
|
||
| endDate | string | 是 | 结束日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/checkIn/daily-stats?startDate=2026-06-01&endDate=2026-06-03"
|
||
```
|
||
|
||
**响应示例**
|
||
|
||
```json
|
||
[
|
||
{
|
||
"date": "2026-06-01",
|
||
"totalSignInCount": 28,
|
||
"successSignInCount": 26,
|
||
"failedSignInCount": 2,
|
||
"successRate": 92.86,
|
||
"qrCodeSignInCount": 22,
|
||
"manualSignInCount": 4,
|
||
"faceSignInCount": 2
|
||
},
|
||
{
|
||
"date": "2026-06-02",
|
||
"totalSignInCount": 24,
|
||
"successSignInCount": 24,
|
||
"failedSignInCount": 0,
|
||
"successRate": 100.00,
|
||
"qrCodeSignInCount": 20,
|
||
"manualSignInCount": 3,
|
||
"faceSignInCount": 1
|
||
},
|
||
{
|
||
"date": "2026-06-03",
|
||
"totalSignInCount": 32,
|
||
"successSignInCount": 30,
|
||
"failedSignInCount": 2,
|
||
"successRate": 93.75,
|
||
"qrCodeSignInCount": 26,
|
||
"manualSignInCount": 4,
|
||
"faceSignInCount": 2
|
||
}
|
||
]
|
||
```
|
||
|
||
---
|
||
|
||
## 4. 数据导出
|
||
|
||
### 4.1 导出会员统计数据
|
||
|
||
导出指定日期范围内的会员统计数据为CSV文件。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/stats/export/member?startDate=2026-06-01&endDate=2026-06-30
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| startDate | string | 是 | 开始日期,格式:yyyy-MM-dd |
|
||
| endDate | string | 是 | 结束日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/export/member?startDate=2026-06-01&endDate=2026-06-03" \
|
||
-H "Accept: text/csv" \
|
||
--output member_stats.csv
|
||
```
|
||
|
||
**响应**
|
||
|
||
- **Content-Type**: `text/csv; charset=UTF-8`
|
||
- **Content-Disposition**: `attachment; filename=member_statistics_2026-06-01_2026-06-03.csv`
|
||
|
||
**CSV格式示例**
|
||
|
||
```csv
|
||
统计日期,新增会员数,活跃会员数,总会员数,男性会员数,女性会员数,购卡人数,平均年龄
|
||
2026-06-01,5,0,19,10,9,19,29.5
|
||
2026-06-02,4,0,19,10,9,19,29.5
|
||
2026-06-03,3,0,19,10,9,19,29.5
|
||
```
|
||
|
||
---
|
||
|
||
### 4.2 导出预约统计数据
|
||
|
||
导出指定日期范围内的预约统计数据为CSV文件。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/stats/export/booking?startDate=2026-06-01&endDate=2026-06-30
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| startDate | string | 是 | 开始日期,格式:yyyy-MM-dd |
|
||
| endDate | string | 是 | 结束日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/export/booking?startDate=2026-06-01&endDate=2026-06-03" \
|
||
-H "Accept: text/csv" \
|
||
--output booking_stats.csv
|
||
```
|
||
|
||
**响应**
|
||
|
||
- **Content-Type**: `text/csv; charset=UTF-8`
|
||
- **Content-Disposition**: `attachment; filename=booking_statistics_2026-06-01_2026-06-03.csv`
|
||
|
||
**CSV格式示例**
|
||
|
||
```csv
|
||
统计日期,预约总数,取消预约数,实际到场数,取消率(%),到场率(%),热门课程,热门课程预约数,团课总数,满员课程数
|
||
2026-06-01,32,5,27,15.63,84.38,燃脂单车,19,3,1
|
||
2026-06-02,30,3,27,10.00,90.00,流瑜伽,10,3,0
|
||
2026-06-03,35,4,31,11.43,88.57,哈他瑜伽,12,3,2
|
||
```
|
||
|
||
---
|
||
|
||
### 4.3 导出签到记录数据
|
||
|
||
导出指定日期范围内的签到记录数据为CSV文件。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/checkIn/records/export?startDate=2026-06-01&endDate=2026-06-30
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| startDate | string | 是 | 开始日期,格式:yyyy-MM-dd |
|
||
| endDate | string | 是 | 结束日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/checkIn/records/export?startDate=2026-06-01&endDate=2026-06-03" \
|
||
-H "Accept: text/csv" \
|
||
--output sign_in_records.csv
|
||
```
|
||
|
||
**响应**
|
||
|
||
- **Content-Type**: `text/csv; charset=UTF-8`
|
||
- **Content-Disposition**: `attachment; filename=sign_in_records_2026-06-01_2026-06-03.csv`
|
||
|
||
**CSV格式示例**
|
||
|
||
```csv
|
||
签到时间,会员ID,会员卡ID,签到方式,签到状态,操作人,来源
|
||
2026-06-01 08:30:00,1,1001,QR_CODE,SUCCESS,张三,MINI_PROGRAM
|
||
2026-06-01 09:15:00,2,1002,MANUAL,SUCCESS,李四,PC_BACKEND
|
||
2026-06-01 10:00:00,3,1003,FACE,SUCCESS,,MINI_PROGRAM
|
||
```
|
||
|
||
---
|
||
|
||
### 4.4 导出全部统计数据
|
||
|
||
导出指定日期范围内的会员和预约统计数据为CSV文件。
|
||
|
||
**请求**
|
||
|
||
```http
|
||
GET /api/stats/export/all?startDate=2026-06-01&endDate=2026-06-30
|
||
```
|
||
|
||
**查询参数**
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|-----|------|-----|------|
|
||
| startDate | string | 是 | 开始日期,格式:yyyy-MM-dd |
|
||
| endDate | string | 是 | 结束日期,格式:yyyy-MM-dd |
|
||
|
||
**请求示例**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/export/all?startDate=2026-06-01&endDate=2026-06-03" \
|
||
-H "Accept: text/csv" \
|
||
--output all_stats.csv
|
||
```
|
||
|
||
**响应**
|
||
|
||
- **Content-Type**: `text/csv; charset=UTF-8`
|
||
- **Content-Disposition**: `attachment; filename=all_statistics_2026-06-01_2026-06-03.csv`
|
||
|
||
**CSV格式示例**
|
||
|
||
```csv
|
||
=== 会员数据统计 ===
|
||
统计日期,新增会员数,活跃会员数,总会员数,男性会员数,女性会员数,购卡人数,平均年龄
|
||
2026-06-01,5,0,19,10,9,19,29.5
|
||
2026-06-02,4,0,19,10,9,19,29.5
|
||
2026-06-03,3,0,19,10,9,19,29.5
|
||
|
||
=== 预约数据统计 ===
|
||
统计日期,预约总数,取消预约数,实际到场数,取消率(%),到场率(%),热门课程,热门课程预约数,团课总数,满员课程数
|
||
2026-06-01,32,5,27,15.63,84.38,燃脂单车,19,3,1
|
||
2026-06-02,30,3,27,10.00,90.00,流瑜伽,10,3,0
|
||
2026-06-03,35,4,31,11.43,88.57,哈他瑜伽,12,3,2
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 错误响应
|
||
|
||
所有接口在发生错误时返回统一的错误格式:
|
||
|
||
```json
|
||
{
|
||
"success": false,
|
||
"message": "错误描述信息"
|
||
}
|
||
```
|
||
|
||
**常见错误码**
|
||
|
||
| HTTP状态码 | 说明 |
|
||
|-----------|------|
|
||
| 400 Bad Request | 参数格式错误或缺少必填参数 |
|
||
| 404 Not Found | 指定日期的数据不存在 |
|
||
| 500 Internal Server Error | 服务器内部错误 |
|
||
|
||
---
|
||
|
||
## 6. 定时任务
|
||
|
||
模块内置以下定时任务,自动计算统计数据并缓存到Redis:
|
||
|
||
| 任务名称 | 执行时间 | 说明 |
|
||
|---------|---------|------|
|
||
| 每日统计 | 每日凌晨1点 | 计算前一天的会员和预约统计 |
|
||
| 每周汇总 | 每周一凌晨2点 | 计算上周的汇总统计 |
|
||
| 每月汇总 | 每月1号凌晨3点 | 计算上月的汇总统计 |
|
||
|
||
**缓存策略**
|
||
|
||
- 缓存键前缀:`stats:member:` 和 `stats:booking:`
|
||
- 缓存过期时间:3600秒(1小时)
|
||
- 每日定时任务会自动刷新缓存
|
||
|
||
---
|
||
|
||
## 7. 数据来源
|
||
|
||
统计数据来源于以下数据表:
|
||
|
||
| 统计类型 | 数据表 | 说明 |
|
||
|---------|-------|------|
|
||
| 会员统计 | `member_user` | 会员基本信息表 |
|
||
| 会员卡统计 | `member_card_record` | 会员卡记录表 |
|
||
| 预约统计 | `group_course_booking` | 团课预约记录表 |
|
||
| 课程统计 | `group_course` | 团课课程表 |
|
||
| 签到统计 | `sign_in_record` | 会员到店签到记录表 |
|
||
|
||
---
|
||
|
||
## 8. 技术实现
|
||
|
||
- **框架**: Spring WebFlux(响应式编程)
|
||
- **数据库访问**: Spring Data R2DBC
|
||
- **缓存**: Redis(ReactiveRedisTemplate)
|
||
- **API文档**: OpenAPI 3.0 / Swagger
|
||
- **导出格式**: CSV
|
||
|
||
---
|
||
|
||
## 附录:接口列表汇总
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|-----|------|------|
|
||
| GET | `/api/stats/member/date/{date}` | 获取指定日期会员统计 |
|
||
| GET | `/api/stats/member/range` | 获取日期范围会员统计列表 |
|
||
| GET | `/api/stats/member/summary` | 获取会员统计汇总 |
|
||
| GET | `/api/stats/booking/date/{date}` | 获取指定日期预约统计 |
|
||
| GET | `/api/stats/booking/range` | 获取日期范围预约统计列表 |
|
||
| GET | `/api/stats/booking/summary` | 获取预约统计汇总 |
|
||
| GET | `/api/checkIn/statistics` | 获取签到统计 |
|
||
| GET | `/api/checkIn/daily-stats` | 获取每日签到统计 |
|
||
| GET | `/api/stats/export/member` | 导出会员统计CSV |
|
||
| GET | `/api/stats/export/booking` | 导出预约统计CSV |
|
||
| GET | `/api/stats/export/all` | 导出全部统计CSV |
|
||
| GET | `/api/checkIn/records/export` | 导出签到记录CSV |
|
||
|
||
---
|
||
|
||
## 9. 测试指南
|
||
|
||
### 9.1 测试数据说明
|
||
|
||
数据库已预置测试数据,日期范围为 **2026-06-01 至 2026-06-10**。
|
||
|
||
#### 会员数据分布
|
||
|
||
| 日期 | 新增会员数 | 男性会员 | 女性会员 |
|
||
|------|-----------|---------|---------|
|
||
| 2026-06-01 | 5 | 3 | 2 |
|
||
| 2026-06-02 | 4 | 2 | 2 |
|
||
| 2026-06-03 | 3 | 1 | 2 |
|
||
| 2026-06-04 | 2 | 1 | 1 |
|
||
| 2026-06-05 | 3 | 2 | 1 |
|
||
| 2026-06-06 | 2 | 1 | 1 |
|
||
| **合计** | **19** | **10** | **9** |
|
||
|
||
#### 预约数据分布
|
||
|
||
| 日期 | 预约总数 | 取消预约 | 实际到场 | 满员课程数 |
|
||
|------|---------|---------|---------|-----------|
|
||
| 2026-06-01 | 32 | 5 | 27 | 1 |
|
||
| 2026-06-02 | 30 | 3 | 27 | 0 |
|
||
| 2026-06-03 | 35 | 4 | 31 | 2 |
|
||
| 2026-06-04 | 28 | 2 | 26 | 1 |
|
||
| 2026-06-05 | 25 | 1 | 24 | 0 |
|
||
| 2026-06-06 | 22 | 1 | 21 | 0 |
|
||
|
||
---
|
||
|
||
### 9.2 测试用例
|
||
|
||
#### 9.2.1 会员数据统计
|
||
|
||
**测试1:获取单日会员统计**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/member/date/2026-06-01"
|
||
```
|
||
|
||
**预期结果**:
|
||
```json
|
||
{
|
||
"date": "2026-06-01",
|
||
"newMembers": 5,
|
||
"activeMembers": 0,
|
||
"retainedMembers": 0,
|
||
"totalMembers": 19,
|
||
"maleMembers": 10,
|
||
"femaleMembers": 9,
|
||
"cardPurchaseCount": 19,
|
||
"averageAge": 29.5
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
**测试2:获取日期范围会员统计**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/member/range?startDate=2026-06-01&endDate=2026-06-03"
|
||
```
|
||
|
||
**预期结果**:返回3条记录,分别为 2026-06-01、2026-06-02、2026-06-03 的统计数据。
|
||
|
||
---
|
||
|
||
**测试3:获取会员统计汇总**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/member/summary?startDate=2026-06-01&endDate=2026-06-06"
|
||
```
|
||
|
||
**预期结果**:
|
||
```json
|
||
{
|
||
"startDate": "2026-06-01",
|
||
"endDate": "2026-06-06",
|
||
"newMembers": 19,
|
||
"activeMembers": 0,
|
||
"totalMembers": 19,
|
||
"maleMembers": 10,
|
||
"femaleMembers": 9,
|
||
"cardPurchaseCount": 19,
|
||
"averageAge": 29.5
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 9.2.2 预约数据统计
|
||
|
||
**测试4:获取单日预约统计**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/booking/date/2026-06-01"
|
||
```
|
||
|
||
**预期结果**:
|
||
```json
|
||
{
|
||
"date": "2026-06-01",
|
||
"totalBookings": 32,
|
||
"cancelledBookings": 5,
|
||
"attendedBookings": 27,
|
||
"bookingSuccessRate": 0.0,
|
||
"cancellationRate": 15.63,
|
||
"attendanceRate": 84.38,
|
||
"popularCourseName": "燃脂单车",
|
||
"popularCourseCount": 19,
|
||
"totalCourses": 3,
|
||
"fullCourses": 1
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
**测试5:获取日期范围预约统计**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/booking/range?startDate=2026-06-01&endDate=2026-06-03"
|
||
```
|
||
|
||
**预期结果**:返回3条记录,分别为 2026-06-01、2026-06-02、2026-06-03 的统计数据。
|
||
|
||
---
|
||
|
||
**测试6:获取预约统计汇总**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/booking/summary?startDate=2026-06-01&endDate=2026-06-06"
|
||
```
|
||
|
||
**预期结果**:
|
||
```json
|
||
{
|
||
"startDate": "2026-06-01",
|
||
"endDate": "2026-06-06",
|
||
"totalBookings": 172,
|
||
"cancelledBookings": 16,
|
||
"attendedBookings": 156,
|
||
"cancellationRate": 9.30,
|
||
"attendanceRate": 90.70
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
#### 9.2.3 数据导出
|
||
|
||
**测试7:导出会员统计数据**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/export/member?startDate=2026-06-01&endDate=2026-06-03" \
|
||
-H "Accept: text/csv" \
|
||
--output member_stats.csv
|
||
```
|
||
|
||
**预期结果**:下载 CSV 文件,包含 2026-06-01 至 2026-06-03 的会员统计数据。
|
||
|
||
---
|
||
|
||
**测试8:导出预约统计数据**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/export/booking?startDate=2026-06-01&endDate=2026-06-03" \
|
||
-H "Accept: text/csv" \
|
||
--output booking_stats.csv
|
||
```
|
||
|
||
**预期结果**:下载 CSV 文件,包含 2026-06-01 至 2026-06-03 的预约统计数据。
|
||
|
||
---
|
||
|
||
**测试9:导出全部统计数据**
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/export/all?startDate=2026-06-01&endDate=2026-06-03" \
|
||
-H "Accept: text/csv" \
|
||
--output all_stats.csv
|
||
```
|
||
|
||
**预期结果**:下载 CSV 文件,包含会员和预约的完整统计数据。
|
||
|
||
---
|
||
|
||
### 9.3 测试参数说明
|
||
|
||
#### 日期参数格式
|
||
|
||
所有日期参数必须使用 `yyyy-MM-dd` 格式,例如:
|
||
- ✅ `2026-06-01`
|
||
- ❌ `2026/06/01`
|
||
- ❌ `2026-6-1`
|
||
- ❌ `06-01-2026`
|
||
|
||
#### 日期范围参数
|
||
|
||
| 参数 | 说明 | 示例 |
|
||
|-----|------|------|
|
||
| startDate | 开始日期(包含) | `2026-06-01` |
|
||
| endDate | 结束日期(包含) | `2026-06-06` |
|
||
|
||
**注意事项**:
|
||
- `startDate` 必须 ≤ `endDate`
|
||
- 日期范围不能超过 365 天
|
||
- 日期必须在测试数据范围内(2026-06-01 至 2026-06-10)
|
||
|
||
---
|
||
|
||
### 9.4 常见测试场景
|
||
|
||
#### 场景1:测试单日统计
|
||
|
||
```bash
|
||
# 测试6月1日的会员和预约统计
|
||
curl "http://localhost:8080/api/stats/member/date/2026-06-01"
|
||
curl "http://localhost:8080/api/stats/booking/date/2026-06-01"
|
||
```
|
||
|
||
---
|
||
|
||
#### 场景2:测试一周统计
|
||
|
||
```bash
|
||
# 测试6月第一周的统计
|
||
curl "http://localhost:8080/api/stats/member/summary?startDate=2026-06-01&endDate=2026-06-06"
|
||
curl "http://localhost:8080/api/stats/booking/summary?startDate=2026-06-01&endDate=2026-06-06"
|
||
```
|
||
|
||
---
|
||
|
||
#### 场景3:测试数据导出
|
||
|
||
```bash
|
||
# 导出6月前3天的所有统计数据
|
||
curl "http://localhost:8080/api/stats/export/all?startDate=2026-06-01&endDate=2026-06-03" \
|
||
--output test_data.csv
|
||
```
|
||
|
||
---
|
||
|
||
### 9.5 错误测试用例
|
||
|
||
#### 测试10:日期格式错误
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/member/date/2026/06/01"
|
||
```
|
||
|
||
**预期结果**:HTTP 400 Bad Request
|
||
|
||
---
|
||
|
||
#### 测试11:日期范围无效
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/member/range?startDate=2026-06-06&endDate=2026-06-01"
|
||
```
|
||
|
||
**预期结果**:HTTP 400 Bad Request
|
||
|
||
---
|
||
|
||
#### 测试12:日期超出测试数据范围
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/api/stats/member/date/2025-01-01"
|
||
```
|
||
|
||
**预期结果**:HTTP 404 Not Found 或返回空数据
|
||
|
||
---
|
||
|
||
### 9.6 使用 Postman 测试
|
||
|
||
导入以下环境变量到 Postman:
|
||
|
||
| 变量名 | 值 | 说明 |
|
||
|-------|---|------|
|
||
| `base_url` | `http://localhost:8080` | API 基础地址 |
|
||
| `test_start_date` | `2026-06-01` | 测试开始日期 |
|
||
| `test_end_date` | `2026-06-06` | 测试结束日期 |
|
||
|
||
示例请求:
|
||
|
||
```
|
||
GET {{base_url}}/api/stats/member/date/2026-06-01
|
||
GET {{base_url}}/api/stats/member/range?startDate={{test_start_date}}&endDate={{test_end_date}}
|
||
GET {{base_url}}/api/stats/booking/summary?startDate={{test_start_date}}&endDate={{test_end_date}}
|
||
```
|