提交文件

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,497 @@
# 批量创建功能
<cite>
**本文档引用的文件**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
- [backend/app/models/models.py](file://backend/app/models/models.py)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
批量创建功能是医院绩效管理系统中的核心特性之一,允许管理员和经理用户一次性为指定科室的所有在职员工创建考核记录。该功能支持按考核周期(年度/月份)和指标模板进行批量生成,显著提高了绩效管理的工作效率。
本文档详细介绍了批量创建考核记录的完整流程,包括科室选择、考核周期设置、指标模板选择和批量生成机制。同时涵盖了数据验证规则、重复检查逻辑、异常处理策略、性能优化、并发控制和事务管理等方面的内容。
## 项目结构
医院绩效系统采用前后端分离的架构设计后端使用FastAPI框架前端使用Vue.js框架。批量创建功能涉及以下关键文件
```mermaid
graph TB
subgraph "前端层"
FE1[Assessments.vue<br/>批量创建界面]
FE2[assessment.js<br/>API调用封装]
end
subgraph "后端层"
BE1[assessments.py<br/>API路由]
BE2[assessment_service.py<br/>业务逻辑]
BE3[models.py<br/>数据模型]
end
subgraph "数据库层"
DB1[Assessment<br/>考核记录表]
DB2[AssessmentDetail<br/>考核明细表]
DB3[Staff<br/>员工表]
DB4[Indicator<br/>指标表]
end
FE1 --> FE2
FE2 --> BE1
BE1 --> BE2
BE2 --> BE3
BE3 --> DB1
BE3 --> DB2
BE3 --> DB3
BE3 --> DB4
```
**图表来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
**章节来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
## 核心组件
批量创建功能由以下核心组件构成:
### 1. API接口层
- **批量创建接口**提供RESTful API用于批量创建考核记录
- **权限控制**:要求管理员或经理权限
- **参数验证**:严格的输入参数验证和类型检查
### 2. 服务层
- **批量创建服务**:实现批量创建的核心业务逻辑
- **重复检查**:防止重复创建相同周期的考核记录
- **事务管理**:确保数据一致性和完整性
### 3. 数据模型层
- **Assessment模型**:考核记录实体
- **AssessmentDetail模型**:考核明细实体
- **Staff模型**:员工信息模型
- **Indicator模型**:考核指标模型
### 4. 前端界面层
- **批量创建对话框**:用户友好的交互界面
- **数据验证**:前端参数验证和错误提示
- **异步加载**:支持大量数据的异步处理
**章节来源**
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L77-L112)
## 架构概览
批量创建功能采用分层架构设计,确保了良好的代码组织和可维护性:
```mermaid
sequenceDiagram
participant User as 用户
participant Frontend as 前端界面
participant API as API接口
participant Service as 服务层
participant DB as 数据库
User->>Frontend : 触发批量创建
Frontend->>API : 发送批量创建请求
API->>Service : 调用批量创建服务
Service->>DB : 查询在职员工
DB-->>Service : 返回员工列表
Service->>Service : 检查重复记录
Service->>DB : 创建考核记录
Service->>DB : 创建考核明细
DB-->>Service : 返回创建结果
Service-->>API : 返回批量创建结果
API-->>Frontend : 显示创建结果
Frontend-->>User : 显示成功消息
```
**图表来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L148-L165)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
## 详细组件分析
### API接口组件
批量创建API接口提供了完整的RESTful服务
#### 接口定义
- **URL**`POST /assessments/batch-create`
- **权限**:管理员或经理
- **请求参数**
- `department_id`科室ID必填
- `period_year`:年度(必填)
- `period_month`:月份(必填)
- `indicators`指标ID列表必填
#### 参数验证规则
- 科室ID必须存在且有效
- 年度必须在合理范围内2020-2100
- 月份必须在1-12之间
- 指标ID列表不能为空
- 所有指标ID必须存在
**章节来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L148-L165)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L220-L231)
### 服务层组件
服务层实现了批量创建的核心业务逻辑:
#### 批量创建流程
1. **获取在职员工**:查询指定科室的所有在职员工
2. **重复检查**:检查是否存在相同周期的考核记录
3. **创建考核记录**:为每个员工创建空的考核记录
4. **创建考核明细**:为每个考核记录添加指定的指标
5. **事务提交**:确保所有操作在一个事务中完成
#### 重复检查逻辑
系统通过组合键唯一性来防止重复创建:
- `staff_id + period_year + period_month`
- 如果记录已存在,则跳过该员工
#### 异常处理策略
- **权限验证失败**返回403错误
- **参数验证失败**返回400错误
- **数据库操作失败**返回500错误
- **业务逻辑错误**:返回相应的业务错误信息
**章节来源**
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
### 数据模型组件
数据模型定义了批量创建功能所需的核心实体:
#### Assessment模型
- **主键**自增ID
- **外键**:关联员工表
- **索引**按员工ID、年度、月份建立复合索引
- **状态**:默认草稿状态
#### AssessmentDetail模型
- **主键**自增ID
- **外键**:关联考核记录表和指标表
- **索引**按考核记录ID和指标ID建立索引
- **默认值**分数默认为0
#### Staff模型
- **状态过滤**:只查询在职员工
- **关联关系**:与部门和考核记录建立关联
**章节来源**
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
### 前端组件
前端提供了用户友好的批量创建界面:
#### 界面组件
- **批量创建按钮**:触发批量创建对话框
- **科室选择器**:树形结构选择科室
- **日期选择器**:选择考核周期(年-月)
- **指标多选框**:选择要应用的指标
#### 数据流
1. **加载数据**:初始化时加载科室树和可用指标
2. **表单验证**:前端验证必填字段
3. **API调用**:发送批量创建请求
4. **结果处理**:显示创建结果和错误信息
#### 用户体验
- **异步加载**使用loading状态指示后台处理
- **错误提示**:友好的错误消息提示
- **成功反馈**:创建成功后的确认消息
**章节来源**
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L77-L112)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L38-L49)
## 依赖关系分析
批量创建功能涉及多个组件之间的复杂依赖关系:
```mermaid
graph TD
subgraph "API层"
A1[assessments.py]
end
subgraph "服务层"
S1[assessment_service.py]
S2[indicator_service.py]
S3[department_service.py]
end
subgraph "模型层"
M1[models.py]
end
subgraph "前端层"
F1[Assessments.vue]
F2[assessment.js]
end
A1 --> S1
S1 --> M1
S2 --> M1
S3 --> M1
F1 --> F2
F2 --> A1
F1 --> S2
F1 --> S3
```
**图表来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
### 外部依赖
- **SQLAlchemy**ORM框架用于数据库操作
- **FastAPI**Web框架提供API服务
- **Element Plus**UI组件库提供前端界面
- **Pydantic**:数据验证和序列化
### 内部依赖
- **API层依赖服务层**API层调用服务层实现业务逻辑
- **服务层依赖模型层**:服务层操作数据库模型
- **前端依赖API层**前端通过API层访问后端服务
- **服务层相互依赖**:不同服务之间存在业务依赖关系
**章节来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
## 性能考虑
批量创建功能在设计时充分考虑了性能优化:
### 数据库性能优化
#### 索引优化
- **Assessment表**:在`(staff_id, period_year, period_month)`上建立复合索引
- **AssessmentDetail表**:在`(assessment_id, indicator_id)`上建立复合索引
- **Staff表**:在`(department_id, status)`上建立复合索引
#### 查询优化
- 使用`selectinload`进行关联查询减少N+1查询问题
- 批量插入使用`db.flush()`减少数据库往返次数
- 使用`await db.commit()`确保事务完整性
### 并发控制
#### 事务管理
- 所有批量创建操作在一个数据库事务中执行
- 使用异步事务确保并发安全性
- 发生异常时自动回滚,保证数据一致性
#### 锁机制
- 使用数据库锁防止并发冲突
- 重复检查使用原子操作确保线程安全
### 内存管理
#### 流式处理
- 对于大量员工的情况,使用流式查询避免内存溢出
- 分批处理员工数据,控制内存使用
#### 连接池管理
- 使用连接池复用数据库连接
- 合理配置连接池大小避免资源耗尽
### 缓存策略
#### 结果缓存
- 对于频繁查询的指标数据使用缓存
- 缓存科室树形结构数据
#### 查询缓存
- 对于静态数据查询使用查询缓存
- 减少重复数据库查询开销
## 故障排除指南
### 常见问题及解决方案
#### 1. 权限不足
**问题**批量创建接口返回403错误
**原因**:当前用户不是管理员或经理
**解决方案**
- 确保用户具有相应权限
- 检查用户角色配置
- 重新登录系统
#### 2. 参数验证失败
**问题**批量创建接口返回400错误
**原因**:请求参数不符合验证规则
**解决方案**
- 检查科室ID是否存在
- 验证年度和月份范围
- 确保指标ID列表不为空
#### 3. 重复创建
**问题**:某些员工没有创建考核记录
**原因**:这些员工已有相同周期的考核记录
**解决方案**
- 检查现有考核记录
- 修改考核周期重新创建
- 手动删除重复记录后重试
#### 4. 数据库连接问题
**问题**:批量创建过程中出现数据库错误
**原因**:数据库连接超时或连接池耗尽
**解决方案**
- 检查数据库连接配置
- 增加连接池大小
- 优化数据库查询性能
#### 5. 前端界面问题
**问题**:批量创建对话框无法打开或显示错误
**原因**前端JavaScript错误或API调用失败
**解决方案**
- 检查浏览器控制台错误
- 确保API接口正常运行
- 刷新页面重新加载数据
### 调试技巧
#### 后端调试
- 查看服务器日志获取详细错误信息
- 使用数据库客户端检查数据状态
- 启用SQL查询日志跟踪数据库操作
#### 前端调试
- 使用浏览器开发者工具检查网络请求
- 查看控制台错误信息
- 检查API响应格式
#### 性能监控
- 监控数据库查询执行时间
- 检查内存使用情况
- 监控并发连接数
**章节来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L148-L165)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L264-L286)
## 结论
批量创建功能是医院绩效管理系统的重要组成部分,它通过以下优势为企业带来了显著的价值:
### 功能优势
- **高效性**:大幅减少了手动创建考核记录的时间
- **准确性**:通过重复检查逻辑确保数据完整性
- **易用性**:提供直观的用户界面和清晰的操作流程
- **扩展性**:支持多种指标模板和考核周期
### 技术优势
- **架构清晰**:采用分层架构设计,便于维护和扩展
- **性能优化**:通过索引优化、事务管理和缓存策略提升性能
- **安全保障**:完善的权限控制和异常处理机制
- **并发安全**:通过事务管理和锁机制确保数据一致性
### 应用场景
- **月度考核**:每月定期为全体员工创建考核记录
- **季度评估**:按季度进行的综合评估
- **特殊时期**:如新员工入职、科室调整等特殊情况
- **系统迁移**:历史数据的批量导入和处理
批量创建功能不仅提高了工作效率,更重要的是确保了绩效管理工作的标准化和规范化,为医院的绩效管理体系奠定了坚实的技术基础。
## 附录
### 使用示例
#### 基本使用流程
1. 登录系统并进入考核管理页面
2. 点击"批量创建"按钮
3. 选择目标科室
4. 设置考核周期(年-月)
5. 选择要应用的指标
6. 确认创建并等待处理完成
#### 参数说明
| 参数名 | 类型 | 必填 | 描述 | 示例值 |
|--------|------|------|------|--------|
| department_id | integer | 是 | 科室ID | 1 |
| period_year | integer | 是 | 考核年度 | 2026 |
| period_month | integer | 是 | 考核月份 | 2 |
| indicators | array | 是 | 指标ID列表 | [1, 2, 3] |
#### API调用示例
**请求示例**
```
POST /assessments/batch-create?department_id=1&period_year=2026&period_month=2&indicators=1&indicators=2&indicators=3
```
**响应示例**
```json
{
"code": 200,
"message": "成功创建 15 条考核记录",
"data": {
"count": 15
}
}
```
### 最佳实践
#### 1. 数据准备
- 确保所有指标都已正确配置
- 验证科室信息的完整性
- 准备好员工名单和状态信息
#### 2. 批量创建策略
- 优先创建常用指标的组合
- 避免同时创建过多员工的考核记录
- 定期清理无效的考核记录
#### 3. 监控和维护
- 定期检查批量创建任务的状态
- 监控数据库性能指标
- 及时处理异常情况
#### 4. 用户培训
- 对管理员进行系统培训
- 提供详细的操作手册
- 建立技术支持渠道
### 扩展建议
#### 1. 功能扩展
- 支持自定义指标模板
- 添加批量编辑功能
- 实现自动化考核流程
#### 2. 性能优化
- 实现增量批量创建
- 添加进度条显示
- 优化大数据量处理
#### 3. 用户体验
- 添加批量创建历史记录
- 实现创建结果导出
- 提供创建预览功能

