# 考核数据分析
**本文档引用的文件**
- [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)
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py)
- [docs/详细设计文档.md](file://docs/详细设计文档.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向医院绩效系统的“考核数据分析”功能,系统性阐述基于考核数据的统计分析能力,涵盖按科室、按人员、按时间段的绩效统计;BSC四个维度的分析方法、趋势分析与排名统计;数据聚合算法、图表展示与报表生成机制;以及分析指标、计算公式与可视化方案,并给出数据准确性保证与性能优化策略。
## 项目结构
后端采用 FastAPI + SQLAlchemy 异步 ORM 架构,前端使用 Vue3 + Element Plus + ECharts。统计分析功能由 API 层、服务层与数据模型层协同完成,前端通过统一的统计接口进行数据拉取与可视化渲染。
```mermaid
graph TB
FE["前端视图
Reports.vue / Dashboard.vue"] --> API["FastAPI 统计接口
stats.py"]
API --> SVC["统计服务层
stats_service.py"]
SVC --> DB["数据库模型
models.py"]
DB --> SQL["SQLAlchemy 异步查询"]
FE --> FE_API["前端统计接口封装
stats.js"]
```
图表来源
- [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-L438)
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L819)
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
章节来源
- [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-L438)
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L819)
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
## 核心组件
- 统计 API:提供 BSC 维度分析、科室统计、趋势分析、排名、指标完成度等接口。
- 统计服务:封装 SQL 聚合逻辑,负责按条件过滤、分组统计与排序。
- 数据模型:定义 Assessment、AssessmentDetail、Indicator、Department、Staff 等实体及其关系。
- 前端视图:集成 ECharts 进行图表渲染,提供周期选择、联动查询与可视化展示。
- 指标模板:内置多种科室类型的 BSC 指标模板,支撑不同维度权重与评分方法。
章节来源
- [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#L62-L203)
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L112-L309)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L24-L186)
## 架构总览
统计分析采用“接口-服务-模型-数据库”的分层架构,前端通过统一接口获取数据并渲染图表,后端通过异步查询与聚合函数实现高性能统计。
```mermaid
sequenceDiagram
participant FE as "前端视图"
participant API as "统计接口(stats.py)"
participant SVC as "统计服务(stats_service.py)"
participant DB as "数据库模型(models.py)"
FE->>API : GET /stats/bsc-dimension
API->>SVC : get_bsc_dimension_stats(...)
SVC->>DB : 异步查询 + 聚合(group_by)
DB-->>SVC : 维度统计结果
SVC-->>API : 维度得分/权重/指标数
API-->>FE : JSON 响应
FE->>API : GET /stats/department
API->>SVC : get_department_stats(...)
SVC->>DB : 异步查询 + 汇总(group_by)
DB-->>SVC : 科室统计结果
SVC-->>API : 排序后的科室列表
API-->>FE : JSON 响应
```
图表来源
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L125)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L146)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
## 详细组件分析
### BSC 维度分析
- 功能概述:按财务、客户、内部流程、学习成长四个维度统计得分、权重与指标数量,并计算平均得分。
- 数据来源:Assessment、AssessmentDetail、Indicator、Staff。
- 过滤条件:支持按年度、月份与科室过滤;仅统计已确认状态的考核记录。
- 聚合逻辑:按维度 group_by,计算维度总分(指标得分×权重求和)、总权重、指标数量,并推导平均得分。
```mermaid
flowchart TD
Start(["开始"]) --> BuildCond["构建查询条件
状态=FINALIZED + 年/月/科室过滤"]
BuildCond --> Query["SQL 聚合查询
按维度分组"]
Query --> Group["按维度汇总
总分/权重/指标数"]
Group --> CalcAvg["计算平均得分=总分/权重"]
CalcAvg --> Return["返回维度统计结果"]
```
图表来源
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
章节来源
- [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)
### 科室绩效统计
- 功能概述:按科室汇总员工得分,计算科室平均分、最高分、最低分、员工列表,并按平均分降序排序。
- 数据来源:Assessment、Staff、Department。
- 聚合逻辑:先按科室分组统计员工数与总分,再计算平均分,最后按平均分排序。
```mermaid
flowchart TD
S(["开始"]) --> Filter["过滤已确认考核记录
按年/月过滤"]
Filter --> Join["连接 Staff/Department"]
Join --> GroupByDept["按科室分组统计
员工数/总分/员工列表"]
GroupByDept --> ComputeAvg["计算平均分=总分/员工数"]
ComputeAvg --> Sort["按平均分降序排序"]
Sort --> Output["输出科室统计列表"]
```
图表来源
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L110)
章节来源
- [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#L74-L146)
### 趋势分析(月度)
- 功能概述:按月统计平均得分与加权得分,支持跨年份的最近 N 个月趋势。
- 数据来源:Assessment。
- 聚合逻辑:按月分组,计算平均分与样本数,按月升序排列。
```mermaid
flowchart TD
TStart(["开始"]) --> YearFilter["按年/月过滤
或使用当前年份"]
YearFilter --> MonthRange["计算起止月份
支持跨年"]
MonthRange --> GroupMonth["按月分组统计
平均分/样本数"]
GroupMonth --> Order["按月升序排列"]
Order --> TOut["返回月度趋势数据"]
```
图表来源
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
章节来源
- [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#L148-L199)
### 绩效排名(科室/员工)
- 员工排名:按加权得分降序取前 N 名,附带排名序号。
- 科室排名:基于科室平均分降序取前 N 名。
- 数据来源:Assessment、Staff、Department。
```mermaid
sequenceDiagram
participant FE as "前端"
participant API as "统计接口"
participant SVC as "统计服务"
participant DB as "数据库"
FE->>API : GET /stats/ranking?limit=N
API->>SVC : get_ranking_stats(...)
SVC->>DB : 查询已确认考核记录并排序
DB-->>SVC : 员工排名结果
SVC-->>API : 带排名序号的列表
API-->>FE : JSON 响应
```
图表来源
- [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#L201-L244)
章节来源
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L186-L207)
- [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#L201-L244)
### 指标完成度统计
- 功能概述:按指标统计平均分、最大/最小分、完成率(平均分/目标值×100),并限制完成率上限为 100%。
- 数据来源:AssessmentDetail、Indicator。
- 聚合逻辑:按指标分组统计,计算完成率并返回指标列表。
```mermaid
flowchart TD
CStart(["开始"]) --> CFilter["过滤已确认考核记录
可按年/月/指标过滤"]
CFilter --> CGroup["按指标分组统计
平均分/最大分/最小分/样本数"]
CGroup --> CRate["计算完成率=平均分/目标值×100
上限100%"]
CRate --> COut["返回指标完成度列表"]
```
图表来源
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L246-L299)
章节来源
- [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#L246-L299)
### 前端可视化与报表生成
- 报表视图 Reports.vue:周期统计概览、科室对比柱状图、绩效分布饼图、科室统计表格、员工排名表格。
- 仪表盘 Dashboard.vue:趋势折线、科室排名条形图、财务趋势、KPI 仪表盘、预警数据。
- ECharts 渲染:支持响应式布局与动态刷新,图表联动查询。
```mermaid
graph TB
subgraph "前端视图"
R["Reports.vue
周期统计/科室对比/排名"]
D["Dashboard.vue
趋势/KPI/预警"]
end
subgraph "接口封装"
FA["stats.js
getDepartmentStats/getTrendData/..."]
end
R --> FA
D --> FA
```
图表来源
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L112-L309)
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L819)
- [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)
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L819)
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
## 依赖关系分析
- 统计接口依赖统计服务,统计服务依赖数据模型与 SQLAlchemy 异步查询。
- 前端视图依赖接口封装,接口封装依赖后端统计接口。
- 指标模板提供维度权重与评分方法,支撑 BSC 维度分析与指标完成度计算。
```mermaid
graph LR
API["stats.py"] --> SVC["stats_service.py"]
SVC --> MODELS["models.py"]
FE_VIEWS["Reports.vue / Dashboard.vue"] --> FE_API["stats.js"]
FE_API --> API
MODELS --> INIT_TPL["init_templates.py"]
```
图表来源
- [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-L438)
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L819)
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L1-L276)
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L203)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L24-L186)
## 性能考虑
- 异步查询:使用 SQLAlchemy 异步引擎与会话,减少阻塞,提升并发处理能力。
- 索引优化:模型中为常用查询字段建立索引(如 staff/dept/status/period),降低查询成本。
- 聚合优化:在服务层使用 SQL 聚合函数(sum/count/avg/group_by)一次性完成统计,避免多次往返。
- 分页与限制:前端接口支持分页与数量限制,避免一次性传输大量数据。
- 缓存策略:对于静态模板与权重配置可在应用启动时缓存,减少重复读取。
- 数据分区:历史数据可按年/月分区存储,便于趋势分析与归档清理。
## 故障排除指南
- 接口返回空数据
- 检查过滤条件(年/月/科室)是否正确,确认存在已确认状态的考核记录。
- 确认前端传参格式与范围(如月份 1-12)。
- 统计结果异常
- 核对指标权重与目标值是否配置正确,确保完成率计算逻辑生效。
- 检查是否存在一票否决指标导致得分异常。
- 图表渲染问题
- 确认 ECharts 初始化与容器尺寸,监听窗口 resize 事件。
- 检查数据结构与键名一致性(如 avg_score、total_bonus)。
章节来源
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L246-L299)
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L173-L295)
## 结论
本系统围绕 BSC 四维度与 KPI 指标,提供了完整的统计分析能力:按科室与人员的绩效统计、趋势分析与排名、指标完成度与可视化展示。通过异步查询与聚合优化,保障了性能与准确性;通过前端 ECharts 的丰富图表,提升了数据洞察力。建议后续进一步完善预警机制与报表导出功能,持续优化数据质量与用户体验。
## 附录
### 分析指标与计算公式
- BSC 维度得分
- 维度总分 = Σ(指标得分 × 指标权重)
- 维度平均分 = 维度总分 / 维度总权重
- 科室平均分
- 科室平均分 = 科室总分 / 科室员工数
- 指标完成度
- 完成率 = min(平均分 / 目标值 × 100%, 100%)
章节来源
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L20-L72)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L246-L299)
- [docs/详细设计文档.md](file://docs/详细设计文档.md#L312-L401)
### 可视化展示方案
- 科室对比柱状图:X 轴科室名称,Y 轴平均得分与右侧奖金折线。
- 绩效分布饼图:按等级划分(优秀/良好/合格/不合格)。
- 趋势折线图:月度平均得分与样本数。
- KPI 仪表盘:床位使用率、药占比、材料占比、患者满意度等关键指标。
章节来源
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L183-L295)
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L741-L807)
### 数据准确性保证
- 状态约束:仅统计已确认状态的考核记录,避免草稿/审核阶段数据干扰。
- 权重与目标值校验:模板初始化时写入权重与目标值,确保计算一致性。
- 一票否决:对严重质量与安全指标设置否决标记,确保结果真实可靠。
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L24-L78)