提交文件
This commit is contained in:
423
.qoder/repowiki/zh/content/API接口文档/统计分析接口.md
Normal file
423
.qoder/repowiki/zh/content/API接口文档/统计分析接口.md
Normal file
@@ -0,0 +1,423 @@
|
||||
# 统计分析接口
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js)
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue)
|
||||
- [docs/api.md](file://docs/api.md)
|
||||
- [docs/详细设计文档.md](file://docs/详细设计文档.md)
|
||||
- [backend/init_db.py](file://backend/init_db.py)
|
||||
- [TEST_REPORT.md](file://TEST_REPORT.md)
|
||||
- [frontend/public/test-api.html](file://frontend/public/test-api.html)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“统计分析与报表接口”的使用者与维护者,系统化梳理后端统计接口、服务层实现、数据模型与前端调用方式,并补充计算逻辑、时间范围选择、聚合方式、同比环比分析、多维交叉分析、数据钻取与筛选、报表导出、缓存策略与性能优化建议,以及移动端适配与响应时间优化思路。文档同时给出接口参数、响应结构与图表数据格式,帮助快速集成与扩展。
|
||||
|
||||
## 项目结构
|
||||
统计分析相关代码分布在后端 API、服务层、模型与前端调用层,配合通用响应与数据模式定义,形成清晰的分层架构。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_API["frontend/src/api/stats.js"]
|
||||
FE_VIEW["frontend/src/views/reports/Reports.vue"]
|
||||
end
|
||||
subgraph "后端"
|
||||
API["backend/app/api/v1/stats.py"]
|
||||
SVC["backend/app/services/stats_service.py"]
|
||||
MODELS["backend/app/models/models.py"]
|
||||
SCHEMAS["backend/app/schemas/schemas.py"]
|
||||
end
|
||||
FE_API --> API
|
||||
FE_VIEW --> FE_API
|
||||
API --> SVC
|
||||
SVC --> MODELS
|
||||
API --> SCHEMAS
|
||||
SVC --> SCHEMAS
|
||||
```
|
||||
|
||||
图示来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L200)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L200)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
|
||||
## 核心组件
|
||||
- 统计 API 路由器:提供 BSC 维度分析、科室绩效统计、趋势分析、周期统计、KPI 仪表盘、收支趋势、科室/员工排名、指标完成度等接口。
|
||||
- 统计服务层:封装 SQL 查询与聚合逻辑,负责跨表联结、条件过滤、分组统计与排序。
|
||||
- 数据模型:定义 BSC 维度、指标类型、评估状态、部门类型等枚举与实体关系。
|
||||
- 前端调用与视图:封装 axios 请求、发起多路并发请求、渲染 ECharts 图表与表格。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L61)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L112-L308)
|
||||
|
||||
## 架构总览
|
||||
统计接口采用 FastAPI + SQLAlchemy 异步 ORM 的分层设计,前端通过统一的 API 封装进行调用,后端服务层负责复杂聚合与排序,最终以统一响应体返回。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端报表页面"
|
||||
participant API as "统计API(stats.py)"
|
||||
participant SVC as "统计服务(stats_service.py)"
|
||||
participant DB as "数据库(异步会话)"
|
||||
FE->>API : GET /stats/department?period_year&period_month
|
||||
API->>SVC : get_department_stats(...)
|
||||
SVC->>DB : 执行SQL聚合(按科室分组)
|
||||
DB-->>SVC : 聚合结果集
|
||||
SVC-->>API : 汇总后的科室统计列表
|
||||
API-->>FE : 统一响应体(data : 列表)
|
||||
```
|
||||
|
||||
图示来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L36-L49)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### BSC 维度分析
|
||||
- 接口:GET /stats/bsc-dimension
|
||||
- 功能:按财务、客户、内部流程、学习与成长四个维度统计得分、权重、指标数量与平均分。
|
||||
- 时间范围:支持按年/月过滤;未指定时返回全部。
|
||||
- 聚合方式:按维度分组,计算总分=Σ(明细得分×指标权重),总权重=Σ权重,平均分=总分/总权重。
|
||||
- 筛选条件:可按科室过滤。
|
||||
- 响应结构:包含维度字典与统计周期字符串。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L33)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
|
||||
### 科室绩效统计
|
||||
- 接口:GET /stats/department
|
||||
- 功能:返回各科室的员工数、总分、平均分、最高/最低分、员工得分列表,并按平均分降序排列。
|
||||
- 时间范围:按年/月过滤;未指定则返回全部。
|
||||
- 聚合方式:按科室分组,累计加权得分,计算平均分,记录员工明细。
|
||||
- 响应结构:数组,元素包含科室信息、统计指标与员工列表。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L36-L49)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
|
||||
### 趋势分析(月度)
|
||||
- 接口:GET /stats/trend
|
||||
- 功能:按最近 N 个月的趋势统计,支持按科室过滤。
|
||||
- 时间范围:若未指定年份,默认使用当前年;按最近 N 个月聚合,跨年处理。
|
||||
- 聚合方式:按月分组,计算平均总分、平均加权分与记录数。
|
||||
- 响应结构:数组,元素包含月份、平均分与计数。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L52-L70)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L149-L199)
|
||||
|
||||
### 周期统计
|
||||
- 接口:GET /stats/period
|
||||
- 功能:返回指定周期的汇总统计(总科室数、总员工数、平均分),并包含各科室明细。
|
||||
- 时间范围:若未指定年/月,默认使用当前年/月。
|
||||
- 聚合方式:对当期科室统计结果做二次汇总。
|
||||
- 响应结构:包含周期字符串、汇总指标与明细数组。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L93-L125)
|
||||
|
||||
### KPI 仪表盘
|
||||
- 接口:GET /stats/kpi-gauges
|
||||
- 功能:返回关键指标仪表盘数据(床位使用率、药占比、材料占比、患者满意度等)。
|
||||
- 时间范围:若未指定年/月,默认使用当前年/月。
|
||||
- 注意:当前为演示数据,后续需替换为真实数据库查询。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L128-L153)
|
||||
|
||||
### 收支趋势
|
||||
- 接口:GET /stats/finance-trend
|
||||
- 功能:返回最近 N 个月的收入、支出、利润趋势。
|
||||
- 时间范围:按最近 N 个月聚合。
|
||||
- 注意:当前为演示数据,后续需替换为真实数据库查询。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L156-L183)
|
||||
|
||||
### 科室绩效排名
|
||||
- 接口:GET /stats/department-ranking
|
||||
- 功能:返回指定周期内科室的平均分排名前 N。
|
||||
- 时间范围:若未指定年/月,默认使用当前年/月。
|
||||
- 聚合方式:基于科室统计结果取前 N。
|
||||
- 响应结构:数组,元素为科室排名数据。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L186-L207)
|
||||
|
||||
### 员工绩效排名
|
||||
- 接口:GET /stats/ranking
|
||||
- 功能:返回指定周期内员工的加权得分排名前 N。
|
||||
- 时间范围:必须提供年/月。
|
||||
- 聚合方式:按加权得分降序取前 N。
|
||||
- 响应结构:数组,元素包含员工信息与排名。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L210-L224)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L202-L244)
|
||||
|
||||
### 指标完成度
|
||||
- 接口:GET /stats/completion
|
||||
- 功能:返回指标的平均分、最大/最小分、完成率与统计数量。
|
||||
- 时间范围:按年/月过滤;可按指标 ID 过滤。
|
||||
- 聚合方式:按指标分组,计算平均分与完成率=平均分/目标值×100(上限 100)。
|
||||
- 响应结构:包含指标数组。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L227-L241)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L247-L299)
|
||||
|
||||
### 预警数据
|
||||
- 接口:GET /stats/alerts
|
||||
- 功能:返回预警数据(低分员工、未完成考核科室、异常数据)。
|
||||
- 注意:当前为演示数据,后续需替换为真实数据库查询。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L73-L90)
|
||||
|
||||
## 依赖关系分析
|
||||
- API 层依赖服务层,服务层依赖模型层与异步数据库会话。
|
||||
- 前端通过封装的 API 模块调用后端接口,视图组件负责并发请求与图表渲染。
|
||||
- 统一响应体与 Pydantic 模式用于前后端契约约束。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StatsAPI {
|
||||
+get_bsc_dimension_stats()
|
||||
+get_department_stats()
|
||||
+get_trend_stats()
|
||||
+get_period_stats()
|
||||
+get_kpi_gauges()
|
||||
+get_finance_trend()
|
||||
+get_department_ranking()
|
||||
+get_ranking_stats()
|
||||
+get_completion_stats()
|
||||
}
|
||||
class StatsService {
|
||||
+get_bsc_dimension_stats()
|
||||
+get_department_stats()
|
||||
+get_trend_stats()
|
||||
+get_ranking_stats()
|
||||
+get_completion_stats()
|
||||
}
|
||||
class Models {
|
||||
+Assessment
|
||||
+AssessmentDetail
|
||||
+Indicator
|
||||
+Department
|
||||
+Staff
|
||||
+BSCDimension
|
||||
+AssessmentStatus
|
||||
}
|
||||
StatsAPI --> StatsService : "调用"
|
||||
StatsService --> Models : "查询/聚合"
|
||||
```
|
||||
|
||||
图示来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L200)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L200)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 使用分组与聚合函数减少往返,避免在 Python 层重复计算。
|
||||
- 对常用过滤条件建立索引(如评估状态、周期、科室等)。
|
||||
- 并发与缓存
|
||||
- 前端并发请求多个统计接口,减少等待时间。
|
||||
- 对热点报表(如周期统计)可引入 Redis 缓存,设置合理 TTL。
|
||||
- 分页与限制
|
||||
- 排名类接口限制返回数量(如 limit),避免大结果集。
|
||||
- 前端渲染
|
||||
- 图表仅在数据就绪后初始化,避免重复渲染。
|
||||
- 响应时间优化建议
|
||||
- 后端:开启连接池、使用异步 ORM、避免 N+1 查询。
|
||||
- 前端:懒加载图表、骨架屏、分页加载。
|
||||
|
||||
[本节为通用性能指导,不直接分析具体文件]
|
||||
|
||||
## 故障排查指南
|
||||
- 常见问题
|
||||
- 参数缺失:确保提供年/月参数或允许默认使用当前年/月。
|
||||
- 数据为空:确认数据库中存在对应周期的评估数据。
|
||||
- 权限问题:确保携带有效 JWT Token。
|
||||
- 快速定位
|
||||
- 使用内置测试页面与后端日志定位接口状态与错误信息。
|
||||
- 前端 Network 标签查看失败请求详情。
|
||||
- 建议步骤
|
||||
- 清除浏览器缓存与本地存储,硬刷新页面。
|
||||
- 重启后端与前端服务,确认端口占用与代理配置。
|
||||
|
||||
章节来源
|
||||
- [frontend/public/test-api.html](file://frontend/public/test-api.html#L113-L129)
|
||||
- [TEST_REPORT.md](file://TEST_REPORT.md#L62-L95)
|
||||
|
||||
## 结论
|
||||
统计分析接口围绕“BSC 维度、科室/员工绩效、趋势与排名、指标完成度”等核心主题,提供了清晰的分层实现与统一响应格式。结合前端并发请求与 ECharts 图表渲染,能够满足日常报表与移动端展示需求。后续可在真实数据接入、缓存策略与性能优化方面持续改进。
|
||||
|
||||
[本节为总结性内容,不直接分析具体文件]
|
||||
|
||||
## 附录
|
||||
|
||||
### 接口清单与参数说明
|
||||
- BSC 维度分析
|
||||
- 方法:GET
|
||||
- 路径:/stats/bsc-dimension
|
||||
- 查询参数:department_id(可选)、period_year、period_month
|
||||
- 响应:包含维度字典与周期字符串
|
||||
- 科室绩效统计
|
||||
- 方法:GET
|
||||
- 路径:/stats/department
|
||||
- 查询参数:period_year、period_month
|
||||
- 响应:科室统计数组
|
||||
- 趋势分析
|
||||
- 方法:GET
|
||||
- 路径:/stats/trend
|
||||
- 查询参数:department_id(可选)、period_year(可选)、months(默认 6,范围 1-24)
|
||||
- 响应:按月聚合的趋势数组
|
||||
- 周期统计
|
||||
- 方法:GET
|
||||
- 路径:/stats/period
|
||||
- 查询参数:period_year(可选)、period_month(可选)
|
||||
- 响应:周期汇总与明细数组
|
||||
- KPI 仪表盘
|
||||
- 方法:GET
|
||||
- 路径:/stats/kpi-gauges
|
||||
- 查询参数:period_year(可选)、period_month(可选)
|
||||
- 响应:关键指标仪表盘数据
|
||||
- 收支趋势
|
||||
- 方法:GET
|
||||
- 路径:/stats/finance-trend
|
||||
- 查询参数:months(默认 6,范围 1-24)
|
||||
- 响应:收入/支出/利润趋势数组
|
||||
- 科室绩效排名
|
||||
- 方法:GET
|
||||
- 路径:/stats/department-ranking
|
||||
- 查询参数:period_year(可选)、period_month(可选)、limit(默认 10,范围 1-100)
|
||||
- 响应:科室排名数组
|
||||
- 员工绩效排名
|
||||
- 方法:GET
|
||||
- 路径:/stats/ranking
|
||||
- 查询参数:period_year、period_month、limit(默认 10,范围 1-100)
|
||||
- 响应:员工排名数组
|
||||
- 指标完成度
|
||||
- 方法:GET
|
||||
- 路径:/stats/completion
|
||||
- 查询参数:indicator_id(可选)、period_year、period_month
|
||||
- 响应:指标完成度数组
|
||||
- 预警数据
|
||||
- 方法:GET
|
||||
- 路径:/stats/alerts
|
||||
- 查询参数:limit(默认 10,范围 1-100)
|
||||
- 响应:预警数据对象
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L241)
|
||||
- [docs/api.md](file://docs/api.md#L471-L538)
|
||||
|
||||
### 响应数据结构与图表数据格式
|
||||
- 统一响应体
|
||||
- 字段:code、message、data(根据接口不同而异)
|
||||
- 科室统计
|
||||
- 字段:department_id、department_name、staff_count、avg_score、total_bonus、staff_list
|
||||
- 趋势数据
|
||||
- 字段:month、avg_score、avg_weighted_score、count
|
||||
- KPI 仪表盘
|
||||
- 字段:bed_usage_rate、drug_ratio、material_ratio、satisfaction_rate
|
||||
- 收支趋势
|
||||
- 字段:period、income、expense、profit
|
||||
- 排名数据
|
||||
- 字段:department 或 staff 的基本信息、score、weighted_score、rank
|
||||
- 指标完成度
|
||||
- 字段:indicator_id、indicator_name、indicator_code、target_value、max_score、avg_score、completion_rate、count
|
||||
|
||||
章节来源
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L347-L375)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L128-L183)
|
||||
|
||||
### 计算逻辑与时间范围选择
|
||||
- BSC 维度分析
|
||||
- 总分=Σ(明细得分×指标权重),总权重=Σ权重,平均分=总分/总权重
|
||||
- 科室统计
|
||||
- 平均分=总加权分/员工数;最高/最低分在员工列表中比较得出
|
||||
- 趋势分析
|
||||
- 若未指定年份,默认使用当前年;按最近 N 个月聚合,跨年处理
|
||||
- 指标完成度
|
||||
- 完成率=平均分/目标值×100,上限 100
|
||||
- 同比环比分析
|
||||
- 可通过前端按月序列与后端趋势接口实现同比(同月去年)与环比(相邻月份)对比
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L149-L199)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L247-L299)
|
||||
|
||||
### 多维度交叉分析、数据钻取与筛选
|
||||
- 多维度:BSC 维度、科室类型、指标类型、评估状态等
|
||||
- 数据钻取:从周期统计到科室明细,再到员工明细
|
||||
- 筛选条件:按年/月、科室、指标 ID、状态等
|
||||
- 前端实现:报表页面通过日期选择器与并发请求实现钻取与筛选
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
|
||||
### 报表导出与移动端适配
|
||||
- 报表导出:建议在前端将 ECharts 图表导出为 PNG/SVG,或将表格数据导出为 Excel/CSV
|
||||
- 移动端适配:图表容器自适应窗口大小,表格采用紧凑布局与分页加载
|
||||
- 响应时间优化:后端异步查询、前端懒加载与骨架屏、缓存热点数据
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L173-L295)
|
||||
|
||||
### 数据模型与枚举参考
|
||||
- BSC 维度:financial、customer、internal_process、learning_growth
|
||||
- 指标类型:quality、quantity、efficiency、service、cost
|
||||
- 评估状态:draft、submitted、reviewed、finalized、rejected
|
||||
- 科室类型:多种类型枚举,覆盖临床、医技、行政、护理、后勤等
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L61)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [docs/详细设计文档.md](file://docs/详细设计文档.md#L85-L120)
|
||||
Reference in New Issue
Block a user