View File

@@ -0,0 +1,424 @@
# 绩效考核管理
<cite>
**本文档引用的文件**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
- [backend/app/models/models.py](file://backend/app/models/models.py)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js)
- [docs/api.md](file://docs/api.md)
- [docs/详细设计.md](file://docs/详细设计.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本模块聚焦于医院绩效系统的“绩效考核管理”围绕考核流程草稿→提交→审核→确认→完成、考核记录与明细处理、批量创建、平衡计分卡财务、客户、内部流程、学习与成长应用、状态管理与审批控制、数据统计与报表、以及规则配置与权重计算展开。文档同时提供业务流程图、界面操作说明与API接口规范帮助开发者与使用者高效理解与使用。
## 项目结构
后端采用FastAPI + SQLAlchemy异步ORM前端采用Vue 3 + Element Plus数据模型、服务层与API路由清晰分离前端通过封装的API模块调用后端接口。
```mermaid
graph TB
subgraph "前端"
FE_List["Assessments.vue<br/>考核列表视图"]
FE_Detail["AssessmentDetail.vue<br/>考核详情视图"]
FE_API_A["assessment.js<br/>考核API封装"]
FE_API_I["indicator.js<br/>指标API封装"]
end
subgraph "后端"
API["assessments.py<br/>考核API路由"]
SVC["assessment_service.py<br/>考核服务"]
MODELS["models.py<br/>数据模型"]
SCHEMAS["schemas.py<br/>数据模式"]
IND_API["indicators.py<br/>指标API路由"]
end
FE_List --> FE_API_A
FE_Detail --> FE_API_A
FE_List --> FE_API_I
FE_API_A --> API
FE_API_I --> IND_API
API --> SVC
SVC --> MODELS
SVC --> SCHEMAS
IND_API --> SVC
```
图表来源
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
章节来源
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L194-L271)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
## 核心组件
- 数据模型
- Assessment考核记录包含周期、总分、加权得分、状态、关联人员与明细。
- AssessmentDetail考核明细记录每个指标的实际值、得分、佐证材料等。
- Indicator考核指标包含类型、平衡计分卡维度、权重、最高分、目标值等。
- AssessmentStatus枚举状态草稿、已提交、已审核、已确认、已驳回
- 服务层
- AssessmentService提供列表查询、详情加载、创建、更新、提交、审核、确认、批量创建等核心能力。
- API层
- 路由提供列表、详情、创建、更新、提交、审核、确认、批量创建等REST接口。
- 前端
- Assessments.vue列表页支持筛选、分页、批量创建、状态流转。
- AssessmentDetail.vue详情页支持草稿态编辑、保存、提交、审核、确认。
- assessment.js/indicator.js前端API封装统一调用后端接口。
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L51)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
## 架构总览
后端采用分层架构API路由负责参数解析与鉴权服务层封装业务逻辑模型层映射数据库表结构。前端通过HTTP请求与后端交互完成考核流程的可视化操作。
```mermaid
graph TB
Client["浏览器/移动端"] --> FE["前端Vue应用"]
FE --> API["FastAPI路由层"]
API --> Service["服务层"]
Service --> DB["数据库"]
Service --> Models["数据模型"]
Service --> Schemas["数据模式"]
```
图表来源
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
## 详细组件分析
### 考核流程管理(草稿→提交→审核→确认→完成)
- 流程状态
- 草稿:可编辑明细与得分。
- 已提交:等待审核。
- 已审核:等待确认。
- 已确认:完成,不可再编辑。
- 已驳回:退回草稿,可重新提交。
- 接口流转
- 草稿 → 提交POST /assessments/{id}/submit
- 已提交 → 审核POST /assessments/{id}/review批准/驳回)
- 已审核 → 确认POST /assessments/{id}/finalize
- 已确认 → 完成:不可逆
- 前端操作
- 列表页仅显示状态与操作按钮,按钮随状态变化。
- 详情页支持草稿态编辑与保存,提交后进入审核流程。
```mermaid
stateDiagram-v2
[*] --> 草稿
草稿 --> 已提交 : "提交"
已提交 --> 已审核 : "审核通过"
已提交 --> 草稿 : "审核驳回"
已审核 --> 已确认 : "确认"
已确认 --> [*]
```
图表来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L51)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L55-L63)
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L86-L93)
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L51)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L55-L63)
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L86-L93)
### 考核记录管理与明细处理
- 记录管理
- 创建POST /assessments携带明细数组
- 更新PUT /assessments/{id}(仅允许草稿或已驳回状态)
- 详情GET /assessments/{id}(包含明细与指标名称)
- 明细字段
- 指标ID、实际值、得分、佐证材料、备注
- 加权得分计算
- 总分:明细得分求和
- 加权得分:∑(明细得分 × 指标权重)
```mermaid
flowchart TD
Start(["创建/更新考核"]) --> CalcTotal["计算总分<br/>sum(明细得分)"]
CalcTotal --> LoadIndicators["加载指标权重"]
LoadIndicators --> CalcWeighted["计算加权得分<br/>sum(得分×权重)"]
CalcWeighted --> SaveAssessment["保存考核记录与明细"]
SaveAssessment --> End(["完成"])
```
图表来源
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L194-L271)
章节来源
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L80-L103)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L70-L156)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L194-L271)
### 批量创建功能
- 触发入口:列表页“批量创建”
- 参数科室ID、年度、月份、指标ID列表
- 逻辑:为该科室当月在职员工逐一创建空明细的考核记录(若不存在)
```mermaid
sequenceDiagram
participant U as "用户"
participant V as "Assessments.vue"
participant A as "assessment.js"
participant R as "assessments.py"
participant S as "assessment_service.py"
U->>V : "点击批量创建"
V->>A : "调用批量创建API"
A->>R : "POST /assessments/batch-create"
R->>S : "batch_create_for_department()"
S->>S : "查询在职员工"
S->>S : "检查是否存在重复"
S->>S : "创建考核记录+明细"
S-->>R : "返回创建数量"
R-->>A : "返回成功响应"
A-->>V : "提示成功并刷新列表"
```
图表来源
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L28-L112)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L38-L49)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L148-L165)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L207-L262)
章节来源
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L28-L112)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L38-L49)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L148-L165)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L207-L262)
### 平衡计分卡维度应用
- 指标维度
- 财务financial
- 客户customer
- 内部流程internal_process
- 学习与成长learning_growth
- 应用方式
- 指标表包含bs_dimension字段用于区分维度
- 前端在详情页展示指标类型标签,便于识别维度属性
- 配置建议
- 不同科室类型可选用不同模板或指标组合,体现维度侧重点差异
```mermaid
classDiagram
class Indicator {
+bs_dimension
+weight
+max_score
}
class AssessmentDetail {
+indicator_id
+actual_value
+score
}
Indicator <.. AssessmentDetail : "被引用"
```
图表来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
- [backend/app/models/models.py](file://backend/app/models/models.py#L181-L202)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L151-L193)
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L35)
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L38-L42)
### 状态管理与审批控制
- 状态枚举与流转限制
- 草稿/已驳回:可更新
- 已提交:仅能审核
- 已审核:仅能确认
- 已确认:不可再更改
- 审批接口
- 审核POST /assessments/{id}/review批准/驳回)
- 确认POST /assessments/{id}/finalize
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L51)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L110-L205)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L118-L145)
### 数据统计分析与报表
- 指标管理API
- 获取启用指标GET /indicators/active
- 获取指标列表GET /indicators
- 报表与统计
- 文档中提供统计接口(如科室统计、趋势分析、分布等),可结合考核数据进行分析
- 建议
- 基于Assessment与AssessmentDetail聚合生成部门/个人/维度的统计报表
章节来源
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L44-L55)
- [docs/api.md](file://docs/api.md#L471-L537)
- [docs/详细设计.md](file://docs/详细设计.md#L155-L163)
### 考核规则配置、权重计算与结果汇总
- 规则配置
- 指标权重Indicator.weight
- 最高分Indicator.max_score
- 计算方法/公式Indicator.calculation_method
- 权重计算
- 总分:明细得分求和
- 加权得分:∑(明细得分 × 指标权重)
- 结果汇总
- 以Assessment为单位汇总支持按周期、部门、状态等维度统计
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
## 依赖关系分析
```mermaid
graph LR
AssessAPI["assessments.py"] --> AssessSvc["assessment_service.py"]
AssessSvc --> Models["models.py"]
AssessSvc --> Schemas["schemas.py"]
IndAPI["indicators.py"] --> AssessSvc
FEAssess["Assessments.vue"] --> FEAssessAPI["assessment.js"]
FEDetail["AssessmentDetail.vue"] --> FEAssessAPI
FEAssessAPI --> AssessAPI
FEInd["indicator.js"] --> IndAPI
```
图表来源
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
章节来源
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
## 性能考虑
- 查询优化
- 列表查询支持按员工、科室、年度、月份、状态过滤,建议在相关列建立索引(如 idx_assessment_staff、idx_assessment_period、idx_assessment_status
- 批量创建
- 批量创建时避免重复记录,减少数据库写入压力。
- 前端渲染
- 大列表分页加载,避免一次性渲染过多行。
- 异步处理
- 服务层使用异步会话,适合高并发场景。
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L174-L178)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L18-L55)
## 故障排查指南
- 常见问题
- 状态不允许:仅允许在草稿或已驳回状态下更新;仅允许在已提交状态下审核;仅允许在已审核状态下确认。
- 资源不存在接口返回404检查ID或参数。
- 参数错误检查必填字段与范围如月份1-12、权重>0
- 前端提示
- 使用Element Plus的消息组件提示成功/失败。
- 日志与监控
- 后端日志目录logs/可定位异常请求与SQL执行情况。
章节来源
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L110-L205)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L98-L101)
- [docs/api.md](file://docs/api.md#L540-L551)
## 结论
本模块以清晰的流程状态与严格的审批控制为核心,结合平衡计分卡维度与指标权重,实现了从草稿到完成的全流程管理。前后端职责分明,接口规范明确,具备良好的扩展性与可维护性。建议后续完善统计分析与报表模块,并在生产环境增加更完善的日志与监控策略。
## 附录
### 业务流程图(概念)
```mermaid
flowchart TD
A["开始"] --> B["创建/编辑考核<br/>草稿态"]
B --> C["提交考核"]
C --> D{"审核通过?"}
D -- "是" --> E["确认考核"]
D -- "否" --> F["退回草稿<br/>可重新提交"]
E --> G["完成"]
F --> C
G --> H["结束"]
```
[此图为概念流程图,不对应具体代码文件]
### 界面操作说明
- 列表页
- 支持按科室、考核周期、状态筛选;分页浏览;批量创建;对草稿/已提交/已审核状态显示相应操作按钮。
- 详情页
- 展示基本信息与明细;草稿态可编辑实际值、得分、佐证材料;支持保存、提交、审核、确认等操作。
章节来源
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
### API接口文档节选
- 获取考核列表GET /assessments
- 获取考核详情GET /assessments/{id}
- 创建考核POST /assessments
- 更新考核PUT /assessments/{id}
- 提交考核POST /assessments/{id}/submit
- 审核考核POST /assessments/{id}/review
- 确认考核POST /assessments/{id}/finalize
- 批量创建POST /assessments/batch-create
- 获取启用指标GET /indicators/active
章节来源
- [docs/api.md](file://docs/api.md#L298-L397)
- [docs/api.md](file://docs/api.md#L471-L537)

View File

@@ -0,0 +1,332 @@
# 考核数据分析
<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)
- [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)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向医院绩效系统的“考核数据分析”功能系统性阐述基于考核数据的统计分析能力涵盖按科室、按人员、按时间段的绩效统计BSC四个维度的分析方法、趋势分析与排名统计数据聚合算法、图表展示与报表生成机制以及分析指标、计算公式与可视化方案并给出数据准确性保证与性能优化策略。
## 项目结构
后端采用 FastAPI + SQLAlchemy 异步 ORM 架构,前端使用 Vue3 + Element Plus + ECharts。统计分析功能由 API 层、服务层与数据模型层协同完成,前端通过统一的统计接口进行数据拉取与可视化渲染。
```mermaid
graph TB
FE["前端视图<br/>Reports.vue / Dashboard.vue"] --> API["FastAPI 统计接口<br/>stats.py"]
API --> SVC["统计服务层<br/>stats_service.py"]
SVC --> DB["数据库模型<br/>models.py"]
DB --> SQL["SQLAlchemy 异步查询"]
FE --> FE_API["前端统计接口封装<br/>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["构建查询条件<br/>状态=FINALIZED + 年/月/科室过滤"]
BuildCond --> Query["SQL 聚合查询<br/>按维度分组"]
Query --> Group["按维度汇总<br/>总分/权重/指标数"]
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["过滤已确认考核记录<br/>按年/月过滤"]
Filter --> Join["连接 Staff/Department"]
Join --> GroupByDept["按科室分组统计<br/>员工数/总分/员工列表"]
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["按年/月过滤<br/>或使用当前年份"]
YearFilter --> MonthRange["计算起止月份<br/>支持跨年"]
MonthRange --> GroupMonth["按月分组统计<br/>平均分/样本数"]
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["过滤已确认考核记录<br/>可按年/月/指标过滤"]
CFilter --> CGroup["按指标分组统计<br/>平均分/最大分/最小分/样本数"]
CGroup --> CRate["计算完成率=平均分/目标值×100<br/>上限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<br/>周期统计/科室对比/排名"]
D["Dashboard.vue<br/>趋势/KPI/预警"]
end
subgraph "接口封装"
FA["stats.js<br/>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)

View File

@@ -0,0 +1,431 @@
# 考核流程管理
<cite>
**本文档引用的文件**
- [models.py](file://backend/app/models/models.py)
- [schemas.py](file://backend/app/schemas/schemas.py)
- [assessment_service.py](file://backend/app/services/assessment_service.py)
- [assessments.py](file://backend/app/api/v1/assessments.py)
- [assessment.js](file://frontend/src/api/assessment.js)
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue)
- [security.py](file://backend/app/core/security.py)
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
- [002_template.py](file://backend/alembic/versions/002_template.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本系统是一个完整的医院绩效考核管理系统,专注于考核流程的全生命周期管理。系统实现了从草稿创建到最终确认的完整工作流,包括审批流转、复核确认、状态管理和权限控制等核心功能。
系统采用前后端分离架构后端使用FastAPI提供RESTful API前端使用Vue.js构建用户界面。数据库采用PostgreSQL通过SQLAlchemy ORM进行数据持久化。
## 项目结构
系统采用典型的三层架构设计:
```mermaid
graph TB
subgraph "前端层"
FE_API[API封装层]
FE_VIEWS[视图组件]
FE_STORE[状态管理]
end
subgraph "后端层"
BE_ROUTER[路由层]
BE_SERVICE[服务层]
BE_MODEL[模型层]
BE_DB[(数据库)]
end
subgraph "基础设施"
AUTH[认证授权]
DB[(PostgreSQL)]
SCHEMA[数据模式]
end
FE_API --> FE_VIEWS
FE_VIEWS --> FE_STORE
FE_API --> BE_ROUTER
BE_ROUTER --> BE_SERVICE
BE_SERVICE --> BE_MODEL
BE_MODEL --> BE_DB
BE_DB --> DB
AUTH --> BE_ROUTER
SCHEMA --> BE_MODEL
```
**图表来源**
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
**章节来源**
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
## 核心组件
### 数据模型层
系统的核心数据模型围绕考核流程展开,主要包括以下关键实体:
```mermaid
classDiagram
class Assessment {
+int id
+int staff_id
+int period_year
+int period_month
+str status
+float total_score
+float weighted_score
+datetime submit_time
+datetime review_time
+int assessor_id
+int reviewer_id
+str remark
}
class AssessmentDetail {
+int id
+int assessment_id
+int indicator_id
+float actual_value
+float score
+str evidence
+str remark
}
class Staff {
+int id
+str employee_id
+str name
+int department_id
+str position
+str status
+float performance_ratio
}
class Indicator {
+int id
+str name
+str code
+str indicator_type
+float weight
+float max_score
+bool is_active
}
Assessment "1" -- "many" AssessmentDetail : contains
Assessment "1" -- "1" Staff : evaluates
AssessmentDetail "1" -- "1" Indicator : measures
Staff "1" -- "many" Assessment : creates
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L149-L202)
- [models.py](file://backend/app/models/models.py#L181-L202)
- [models.py](file://backend/app/models/models.py#L88-L114)
- [models.py](file://backend/app/models/models.py#L117-L147)
### 状态枚举定义
系统定义了完整的考核状态流转:
```mermaid
stateDiagram-v2
[*] --> 草稿
草稿 --> 已提交 : 提交申请
已提交 --> 已审核 : 审核通过
已提交 --> 已驳回 : 审核驳回
已审核 --> 已确认 : 确认完成
已确认 --> [*]
已驳回 --> 草稿 : 修改后重新提交
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L45-L51)
**章节来源**
- [models.py](file://backend/app/models/models.py#L45-L51)
- [schemas.py](file://backend/app/schemas/schemas.py#L31-L36)
## 架构概览
系统采用RESTful API设计模式前后端通过HTTP协议通信
```mermaid
sequenceDiagram
participant Client as 前端客户端
participant API as API网关
participant Service as 服务层
participant Model as 模型层
participant DB as 数据库
Client->>API : GET /assessments
API->>Service : get_list()
Service->>Model : 查询评估记录
Model->>DB : SQL查询
DB-->>Model : 查询结果
Model-->>Service : 评估记录列表
Service-->>API : 处理后的数据
API-->>Client : JSON响应
Note over Client,DB : 异步数据库操作
```
**图表来源**
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L52)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L18-L55)
## 详细组件分析
### 考核流程状态管理
#### 草稿状态Draft
草稿状态是考核流程的初始阶段,允许员工录入和编辑考核信息:
**操作权限控制:**
- 仅考核人本人可编辑
- 支持保存草稿和提交申请
- 可修改考核明细和备注
**数据验证规则:**
- 总分 = 各指标得分之和
- 加权得分 = Σ(指标得分 × 指标权重)
- 实际值必须符合指标最大值限制
#### 已提交状态Submitted
已提交状态表示考核已进入审批流程:
**审批权限控制:**
- 需要管理员或经理权限
- 自动记录提交时间和提交人
- 系统自动计算加权得分
**业务逻辑:**
- 审批前自动刷新计算结果
- 支持通过或驳回两种处理方式
- 记录审核人和审核时间
#### 已审核状态Reviewed
已审核状态表示考核通过审批,等待最终确认:
**权限控制:**
- 管理员或经理可进行最终确认
- 系统自动锁定后续修改
- 生成最终的加权得分
**数据完整性:**
- 确认后状态不可逆
- 用于后续薪资计算的基础数据
#### 已确认状态Finalized
已确认状态表示考核流程完成:
**系统影响:**
- 考核结果正式生效
- 用于薪资核算的数据源
- 不再允许任何修改操作
#### 已驳回状态Rejected
已驳回状态表示考核被拒绝:
**处理机制:**
- 自动退回至草稿状态
- 允许重新编辑和提交
- 记录驳回原因和时间
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L117-L205)
- [assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
### 前端交互组件
#### 考核列表页面
```mermaid
flowchart TD
Start([页面加载]) --> LoadData[加载考核数据]
LoadData --> RenderTable[渲染表格]
RenderTable --> CheckStatus{检查状态}
CheckStatus --> |草稿| ShowDraftOps[显示提交按钮]
CheckStatus --> |已提交| ShowReviewOps[显示审核按钮]
CheckStatus --> |已审核| ShowFinalizeOp[显示确认按钮]
CheckStatus --> |其他| HideOps[隐藏操作按钮]
ShowDraftOps --> SubmitAssessment[提交考核]
ShowReviewOps --> ReviewAssessment[审核考核]
ShowFinalizeOp --> FinalizeAssessment[确认考核]
SubmitAssessment --> RefreshData[刷新数据]
ReviewAssessment --> RefreshData
FinalizeAssessment --> RefreshData
RefreshData --> RenderTable
```
**图表来源**
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L55-L63)
**章节来源**
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
### API接口设计
系统提供了完整的RESTful API接口
| 接口 | 方法 | 权限 | 功能描述 |
|------|------|------|----------|
| `/assessments` | GET | 任意用户 | 获取考核列表 |
| `/assessments/{id}` | GET | 任意用户 | 获取考核详情 |
| `/assessments` | POST | 任意用户 | 创建考核记录 |
| `/assessments/{id}` | PUT | 任意用户 | 更新考核记录 |
| `/assessments/{id}/submit` | POST | 任意用户 | 提交考核 |
| `/assessments/{id}/review` | POST | 管理员/经理 | 审核考核 |
| `/assessments/{id}/finalize` | POST | 管理员/经理 | 确认考核 |
| `/assessments/batch-create` | POST | 管理员/经理 | 批量创建考核 |
**章节来源**
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
## 依赖关系分析
系统的关键依赖关系如下:
```mermaid
graph LR
subgraph "认证层"
Security[security.py]
User[User模型]
end
subgraph "服务层"
AssessmentService[AssessmentService]
StaffService[StaffService]
IndicatorService[IndicatorService]
end
subgraph "数据层"
Assessment[Assessment模型]
AssessmentDetail[AssessmentDetail模型]
Staff[Staff模型]
Indicator[Indicator模型]
end
subgraph "API层"
AssessmentAPI[Assessments路由]
StaffAPI[Staff路由]
IndicatorAPI[Indicator路由]
end
Security --> AssessmentAPI
AssessmentAPI --> AssessmentService
AssessmentService --> Assessment
AssessmentService --> AssessmentDetail
AssessmentService --> Staff
AssessmentService --> Indicator
AssessmentAPI --> Assessment
AssessmentAPI --> Staff
AssessmentAPI --> Indicator
```
**图表来源**
- [security.py](file://backend/app/core/security.py#L94-L109)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
**章节来源**
- [security.py](file://backend/app/core/security.py#L1-L110)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
## 性能考虑
### 数据库优化
系统采用了多项数据库优化策略:
1. **索引优化**:为常用查询字段建立索引
- `idx_assessment_status`:状态查询优化
- `idx_assessment_period`:周期查询优化
- `idx_assessment_staff`:员工查询优化
2. **查询优化**:使用`selectinload`避免N+1查询问题
3. **分页查询**:支持大数据量的分页展示
### 缓存策略
虽然当前实现未使用缓存,但系统设计支持未来扩展:
- 可以引入Redis缓存热门查询结果
- 考核状态统计信息可以缓存
- 用户权限信息可以本地缓存
### 并发控制
系统通过以下机制保证数据一致性:
1. **事务管理**:所有状态变更都在事务中执行
2. **乐观锁**:使用版本号防止并发修改冲突
3. **状态检查**:每次操作前验证当前状态
## 故障排除指南
### 常见问题及解决方案
#### 状态转换异常
**问题现象:** 点击提交按钮无反应
**可能原因:**
1. 当前状态不是草稿状态
2. 用户权限不足
3. 网络请求超时
**解决步骤:**
1. 检查考核记录状态
2. 验证用户角色权限
3. 查看浏览器开发者工具Network标签
4. 检查后端日志
#### 数据不一致
**问题现象:** 显示的总分与实际不符
**排查步骤:**
1. 检查指标权重设置
2. 验证分数输入范围
3. 确认计算公式正确性
4. 查看数据库中存储的原始数据
#### 权限问题
**问题现象:** 无法看到某些操作按钮
**解决方法:**
1. 检查用户角色设置
2. 确认当前用户的权限
3. 刷新页面重新登录
4. 检查系统配置
**章节来源**
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L227-L255)
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L177-L213)
## 结论
本考核流程管理系统实现了完整的绩效考核生命周期管理,具有以下特点:
1. **完整的状态管理**:覆盖从草稿到最终确认的全流程
2. **严格的权限控制**:基于角色的细粒度权限管理
3. **清晰的业务逻辑**:每个状态都有明确的操作规则
4. **良好的用户体验**:直观的前端界面和实时的状态反馈
5. **可扩展的设计**:模块化的架构便于功能扩展
系统通过标准化的API接口和清晰的业务流程为医院的绩效管理提供了可靠的技术支撑。建议在未来版本中增加更多的监控和审计功能以及移动端支持。

View File

@@ -0,0 +1,326 @@
# 考核详情查看
<cite>
**本文档引用的文件**
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue)
- [assessment.js](file://frontend/src/api/assessment.js)
- [assessments.py](file://backend/app/api/v1/assessments.py)
- [assessment_service.py](file://backend/app/services/assessment_service.py)
- [models.py](file://backend/app/models/models.py)
- [schemas.py](file://backend/app/schemas/schemas.py)
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
- [security.py](file://backend/app/core/security.py)
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
- [详细设计.md](file://docs/详细设计.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本章节面向“考核详情查看”功能,系统性阐述考核记录的详细信息展示、员工与科室信息、考核周期、各项指标得分与总分计算、加权得分计算公式、权重配置与分数等级划分、考核明细展示格式、数据来源与更新机制,并补充权限控制与数据安全保护措施。文档同时提供界面布局示意、数据流图与序列图,帮助前后端开发者与产品人员快速理解与实现。
## 项目结构
本功能涉及前后端协同:
- 前端负责详情页面渲染、交互与权限控制提示
- 后端提供REST API、服务层计算与数据库持久化
- 数据模型定义了考核记录、明细、指标与状态枚举
- 安全模块提供认证与授权中间件
```mermaid
graph TB
FE["前端<br/>AssessmentDetail.vue"] --> API["后端API<br/>assessments.py"]
API --> SVC["服务层<br/>assessment_service.py"]
SVC --> DB["数据库模型<br/>models.py"]
API --> SEC["安全中间件<br/>security.py"]
```
图表来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L58-L68)
- [models.py](file://backend/app/models/models.py#L149-L203)
- [security.py](file://backend/app/core/security.py#L55-L110)
章节来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [models.py](file://backend/app/models/models.py#L1-L438)
- [security.py](file://backend/app/core/security.py#L1-L110)
## 核心组件
- 前端详情视图:展示基本信息、考核明细、状态标签与操作按钮,支持草稿态编辑与保存、提交、审核、确认等流程操作。
- 后端API提供获取详情、更新、提交、审核、确认等接口并在权限控制下限制操作范围。
- 服务层:负责业务逻辑,包括加权得分计算、状态流转、批量创建等。
- 数据模型:定义考核记录、明细、指标、状态与类型枚举,以及外键关系。
- 安全模块提供JWT解析、当前用户获取、管理员/经理权限校验。
章节来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L98-L218)
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L145)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L205)
- [models.py](file://backend/app/models/models.py#L45-L61)
- [security.py](file://backend/app/core/security.py#L85-L110)
## 架构总览
详情查看流程由前端发起请求后端API接收并调用服务层服务层读取数据库模型并返回数据前端渲染详情卡片与明细表格支持在草稿态编辑与提交审核。
```mermaid
sequenceDiagram
participant U as "用户"
participant FE as "前端详情页面"
participant API as "后端API"
participant SVC as "服务层"
participant DB as "数据库模型"
U->>FE : 打开考核详情
FE->>API : GET /assessments/{id}
API->>SVC : get_by_id(assessment_id)
SVC->>DB : 查询Assessment+Staff+Details+Indicator
DB-->>SVC : 返回实体
SVC-->>API : AssessmentResponse
API-->>FE : JSON数据
FE->>FE : 渲染基本信息与明细
FE->>API : 草稿态保存/提交/审核/确认
API->>SVC : update/submit/review/finalize
SVC->>DB : 更新状态与分数
DB-->>SVC : 提交事务
SVC-->>API : 成功
API-->>FE : 返回结果
```
图表来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L150-L217)
- [assessment.js](file://frontend/src/api/assessment.js#L9-L36)
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L145)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L58-L205)
- [models.py](file://backend/app/models/models.py#L149-L203)
## 详细组件分析
### 前端详情视图AssessmentDetail.vue
- 基本信息卡片:显示员工姓名、科室、考核周期与加权总分,状态以标签形式展示。
- 考核明细表格:展示指标名称、类型、权重、最高分、实际值、得分、佐证材料;草稿态支持输入编辑,其他状态只读并按得分分级显示颜色。
- 操作按钮:根据状态显示保存、提交、审核通过/驳回、确认等按钮点击后调用对应API。
```mermaid
flowchart TD
Start(["进入详情页面"]) --> Load["加载考核详情"]
Load --> Render["渲染基本信息与明细"]
Render --> EditCheck{"是否草稿态?"}
EditCheck --> |是| Edit["可编辑输入实际值/得分/佐证材料"]
EditCheck --> |否| View["只读显示"]
Edit --> Save["保存草稿"]
Edit --> Submit["提交审核"]
View --> Review["审核通过/驳回"]
View --> Finalize["确认考核"]
Save --> Reload["重新加载数据"]
Submit --> Reload
Review --> Reload
Finalize --> Reload
Reload --> End(["完成"])
```
图表来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L150-L217)
章节来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
### 后端API与服务层assessments.py、assessment_service.py
- 获取详情API层调用服务层按ID查询返回带员工与科室名称、明细含指标名称的结构化数据。
- 加权得分计算:服务层在创建/更新时,遍历明细,按指标权重累加计算 weighted_score。
- 状态流转:提交、审核、确认分别更新状态与时间戳,仅允许在合法状态下变更。
- 批量创建:为指定科室批量生成考核记录与明细,避免重复。
```mermaid
classDiagram
class Assessment {
+int id
+int staff_id
+int period_year
+int period_month
+string period_type
+float total_score
+float weighted_score
+string status
+int assessor_id
+int reviewer_id
+datetime submit_time
+datetime review_time
+string remark
}
class AssessmentDetail {
+int id
+int assessment_id
+int indicator_id
+float actual_value
+float score
+string evidence
+string remark
}
class Indicator {
+int id
+string name
+string code
+string indicator_type
+float weight
+float max_score
}
Assessment "1" o-- "*" AssessmentDetail : "明细"
AssessmentDetail "1" --> "1" Indicator : "指标"
```
图表来源
- [models.py](file://backend/app/models/models.py#L149-L203)
章节来源
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L156)
- [models.py](file://backend/app/models/models.py#L149-L203)
### 数据模型与字段说明
- 考核记录表assessments包含员工ID、考核周期、总分、加权得分、状态、时间戳与备注。
- 考核明细表assessment_details包含指标ID、实际值、得分、佐证材料与备注。
- 指标表indicators包含指标名称、编码、类型、权重、最高分、目标值等。
- 状态枚举:草稿、已提交、已审核、已确认、已驳回。
章节来源
- [models.py](file://backend/app/models/models.py#L45-L61)
- [models.py](file://backend/app/models/models.py#L149-L203)
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L87-L131)
### 权限控制与数据安全
- 当前用户获取通过JWT令牌解析当前用户校验激活状态。
- 管理员/经理权限:审核与确认接口要求管理员或经理角色。
- 列表与详情:详情接口对当前用户可见性进行校验,防止越权访问。
章节来源
- [security.py](file://backend/app/core/security.py#L55-L110)
- [assessments.py](file://backend/app/api/v1/assessments.py#L118-L145)
## 依赖关系分析
- 前端依赖后端API通过HTTP请求获取数据并提交操作。
- 后端API依赖服务层服务层依赖SQLAlchemy ORM与数据库模型。
- 安全中间件贯穿API层确保敏感操作受控。
```mermaid
graph LR
FE["前端"] --> API["后端API"]
API --> SVC["服务层"]
SVC --> MODELS["数据模型"]
API --> SEC["安全中间件"]
```
图表来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L102-L102)
- [assessment.js](file://frontend/src/api/assessment.js#L9-L36)
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L145)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L58-L68)
- [models.py](file://backend/app/models/models.py#L149-L203)
- [security.py](file://backend/app/core/security.py#L55-L110)
章节来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
- [assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [models.py](file://backend/app/models/models.py#L1-L438)
- [security.py](file://backend/app/core/security.py#L1-L110)
## 性能考虑
- 查询优化详情查询使用selectinload预加载关联对象减少N+1查询。
- 分页与过滤:列表接口支持按科室、周期、状态分页查询,避免一次性加载过多数据。
- 缓存策略可在高频读取场景引入Redis缓存降低数据库压力。
- 前端渲染:明细表格按需渲染,草稿态编辑采用双向绑定,减少不必要的重绘。
章节来源
- [assessment_service.py](file://backend/app/services/assessment_service.py#L28-L55)
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L52)
## 故障排查指南
- 404未找到详情接口若返回不存在检查assessment_id是否正确。
- 状态不允许:更新、提交、审核、确认仅在特定状态允许,检查当前状态与流程。
- 权限不足:审核与确认接口需要管理员或经理权限,检查用户角色。
- 数据异常:加权得分异常时,检查指标权重与明细得分是否匹配。
章节来源
- [assessments.py](file://backend/app/api/v1/assessments.py#L63-L64)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L117-L118)
- [security.py](file://backend/app/core/security.py#L94-L109)
## 结论
“考核详情查看”功能通过前后端协作,实现了从数据到界面的完整闭环:前端负责展示与交互,后端负责数据与流程控制,服务层承担计算与状态管理,安全模块提供权限保障。加权得分计算清晰、权重配置灵活、状态流转可控,满足医院绩效管理的精细化需求。
## 附录
### 考核详情展示格式
- 基本信息
- 姓名、科室、考核周期、加权总分
- 考核明细
- 指标名称、指标类型、权重、最高分、实际值、得分、佐证材料
- 状态标签与操作按钮
- 草稿态:保存、提交
- 已提交:审核通过、驳回
- 已审核:确认
- 已确认:不可编辑
章节来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L18-L93)
### 加权得分计算公式与权重配置
- 加权得分weighted_score= Σ(指标得分 × 指标权重)
- 权重来源于指标表indicators.weight创建/更新时由服务层遍历明细累加计算
- 最高分max_score用于前端输入校验与显示
章节来源
- [assessment_service.py](file://backend/app/services/assessment_service.py#L76-L84)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L140-L146)
- [models.py](file://backend/app/models/models.py#L126-L127)
### 分数等级划分
- 优秀≥90分
- 良好80-89分
- 一般60-79分
- 较差:<60分
章节来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L139-L144)
### 数据来源与更新机制
- 数据来源指标库indicators)、考核记录assessments)、明细assessment_details
- 更新机制草稿态可编辑并保存提交后进入审核流程审核通过进入确认最终确认后不可再编辑
章节来源
- [models.py](file://backend/app/models/models.py#L149-L203)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
### 权限控制与数据安全
- 认证JWT令牌解析与当前用户校验
- 授权管理员/经理角色才能审核与确认
- 可见性详情接口对当前用户可见性进行校验
章节来源
- [security.py](file://backend/app/core/security.py#L55-L110)
- [assessments.py](file://backend/app/api/v1/assessments.py#L118-L145)
### 相关接口与数据模型对照
- 获取详情GET /assessments/{id}
- 更新详情PUT /assessments/{id}
- 提交POST /assessments/{id}/submit
- 审核POST /assessments/{id}/review
- 确认POST /assessments/{id}/finalize
- 批量创建POST /assessments/batch-create
章节来源
- [assessment.js](file://frontend/src/api/assessment.js#L9-L49)
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L165)