提交文件

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,473 @@
# 考核服务
<cite>
**本文档引用的文件**
- [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.py](file://backend/app/api/v1/assessments.py)
- [database.py](file://backend/app/core/database.py)
- [security.py](file://backend/app/core/security.py)
- [config.py](file://backend/app/core/config.py)
- [main.py](file://backend/app/main.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
考核服务是医院绩效管理系统的核心模块负责管理员工的绩效考核流程。该服务实现了完整的考核生命周期管理包括考核记录的CRUD操作、状态管理和流程控制。系统采用基于平衡计分卡BSC的多维度考核体系支持多种科室类型的差异化考核需求。
## 项目结构
考核服务位于后端应用的服务层,采用清晰的分层架构设计:
```mermaid
graph TB
subgraph "API层"
A[API路由]
B[认证中间件]
end
subgraph "服务层"
C[AssessmentService]
D[其他服务]
end
subgraph "数据层"
E[模型定义]
F[数据库]
end
subgraph "配置层"
G[数据库配置]
H[安全配置]
I[应用配置]
end
A --> C
B --> A
C --> E
E --> F
G --> F
H --> A
I --> A
```
**图表来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
- [models.py](file://backend/app/models/models.py#L149-L203)
- [database.py](file://backend/app/core/database.py#L9-L39)
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [models.py](file://backend/app/models/models.py#L1-L438)
## 核心组件
### AssessmentService 类
AssessmentService 是考核服务的核心类,提供了完整的考核管理功能:
#### 主要职责
- 考核记录的创建、读取、更新、删除
- 考核状态的流转管理
- 考核分数的自动计算
- 批量考核创建功能
#### 关键特性
- 异步数据库操作支持
- 完整的状态机管理
- 自动化的分数计算
- 权限控制集成
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
## 架构概览
考核服务采用经典的三层架构模式,确保了良好的关注点分离:
```mermaid
sequenceDiagram
participant Client as 客户端
participant API as API路由
participant Service as AssessmentService
participant DB as 数据库
participant Model as 数据模型
Client->>API : HTTP请求
API->>Service : 调用服务方法
Service->>DB : 执行数据库操作
DB->>Model : 映射数据模型
Model-->>DB : 返回实体对象
DB-->>Service : 返回查询结果
Service-->>API : 返回业务结果
API-->>Client : HTTP响应
```
**图表来源**
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L17-L263)
## 详细组件分析
### 数据模型设计
#### Assessment 模型
Assessment 模型代表一条完整的考核记录,包含以下关键字段:
```mermaid
classDiagram
class Assessment {
+int id
+int staff_id
+int period_year
+int period_month
+string period_type
+float total_score
+float weighted_score
+AssessmentStatus status
+int assessor_id
+int reviewer_id
+datetime submit_time
+datetime review_time
+string remark
+datetime created_at
+datetime updated_at
}
class AssessmentDetail {
+int id
+int assessment_id
+int indicator_id
+float actual_value
+float score
+string evidence
+string remark
+datetime created_at
+datetime updated_at
}
class Staff {
+int id
+string employee_id
+string name
+int department_id
+string position
+string title
+string phone
+string email
+float base_salary
+float performance_ratio
+StaffStatus status
+datetime hire_date
}
class Indicator {
+int id
+string name
+string code
+IndicatorType indicator_type
+BSCDimension bs_dimension
+float weight
+float max_score
+float target_value
+string target_unit
+string calculation_method
+string assessment_method
+string deduction_standard
+string data_source
+string applicable_dept_types
+bool is_veto
+bool is_active
}
Assessment "1" -- "many" AssessmentDetail : "包含"
Assessment "1" -- "1" Staff : "关联"
AssessmentDetail "1" -- "1" Indicator : "关联"
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L149-L203)
- [models.py](file://backend/app/models/models.py#L181-L203)
#### AssessmentStatus 状态枚举
考核状态采用严格的有限状态机设计:
```mermaid
stateDiagram-v2
[*] --> DRAFT : 创建
DRAFT --> SUBMITTED : 提交
SUBMITTED --> REVIEWED : 审核通过
SUBMITTED --> REJECTED : 审核驳回
REVIEWED --> FINALIZED : 确认
REJECTED --> DRAFT : 修改后重新提交
FINALIZED --> [*] : 结束
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L45-L52)
**章节来源**
- [models.py](file://backend/app/models/models.py#L149-L203)
- [models.py](file://backend/app/models/models.py#L45-L52)
### 核心业务方法详解
#### 1. 列表查询方法
`get_list()` 方法提供了灵活的考核记录查询功能:
**功能特点:**
- 多条件过滤支持员工ID、科室ID、年度、月份、状态
- 分页查询支持
- 性能优化的子查询统计
- 关联数据预加载
**查询逻辑:**
```mermaid
flowchart TD
Start([开始查询]) --> BuildQuery["构建基础查询"]
BuildQuery --> CheckFilters{"是否有过滤条件?"}
CheckFilters --> |是| ApplyFilters["应用过滤条件"]
CheckFilters --> |否| CountQuery["构建统计查询"]
ApplyFilters --> CountQuery
CountQuery --> Pagination["应用分页"]
Pagination --> ExecuteQuery["执行查询"]
ExecuteQuery --> ReturnResults["返回结果"]
ReturnResults --> End([结束])
```
**图表来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L18-L56)
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L18-L56)
#### 2. 详情获取方法
`get_by_id()` 方法提供了完整的考核详情查询:
**功能特点:**
- 关联员工信息查询
- 考核明细及指标信息加载
- 预加载优化减少N+1查询
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L58-L68)
#### 3. 创建考核方法
`create()` 方法实现了完整的考核创建流程:
**核心算法:**
1. 计算总分:所有明细得分的简单求和
2. 计算加权得分:每个指标得分乘以其权重后的总和
3. 创建主记录和明细记录
4. 自动设置初始状态为草稿
**分数计算公式:**
- 总分 = Σ(明细得分)
- 加权得分 = Σ(明细得分 × 指标权重)
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
#### 4. 更新考核方法
`update()` 方法提供了受控的考核更新功能:
**状态限制:**
- 仅允许草稿和被驳回状态的记录进行更新
- 更新时会删除旧的考核明细并重新创建
**更新流程:**
```mermaid
flowchart TD
Start([开始更新]) --> LoadAssessment["加载考核记录"]
LoadAssessment --> CheckStatus{"状态是否允许更新?"}
CheckStatus --> |否| ReturnNull["返回None"]
CheckStatus --> |是| DeleteOldDetails["删除旧明细"]
DeleteOldDetails --> RecalculateScores["重新计算分数"]
RecalculateScores --> UpdateFields["更新其他字段"]
UpdateFields --> SaveChanges["保存更改"]
SaveChanges --> ReturnAssessment["返回更新后的记录"]
ReturnNull --> End([结束])
ReturnAssessment --> End
```
**图表来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L111-L156)
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L111-L156)
#### 5. 流程控制方法
##### 提交方法 (`submit`)
将草稿状态的考核记录提交到审核流程。
##### 审核方法 (`review`)
管理员或经理对提交的考核进行审核:
- 通过:状态转为已审核
- 驳回:状态转为被驳回并可添加审核意见
##### 确认方法 (`finalize`)
最终确认已审核的考核记录,状态转为已确认。
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L159-L205)
#### 6. 批量创建方法
`batch_create_for_department()` 实现了高效的批量考核创建:
**功能特点:**
- 为指定科室的所有在职员工批量创建考核
- 自动检查重复创建
- 为每个员工创建相同的考核指标模板
**使用场景:**
- 月末批量创建员工考核
- 新指标模板上线时的批量创建
- 年度考核周期开始时的批量初始化
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
### API 接口设计
#### RESTful API 规范
| 接口 | 方法 | 权限 | 功能描述 |
|------|------|------|----------|
| `/assessments` | GET | 任意用户 | 获取考核列表 |
| `/assessments` | POST | 普通用户 | 创建考核记录 |
| `/assessments/{id}` | GET | 任意用户 | 获取考核详情 |
| `/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#L20-L166)
## 依赖关系分析
### 外部依赖
```mermaid
graph LR
subgraph "核心依赖"
A[SQLAlchemy 2.0]
B[FastAPI]
C[Pydantic]
D[PostgreSQL]
end
subgraph "服务层"
E[AssessmentService]
F[其他业务服务]
end
subgraph "数据层"
G[模型定义]
H[数据库连接]
end
E --> A
E --> G
F --> A
G --> H
H --> D
B --> C
```
**图表来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L12)
- [database.py](file://backend/app/core/database.py#L4-L20)
### 内部依赖关系
```mermaid
graph TD
A[AssessmentService] --> B[Assessment 模型]
A --> C[AssessmentDetail 模型]
A --> D[Staff 模型]
A --> E[Indicator 模型]
A --> F[AssessmentStatus 枚举]
A --> G[数据库会话]
H[API路由] --> A
I[安全模块] --> H
J[配置模块] --> H
K[数据库配置] --> G
```
**图表来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L10-L11)
- [assessments.py](file://backend/app/api/v1/assessments.py#L14-L15)
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L12)
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L17)
## 性能考虑
### 数据库优化策略
1. **索引优化**
- 考核记录按员工ID、年度月份、状态建立复合索引
- 考核明细按考核记录ID、指标ID建立索引
2. **查询优化**
- 使用 selectinload 进行关联数据预加载
- 子查询统计避免全表扫描
3. **连接池管理**
- 异步连接池配置
- 连接超时和重试机制
### 缓存策略
- 使用 LRU 缓存存储常用配置
- 数据库查询结果缓存(可选)
### 异步处理
- 全面采用异步数据库操作
- 避免阻塞式I/O操作
## 故障排除指南
### 常见问题及解决方案
#### 1. 考核状态错误
**问题:** 尝试在不允许的状态下更新或操作考核
**解决方案:** 检查当前状态是否符合操作要求
#### 2. 权限不足
**问题:** 审核或确认操作返回403错误
**解决方案:** 确认当前用户具有管理员或经理权限
#### 3. 数据库连接问题
**问题:** 数据库操作失败
**解决方案:** 检查数据库连接配置和网络连通性
#### 4. 分页查询异常
**问题:** 分页参数无效导致查询错误
**解决方案:** 验证页码和每页数量参数范围
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L117-L118)
- [security.py](file://backend/app/core/security.py#L94-L109)
## 结论
考核服务通过精心设计的架构和完善的业务逻辑,为医院绩效管理提供了强大的技术支持。系统的主要优势包括:
1. **完整的生命周期管理**:从创建到确认的完整流程覆盖
2. **灵活的查询能力**:支持多维度、多条件的复杂查询
3. **严格的状态控制**:确保业务流程的合规性
4. **高效的批量处理**:支持大规模数据的批量操作
5. **完善的权限控制**:基于角色的精细化权限管理
该服务为后续的薪资计算、统计分析等功能奠定了坚实的基础,是整个绩效管理系统的核心支柱。