17 KiB
17 KiB
数据分析报表
**本文引用的文件** - [后端统计API stats.py](file://backend/app/api/v1/stats.py) - [统计服务 stats_service.py](file://backend/app/services/stats_service.py) - [前端报表页面 Reports.vue](file://frontend/src/views/reports/Reports.vue) - [前端统计API封装 stats.js](file://frontend/src/api/stats.js) - [数据模型 models.py](file://backend/app/models/models.py) - [数据库连接 database.py](file://backend/app/core/database.py) - [API路由器 __init__.py](file://backend/app/api/v1/__init__.py) - [数据库设计文档 database.md](file://docs/database.md) - [初始化指标模板 init_templates.py](file://backend/app/scripts/init_templates.py) - [初始化指标模板脚本 init_indicator_templates.py](file://backend/init_indicator_templates.py)目录
简介
本文件面向“医院绩效系统”的数据分析报表模块,系统化阐述BSC维度分析、科室绩效统计、趋势分析、绩效排名、指标完成度等核心功能。文档覆盖数据聚合算法、图表展示组件、报表生成机制、多维度统计分析、数据可视化与导出能力,并解释数据更新机制、缓存策略与性能优化方案。同时提供分析指标定义、计算方法与展示样式说明,帮助开发者与运维人员快速理解并扩展系统能力。
项目结构
报表模块由后端FastAPI接口、SQLAlchemy异步ORM服务层、前端Vue组件与ECharts图表构成,遵循前后端分离与职责清晰的设计原则。
graph TB
subgraph "前端"
FE_Report["Reports.vue<br/>报表页面"]
FE_API["stats.js<br/>API封装"]
end
subgraph "后端"
BE_Router["API路由器<br/>__init__.py"]
BE_StatsAPI["统计API<br/>stats.py"]
BE_Service["统计服务<br/>stats_service.py"]
BE_Models["数据模型<br/>models.py"]
BE_DB["数据库连接<br/>database.py"]
end
FE_Report --> FE_API
FE_API --> BE_Router
BE_Router --> BE_StatsAPI
BE_StatsAPI --> BE_Service
BE_Service --> BE_Models
BE_Service --> BE_DB
图表来源
- API路由器 init.py
- 后端统计API stats.py
- 统计服务 stats_service.py
- 数据模型 models.py
- 数据库连接 database.py
- 前端报表页面 Reports.vue
- 前端统计API封装 stats.js
章节来源
- API路由器 init.py
- 后端统计API stats.py
- 统计服务 stats_service.py
- 数据模型 models.py
- 数据库连接 database.py
- 前端报表页面 Reports.vue
- 前端统计API封装 stats.js
核心组件
- 统计API接口:提供BSC维度分析、科室绩效统计、趋势分析、绩效排名、指标完成度、周期统计、关键指标仪表盘、收支趋势等接口。
- 统计服务层:封装复杂聚合逻辑,负责SQL查询、分组统计、跨表联接与结果组装。
- 数据模型:定义科室、员工、指标、考核、明细、工资等实体及其关系。
- 前端报表页面:集成ECharts图表,支持多视图联动与交互式筛选。
- 数据库连接:异步SQLAlchemy引擎与会话管理,确保并发安全与事务一致性。
章节来源
架构总览
后端采用FastAPI + SQLAlchemy异步ORM,前端使用Vue + ECharts,通过REST接口进行数据交互。统计服务层对多表进行联接与聚合,输出标准化数据结构供前端渲染。
sequenceDiagram
participant FE as "前端报表页面"
participant API as "统计API(stats.py)"
participant SVC as "统计服务(stats_service.py)"
participant DB as "数据库连接(database.py)"
FE->>API : GET /stats/department?year&month
API->>SVC : get_department_stats(db, year, month)
SVC->>DB : 异步SQL查询(联接 : departments/staff/assessments)
DB-->>SVC : 聚合结果集
SVC-->>API : 标准化科室统计列表
API-->>FE : JSON响应(data : 列表)
图表来源
详细组件分析
BSC维度分析
- 功能说明:按财务、客户、内部流程、学习成长四个维度统计得分、权重、指标数量与平均分。
- 数据聚合算法:
- 过滤条件:仅统计最终确认状态的考核记录;可按年、月、科室过滤。
- 聚合逻辑:按维度分组,计算加权总分与总权重,得到平均分。
- 展示样式:返回维度字典与统计周期字符串,前端可直接映射到图表或表格。
flowchart TD
Start(["开始"]) --> BuildCond["构建过滤条件<br/>状态=FINALIZED<br/>可选: 年/月/科室"]
BuildCond --> JoinTables["联接: 指标→明细→考核"]
JoinTables --> GroupByDim["按BSC维度分组"]
GroupByDim --> CalcAvg["计算: 加权总分/总权重"]
CalcAvg --> Output["输出: 维度统计+周期"]
Output --> End(["结束"])
图表来源
章节来源
科室绩效统计
- 功能说明:按科室汇总员工得分,计算平均分、最大/最小分、员工列表,并按平均分降序排列。
- 数据聚合算法:
- 聚合字段:科室ID、名称、类型、员工数、总分、平均分、最大/最小分、员工明细。
- 排序规则:按平均分降序。
- 展示样式:前端表格展示科室统计,支持奖金列(若存在)。
flowchart TD
S(["开始"]) --> Filter["过滤: FINALIZED+年+月"]
Filter --> Join["联接: 科室→员工→考核"]
Join --> Group["按科室分组聚合"]
Group --> Compute["计算: 员工数/总分/平均分/最值"]
Compute --> Sort["按平均分降序"]
Sort --> Out(["输出: 科室统计列表"])
Out --> E(["结束"])
图表来源
章节来源
趋势分析(月度)
- 功能说明:按月统计平均分与加权平均分,支持指定最近N个月与按科室过滤。
- 数据聚合算法:
- 时间范围:若指定年份,计算最近months个月(跨年处理)。
- 聚合字段:月份、平均分、加权平均分、记录数。
- 展示样式:折线/柱状组合图,双轴显示平均分与奖金(若存在)。
flowchart TD
TStart(["开始"]) --> TFilter["过滤: FINALIZED+年/月范围"]
TFilter --> TJoin["联接: 员工→考核"]
TJoin --> TGroup["按月分组聚合"]
TGroup --> TAgg["计算: 平均分/加权平均分/数量"]
TAgg --> TSort["按月升序"]
TSort --> TOut(["输出: 月度趋势列表"])
TOut --> TE(["结束"])
图表来源
章节来源
绩效排名
- 功能说明:提供员工与科室的绩效排名,支持限制返回条数。
- 数据聚合算法:
- 员工排名:按加权得分降序取前N名。
- 科室排名:先按科室汇总平均分,再整体降序取前N名。
- 展示样式:表格排名,突出前三名。
sequenceDiagram
participant API as "统计API"
participant SVC as "统计服务"
participant DB as "数据库"
API->>SVC : get_ranking_stats(year, month, limit)
SVC->>DB : 查询最终确认的考核记录
DB-->>SVC : 结果集(员工ID/姓名/部门/得分)
SVC-->>API : 排名列表(含排名序号)
API-->>API : 返回JSON
图表来源
章节来源
指标完成度
- 功能说明:按指标统计平均分、最大/最小分、完成率与样本数。
- 数据聚合算法:
- 过滤条件:最终确认状态;可按年、月、指标过滤。
- 计算完成率:平均分/目标值×100%,上限100%。
- 展示样式:指标列表卡片,完成率进度条或数值。
章节来源
周期统计与关键指标仪表盘
- 周期统计:汇总当期总科室数、总员工数、平均分等。
- 关键指标仪表盘:床位使用率、药占比、材料占比、患者满意度等(演示数据)。
- 展示样式:概览卡片与仪表盘组件。
章节来源
收支趋势
- 功能说明:按月统计收入、支出、利润趋势。
- 展示样式:折线图,支持选择最近6/12个月。
章节来源
前端报表页面与图表
- 页面组件:筛选器、统计概览卡片、科室对比图、绩效分布饼图、科室统计表、员工排名表。
- 图表实现:ECharts初始化、窗口自适应、双轴图表、饼图标签与强调。
- 数据加载:并行请求多个接口,统一更新图表。
sequenceDiagram
participant View as "Reports.vue"
participant API as "stats.js"
participant BE as "后端统计API"
View->>View : 选择统计周期(年-月)
View->>API : 并行调用 : 周期统计/科室统计/员工排名
API->>BE : GET /stats/period
API->>BE : GET /stats/department
API->>BE : GET /stats/ranking
BE-->>API : JSON响应
API-->>View : 数据对象
View->>View : 更新ECharts图表
图表来源
章节来源
依赖关系分析
classDiagram
class StatsAPI {
+get_bsc_dimension_stats()
+get_department_stats()
+get_trend_stats()
+get_ranking_stats()
+get_completion_stats()
+get_period_stats()
+get_kpi_gauges()
+get_finance_trend()
+get_department_ranking()
}
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
}
class Database {
+AsyncEngine
+AsyncSession
}
StatsAPI --> StatsService : "调用"
StatsService --> Models : "查询/联接"
StatsService --> Database : "使用会话"
图表来源
章节来源
性能考虑
- 异步ORM:使用SQLAlchemy异步引擎与会话,提升并发吞吐与响应速度。
- 索引优化:模型中已为常用查询字段建立索引(如考核记录的年月、状态、员工ID等),建议结合实际查询模式评估是否需要复合索引。
- 聚合优化:统计服务对大表联接与分组聚合,建议:
- 限定查询时间范围(如最近6/12个月)。
- 对高频查询增加物化视图或缓存中间结果。
- 使用LIMIT限制排名条数,避免超大数据集排序。
- 前端优化:ECharts实例复用与窗口resize监听,减少重绘开销;图表数据按需更新,避免全量刷新。
- 缓存策略:可引入Redis缓存热点报表(如当月周期统计、Top N排名),设置合理TTL与失效策略,降低数据库压力。
- 数据更新机制:建议在考核状态变更时触发增量更新任务,或定时任务批量刷新报表缓存。
[本节为通用性能指导,不直接分析具体文件]
故障排查指南
- 接口返回空数据或异常:
- 检查过滤条件(年、月、科室)是否正确传入。
- 确认考核状态为最终确认(FINALIZED)。
- 图表不显示或空白:
- 检查ECharts实例初始化与容器尺寸。
- 确认数据格式与字段名一致(如avg_score、total_bonus)。
- 数据库连接问题:
- 查看异步会话生命周期与异常回滚逻辑。
- 检查数据库URL与连接池配置。
- 指标模板缺失:
- 确认初始化脚本已执行,模板与指标数据完整。
章节来源
结论
本模块以清晰的分层架构实现了BSC维度分析、科室统计、趋势与排名等核心报表功能。通过异步ORM与ECharts的结合,既保证了性能也提供了良好的用户体验。建议后续完善缓存与物化视图、扩展更多关键指标仪表盘与导出能力,并持续优化索引与查询计划以应对更大规模数据。
[本节为总结性内容,不直接分析具体文件]
附录
分析指标定义与计算方法
- BSC维度得分:按指标权重加权求和,再除以总权重得到平均分。
- 科室平均分:科室内员工加权得分的算术平均。
- 趋势数据:按月分组的平均分与加权平均分。
- 指标完成率:平均分/目标值×100%,上限100%。
- 关键指标(演示):床位使用率、药占比、材料占比、患者满意度。
章节来源
- 统计服务 stats_service.py
- 统计服务 stats_service.py
- 统计服务 stats_service.py
- 统计服务 stats_service.py
- 后端统计API stats.py
数据模型与索引
- 关键实体:Department、Staff、Assessment、AssessmentDetail、Indicator、SalaryRecord。
- 索引位置:考核记录、员工、指标、科室等表均有相应索引,加速查询与排序。
章节来源
指标模板与BSC维度
- 模板类型:通用模板与按科室类型的模板(如手术、非手术、医技、护理、行政等)。
- 维度权重:模板可配置财务、客户、内部流程、学习成长维度权重。
章节来源