提交文件

This commit is contained in:
2026-02-28 15:16:15 +08:00
parent 1a4e50e0a4
commit 44f250f58e
159 changed files with 61268 additions and 0 deletions

View File

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