Files
gym-manage/gym-manage-api/docs/datacount-api.md
T

23 KiB
Raw Blame History

数据统计模块 API 文档

模块:gym-dataCount
版本:1.0.0
更新日期:2026-06-06

概述

数据统计模块提供会员数据统计、预约数据统计和数据导出功能,支持按日期查询、日期范围查询和汇总统计。


基础信息

  • Base URL: /api/stats
  • Content-Type: application/json
  • 响应格式: JSON

1. 会员数据统计

1.1 获取指定日期的会员统计

获取某一天的会员数据统计信息。

请求

GET /api/stats/member/date/{date}

路径参数

参数 类型 必填 说明
date string 统计日期,格式:yyyy-MM-dd

请求示例

curl -X GET "http://localhost:8080/api/stats/member/date/2026-06-01"

响应示例

{
  "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 获取日期范围内的会员统计列表

获取指定日期范围内每天的会员统计数据。

请求

GET /api/stats/member/range?startDate=2026-06-01&endDate=2026-06-05

查询参数

参数 类型 必填 说明
startDate string 开始日期,格式:yyyy-MM-dd
endDate string 结束日期,格式:yyyy-MM-dd

请求示例

curl -X GET "http://localhost:8080/api/stats/member/range?startDate=2026-06-01&endDate=2026-06-03"

响应示例

[
  {
    "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 获取会员统计汇总

获取指定日期范围内的会员数据汇总统计。

请求

GET /api/stats/member/summary?startDate=2026-06-01&endDate=2026-06-30

查询参数

参数 类型 必填 说明
startDate string 开始日期,格式:yyyy-MM-dd
endDate string 结束日期,格式:yyyy-MM-dd

请求示例

curl -X GET "http://localhost:8080/api/stats/member/summary?startDate=2026-06-01&endDate=2026-06-06"

响应示例

{
  "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 获取指定日期的预约统计

获取某一天的团课预约数据统计信息。

请求

GET /api/stats/booking/date/{date}

路径参数

参数 类型 必填 说明
date string 统计日期,格式:yyyy-MM-dd

请求示例

curl -X GET "http://localhost:8080/api/stats/booking/date/2026-06-01"

响应示例

{
  "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 获取日期范围内的预约统计列表

获取指定日期范围内每天的预约统计数据。

请求

GET /api/stats/booking/range?startDate=2026-06-01&endDate=2026-06-05

查询参数

参数 类型 必填 说明
startDate string 开始日期,格式:yyyy-MM-dd
endDate string 结束日期,格式:yyyy-MM-dd

请求示例

curl -X GET "http://localhost:8080/api/stats/booking/range?startDate=2026-06-01&endDate=2026-06-03"

响应示例

[
  {
    "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 获取预约统计汇总

获取指定日期范围内的预约数据汇总统计。

请求

GET /api/stats/booking/summary?startDate=2026-06-01&endDate=2026-06-30

查询参数

参数 类型 必填 说明
startDate string 开始日期,格式:yyyy-MM-dd
endDate string 结束日期,格式:yyyy-MM-dd

请求示例

curl -X GET "http://localhost:8080/api/stats/booking/summary?startDate=2026-06-01&endDate=2026-06-06"

响应示例

{
  "startDate": "2026-06-01",
  "endDate": "2026-06-06",
  "totalBookings": 172,
  "cancelledBookings": 16,
  "attendedBookings": 156,
  "cancellationRate": 9.30,
  "attendanceRate": 90.70
}

3. 签到数据统计

3.1 获取签到统计

获取指定日期范围内的签到统计数据。

请求

GET /api/checkIn/statistics

查询参数

参数 类型 必填 说明
startDate string 开始日期,格式:yyyy-MM-dd
endDate string 结束日期,格式:yyyy-MM-dd

请求示例

curl -X GET "http://localhost:8080/api/checkIn/statistics?startDate=2026-06-01&endDate=2026-06-06"

响应示例

{
  "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 获取每日签到统计

获取指定日期范围内每天的签到统计列表。

请求

GET /api/checkIn/daily-stats?startDate=2026-06-01&endDate=2026-06-05

查询参数

参数 类型 必填 说明
startDate string 开始日期,格式:yyyy-MM-dd
endDate string 结束日期,格式:yyyy-MM-dd

请求示例

curl -X GET "http://localhost:8080/api/checkIn/daily-stats?startDate=2026-06-01&endDate=2026-06-03"

响应示例

[
  {
    "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文件。

请求

GET /api/stats/export/member?startDate=2026-06-01&endDate=2026-06-30

查询参数

参数 类型 必填 说明
startDate string 开始日期,格式:yyyy-MM-dd
endDate string 结束日期,格式:yyyy-MM-dd

请求示例

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格式示例

统计日期,新增会员数,活跃会员数,总会员数,男性会员数,女性会员数,购卡人数,平均年龄
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文件。

请求

GET /api/stats/export/booking?startDate=2026-06-01&endDate=2026-06-30

查询参数

参数 类型 必填 说明
startDate string 开始日期,格式:yyyy-MM-dd
endDate string 结束日期,格式:yyyy-MM-dd

请求示例

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格式示例

统计日期,预约总数,取消预约数,实际到场数,取消率(%),到场率(%),热门课程,热门课程预约数,团课总数,满员课程数
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文件。

请求

GET /api/checkIn/records/export?startDate=2026-06-01&endDate=2026-06-30

查询参数

参数 类型 必填 说明
startDate string 开始日期,格式:yyyy-MM-dd
endDate string 结束日期,格式:yyyy-MM-dd

请求示例

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格式示例

签到时间,会员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文件。

请求

GET /api/stats/export/all?startDate=2026-06-01&endDate=2026-06-30

查询参数

参数 类型 必填 说明
startDate string 开始日期,格式:yyyy-MM-dd
endDate string 结束日期,格式:yyyy-MM-dd

请求示例

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格式示例

=== 会员数据统计 ===
统计日期,新增会员数,活跃会员数,总会员数,男性会员数,女性会员数,购卡人数,平均年龄
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. 错误响应

所有接口在发生错误时返回统一的错误格式:

{
  "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
  • 缓存: RedisReactiveRedisTemplate
  • 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:获取单日会员统计

curl -X GET "http://localhost:8080/api/stats/member/date/2026-06-01"

预期结果

{
  "date": "2026-06-01",
  "newMembers": 5,
  "activeMembers": 0,
  "retainedMembers": 0,
  "totalMembers": 19,
  "maleMembers": 10,
  "femaleMembers": 9,
  "cardPurchaseCount": 19,
  "averageAge": 29.5
}

测试2:获取日期范围会员统计

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:获取会员统计汇总

curl -X GET "http://localhost:8080/api/stats/member/summary?startDate=2026-06-01&endDate=2026-06-06"

预期结果

{
  "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:获取单日预约统计

curl -X GET "http://localhost:8080/api/stats/booking/date/2026-06-01"

预期结果

{
  "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:获取日期范围预约统计

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:获取预约统计汇总

curl -X GET "http://localhost:8080/api/stats/booking/summary?startDate=2026-06-01&endDate=2026-06-06"

预期结果

{
  "startDate": "2026-06-01",
  "endDate": "2026-06-06",
  "totalBookings": 172,
  "cancelledBookings": 16,
  "attendedBookings": 156,
  "cancellationRate": 9.30,
  "attendanceRate": 90.70
}

9.2.3 数据导出

测试7:导出会员统计数据

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:导出预约统计数据

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:导出全部统计数据

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:测试单日统计

# 测试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:测试一周统计

# 测试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:测试数据导出

# 导出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:日期格式错误

curl -X GET "http://localhost:8080/api/stats/member/date/2026/06/01"

预期结果HTTP 400 Bad Request


测试11:日期范围无效

curl -X GET "http://localhost:8080/api/stats/member/range?startDate=2026-06-06&endDate=2026-06-01"

预期结果HTTP 400 Bad Request


测试12:日期超出测试数据范围

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}}