提交文件

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,534 @@
# API路由实现
<cite>
**本文档引用的文件**
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/core/security.py](file://backend/app/core/security.py)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py)
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py)
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py)
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向医院绩效系统后端API路由实现系统采用FastAPI框架提供RESTful风格的接口涵盖认证、基础数据、考核、工资、统计、计划、菜单、模板、财务等模块。文档重点说明路由装饰器使用、路径参数与查询参数处理、请求验证、响应模型定义、错误处理机制、CORS配置、中间件使用、安全控制、API版本管理、文档生成与测试方法并给出性能优化、限流策略与监控集成建议。
## 项目结构
后端采用分层与功能模块化组织:
- 应用入口与配置main.py负责应用实例创建、CORS配置、路由注册、异常处理与健康检查
- API版本api/v1目录统一管理v1版本的所有路由模块
- 核心模块core目录包含配置、数据库连接、安全认证等基础设施
- 数据模型与Schemamodels与schemas定义数据库实体与API输入输出模型
- 业务服务services目录封装各模块业务逻辑
- 前端对接frontend目录提供前端界面与API调用示例
```mermaid
graph TB
A["应用入口<br/>backend/app/main.py"] --> B["API路由器<br/>backend/app/api/v1/__init__.py"]
B --> C["认证模块<br/>backend/app/api/v1/auth.py"]
B --> D["基础数据模块<br/>departments/staff/indicators"]
B --> E["考核模块<br/>backend/app/api/v1/assessments.py"]
B --> F["工资模块<br/>backend/app/api/v1/salary.py"]
B --> G["统计模块<br/>backend/app/api/v1/stats.py"]
B --> H["财务模块<br/>backend/app/api/v1/finance.py"]
B --> I["计划模块<br/>backend/app/api/v1/performance_plans.py"]
B --> J["菜单模块<br/>backend/app/api/v1/menus.py"]
K["配置模块<br/>backend/app/core/config.py"] --> A
L["安全模块<br/>backend/app/core/security.py"] --> A
M["Schema定义<br/>backend/app/schemas/schemas.py"] --> C
M --> D
M --> E
M --> F
M --> G
M --> H
M --> I
M --> J
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
## 核心组件
- 应用实例与中间件
- 使用FastAPI构造应用配置标题、版本、描述与OpenAPI文档路径
- 注册CORS中间件允许跨域请求
- 注册API路由器统一前缀为配置中的API_PREFIX
- 定义健康检查端点
- 注册全局异常处理器,记录日志并抛出异常
- 配置管理
- 通过Settings类集中管理应用名、版本、数据库连接、JWT密钥、CORS白名单、分页参数等
- 使用lru_cache缓存配置实例
- 安全认证
- 基于JWT的OAuth2密码流支持密码哈希、令牌签发与解析
- 提供当前用户、激活用户、管理员、经理权限校验依赖
- Schema定义
- 统一响应模型ResponseBase与分页模型PaginatedResponse
- 定义枚举类型(科室类型、员工状态、考核状态、指标类型、财务类型等)
- 为各模块定义输入输出模型,确保请求验证与响应格式标准化
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L19-L77)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/app/core/security.py](file://backend/app/core/security.py#L21-L110)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L743)
## 架构概览
系统采用分层架构路由层FastAPI装饰器与依赖注入、服务层业务逻辑封装、数据层SQLAlchemy异步ORM。路由层负责参数解析、权限校验与响应包装服务层负责领域逻辑数据层负责持久化。
```mermaid
graph TB
subgraph "路由层"
R1["认证路由<br/>auth.py"]
R2["基础数据路由<br/>departments/staff/indicators.py"]
R3["考核路由<br/>assessments.py"]
R4["工资路由<br/>salary.py"]
R5["统计路由<br/>stats.py"]
R6["财务路由<br/>finance.py"]
R7["计划路由<br/>performance_plans.py"]
R8["菜单路由<br/>menus.py"]
end
subgraph "服务层"
S1["认证服务"]
S2["部门服务"]
S3["员工服务"]
S4["指标服务"]
S5["考核服务"]
S6["工资服务"]
S7["统计服务"]
S8["财务服务"]
S9["计划服务"]
S10["菜单服务"]
end
subgraph "数据层"
D1["数据库会话<br/>AsyncSession"]
D2["模型定义<br/>models/*.py"]
end
R1 --> S1 --> D1
R2 --> S2 --> D1
R3 --> S5 --> D1
R4 --> S6 --> D1
R5 --> S7 --> D1
R6 --> S8 --> D1
R7 --> S9 --> D1
R8 --> S10 --> D1
```
**图表来源**
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L14-L74)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L17-L108)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L17-L124)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L17-L142)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L17-L166)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L17-L156)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L14-L242)
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L18-L217)
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L18-L310)
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L14-L164)
## 详细组件分析
### 认证模块auth
- 路由装饰器使用
- 使用APIRouter装饰器定义路由前缀与标签
- 使用Depends注入数据库会话与安全依赖
- 路径与查询参数
- 登录接口使用OAuth2PasswordRequestForm自动解析表单参数
- 注册接口接收JSON体参数UserCreate
- 请求验证与响应模型
- 使用Pydantic模型进行请求体验证
- 响应模型Token与UserResponse
- 错误处理
- 用户名或密码错误返回401
- 账户禁用返回403
- 用户名重复返回400
- 安全控制
- 密码使用bcrypt哈希存储
- JWT令牌包含过期时间默认8小时
- 当前用户依赖get_current_active_user保证用户激活状态
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Auth as "认证路由"
participant Security as "安全模块"
participant DB as "数据库"
Client->>Auth : POST /api/v1/auth/login
Auth->>DB : 查询用户
DB-->>Auth : 用户对象
Auth->>Security : 验证密码
Security-->>Auth : 验证结果
Auth->>Security : 创建访问令牌
Security-->>Auth : 令牌
Auth-->>Client : {access_token, token_type}
Note over Client,Security : 登录成功后使用Bearer令牌访问受保护资源
```
**图表来源**
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L43)
**章节来源**
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L14-L74)
- [backend/app/core/security.py](file://backend/app/core/security.py#L21-L110)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L315-L345)
### 基础数据模块departments, staff, indicators
- 路由装饰器与依赖
- 使用Depends(get_current_active_user)确保用户登录
- 部门、员工、指标管理使用get_current_manager_user限制为管理员或经理
- 查询参数处理
- 列表接口统一支持dept_type/status/is_active/keyword/page/page_size等查询参数
- 树形结构接口支持dept_type过滤
- 响应模型
- 使用DepartmentResponse、StaffResponse、IndicatorResponse等模型
- 列表接口返回统一的分页响应结构
- 错误处理
- 资源不存在返回404
- 编码重复返回400
- 删除失败返回400
```mermaid
flowchart TD
Start(["请求进入"]) --> Parse["解析查询参数<br/>dept_type/status/is_active/keyword/page/page_size"]
Parse --> Filter["服务层查询<br/>按条件过滤"]
Filter --> BuildResp["构建响应模型<br/>DepartmentResponse/StaffResponse/IndicatorResponse"]
BuildResp --> PageWrap["分页包装<br/>统一响应结构"]
PageWrap --> End(["返回响应"])
```
**图表来源**
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L40)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L49)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
**章节来源**
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L17-L108)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L17-L124)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L17-L142)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L64-L192)
### 考核模块assessments
- 功能特性
- 支持创建、更新、提交、审核、确认考核记录
- 支持批量创建考核
- 明细包含指标ID、实际值、得分、佐证材料与备注
- 路由装饰器与权限
- 多数操作使用get_current_active_user
- 审核与确认使用get_current_manager_user
- 查询参数
- 支持按员工、科室、年度、月份、状态筛选
- 流程控制
- 提交、审核、确认按状态机流转非法状态返回400
```mermaid
stateDiagram-v2
[*] --> 草稿
草稿 --> 已提交 : "提交"
已提交 --> 已审核 : "审核通过"
已提交 --> 已驳回 : "审核驳回"
已审核 --> 已确认 : "确认"
已确认 --> [*]
已驳回 --> [*]
```
**图表来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L31-L37)
**章节来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L17-L166)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L194-L270)
### 工资模块salary
- 功能特性
- 支持创建、更新、确认工资记录
- 支持根据考核生成工资、批量生成与批量确认
- 路由装饰器与权限
- 生成与确认使用get_current_manager_user
- 查询参数
- 支持按员工、科室、年度、月份、状态筛选
- 业务逻辑
- 生成工资时需存在已确认的考核记录且无重复工资记录
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Salary as "工资路由"
participant Service as "工资服务"
participant DB as "数据库"
Client->>Salary : POST /api/v1/salary/generate
Salary->>Service : generate_from_assessment(staff_id, year, month)
Service->>DB : 查询已确认考核
DB-->>Service : 考核记录
Service->>DB : 创建工资记录
DB-->>Service : 工资记录
Service-->>Salary : 工资记录
Salary-->>Client : {code, message, data{id}}
```
**图表来源**
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L110)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py)
**章节来源**
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L17-L156)
### 统计模块stats
- 功能特性
- BSC维度分析、科室绩效统计、趋势分析、周期统计、仪表盘指标、预警数据、排名、指标完成度
- 查询参数
- 年度、月份、科室ID、返回数量等
- 数据处理
- 对查询结果进行聚合计算(如平均分、总数等)
```mermaid
flowchart TD
Q["接收查询参数<br/>department_id/year/month/limit"] --> Calc["调用统计服务"]
Calc --> Agg["聚合计算<br/>平均分/总数/排名"]
Agg --> Resp["构建响应<br/>统一结构"]
Resp --> Done["返回数据"]
```
**图表来源**
- [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)
**章节来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L14-L242)
### 财务模块finance
- 功能特性
- 收入、支出、收支结余查询,按类别统计,财务汇总,类别枚举获取
- 支持创建、更新、删除财务记录
- 路由装饰器与权限
- 创建、更新、删除使用get_current_manager_user
- 类别校验
- 根据财务类型(收入/支出)校验类别是否有效
```mermaid
flowchart TD
Start(["创建财务记录"]) --> Type["判断财务类型"]
Type --> Rev{"收入?"}
Rev --> |是| CheckRev["校验收入类别"]
Rev --> |否| CheckExp["校验支出类别"]
CheckRev --> Valid{"类别有效?"}
CheckExp --> Valid
Valid --> |否| Err["返回400"]
Valid --> |是| Create["创建记录"]
Create --> Done["返回成功"]
```
**图表来源**
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L157-L187)
**章节来源**
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L18-L217)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L376-L460)
### 计划模块performance_plans
- 功能特性
- 绩效计划的CRUD、提交、审批、激活、树形结构、统计信息、指标关联管理
- 路由装饰器与权限
- 多数操作使用get_current_active_user
- 审批与激活使用get_current_manager_user
- 数据结构
- 计划与指标关联模型支持权重、评分方法、目标值等
```mermaid
classDiagram
class PerformancePlan {
+int id
+string plan_name
+string plan_code
+string plan_level
+int plan_year
+int plan_month
+string status
+int department_id
+int staff_id
+string description
+datetime created_at
+datetime updated_at
}
class PlanKpiRelation {
+int id
+int plan_id
+int indicator_id
+float target_value
+string target_unit
+float weight
+string scoring_method
+string scoring_params
+string remark
}
PerformancePlan "1" o-- "0..*" PlanKpiRelation : "包含"
```
**图表来源**
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L519-L570)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L481-L570)
**章节来源**
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L18-L310)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L461-L580)
### 菜单模块menus
- 功能特性
- 菜单树形结构、列表、详情、创建、更新、删除、初始化默认菜单
- 路由装饰器与权限
- 创建、更新、删除、初始化使用get_current_manager_user
- 树形结构
- 支持仅返回可见菜单
**章节来源**
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L14-L164)
## 依赖关系分析
- 路由到服务
- 各路由模块通过Depends注入数据库会话调用对应服务层方法
- 服务层封装业务逻辑,避免路由层直接操作数据库
- 服务到模型
- 服务层使用SQLAlchemy异步会话执行查询与事务
- 模型定义在models目录Schema在schemas目录二者分离职责
- 安全依赖链
- get_current_user -> decode_token -> 数据库查询用户
- get_current_active_user -> 检查用户激活状态
- get_current_admin_user / get_current_manager_user -> 检查角色
```mermaid
graph LR
Route["路由模块"] --> Service["服务模块"]
Service --> Model["模型定义"]
Route --> Security["安全依赖"]
Security --> DB["数据库会话"]
```
**图表来源**
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L55-L82)
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
**章节来源**
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
## 性能考虑
- 连接池配置
- 数据库连接池大小与溢出配置在配置模块中集中管理,建议根据并发与硬件资源调整
- 异步IO
- 使用SQLAlchemy 2.0异步会话,提升高并发下的吞吐能力
- 分页与查询优化
- 列表接口统一分页参数,避免一次性加载大量数据
- 查询参数尽量使用索引字段如部门ID、状态等
- 缓存策略
- 配置模块使用LRU缓存缓存Settings实例减少重复解析环境变量
- 响应模型序列化
- 使用Pydantic模型的model_validate/model_dump减少手动转换开销
[本节为通用性能指导,不涉及具体文件分析]
## 故障排除指南
- 认证相关
- 401未授权检查Bearer令牌是否正确传递与未过期
- 403禁止访问检查用户角色与权限依赖
- 资源不存在
- 404确认ID是否存在路径参数是否正确
- 参数验证错误
- 422检查请求体字段类型与长度约束
- 数据冲突
- 400如用户名重复、编码重复、删除失败等根据提示修正
**章节来源**
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L37)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L74-L77)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L100-L102)
## 结论
本系统通过清晰的模块划分、严格的请求验证与响应模型、完善的权限控制与异常处理实现了稳定可靠的API路由层。结合异步数据库与分页策略具备良好的扩展性与性能表现。建议在生产环境中进一步完善限流、监控与日志策略确保系统在高并发场景下的稳定性。
## 附录
### RESTful设计原则
- 资源命名:使用名词复数形式(如/departments、/staff、/indicators
- 路径参数:唯一标识资源(如/{dept_id}
- 查询参数:过滤与分页(如?page&page_size
- 状态码遵循HTTP语义200、201、400、401、403、404、422、500
- 响应格式统一使用包含code、message、data的结构
### HTTP状态码使用
- 200成功获取或更新
- 201成功创建
- 400客户端参数错误或业务逻辑错误
- 401未认证
- 403权限不足
- 404资源不存在
- 422请求体验证失败
- 500服务器内部错误
### API版本管理
- 版本前缀:/api/v1
- 文档路径:/api/v1/docs、/api/v1/redoc、/api/v1/openapi.json
- 配置集中settings.API_PREFIX统一管理
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L19-L39)
- [backend/app/core/config.py](file://backend/app/core/config.py#L16-L16)
### 文档生成与测试
- 文档生成FastAPI自动生成OpenAPI规范与交互式文档
- 测试方法建议使用pytest与HTTP客户端对各模块进行单元测试与集成测试
[本节为通用指导,不涉及具体文件分析]
### CORS配置与中间件
- CORS中间件允许跨域请求支持凭证、通配符方法与头
- 中间件注册在应用创建时添加至FastAPI实例
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
- [backend/app/core/config.py](file://backend/app/core/config.py#L28-L29)
### 安全控制
- JWT令牌使用SECRET_KEY与ALGORITHM签名ACCESS_TOKEN_EXPIRE_MINUTES控制有效期
- 密码哈希bcrypt确保密码安全存储
- 权限依赖:多级权限校验,确保敏感操作仅管理员或经理可执行
**章节来源**
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L110)
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
### 性能优化与限流策略
- 连接池合理配置pool_size与max_overflow
- 异步查询:利用异步会话减少阻塞
- 缓存:对热点配置与查询结果进行缓存
- 限流建议引入速率限制中间件如基于IP或令牌的限流
- 监控集成APM工具如Prometheus + Grafana监控QPS、延迟与错误率
[本节为通用指导,不涉及具体文件分析]

View File

@@ -0,0 +1,438 @@
# 基础数据接口
<cite>
**本文档引用的文件**
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_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/main.py](file://backend/app/main.py)
- [frontend/src/api/department.js](file://frontend/src/api/department.js)
- [frontend/src/api/staff.js](file://frontend/src/api/staff.js)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js)
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本文件面向基础数据接口的详细文档,涵盖以下模块:
- 科室管理:支持树形结构的增删改查、层级关系维护与权限控制
- 员工管理支持员工信息的CRUD、按科室检索与状态管理
- 考核指标管理:支持指标分类、权重设置、计算公式与模板导入
- 工资相关接口支持工资记录的CRUD、批量生成与确认、业务规则校验
文档同时说明RESTful设计原则、统一响应格式、分页查询、条件筛选、排序规则、数据导入导出与批量操作的实现思路以及错误处理策略。
## 项目结构
后端采用FastAPI + SQLAlchemy 2.0 + 异步数据库访问,遵循分层架构:
- API层定义路由与请求参数校验
- 服务层:封装业务逻辑与数据访问
- 模型层:定义数据库实体与关系
- 模式层定义Pydantic数据结构用于序列化与校验
- 前端层通过Axios封装的API调用
```mermaid
graph TB
subgraph "前端"
FE_Dep["department.js"]
FE_Staff["staff.js"]
FE_Ind["indicator.js"]
FE_Sal["salary.js"]
end
subgraph "后端"
API_Dep["departments.py"]
API_Staff["staff.py"]
API_Ind["indicators.py"]
API_Sal["salary.py"]
SVC_Dep["department_service.py"]
SVC_Staff["staff_service.py"]
SVC_Ind["indicator_service.py"]
SVC_Sal["salary_service.py"]
MODELS["models.py"]
SCHEMAS["schemas.py"]
MAIN["main.py"]
end
FE_Dep --> API_Dep
FE_Staff --> API_Staff
FE_Ind --> API_Ind
FE_Sal --> API_Sal
API_Dep --> SVC_Dep
API_Staff --> SVC_Staff
API_Ind --> SVC_Ind
API_Sal --> SVC_Sal
SVC_Dep --> MODELS
SVC_Staff --> MODELS
SVC_Ind --> MODELS
SVC_Sal --> MODELS
API_Dep --> SCHEMAS
API_Staff --> SCHEMAS
API_Ind --> SCHEMAS
API_Sal --> SCHEMAS
MAIN --> API_Dep
MAIN --> API_Staff
MAIN --> API_Ind
MAIN --> API_Sal
```
图表来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
- [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/main.py](file://backend/app/main.py#L1-L92)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
## 核心组件
- API路由层定义RESTful端点负责参数解析、权限校验与统一响应包装
- 服务层:封装业务逻辑,处理数据访问、复杂查询与事务控制
- 模型层:定义实体关系、索引与约束,支撑树形结构与多对多关系
- 模式层:定义输入输出结构,确保前后端数据一致性与校验
章节来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L17-L108)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L17-L124)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L17-L142)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L17-L156)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L13-L150)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L13-L197)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L231)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L311)
## 架构概览
系统采用分层架构API层仅负责协议转换与权限控制服务层承担业务规则模型层承载数据结构与约束。统一响应格式包含状态码、消息、数据体、分页信息异常通过全局处理器记录并抛出。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "API路由"
participant Service as "服务层"
participant DB as "数据库"
Client->>API : "HTTP请求"
API->>API : "参数校验/权限检查"
API->>Service : "调用业务逻辑"
Service->>DB : "SQLAlchemy查询/写入"
DB-->>Service : "返回结果"
Service-->>API : "业务结果"
API-->>Client : "统一响应格式"
```
图表来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L40)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L49)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L20-L51)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L43)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L49)
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L46)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L20-L58)
## 详细组件分析
### 科室管理接口
- 功能范围
- 列表查询:支持按类型、启用状态过滤,分页与排序
- 树形结构:按层级与排序生成树形结构,便于前端渲染
- 单条查询按ID获取详情
- 新增/更新/删除:新增时自动计算层级,删除前检查是否存在子节点
- 权限控制:新增、更新、删除需管理员或经理权限
- 数据模型与关系
- Department实体支持自引用父-子关系维护level与sort_order
- 通过索引优化dept_type与parent_id查询
- 统一响应与分页
- 响应包含code、message、data、total、page、page_size
- 列表默认按sort_order与id排序
- 错误处理
- 未找到资源返回404
- 删除失败存在子节点返回400
```mermaid
classDiagram
class Department {
+int id
+string name
+string code
+DeptType dept_type
+int parent_id
+int level
+int sort_order
+bool is_active
+string description
+datetime created_at
+datetime updated_at
+Department parent
+Staff[] staff
}
class DepartmentService {
+get_list(...)
+get_tree(...)
+get_by_id(...)
+get_by_code(...)
+create(...)
+update(...)
+delete(...)
}
DepartmentService --> Department : "读写"
```
图表来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L13-L150)
章节来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L108)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L150)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L64-L103)
### 员工管理接口
- 功能范围
- 列表查询:支持按科室、状态、关键词(姓名/工号)过滤,分页与排序
- 单条查询按ID获取详情附加科室名称
- 新增/更新/删除:新增前检查工号唯一性
- 科室员工查询按科室ID获取在职员工列表
- 数据模型与关系
- Staff与Department为多对一关系支持按状态与部门ID高效查询
- 提供索引优化department_id与status字段
- 统一响应与分页
- 响应包含code、message、data、total、page、page_size
- 列表默认按id倒序
- 错误处理
- 未找到资源返回404
```mermaid
classDiagram
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
+datetime created_at
+datetime updated_at
+Department department
+Assessment[] assessments
+SalaryRecord[] salary_records
}
class StaffService {
+get_list(...)
+get_by_id(...)
+get_by_employee_id(...)
+create(...)
+update(...)
+delete(...)
+get_by_department(...)
}
StaffService --> Staff : "读写"
```
图表来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
章节来源
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L124)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L112)
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
### 考核指标管理接口
- 功能范围
- 列表查询支持按指标类型、BSC维度、启用状态过滤分页与排序
- 启用指标查询:获取全部启用的指标
- 单条查询按ID获取详情
- 新增/更新/删除:新增前检查指标编码唯一性
- 模板管理:提供模板列表与导入能力,支持覆盖策略
- 数据模型与关系
- Indicator实体包含指标类型、BSC维度、权重、最高分值、目标值与单位、计算方法、适用科室类型等
- 提供索引优化indicator_type字段与权重约束
- 统一响应与分页
- 响应包含code、message、data、total、page、page_size
- 列表默认按indicator_type与id排序
- 模板导入流程
- 按模板dept_type批量导入指标支持覆盖已有指标
```mermaid
flowchart TD
Start(["开始导入"]) --> LoadTemplate["加载模板数据"]
LoadTemplate --> Iterate["遍历指标项"]
Iterate --> Exists{"指标已存在?"}
Exists --> |是且覆盖| Update["更新现有指标"]
Exists --> |是不覆盖| Skip["跳过该指标"]
Exists --> |否| Create["创建新指标"]
Update --> Next["下一个指标"]
Skip --> Next
Create --> Next
Next --> Done(["完成导入"])
```
图表来源
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L106-L154)
章节来源
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L142)
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L197)
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L153-L192)
### 工资核算管理接口
- 功能范围
- 列表查询:支持按员工、科室、年度、月份、状态过滤,分页与排序
- 单条查询按ID获取详情附加员工与科室名称
- 新增/更新:创建时计算总工资,更新时重新计算总工资
- 生成工资:根据已确认的考核记录生成工资记录
- 批量生成:按科室批量生成工资记录
- 确认工资:单条与批量确认,状态变更
- 业务规则
- 工资 = 基本工资 + 绩效奖金 + 补贴 - 扣款
- 绩效奖金 = 固定基数 × (绩效得分/100) × 员工绩效系数
- 仅允许对“待确认”状态进行更新与确认
- 统一响应与分页
- 响应包含code、message、data、total、page、page_size
- 列表默认按年度、月份、id倒序
- 批量操作
- 批量生成与批量确认均支持按科室过滤
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "salary.py"
participant Service as "salary_service.py"
participant DB as "数据库"
Client->>API : "POST /salary/generate?staff_id=&period_year=&period_month="
API->>Service : "generate_from_assessment(...)"
Service->>DB : "查询员工与已确认考核记录"
DB-->>Service : "返回员工与考核记录"
Service->>Service : "计算绩效奖金与总工资"
Service->>DB : "插入工资记录"
DB-->>Service : "返回新记录"
Service-->>API : "返回记录ID"
API-->>Client : "统一响应"
```
图表来源
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L111)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
章节来源
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L20-L156)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L20-L260)
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L274-L311)
## 依赖分析
- API层依赖服务层与安全中间件统一响应包装
- 服务层依赖模型层进行数据持久化
- 模式层为API与服务层提供数据契约
- 前端通过Axios封装的API与后端交互
```mermaid
graph LR
FE_Dep["frontend/src/api/department.js"] --> API_Dep["backend/app/api/v1/departments.py"]
FE_Staff["frontend/src/api/staff.js"] --> API_Staff["backend/app/api/v1/staff.py"]
FE_Ind["frontend/src/api/indicator.js"] --> API_Ind["backend/app/api/v1/indicators.py"]
FE_Sal["frontend/src/api/salary.js"] --> API_Sal["backend/app/api/v1/salary.py"]
API_Dep --> SVC_Dep["backend/app/services/department_service.py"]
API_Staff --> SVC_Staff["backend/app/services/staff_service.py"]
API_Ind --> SVC_Ind["backend/app/services/indicator_service.py"]
API_Sal --> SVC_Sal["backend/app/services/salary_service.py"]
SVC_Dep --> MODELS["backend/app/models/models.py"]
SVC_Staff --> MODELS
SVC_Ind --> MODELS
SVC_Sal --> MODELS
API_Dep --> SCHEMAS["backend/app/schemas/schemas.py"]
API_Staff --> SCHEMAS
API_Ind --> SCHEMAS
API_Sal --> SCHEMAS
```
图表来源
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
- [frontend/src/api/staff.js](file://frontend/src/api/staff.js#L1-L32)
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
- [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)
## 性能考虑
- 查询优化
- 使用索引科室类型、父节点ID、员工部门ID、状态、指标类型、考核记录周期、工资记录周期等
- 分页查询:限制每页最大数量,避免一次性返回大量数据
- 关联预加载使用selectinload减少N+1查询
- 事务与并发
- 服务层方法内部保持事务一致性,避免脏读与丢失更新
- 缓存与异步
- 当前实现为同步处理,如需高并发场景可引入缓存与异步任务队列
## 故障排除指南
- 常见错误
- 404资源不存在科室、员工、指标、工资记录
- 400业务规则不满足删除存在子节点的科室、重复编码、状态不允许更新/确认)
- 日志与异常
- 全局异常处理器记录HTTP异常与验证异常便于定位问题
- 排查步骤
- 检查请求参数与权限头
- 查看服务层日志与数据库事务状态
- 确认业务规则(如状态机、唯一性约束)
章节来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L62-L107)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L60-L108)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L78-L111)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L92-L142)
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
## 结论
本系统通过清晰的分层架构与统一的数据契约,实现了基础数据管理的核心能力。科室管理支持树形结构与层级维护,员工管理提供灵活的查询与状态管理,指标管理具备模板导入与权重配置能力,工资管理覆盖从生成到确认的完整流程。建议后续在高并发场景引入缓存与异步处理,并持续完善数据校验与审计日志。

View File

@@ -0,0 +1,598 @@
# 工资财务接口
<cite>
**本文档引用的文件**
- [salary.py](file://backend/app/api/v1/salary.py)
- [finance.py](file://backend/app/api/v1/finance.py)
- [salary_service.py](file://backend/app/services/salary_service.py)
- [finance_service.py](file://backend/app/services/finance_service.py)
- [finance.py](file://backend/app/models/finance.py)
- [models.py](file://backend/app/models/models.py)
- [schemas.py](file://backend/app/schemas/schemas.py)
- [security.py](file://backend/app/core/security.py)
- [config.py](file://backend/app/core/config.py)
- [logging_config.py](file://backend/app/core/logging_config.py)
- [stats.py](file://backend/app/api/v1/stats.py)
- [stats_service.py](file://backend/app/services/stats_service.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本项目是一个基于FastAPI的医院绩效管理系统专注于工资财务接口的实现。系统提供了完整的工资核算、奖金计算和财务统计功能包括
- **工资核算管理**:支持单个和批量工资记录的生成、审核和发放
- **奖金计算算法**:基于绩效得分和系数的科学计算模型
- **财务统计分析**:科室收支统计、趋势分析和报表生成
- **税务计算和社保扣款**:精确的工资计算和扣除机制
- **数据安全和审计**:完善的权限控制和操作日志
## 项目结构
系统采用典型的三层架构设计,主要分为以下层次:
```mermaid
graph TB
subgraph "表现层"
Frontend[前端界面]
API[API路由层]
end
subgraph "业务逻辑层"
SalaryService[工资服务层]
FinanceService[财务服务层]
StatsService[统计服务层]
end
subgraph "数据访问层"
SalaryModel[工资模型]
FinanceModel[财务模型]
UserModel[用户模型]
end
subgraph "基础设施"
Database[(PostgreSQL数据库)]
Security[安全认证]
Logging[日志系统]
end
Frontend --> API
API --> SalaryService
API --> FinanceService
API --> StatsService
SalaryService --> SalaryModel
FinanceService --> FinanceModel
StatsService --> UserModel
SalaryModel --> Database
FinanceModel --> Database
UserModel --> Database
API --> Security
SalaryService --> Logging
FinanceService --> Logging
```
**图表来源**
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
- [finance.py](file://backend/app/api/v1/finance.py#L1-L217)
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
- [finance_service.py](file://backend/app/services/finance_service.py#L1-L368)
**章节来源**
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
- [finance.py](file://backend/app/api/v1/finance.py#L1-L217)
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
- [finance_service.py](file://backend/app/services/finance_service.py#L1-L368)
## 核心组件
### 工资核算组件
系统实现了完整的工资核算生命周期管理:
```mermaid
stateDiagram-v2
[*] --> 草稿 : 创建工资记录
草稿 --> 待确认 : 生成工资记录
待确认 --> 已确认 : 确认工资
已确认 --> 已发放 : 发放工资
已发放 --> [*]
待确认 --> 草稿 : 更新记录
草稿 --> 待确认 : 重新生成
```
**图表来源**
- [salary_service.py](file://backend/app/services/salary_service.py#L221-L260)
### 财务统计组件
财务统计系统提供多维度的数据分析能力:
```mermaid
graph LR
subgraph "数据源"
Assessments[考核数据]
Staff[员工数据]
Departments[科室数据]
end
subgraph "统计维度"
BSC[BSC维度分析]
Trends[趋势分析]
Rankings[绩效排名]
Completion[指标完成度]
end
subgraph "输出结果"
Reports[统计报表]
Dashboards[数据看板]
end
Assessments --> BSC
Staff --> Trends
Departments --> Rankings
Assessments --> Completion
BSC --> Reports
Trends --> Dashboards
Rankings --> Reports
Completion --> Dashboards
```
**图表来源**
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L300)
- [stats.py](file://backend/app/api/v1/stats.py#L17-L242)
**章节来源**
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
- [finance_service.py](file://backend/app/services/finance_service.py#L17-L368)
- [stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
## 架构概览
系统采用RESTful API设计遵循HTTP协议的最佳实践
```mermaid
sequenceDiagram
participant Client as 客户端
participant API as API网关
participant Service as 业务服务层
participant Model as 数据模型层
participant DB as 数据库
Client->>API : HTTP请求
API->>Service : 路由分发
Service->>Model : 数据验证和转换
Model->>DB : 数据查询/更新
DB-->>Model : 查询结果
Model-->>Service : 业务对象
Service-->>API : 业务结果
API-->>Client : JSON响应
```
**图表来源**
- [salary.py](file://backend/app/api/v1/salary.py#L20-L156)
- [finance.py](file://backend/app/api/v1/finance.py#L21-L217)
### 权限控制架构
系统实现了多层次的权限控制机制:
```mermaid
graph TD
subgraph "用户角色"
Guest[访客]
Staff[普通员工]
Manager[科室经理]
Admin[系统管理员]
end
subgraph "权限级别"
Read[读取权限]
Write[写入权限]
Approve[审批权限]
AdminAccess[管理权限]
end
Guest --> Read
Staff --> Read
Manager --> Write
Manager --> Approve
Admin --> AdminAccess
Read --> 薪资查询
Write --> 薪资创建
Approve --> 薪资确认
AdminAccess --> 系统管理
```
**图表来源**
- [security.py](file://backend/app/core/security.py#L85-L110)
**章节来源**
- [security.py](file://backend/app/core/security.py#L1-L110)
- [config.py](file://backend/app/core/config.py#L1-L47)
## 详细组件分析
### 工资核算服务
#### 绩效奖金计算算法
系统采用科学的绩效奖金计算模型:
```mermaid
flowchart TD
Start([开始计算]) --> GetScore["获取绩效得分"]
GetScore --> GetRatio["获取绩效系数"]
GetRatio --> CalcBonus["计算奖金 = 基数 × (得分/100) × 系数"]
CalcBonus --> CalcTotal["计算总工资 = 基本工资 + 奖金 + 津贴 - 扣款"]
CalcTotal --> CreateRecord["创建工资记录"]
CreateRecord --> End([结束])
CalcBonus --> CheckRange{"奖金范围检查"}
CheckRange --> |超出范围| Adjust["调整奖金"]
CheckRange --> |正常范围| Continue["继续计算"]
Adjust --> Continue
Continue --> CalcTotal
```
**图表来源**
- [salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
- [salary_service.py](file://backend/app/services/salary_service.py#L167-L170)
#### 工资记录生成流程
```mermaid
sequenceDiagram
participant HR as 人力资源
participant API as 工资API
participant Service as 工资服务
participant DB as 数据库
participant Payroll as 工资系统
HR->>API : 请求生成工资
API->>Service : generate_from_assessment()
Service->>DB : 查询员工信息
DB-->>Service : 员工数据
Service->>DB : 查询考核记录
DB-->>Service : 考核数据
Service->>Service : 计算绩效奖金
Service->>DB : 创建工资记录
DB-->>Service : 记录ID
Service-->>API : 工资记录
API-->>HR : 生成结果
HR->>Payroll : 提交工资发放
```
**图表来源**
- [salary.py](file://backend/app/api/v1/salary.py#L96-L110)
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
**章节来源**
- [salary_service.py](file://backend/app/services/salary_service.py#L71-L190)
- [salary.py](file://backend/app/api/v1/salary.py#L96-L110)
### 财务核算服务
#### 收支统计分析
系统提供全面的财务统计功能:
```mermaid
classDiagram
class FinanceService {
+get_department_revenue() List[Dict]
+get_department_expense() List[Dict]
+get_department_balance() Dict
+get_revenue_by_category() List[Dict]
+get_expense_by_category() List[Dict]
+get_department_summary() List[Dict]
+create_finance_record() DepartmentFinance
}
class DepartmentFinance {
+int id
+int department_id
+int period_year
+int period_month
+FinanceType finance_type
+str category
+float amount
+str source
+str remark
+datetime created_at
+datetime updated_at
}
class RevenueCategory {
<<enumeration>>
EXAMINATION
LAB_TEST
RADIOLOGY
BED
NURSING
TREATMENT
SURGERY
INJECTION
OXYGEN
OTHER
}
class ExpenseCategory {
<<enumeration>>
MATERIAL
PERSONNEL
MAINTENANCE
UTILITY
OTHER
}
FinanceService --> DepartmentFinance : creates
DepartmentFinance --> RevenueCategory : uses
DepartmentFinance --> ExpenseCategory : uses
```
**图表来源**
- [finance_service.py](file://backend/app/services/finance_service.py#L17-L368)
- [finance.py](file://backend/app/models/finance.py#L16-L79)
#### 财务报表生成
```mermaid
flowchart TD
GetData["获取财务数据"] --> GroupByMonth["按月分组"]
GroupByMonth --> SumAmount["计算金额汇总"]
SumAmount --> CalcBalance["计算收支结余"]
CalcBalance --> GenerateReport["生成报表"]
GenerateReport --> ExportData["导出数据"]
GetData --> FilterByDept["按科室过滤"]
FilterByDept --> GroupByCategory["按类别分组"]
GroupByCategory --> SumCategory["类别金额汇总"]
SumCategory --> GenerateChart["生成图表"]
GenerateChart --> ExportChart["导出图表"]
```
**图表来源**
- [finance_service.py](file://backend/app/services/finance_service.py#L143-L198)
- [finance_service.py](file://backend/app/services/finance_service.py#L200-L272)
**章节来源**
- [finance_service.py](file://backend/app/services/finance_service.py#L43-L368)
- [finance.py](file://backend/app/models/finance.py#L16-L79)
### 统计分析组件
#### BSC维度分析
系统支持平衡计分卡四个维度的综合分析:
| 维度 | 描述 | 关键指标 | 分析方法 |
|------|------|----------|----------|
| 财务维度 | 医院财务状况 | 收入增长率、成本控制率 | 趋势分析、对比分析 |
| 客户维度 | 患者满意度 | 满意度评分、投诉率 | 排名分析、分布分析 |
| 内部流程维度 | 医疗服务质量 | 治愈率、并发症率 | 进度跟踪、效率分析 |
| 学习成长维度 | 员工发展能力 | 培训完成率、技能提升 | 能力评估、发展轨迹 |
**章节来源**
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
- [stats.py](file://backend/app/api/v1/stats.py#L17-L33)
## 依赖关系分析
系统采用模块化设计,各组件间依赖关系清晰:
```mermaid
graph TB
subgraph "API层"
SalaryAPI[工资API]
FinanceAPI[财务API]
StatsAPI[统计API]
end
subgraph "服务层"
SalaryService[工资服务]
FinanceService[财务服务]
StatsService[统计服务]
end
subgraph "模型层"
SalaryModel[工资模型]
FinanceModel[财务模型]
UserModel[用户模型]
end
subgraph "工具层"
Security[安全模块]
Logger[日志模块]
Config[配置模块]
end
SalaryAPI --> SalaryService
FinanceAPI --> FinanceService
StatsAPI --> StatsService
SalaryService --> SalaryModel
FinanceService --> FinanceModel
StatsService --> UserModel
SalaryAPI --> Security
FinanceAPI --> Security
StatsAPI --> Security
SalaryService --> Logger
FinanceService --> Logger
StatsService --> Logger
SalaryAPI --> Config
FinanceAPI --> Config
StatsAPI --> Config
```
**图表来源**
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
- [finance.py](file://backend/app/api/v1/finance.py#L1-L217)
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
### 数据模型关系
```mermaid
erDiagram
STAFF {
int id PK
string employee_id UK
string name
int department_id FK
float base_salary
float performance_ratio
enum status
date hire_date
}
ASSESSMENTS {
int id PK
int staff_id FK
int period_year
int period_month
float total_score
float weighted_score
enum status
date submit_time
date review_time
}
SALARY_RECORDS {
int id PK
int staff_id FK
int period_year
int period_month
float base_salary
float performance_score
float performance_bonus
float deduction
float allowance
float total_salary
string status
text remark
}
DEPARTMENTS {
int id PK
string name
string code UK
enum dept_type
int parent_id FK
int level
boolean is_active
}
STAFF ||--o{ ASSESSMENTS : has
DEPARTMENTS ||--o{ STAFF : contains
STAFF ||--o{ SALARY_RECORDS : generates
ASSESSMENTS ||--o{ SALARY_RECORDS : influences
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L88-L231)
**章节来源**
- [models.py](file://backend/app/models/models.py#L88-L231)
- [schemas.py](file://backend/app/schemas/schemas.py#L272-L311)
## 性能考虑
### 数据库优化策略
1. **索引优化**
- 工资记录表按员工ID和年月组合索引
- 财务记录表:按科室、年月、类型、类别的复合索引
- 考核记录表:按状态、年月的快速查询索引
2. **查询优化**
- 使用selectinload进行关联查询优化
- 分页查询避免大数据集一次性加载
- 缓存常用配置和枚举数据
3. **连接池管理**
- 数据库连接池大小20个连接
- 最大溢出连接10个连接
- 连接超时时间30秒
### 缓存策略
```mermaid
graph TD
subgraph "缓存层次"
Redis[Redis缓存]
Memory[内存缓存]
Database[数据库缓存]
end
subgraph "缓存策略"
ConfigCache[配置缓存]
EnumCache[枚举缓存]
UserCache[用户信息缓存]
ReportCache[报表缓存]
end
ConfigCache --> Redis
EnumCache --> Redis
UserCache --> Memory
ReportCache --> Database
```
### 异步处理
系统采用异步编程模式提高并发处理能力:
- **异步数据库操作**使用SQLAlchemy异步引擎
- **异步文件处理**:报表导出采用流式处理
- **异步任务队列**:支持批量工资处理和报表生成
## 故障排除指南
### 常见错误类型
| 错误类型 | 状态码 | 描述 | 解决方案 |
|----------|--------|------|----------|
| 权限不足 | 403 | 用户权限不够 | 检查用户角色和权限配置 |
| 数据不存在 | 404 | 请求资源不存在 | 验证ID和数据完整性 |
| 参数错误 | 422 | 请求参数格式错误 | 检查请求体和查询参数 |
| 服务器错误 | 500 | 服务器内部错误 | 查看日志文件和数据库连接 |
### 日志分析
系统提供多级别的日志记录:
```mermaid
graph LR
subgraph "日志级别"
Debug[调试日志]
Info[信息日志]
Warning[警告日志]
Error[错误日志]
Critical[严重错误]
end
subgraph "日志文件"
AppLog[应用日志]
ErrorLog[错误日志]
AccessLog[访问日志]
end
Debug --> AppLog
Info --> AppLog
Warning --> ErrorLog
Error --> ErrorLog
Critical --> ErrorLog
```
**图表来源**
- [logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
### 性能监控
```mermaid
flowchart TD
Monitor[监控系统] --> Metrics[性能指标]
Metrics --> ResponseTime[响应时间]
Metrics --> Throughput[吞吐量]
Metrics --> ErrorRate[错误率]
Metrics --> ResourceUsage[资源使用]
ResponseTime --> Alert[告警通知]
Throughput --> Alert
ErrorRate --> Alert
ResourceUsage --> Alert
Alert --> Action[自动处理]
Action --> Recovery[系统恢复]
```
**章节来源**
- [logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
## 结论
本工资财务接口系统提供了完整的医院绩效管理解决方案,具有以下特点:
1. **功能完整**:涵盖工资核算、奖金计算、财务统计的全流程管理
2. **算法科学**:基于绩效得分和系数的精确计算模型
3. **扩展性强**:模块化设计支持功能扩展和定制
4. **安全可靠**:完善的权限控制和审计机制
5. **性能优异**:异步处理和数据库优化确保高并发性能
系统通过标准化的API接口和清晰的业务逻辑为医院的绩效管理和财务核算提供了强有力的技术支撑。未来可以进一步集成税务计算、社保扣款等高级功能满足更复杂的业务需求。

View File

@@ -0,0 +1,411 @@
# 系统管理接口
<cite>
**本文档引用的文件**
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py)
- [menus.py](file://backend/app/api/v1/menus.py)
- [templates.py](file://backend/app/api/v1/templates.py)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
- [menu_service.py](file://backend/app/services/menu_service.py)
- [template_service.py](file://backend/app/services/template_service.py)
- [models.py](file://backend/app/models/models.py)
- [schemas.py](file://backend/app/schemas/schemas.py)
- [security.py](file://backend/app/core/security.py)
- [database.py](file://backend/app/core/database.py)
- [main.py](file://backend/app/main.py)
- [config.py](file://backend/app/core/config.py)
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
- [002_template.py](file://backend/alembic/versions/002_template.py)
- [init_templates.py](file://backend/app/scripts/init_templates.py)
- [logging_config.py](file://backend/app/core/logging_config.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向系统管理接口围绕绩效计划管理、菜单权限和模板管理三大核心领域系统化梳理后端API实现、数据模型、服务层逻辑与安全控制机制。文档同时覆盖系统配置的动态管理、角色权限控制、菜单树结构、模板版本与继承、系统初始化与数据迁移、配置备份、日志审计与安全监控以及性能监控、资源管理与故障恢复策略。
## 项目结构
后端采用FastAPI + SQLAlchemy 2.0 + 异步数据库的现代架构按功能域划分API路由、服务层与数据模型配合Alembic进行数据库版本管理支持系统初始化脚本与模板数据注入。
```mermaid
graph TB
subgraph "应用入口"
MAIN["app/main.py"]
CONFIG["app/core/config.py"]
LOGCFG["app/core/logging_config.py"]
end
subgraph "API层"
PERF_API["app/api/v1/performance_plans.py"]
MENU_API["app/api/v1/menus.py"]
TPL_API["app/api/v1/templates.py"]
end
subgraph "服务层"
PERF_SRV["app/services/performance_plan_service.py"]
MENU_SRV["app/services/menu_service.py"]
TPL_SRV["app/services/template_service.py"]
end
subgraph "核心模块"
SEC["app/core/security.py"]
DB["app/core/database.py"]
end
subgraph "数据模型与迁移"
MODELS["app/models/models.py"]
ALEMBIC1["backend/alembic/versions/001_initial.py"]
ALEMBIC2["backend/alembic/versions/002_template.py"]
end
MAIN --> PERF_API
MAIN --> MENU_API
MAIN --> TPL_API
PERF_API --> PERF_SRV
MENU_API --> MENU_SRV
TPL_API --> TPL_SRV
PERF_SRV --> MODELS
MENU_SRV --> MODELS
TPL_SRV --> MODELS
PERF_API --> SEC
MENU_API --> SEC
TPL_API --> SEC
PERF_API --> DB
MENU_API --> DB
TPL_API --> DB
CONFIG --> MAIN
LOGCFG --> MAIN
ALEMBIC1 --> MODELS
ALEMBIC2 --> MODELS
```
**图表来源**
- [main.py](file://backend/app/main.py#L15-L77)
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
- [template_service.py](file://backend/app/services/template_service.py#L1-L293)
- [models.py](file://backend/app/models/models.py#L1-L438)
- [config.py](file://backend/app/core/config.py#L1-L47)
- [logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
- [002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
**章节来源**
- [main.py](file://backend/app/main.py#L15-L77)
- [config.py](file://backend/app/core/config.py#L9-L47)
## 核心组件
- 绩效计划管理API提供计划的CRUD、状态流转、指标关联、树形结构与统计查询。
- 菜单管理API提供菜单树、列表、详情、创建/更新/删除与默认菜单初始化。
- 指标模板管理API提供模板与模板指标的CRUD、批量导入、维度与类型枚举。
- 服务层:封装业务逻辑,统一处理状态机、关联关系与查询优化。
- 数据模型:定义实体、枚举与索引,支撑多维考核与组织结构。
- 安全与配置JWT认证、权限校验、数据库连接与日志配置。
**章节来源**
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L18-L310)
- [menus.py](file://backend/app/api/v1/menus.py#L14-L164)
- [templates.py](file://backend/app/api/v1/templates.py#L19-L272)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L15-L342)
- [menu_service.py](file://backend/app/services/menu_service.py#L12-L137)
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
- [models.py](file://backend/app/models/models.py#L1-L438)
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
- [security.py](file://backend/app/core/security.py#L1-L110)
- [database.py](file://backend/app/core/database.py#L1-L39)
## 架构概览
系统采用分层架构API层负责请求解析与响应封装服务层承载业务规则与状态机模型层定义数据结构与约束核心模块提供安全、数据库与配置能力。API层通过依赖注入获取数据库会话与当前用户确保权限控制与事务一致性。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "API控制器"
participant Service as "服务层"
participant Model as "数据模型"
participant DB as "数据库"
Client->>API : 发起请求(携带JWT)
API->>API : 依赖注入(get_db, get_current_active_user)
API->>Service : 调用业务方法(带参数)
Service->>DB : 查询/更新(ORM操作)
DB-->>Service : 返回结果
Service-->>API : 业务结果
API-->>Client : 统一响应格式
```
**图表来源**
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L31)
- [menus.py](file://backend/app/api/v1/menus.py#L17-L22)
- [templates.py](file://backend/app/api/v1/templates.py#L22-L29)
- [security.py](file://backend/app/core/security.py#L55-L82)
- [database.py](file://backend/app/core/database.py#L28-L39)
## 详细组件分析
### 绩效计划管理
- 功能范围:计划列表、树形结构、统计、详情、创建、更新、提交、审批、激活、删除、指标关联增删改。
- 状态机:草稿 → 待审批 → 已批准 → 执行中 → 已完成/已取消;拒绝后可重新提交。
- 关键点:指标关联支持目标值、权重、评分方法与参数;支持父子计划形成树形层级。
- 权限控制:提交、审批、激活、删除等操作需管理员或经理权限。
```mermaid
stateDiagram-v2
[*] --> 草稿
草稿 --> 待审批 : "提交"
待审批 --> 已批准 : "审批通过"
待审批 --> 已驳回 : "审批驳回"
已批准 --> 执行中 : "激活"
执行中 --> 已完成 : "完成"
执行中 --> 已取消 : "取消"
已驳回 --> 草稿 : "重新提交"
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L233-L242)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
**章节来源**
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L310)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L18-L342)
- [models.py](file://backend/app/models/models.py#L270-L339)
### 菜单权限管理
- 功能范围:菜单树、列表、详情、创建、更新、删除、默认菜单初始化。
- 树形结构:支持父子关系与可见性过滤;支持按钮级权限标识。
- 权限控制:创建/更新/删除/初始化默认菜单需管理员或经理权限。
```mermaid
flowchart TD
Start(["获取菜单树"]) --> Query["查询根节点(父ID为空)"]
Query --> Filter["按可见性/启用过滤"]
Filter --> Order["按排序与ID排序"]
Order --> Build["递归构建树结构(children)"]
Build --> End(["返回树形结构"])
```
**图表来源**
- [menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
- [menu_service.py](file://backend/app/services/menu_service.py#L101-L109)
**章节来源**
- [menus.py](file://backend/app/api/v1/menus.py#L17-L164)
- [menu_service.py](file://backend/app/services/menu_service.py#L16-L137)
- [models.py](file://backend/app/models/models.py#L347-L372)
### 指标模板管理
- 功能范围:模板列表、详情、类型与维度枚举、创建、更新、删除;模板指标的增删改与批量导入。
- 版本与继承:模板具备版本号与激活状态;模板指标支持分类、权重、排序与评分参数。
- 初始化:提供脚本批量注入标准模板与指标数据,支持维度权重与评估周期配置。
```mermaid
classDiagram
class IndicatorTemplate {
+template_code
+template_name
+template_type
+dimension_weights
+assessment_cycle
+is_active
+created_at
+updated_at
}
class TemplateIndicator {
+template_id
+indicator_id
+category
+weight
+sort_order
+scoring_method
+scoring_params
+remark
}
class Indicator {
+code
+name
+indicator_type
+bs_dimension
+weight
+max_score
+calculation_method
+assessment_method
+is_veto
}
IndicatorTemplate "1" o-- "*" TemplateIndicator : "包含"
Indicator "1" o-- "*" TemplateIndicator : "被引用"
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L387-L437)
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
**章节来源**
- [templates.py](file://backend/app/api/v1/templates.py#L22-L272)
- [template_service.py](file://backend/app/services/template_service.py#L23-L293)
- [init_templates.py](file://backend/app/scripts/init_templates.py#L81-L186)
### 数据模型与枚举
- 组织与人员Department、Staff、User支持层级与状态管理。
- 考核与工资Assessment、AssessmentDetail、SalaryRecord支持周期与状态。
- 计划与指标PerformancePlan、PlanKpiRelation支持层级与父子关系。
- 菜单与模板Menu、IndicatorTemplate、TemplateIndicator支持树形与关联。
- 枚举:科室类型、指标类型、状态、计划层级与菜单类型等。
**章节来源**
- [models.py](file://backend/app/models/models.py#L62-L438)
- [schemas.py](file://backend/app/schemas/schemas.py#L10-L743)
### 安全与权限控制
- JWT认证OAuth2密码模式支持令牌签发、解码与用户解析。
- 权限校验:当前用户、激活用户、管理员、管理员或经理。
- 依赖注入API层通过Depends获取数据库会话与当前用户确保每个请求的安全上下文。
**章节来源**
- [security.py](file://backend/app/core/security.py#L18-L110)
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L8-L16)
- [menus.py](file://backend/app/api/v1/menus.py#L8-L12)
- [templates.py](file://backend/app/api/v1/templates.py#L8-L17)
### 系统配置与数据库
- 配置中心应用名、版本、API前缀、数据库URL、JWT密钥与过期时间、跨域白名单、分页参数。
- 数据库:异步引擎与会话工厂,自动事务提交/回滚与关闭。
- 迁移:初始版本创建核心表,模板版本增加指标模板与关联表,并扩展指标字段。
**章节来源**
- [config.py](file://backend/app/core/config.py#L9-L47)
- [database.py](file://backend/app/core/database.py#L9-L39)
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
## 依赖分析
- API层依赖服务层与安全模块通过依赖注入获取数据库会话与当前用户。
- 服务层依赖数据模型与SQLAlchemy ORM封装查询、状态机与事务。
- 数据模型定义实体关系与索引,支撑高效查询与数据完整性。
- 迁移脚本定义数据库演进路径,确保版本一致与数据安全。
```mermaid
graph LR
PERF_API["performance_plans.py"] --> PERF_SRV["performance_plan_service.py"]
MENU_API["menus.py"] --> MENU_SRV["menu_service.py"]
TPL_API["templates.py"] --> TPL_SRV["template_service.py"]
PERF_SRV --> MODELS["models.py"]
MENU_SRV --> MODELS
TPL_SRV --> MODELS
PERF_API --> SEC["security.py"]
MENU_API --> SEC
TPL_API --> SEC
PERF_API --> DB["database.py"]
MENU_API --> DB
TPL_API --> DB
ALEMBIC1["001_initial.py"] --> MODELS
ALEMBIC2["002_template.py"] --> MODELS
```
**图表来源**
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L10-L16)
- [menus.py](file://backend/app/api/v1/menus.py#L9-L12)
- [templates.py](file://backend/app/api/v1/templates.py#L9-L17)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L7-L12)
- [menu_service.py](file://backend/app/services/menu_service.py#L5-L9)
- [template_service.py](file://backend/app/services/template_service.py#L6-L13)
- [models.py](file://backend/app/models/models.py#L6-L13)
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
**章节来源**
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L10-L16)
- [menus.py](file://backend/app/api/v1/menus.py#L9-L12)
- [templates.py](file://backend/app/api/v1/templates.py#L9-L17)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L7-L12)
- [menu_service.py](file://backend/app/services/menu_service.py#L5-L9)
- [template_service.py](file://backend/app/services/template_service.py#L6-L13)
## 性能考虑
- 异步数据库使用异步引擎与会话提升高并发下的IO吞吐。
- 查询优化服务层使用selectinload预加载关联减少N+1查询索引覆盖常用查询字段。
- 分页与限制API层对分页参数进行范围校验避免过大页大小影响性能。
- 缓存策略建议在热点读取场景引入Redis缓存如菜单树、模板列表降低数据库压力。
- 连接池:合理配置数据库连接池大小与溢出,避免连接争用。
[本节为通用指导,无需特定文件引用]
## 故障排查指南
- 日志系统:应用日志与错误日志分离,按日期轮转,便于定位问题。
- 异常处理全局异常捕获与记录HTTP异常与参数校验异常分别处理。
- 数据一致性:服务层事务提交/回滚,确保状态变更原子性。
- 权限问题确认JWT令牌有效、用户状态正常、角色满足要求。
- 数据迁移检查Alembic版本与数据库一致必要时执行升级/降级。
**章节来源**
- [logging_config.py](file://backend/app/core/logging_config.py#L17-L64)
- [main.py](file://backend/app/main.py#L58-L75)
- [database.py](file://backend/app/core/database.py#L28-L39)
## 结论
本系统管理接口围绕绩效计划、菜单权限与模板管理构建了完整的API体系配合严谨的数据模型、服务层状态机与安全控制实现了可配置、可扩展、可审计的医院绩效管理体系。通过完善的初始化与迁移机制、日志与异常处理、以及性能与故障恢复策略系统具备良好的稳定性与可维护性。
[本节为总结,无需特定文件引用]
## 附录
### API端点速览
- 绩效计划
- GET /plans获取计划列表
- GET /plans/tree获取计划树
- GET /plans/stats获取计划统计
- GET /plans/{plan_id}:获取计划详情
- POST /plans创建计划
- PUT /plans/{plan_id}:更新计划
- POST /plans/{plan_id}/submit提交计划
- POST /plans/{plan_id}/approve审批计划
- POST /plans/{plan_id}/activate激活计划
- DELETE /plans/{plan_id}:删除计划
- POST /plans/{plan_id}/kpi-relations添加指标关联
- PUT /plans/kpi-relations/{relation_id}:更新指标关联
- DELETE /plans/kpi-relations/{relation_id}:删除指标关联
- 菜单管理
- GET /menus/tree获取菜单树
- GET /menus获取菜单列表
- GET /menus/{menu_id}:获取菜单详情
- POST /menus创建菜单
- PUT /menus/{menu_id}:更新菜单
- DELETE /menus/{menu_id}:删除菜单
- POST /menus/init初始化默认菜单
- 指标模板
- GET /templates获取模板列表
- GET /templates/types获取模板类型列表
- GET /templates/dimensions获取BSC维度列表
- GET /templates/{template_id}:获取模板详情
- POST /templates创建模板
- PUT /templates/{template_id}:更新模板
- DELETE /templates/{template_id}:删除模板
- GET /templates/{template_id}/indicators获取模板指标列表
- POST /templates/{template_id}/indicators添加模板指标
- PUT /templates/{template_id}/indicators/{indicator_id}:更新模板指标
- DELETE /templates/{template_id}/indicators/{indicator_id}:移除模板指标
- POST /templates/{template_id}/indicators/batch批量添加模板指标
**章节来源**
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L310)
- [menus.py](file://backend/app/api/v1/menus.py#L17-L164)
- [templates.py](file://backend/app/api/v1/templates.py#L22-L272)
### 系统初始化与数据迁移
- 初始版本:创建科室、员工、指标、考核、工资、用户等核心表。
- 模板版本:新增指标模板与模板指标关联表,并扩展指标字段。
- 初始化脚本:批量创建标准模板与指标,支持维度权重与评估周期配置。
**章节来源**
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
- [init_templates.py](file://backend/app/scripts/init_templates.py#L189-L272)

View File

@@ -0,0 +1,388 @@
# 统计报表接口
<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)
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/app/api/__init__.py](file://backend/app/api/__init__.py)
- [docs/详细设计.md](file://docs/详细设计.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件详细说明医院绩效管理系统的统计报表接口涵盖BSC维度分析、绩效统计、趋势分析、预警数据、周期统计、关键指标仪表盘、收支趋势、科室绩效排名、个人绩效统计与对比分析等功能。文档重点阐述多维度数据聚合、图表数据生成、报表格式化、实时数据更新、缓存策略、性能优化、统计数据准确性保证、数据源管理与ETL流程、自定义报表、数据导出与可视化集成、统计口径说明、数据质量控制与异常检测机制。
## 项目结构
后端采用FastAPI + SQLAlchemy 2.0 + PostgreSQL + 异步IO架构统计报表接口位于API路由层业务逻辑封装在服务层数据模型定义在ORM层配置与数据库连接在核心模块中。
```mermaid
graph TB
subgraph "表现层"
Frontend[前端应用]
end
subgraph "应用层"
API_Router[API路由层<br/>stats.py]
Main_App[主应用入口<br/>main.py]
end
subgraph "服务层"
Stats_Service[统计服务层<br/>stats_service.py]
end
subgraph "数据层"
Models[数据模型<br/>models.py]
Schemas[数据模式<br/>schemas.py]
Database[数据库连接<br/>database.py]
Config[系统配置<br/>config.py]
end
Frontend --> API_Router
API_Router --> Stats_Service
Stats_Service --> Models
Stats_Service --> Database
API_Router --> Main_App
Main_App --> Config
Database --> Config
```
**图表来源**
- [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)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
**章节来源**
- [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)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
## 核心组件
- API路由层提供REST接口负责请求参数解析、鉴权与响应包装。
- 服务层实现统计逻辑包括BSC维度分析、科室/个人绩效统计、趋势分析、指标完成度等。
- 数据模型层:定义科室、员工、指标、考核、明细、工资等实体及其关系。
- 数据模式层定义Pydantic模型用于序列化/反序列化与API响应。
- 核心模块:配置系统参数、数据库连接与中间件。
**章节来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L14-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-L231)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L347-L375)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
## 架构概览
统计报表接口遵循分层架构API路由层仅负责输入输出与鉴权服务层封装复杂查询与聚合逻辑数据模型层提供ORM映射核心模块提供配置与数据库连接。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "统计API路由<br/>stats.py"
participant Service as "统计服务<br/>stats_service.py"
participant DB as "数据库引擎<br/>database.py"
participant Model as "数据模型<br/>models.py"
Client->>API : GET /api/v1/stats/bsc-dimension
API->>Service : get_bsc_dimension_stats(...)
Service->>DB : 异步SQL查询
DB->>Model : ORM映射
Model-->>DB : 查询结果
DB-->>Service : 结果集
Service-->>API : 聚合后的统计结果
API-->>Client : JSON响应
```
**图表来源**
- [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)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L197)
## 详细组件分析
### BSC维度分析
- 功能:按财务、客户、内部流程、学习与成长四个维度统计得分、权重与指标数量,并计算平均分。
- 查询条件:支持按年度、月份、科室过滤,仅统计已确认的考核记录。
- 聚合逻辑:按维度分组,计算加权总分、总权重、指标数量与平均分。
- 输出格式:包含维度详情与统计周期。
```mermaid
flowchart TD
Start(["开始"]) --> BuildConditions["构建查询条件<br/>状态=FINALIZED<br/>可选: 年度/月份/科室"]
BuildConditions --> QueryGroup["按维度分组查询<br/>SUM(得分*权重)/SUM(权重)"]
QueryGroup --> Aggregate["聚合维度统计<br/>得分/权重/指标数/平均分"]
Aggregate --> FormatOutput["格式化输出<br/>包含周期信息"]
FormatOutput --> End(["结束"])
```
**图表来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
**章节来源**
- [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)
### 科室绩效统计
- 功能:获取各科室的绩效统计,包括员工人数、总分、平均分、最高/最低分、员工列表。
- 聚合逻辑:按科室汇总,计算平均分并按平均分降序排列。
- 输出格式:包含科室基本信息与员工明细。
```mermaid
flowchart TD
Start(["开始"]) --> FilterFinalized["过滤已确认考核记录"]
FilterFinalized --> JoinTables["连接科室/员工/考核表"]
JoinTables --> GroupByDept["按科室分组聚合"]
GroupByDept --> CalcStats["计算员工数/总分/最高/最低分"]
CalcStats --> AvgScore["计算平均分"]
AvgScore --> Sort["按平均分降序排序"]
Sort --> Format["格式化输出"]
Format --> End(["结束"])
```
**图表来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
**章节来源**
- [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个月或按年份范围查询。
- 时间处理:跨年处理,确保月份范围正确。
- 输出格式:包含月份与对应的平均分。
```mermaid
flowchart TD
Start(["开始"]) --> SetPeriod["设置统计周期<br/>默认当前年份"]
SetPeriod --> MonthRange["计算最近N个月范围"]
MonthRange --> CrossYear{"是否跨年?"}
CrossYear --> |是| YearConditions["年份条件: 上一年>=起始月<br/>当年<=当前月"]
CrossYear --> |否| SameYear["年份条件: 当年且起止范围内"]
YearConditions --> QueryAvg["按月分组查询平均分"]
SameYear --> QueryAvg
QueryAvg --> Format["格式化输出"]
Format --> End(["结束"])
```
**图表来源**
- [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)
### 预警数据
- 功能:预留接口,用于返回低分员工、未完成考核科室、异常数据等预警信息。
- 当前实现:返回模拟数据,后续可扩展为从数据库查询实际预警数据。
**章节来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L73-L90)
### 周期统计
- 功能:按年月统计全院的科室数量、员工总数、平均分等汇总信息。
- 计算逻辑:对科室统计结果进行汇总计算。
- 输出格式:包含周期、总数、平均分与明细列表。
**章节来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L93-L125)
### 关键指标仪表盘
- 功能:返回关键指标的仪表盘数据,如床位使用率、药占比、材料占比、患者满意度等。
- 当前实现:返回模拟数据,后续可扩展为从数据库查询实际指标。
**章节来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L128-L153)
### 收支趋势
- 功能:按月统计收入、支出、利润趋势。
- 当前实现:返回模拟数据,后续可扩展为从财务系统查询实际数据。
**章节来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L156-L183)
### 科室绩效排名
- 功能:按平均分对科室进行排名,支持限制返回数量。
- 实现:基于科室统计结果进行排序与截取。
**章节来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L186-L207)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
### 个人绩效统计与对比分析
- 功能:获取个人绩效排名,支持限制返回数量。
- 实现:连接员工、科室、考核表,按加权平均分排序并标注排名。
```mermaid
sequenceDiagram
participant API as "统计API"
participant Service as "统计服务"
participant DB as "数据库"
participant Model as "模型"
API->>Service : get_ranking_stats(year, month, limit)
Service->>DB : 查询已确认考核记录
DB->>Model : 连接员工/科室/考核表
Model-->>DB : 查询结果
DB-->>Service : 排序后的结果集
Service-->>API : 格式化排名数据
API-->>API : 标注排名序号
```
**图表来源**
- [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#L210-L224)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L201-L244)
### 指标完成度
- 功能:按指标统计平均分、最大/最小分、完成率等。
- 计算逻辑:完成率=平均分/目标值×100%上限100%。
- 输出格式:包含指标基本信息与统计指标。
**章节来源**
- [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)
## 依赖关系分析
统计报表接口的依赖关系清晰API路由层依赖服务层服务层依赖数据模型与数据库连接整体耦合度低、内聚性强。
```mermaid
graph TB
StatsAPI["统计API路由<br/>stats.py"] --> StatsService["统计服务<br/>stats_service.py"]
StatsService --> Models["数据模型<br/>models.py"]
StatsService --> Database["数据库连接<br/>database.py"]
StatsAPI --> MainApp["主应用<br/>main.py"]
MainApp --> Config["配置<br/>config.py"]
Database --> Config
```
**图表来源**
- [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)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
**章节来源**
- [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)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
## 性能考虑
- 异步数据库连接使用SQLAlchemy异步引擎与会话工厂减少阻塞提升并发能力。
- 查询优化合理使用索引如考核记录的状态、年月、员工ID等避免N+1查询。
- 分页与限制:接口支持分页与返回数量限制,防止大数据量查询导致性能问题。
- 缓存策略当前接口未实现缓存建议对高频查询如趋势分析、排名引入Redis缓存设置合理的TTL。
- 数据库连接池:配置合适的连接池大小与溢出数量,避免连接争用。
- 前端渲染:图表数据建议采用分页或分批加载,避免一次性传输大量数据。
**章节来源**
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L21)
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L75-L90)
## 故障排除指南
- 数据库连接失败检查DATABASE_URL配置与数据库服务状态。
- 查询超时优化查询条件增加索引减少不必要的JOIN。
- 权限错误:确认用户角色与接口权限,确保鉴权中间件正常工作。
- 响应格式异常检查服务层返回的数据结构与API路由的响应包装。
- 预警与仪表盘:当前返回模拟数据,需实现真实数据查询逻辑。
**章节来源**
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L73-L90)
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
## 结论
统计报表接口实现了BSC维度分析、绩效统计、趋势分析、排名与指标完成度等核心功能具备良好的扩展性与可维护性。建议后续完善预警与仪表盘的真实数据查询、引入缓存策略、优化查询性能并补充数据质量控制与异常检测机制以满足生产环境的稳定性与准确性要求。
## 附录
### API接口定义
- BSC维度分析GET /api/v1/stats/bsc-dimension
- 参数department_id可选、period_year、period_month
- 返回:维度得分、权重、指标数量与平均分
- 科室绩效统计GET /api/v1/stats/department
- 参数period_year、period_month
- 返回:各科室统计与员工明细
- 趋势分析GET /api/v1/stats/trend
- 参数department_id可选、period_year可选、months1-24默认6
- 返回:月度平均分趋势
- 预警数据GET /api/v1/stats/alerts
- 参数limit1-100默认10
- 返回:低分员工、未完成考核科室、异常数据
- 周期统计GET /api/v1/stats/period
- 参数period_year可选、period_month可选
- 返回:周期汇总与明细
- 关键指标仪表盘GET /api/v1/stats/kpi-gauges
- 参数period_year可选、period_month可选
- 返回:床位使用率、药占比、材料占比、患者满意度
- 收支趋势GET /api/v1/stats/finance-trend
- 参数months1-24默认6
- 返回:月度收入、支出、利润
- 科室绩效排名GET /api/v1/stats/department-ranking
- 参数period_year可选、period_month可选、limit1-100默认10
- 返回前N名科室
- 个人绩效统计GET /api/v1/stats/ranking
- 参数period_year、period_month、limit
- 返回:个人绩效排名
- 指标完成度GET /api/v1/stats/completion
- 参数indicator_id可选、period_year、period_month
- 返回:指标平均分、完成率等
**章节来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L241)
### 数据模型关系
```mermaid
erDiagram
DEPARTMENTS ||--o{ STAFF : "拥有"
STAFF ||--o{ ASSESSMENTS : "参与"
INDICATORS ||--o{ ASSESSMENT_DETAILS : "被评估"
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "包含"
SALARY_RECORDS ||--|| STAFF : "关联"
```
**图表来源**
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L231)
### 统计口径说明
- 加权平均分:按指标权重计算的平均分,体现权重影响。
- 完成率平均分与目标值的比值上限100%。
- 排名:按加权平均分降序排列,相同分数按规则处理并列。
**章节来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L62-L67)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L284-L296)
### 数据质量控制与异常检测
- 数据完整性:仅统计状态为已确认的考核记录,确保数据有效性。
- 异常值处理:在服务层对空值与边界值进行处理,避免异常影响统计结果。
- ETL流程建议在系统外部实现ETL从HIS、财务、院感等系统抽取数据清洗后入库统计接口从数据库读取。
**章节来源**
- [docs/详细设计.md](file://docs/详细设计.md#L96-L109)
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L36-L43)

View File

@@ -0,0 +1,626 @@
# 考核管理接口
<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/templates.py](file://backend/app/api/v1/templates.py)
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py)
- [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/core/security.py](file://backend/app/core/security.py)
- [backend/app/main.py](file://backend/app/main.py)
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.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 2.0架构,采用分层设计模式:
```mermaid
graph TB
subgraph "表现层"
Frontend[前端Vue.js应用]
end
subgraph "应用层"
API[API路由层]
Services[业务服务层]
end
subgraph "数据层"
Models[ORM模型层]
Database[(PostgreSQL数据库)]
end
Frontend --> API
API --> Services
Services --> Models
Models --> Database
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
系统采用模块化设计,主要模块包括:
- **认证模块**JWT令牌管理和权限控制
- **考核管理模块**:考核流程、状态管理和审批
- **指标模板模块**:模板管理和指标配置
- **统计分析模块**:报表和数据分析
- **数据模型模块**:核心业务实体和关系
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [docs/详细设计.md](file://docs/详细设计.md#L27-L47)
## 核心组件
### 考核状态管理
系统实现了完整的考核状态流转机制,支持四种状态:
- **草稿 (draft)**:初始状态,允许修改
- **已提交 (submitted)**:等待审核
- **已审核 (reviewed)**:审核通过,等待确认
- **已确认 (finalized)**:最终状态,不可修改
- **已驳回 (rejected)**:审核不通过
```mermaid
stateDiagram-v2
[*] --> 草稿
草稿 --> 已提交 : "提交考核"
已提交 --> 已审核 : "审核通过"
已提交 --> 已驳回 : "审核驳回"
已审核 --> 已确认 : "确认考核"
已确认 --> [*]
已驳回 --> 草稿 : "重新修改"
```
**图表来源**
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L52)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
### 权限控制系统
系统采用基于角色的权限控制RBAC
```mermaid
graph LR
subgraph "用户角色"
Staff[普通员工]
Manager[科室经理]
Admin[系统管理员]
end
subgraph "权限级别"
Read[只读权限]
Write[写入权限]
Approve[审批权限]
Manage[管理权限]
end
Staff --> Read
Manager --> Write
Manager --> Approve
Admin --> Manage
```
**图表来源**
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L109)
**章节来源**
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L52)
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L109)
## 架构概览
系统采用经典的三层架构模式,确保关注点分离和代码可维护性:
```mermaid
graph TB
subgraph "API层"
AssessmentsAPI[考核API]
TemplatesAPI[模板API]
StatsAPI[统计API]
end
subgraph "服务层"
AssessmentService[考核服务]
TemplateService[模板服务]
StatsService[统计服务]
end
subgraph "数据层"
AssessmentModel[考核模型]
DetailModel[明细模型]
IndicatorModel[指标模型]
DepartmentModel[科室模型]
end
AssessmentsAPI --> AssessmentService
TemplatesAPI --> TemplateService
StatsAPI --> StatsService
AssessmentService --> AssessmentModel
AssessmentService --> DetailModel
AssessmentService --> IndicatorModel
TemplateService --> AssessmentModel
TemplateService --> DetailModel
TemplateService --> IndicatorModel
StatsService --> AssessmentModel
StatsService --> DetailModel
StatsService --> IndicatorModel
StatsService --> DepartmentModel
```
**图表来源**
- [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#L14-L263)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
## 详细组件分析
### 考核管理API
#### 考核列表查询
支持多条件过滤和分页查询:
| 查询参数 | 类型 | 描述 | 示例 |
|---------|------|------|------|
| staff_id | int | 员工ID | 1001 |
| department_id | int | 科室ID | 501 |
| period_year | int | 年度 | 2024 |
| period_month | int | 月份 | 1 |
| status | string | 状态 | "submitted" |
| page | int | 页码 | 1 |
| page_size | int | 每页数量 | 20 |
#### 考核详情查询
返回完整的考核信息,包括员工和科室名称以及指标名称:
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "考核API"
participant Service as "考核服务"
participant DB as "数据库"
Client->>API : GET /assessments/{id}
API->>Service : get_by_id(assessment_id)
Service->>DB : 查询考核记录
DB-->>Service : 考核详情
Service->>DB : 查询明细和指标
DB-->>Service : 明细数据
Service-->>API : 完整考核信息
API-->>Client : 考核详情响应
```
**图表来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L58-L68)
#### 考核状态流转
```mermaid
flowchart TD
Start([开始]) --> Draft[草稿状态]
Draft --> Submit{提交考核?}
Submit --> |是| Submitted[已提交]
Submit --> |否| Draft
Submitted --> Review{审核结果}
Review --> |通过| Reviewed[已审核]
Review --> |驳回| Rejected[已驳回]
Reviewed --> Finalize{确认考核?}
Finalize --> |是| Finalized[已确认]
Finalize --> |否| Reviewed
Rejected --> Edit[修改后重新提交]
Edit --> Draft
Finalized --> End([结束])
```
**图表来源**
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
**章节来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L52)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
### 指标模板管理
#### 模板类型体系
系统支持多种科室类型的指标模板:
| 模板类型 | 适用科室 | 描述 |
|---------|---------|------|
| general | 通用模板 | 适用于所有科室的基础指标 |
| surgical | 手术临床科室 | 适用于手术科室的特殊指标 |
| nonsurgical_ward | 非手术有病房科室 | 适用于内科、儿科等有病房科室 |
| nonsurgical_noward | 非手术无病房科室 | 适用于门诊科室 |
| medical_tech | 医技科室 | 适用于检验、影像等医技科室 |
| nursing | 护理单元 | 适用于护理部门 |
| admin | 行政科室 | 适用于行政部门 |
| logistics | 后勤科室 | 适用于后勤保障部门 |
#### 模板指标关联
```mermaid
erDiagram
INDICATOR_TEMPLATE ||--o{ TEMPLATE_INDICATOR : "包含"
TEMPLATE_INDICATOR }o--|| INDICATOR : "关联"
INDICATOR_TEMPLATE {
int id PK
string template_name
string template_code
string template_type
text dimension_weights
string assessment_cycle
boolean is_active
}
TEMPLATE_INDICATOR {
int id PK
int template_id FK
int indicator_id FK
string category
float target_value
string target_unit
float weight
string scoring_method
text scoring_params
int sort_order
text remark
}
INDICATOR {
int id PK
string name
string code
string indicator_type
string bs_dimension
float weight
float max_score
float target_value
string target_unit
text calculation_method
text assessment_method
text deduction_standard
string data_source
text applicable_dept_types
boolean is_veto
boolean is_active
}
```
**图表来源**
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L437)
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
**章节来源**
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L42)
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L77-L126)
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L23-L71)
### 统计分析接口
#### BSC维度分析
系统支持平衡计分卡四个维度的统计分析:
| 维度 | 描述 | 权重范围 |
|------|------|----------|
| financial | 财务管理 | 30%-40% |
| customer | 顾客服务 | 25%-35% |
| internal_process | 内部流程 | 20%-30% |
| learning_growth | 学习与成长 | 5%-15% |
#### 绩效排名统计
```mermaid
sequenceDiagram
participant Client as "客户端"
participant StatsAPI as "统计API"
participant StatsService as "统计服务"
participant DB as "数据库"
Client->>StatsAPI : GET /stats/ranking
StatsAPI->>StatsService : get_ranking_stats(year, month, limit)
StatsService->>DB : 查询最终状态的考核记录
DB-->>StatsService : 排名数据
StatsService->>DB : 关联员工和科室信息
DB-->>StatsService : 员工详情
StatsService-->>StatsAPI : 排名结果
StatsAPI-->>Client : 排名列表
```
**图表来源**
- [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#L202-L244)
**章节来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L33)
- [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#L19-L72)
### 数据模型设计
#### 核心实体关系
```mermaid
erDiagram
ASSESSMENT {
int id PK
int staff_id FK
int period_year
int period_month
string period_type
float total_score
float weighted_score
string status
int assessor_id FK
int reviewer_id FK
datetime submit_time
datetime review_time
text remark
datetime created_at
datetime updated_at
}
ASSESSMENT_DETAIL {
int id PK
int assessment_id FK
int indicator_id FK
float actual_value
float score
text evidence
text remark
datetime created_at
datetime updated_at
}
INDICATOR {
int id PK
string name
string code
string indicator_type
string bs_dimension
float weight
float max_score
float target_value
string target_unit
text calculation_method
text assessment_method
text deduction_standard
string data_source
text applicable_dept_types
boolean is_veto
boolean is_active
}
STAFF {
int id PK
string employee_id
string name
int department_id FK
string position
string title
string phone
string email
float base_salary
float performance_ratio
string status
datetime hire_date
datetime created_at
datetime updated_at
}
DEPARTMENT {
int id PK
string name
string code
string dept_type
int parent_id FK
int level
int sort_order
boolean is_active
text description
datetime created_at
datetime updated_at
}
ASSESSMENT ||--o{ ASSESSMENT_DETAIL : "包含"
ASSESSMENT }o--|| STAFF : "属于"
STAFF }o--|| DEPARTMENT : "隶属于"
ASSESSMENT_DETAIL }o--|| INDICATOR : "对应"
```
**图表来源**
- [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#L88-L114)
**章节来源**
- [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)
## 依赖关系分析
### 模块依赖图
```mermaid
graph TB
subgraph "外部依赖"
FastAPI[FastAPI框架]
SQLAlchemy[SQLAlchemy ORM]
Postgres[PostgreSQL数据库]
JWT[jwt库]
Bcrypt[bcrypt加密]
end
subgraph "核心模块"
Security[安全模块]
Database[数据库模块]
Logging[日志模块]
end
subgraph "业务模块"
AssessmentAPI[考核API]
AssessmentService[考核服务]
TemplateAPI[模板API]
TemplateService[模板服务]
StatsAPI[统计API]
StatsService[统计服务]
end
FastAPI --> AssessmentAPI
FastAPI --> TemplateAPI
FastAPI --> StatsAPI
AssessmentAPI --> AssessmentService
TemplateAPI --> TemplateService
StatsAPI --> StatsService
AssessmentService --> Database
TemplateService --> Database
StatsService --> Database
AssessmentAPI --> Security
TemplateAPI --> Security
StatsAPI --> Security
Security --> JWT
Security --> Bcrypt
Database --> Postgres
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
### 数据一致性保证
系统通过以下机制确保数据一致性:
1. **事务管理**:所有数据库操作都在事务中执行
2. **外键约束**使用SQLAlchemy外键约束保证引用完整性
3. **状态验证**:在状态转换前验证当前状态
4. **并发控制**:使用数据库锁防止并发修改冲突
**章节来源**
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178)
## 性能考虑
### 查询优化策略
1. **索引优化**:为常用查询字段建立索引
- 考核记录staff_id, period_year, period_month, status
- 明细记录assessment_id, indicator_id
- 员工信息department_id, status
2. **分页查询**默认每页20条记录最大100条
3. **批量操作**:支持批量创建和查询
4. **缓存策略**:对于静态数据使用缓存
### 并发控制
系统采用以下并发控制策略:
```mermaid
flowchart TD
Request[请求到达] --> CheckLock{检查锁}
CheckLock --> |无锁| AcquireLock[获取锁]
CheckLock --> |有锁| Wait[等待锁释放]
AcquireLock --> Process[处理业务逻辑]
Process --> ReleaseLock[释放锁]
Wait --> CheckLock
ReleaseLock --> Response[返回响应]
```
**图表来源**
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
## 故障排除指南
### 常见错误处理
| 错误类型 | HTTP状态码 | 描述 | 处理建议 |
|---------|-----------|------|----------|
| 未授权 | 401 | JWT令牌无效或过期 | 重新登录获取新令牌 |
| 权限不足 | 403 | 用户权限不够 | 检查用户角色和权限 |
| 资源不存在 | 404 | 请求的资源不存在 | 确认ID是否正确 |
| 参数错误 | 400 | 请求参数不合法 | 检查请求格式和参数类型 |
| 数据验证失败 | 422 | 数据不符合验证规则 | 修正数据格式和范围 |
### 日志记录
系统提供完整的日志记录机制:
```mermaid
graph LR
subgraph "日志级别"
Info[信息日志]
Warning[警告日志]
Error[错误日志]
Debug[调试日志]
end
subgraph "日志内容"
Request[请求信息]
Response[响应信息]
ErrorDetail[错误详情]
Performance[性能数据]
end
Info --> Request
Warning --> ErrorDetail
Error --> ErrorDetail
Debug --> Performance
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L109)
## 结论
本考核管理接口提供了完整的医院绩效管理系统解决方案,具有以下特点:
1. **完整的生命周期管理**:从草稿到最终确认的全流程管理
2. **灵活的权限控制**:基于角色的精细化权限管理
3. **强大的统计分析**:多维度的报表和分析功能
4. **可靠的并发控制**:确保数据一致性和系统稳定性
5. **良好的扩展性**:模块化设计便于功能扩展和维护
系统采用现代化的技术栈和设计模式,能够满足医院绩效管理的复杂需求,为提升医疗质量和效率提供有力支撑。
## 附录
### 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 | /stats/bsc-dimension | 普通员工 | BSC维度分析 |
| GET | /stats/department | 普通员工 | 科室绩效统计 |
| GET | /stats/trend | 普通员工 | 趋势分析 |
| GET | /stats/ranking | 普通员工 | 绩效排名 |
| GET | /stats/completion | 普通员工 | 指标完成度 |
**章节来源**
- [docs/api.md](file://docs/api.md#L298-L468)
- [docs/api.md](file://docs/api.md#L471-L537)

View File

@@ -0,0 +1,480 @@
# 认证接口
<cite>
**本文档引用的文件**
- [auth.py](file://backend/app/api/v1/auth.py)
- [security.py](file://backend/app/core/security.py)
- [models.py](file://backend/app/models/models.py)
- [schemas.py](file://backend/app/schemas/schemas.py)
- [config.py](file://backend/app/core/config.py)
- [database.py](file://backend/app/core/database.py)
- [main.py](file://backend/app/main.py)
- [auth.js](file://frontend/src/api/auth.js)
- [user.js](file://frontend/src/stores/user.js)
- [api.md](file://docs/api.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本文件详细说明了医院绩效管理系统的认证接口实现包括用户登录、注册和当前用户信息获取的API。系统采用OAuth2密码模式配合JWT令牌进行身份验证实现了完整的用户认证和授权机制。
该认证系统支持三种用户角色:普通员工(staff)、科室经理(manager)和系统管理员(admin)并提供了相应的权限控制机制。所有密码均使用bcrypt进行安全哈希存储JWT令牌具有8小时有效期。
## 项目结构
认证相关的核心文件组织如下:
```mermaid
graph TB
subgraph "后端认证模块"
A[auth.py<br/>认证路由]
B[security.py<br/>安全工具]
C[models.py<br/>用户模型]
D[schemas.py<br/>数据模式]
E[config.py<br/>配置]
F[database.py<br/>数据库]
end
subgraph "前端认证模块"
G[auth.js<br/>认证API]
H[user.js<br/>用户状态]
end
subgraph "系统配置"
I[main.py<br/>应用入口]
J[api.md<br/>API文档]
end
A --> B
A --> C
A --> D
B --> E
B --> F
G --> I
H --> G
I --> A
```
**图表来源**
- [auth.py](file://backend/app/api/v1/auth.py#L1-L74)
- [security.py](file://backend/app/core/security.py#L1-L110)
- [models.py](file://backend/app/models/models.py#L244-L261)
- [schemas.py](file://backend/app/schemas/schemas.py#L313-L345)
**章节来源**
- [auth.py](file://backend/app/api/v1/auth.py#L1-L74)
- [security.py](file://backend/app/core/security.py#L1-L110)
- [models.py](file://backend/app/models/models.py#L244-L261)
- [schemas.py](file://backend/app/schemas/schemas.py#L313-L345)
## 核心组件
### 认证路由模块
认证路由模块定义了三个主要接口:
- `/auth/login` - 用户登录接口
- `/auth/register` - 用户注册接口
- `/auth/me` - 获取当前用户信息接口
每个接口都经过严格的参数验证和权限检查,确保系统的安全性。
### 安全工具模块
安全工具模块提供了JWT令牌的生成、验证和用户权限检查功能
- 密码哈希和验证
- JWT令牌创建和解析
- 用户权限验证
- OAuth2密码模式支持
### 数据模型
用户模型包含以下关键字段:
- 用户名(username) - 唯一标识
- 密码哈希(password_hash) - 安全存储
- 角色(role) - 权限级别
- 激活状态(is_active) - 账户状态
- 关联员工(staff_id) - 与员工信息关联
**章节来源**
- [auth.py](file://backend/app/api/v1/auth.py#L14-L74)
- [security.py](file://backend/app/core/security.py#L18-L110)
- [models.py](file://backend/app/models/models.py#L244-L261)
## 架构概览
认证系统的整体架构采用分层设计,确保了良好的可维护性和扩展性:
```mermaid
sequenceDiagram
participant Client as 客户端
participant API as 认证API
participant Security as 安全模块
participant DB as 数据库
participant JWT as JWT服务
Client->>API : POST /auth/login
API->>Security : 验证密码
Security->>DB : 查询用户信息
DB-->>Security : 用户数据
Security->>Security : bcrypt校验密码
Security->>JWT : 创建访问令牌
JWT-->>Security : JWT令牌
Security-->>API : 验证结果
API-->>Client : {access_token, token_type}
Note over Client,JWT : 用户登录成功
Client->>API : GET /auth/me
API->>Security : 解析JWT令牌
Security->>JWT : 验证令牌有效性
JWT-->>Security : 令牌载荷
Security->>DB : 获取用户信息
DB-->>Security : 用户详情
Security-->>API : 当前用户
API-->>Client : 用户信息
```
**图表来源**
- [auth.py](file://backend/app/api/v1/auth.py#L17-L37)
- [security.py](file://backend/app/core/security.py#L55-L91)
## 详细组件分析
### 登录接口 (POST /auth/login)
登录接口实现了OAuth2密码模式的标准流程
#### 接口规范
- **URL**: `/auth/login`
- **方法**: POST
- **认证**: 无需认证
- **内容类型**: application/x-www-form-urlencoded
#### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 长度限制 |
|--------|------|------|------|----------|
| username | string | 是 | 用户名 | 3-50字符 |
| password | string | 是 | 密码 | 6-100字符 |
#### 响应格式
```json
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "bearer"
}
```
#### 处理流程
```mermaid
flowchart TD
Start([开始登录]) --> ValidateInput["验证输入参数"]
ValidateInput --> CheckUsername{"用户名存在?"}
CheckUsername --> |否| Return401["返回401错误"]
CheckUsername --> |是| VerifyPassword["验证密码"]
VerifyPassword --> PasswordCorrect{"密码正确?"}
PasswordCorrect --> |否| Return401["返回401错误"]
PasswordCorrect --> CheckActive{"账户已激活?"}
CheckActive --> |否| Return403["返回403错误"]
CheckActive --> CreateToken["创建JWT访问令牌"]
CreateToken --> ReturnToken["返回访问令牌"]
Return401 --> End([结束])
Return403 --> End
ReturnToken --> End
```
**图表来源**
- [auth.py](file://backend/app/api/v1/auth.py#L18-L37)
#### 错误处理
- **401 Unauthorized**: 用户名或密码错误
- **403 Forbidden**: 账户已禁用
- **422 Unprocessable Entity**: 参数验证失败
**章节来源**
- [auth.py](file://backend/app/api/v1/auth.py#L17-L37)
- [schemas.py](file://backend/app/schemas/schemas.py#L315-L318)
### 注册接口 (POST /auth/register)
注册接口负责创建新用户账户:
#### 接口规范
- **URL**: `/auth/register`
- **方法**: POST
- **认证**: 无需认证
- **内容类型**: application/json
#### 请求参数
| 参数名 | 类型 | 必填 | 描述 | 长度限制 |
|--------|------|------|------|----------|
| username | string | 是 | 用户名 | 3-50字符 |
| password | string | 是 | 密码 | 6-100字符 |
| staff_id | integer | 否 | 关联员工ID | 无限制 |
| role | string | 否 | 用户角色 | admin/manager/staff |
#### 响应格式
```json
{
"code": 200,
"message": "注册成功",
"data": {
"id": 1
}
}
```
#### 处理流程
```mermaid
flowchart TD
Start([开始注册]) --> ValidateInput["验证输入参数"]
ValidateInput --> CheckDuplicate{"用户名已存在?"}
CheckDuplicate --> |是| Return400["返回400错误"]
CheckDuplicate --> |否| HashPassword["生成密码哈希"]
HashPassword --> CreateUserData["创建用户数据"]
CreateUserData --> SaveToDB["保存到数据库"]
SaveToDB --> ReturnSuccess["返回成功响应"]
Return400 --> End([结束])
ReturnSuccess --> End
```
**图表来源**
- [auth.py](file://backend/app/api/v1/auth.py#L40-L65)
#### 错误处理
- **400 Bad Request**: 用户名已存在
- **422 Unprocessable Entity**: 参数验证失败
**章节来源**
- [auth.py](file://backend/app/api/v1/auth.py#L40-L65)
- [schemas.py](file://backend/app/schemas/schemas.py#L321-L327)
### 当前用户接口 (GET /auth/me)
当前用户接口用于获取已认证用户的详细信息:
#### 接口规范
- **URL**: `/auth/me`
- **方法**: GET
- **认证**: 需要Bearer Token
- **内容类型**: 无要求
#### 请求头
- **Authorization**: Bearer {JWT令牌}
#### 响应格式
```json
{
"id": 1,
"username": "admin",
"role": "admin",
"is_active": true,
"last_login": "2024-01-01T00:00:00",
"created_at": "2024-01-01T00:00:00"
}
```
#### 权限验证流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant API as API层
participant Security as 安全层
participant JWT as JWT验证
participant DB as 数据库
Client->>API : GET /auth/me
API->>Security : 从Authorization头提取令牌
Security->>JWT : 验证JWT令牌
JWT-->>Security : 验证结果
Security->>DB : 查询用户信息
DB-->>Security : 用户详情
Security->>Security : 检查账户激活状态
Security-->>API : 当前用户对象
API-->>Client : 用户信息
```
**图表来源**
- [auth.py](file://backend/app/api/v1/auth.py#L68-L73)
- [security.py](file://backend/app/core/security.py#L85-L91)
#### 权限级别
- **普通用户**: 可访问自己的信息
- **管理员**: 可访问所有用户信息
- **禁用用户**: 无法获取用户信息
**章节来源**
- [auth.py](file://backend/app/api/v1/auth.py#L68-L73)
- [security.py](file://backend/app/core/security.py#L85-L110)
- [schemas.py](file://backend/app/schemas/schemas.py#L335-L345)
## 依赖关系分析
认证系统的依赖关系体现了清晰的分层架构:
```mermaid
graph TB
subgraph "外部依赖"
A[FastAPI框架]
B[SQLAlchemy ORM]
C[bcrypt库]
D[jose(JWT库)]
E[PostgreSQL数据库]
end
subgraph "核心模块"
F[auth.py - 路由层]
G[security.py - 安全层]
H[models.py - 数据层]
I[schemas.py - 模式层]
J[database.py - 连接层]
K[config.py - 配置层]
end
F --> G
F --> H
F --> I
G --> J
G --> K
H --> B
G --> C
G --> D
J --> E
subgraph "前端依赖"
L[Pinia状态管理]
M[Axios HTTP客户端]
end
N[auth.js] --> M
O[user.js] --> L
O --> N
```
**图表来源**
- [auth.py](file://backend/app/api/v1/auth.py#L4-L12)
- [security.py](file://backend/app/core/security.py#L6-L15)
- [models.py](file://backend/app/models/models.py#L10-L13)
### 核心依赖关系
1. **OAuth2密码模式**: 使用FastAPI内置的OAuth2PasswordBearer
2. **JWT令牌**: 使用jose库进行JWT的编码和解码
3. **密码哈希**: 使用bcrypt库进行安全的密码哈希
4. **数据库访问**: 使用SQLAlchemy ORM进行异步数据库操作
**章节来源**
- [auth.py](file://backend/app/api/v1/auth.py#L4-L12)
- [security.py](file://backend/app/core/security.py#L6-L15)
## 性能考虑
### JWT令牌性能优化
- **令牌有效期**: 默认8小时可根据业务需求调整
- **内存缓存**: 可考虑添加令牌黑名单缓存
- **并发处理**: 异步数据库操作支持高并发场景
### 数据库性能优化
- **索引优化**: 用户名字段建立唯一索引
- **查询优化**: 使用select语句精确查询用户信息
- **连接池**: 配置合适的数据库连接池大小
### 缓存策略
```mermaid
flowchart LR
subgraph "缓存层"
A[Redis缓存]
B[内存缓存]
end
subgraph "认证流程"
C[用户登录]
D[令牌验证]
E[用户信息获取]
end
C --> A
D --> B
E --> B
```
## 故障排除指南
### 常见问题及解决方案
#### 登录失败 (401错误)
**症状**: 返回"用户名或密码错误"
**可能原因**:
- 用户名不存在
- 密码不正确
- 账户被禁用
**解决步骤**:
1. 验证用户名和密码格式
2. 检查用户账户状态
3. 确认密码哈希匹配
#### 权限不足 (403错误)
**症状**: 返回"需要管理员权限"
**可能原因**:
- 当前用户角色权限不足
- 用户账户被禁用
**解决步骤**:
1. 检查用户角色配置
2. 验证用户权限级别
3. 确认操作所需的最小权限
#### 数据库连接问题
**症状**: 数据库操作失败
**可能原因**:
- 数据库连接字符串错误
- 数据库服务不可用
- 连接池耗尽
**解决步骤**:
1. 检查DATABASE_URL配置
2. 验证数据库服务状态
3. 调整连接池参数
#### JWT令牌问题
**症状**: 令牌验证失败
**可能原因**:
- 令牌过期
- 密钥不匹配
- 令牌格式错误
**解决步骤**:
1. 检查SECRET_KEY配置
2. 验证令牌有效期
3. 确认令牌格式正确
**章节来源**
- [auth.py](file://backend/app/api/v1/auth.py#L30-L34)
- [security.py](file://backend/app/core/security.py#L60-L82)
## 结论
本认证系统实现了完整的用户身份验证和授权机制,具有以下特点:
### 安全特性
- **密码安全**: 使用bcrypt进行密码哈希存储
- **令牌安全**: JWT令牌包含过期时间和用户标识
- **权限控制**: 支持多角色权限管理和细粒度访问控制
- **传输安全**: 建议在生产环境中使用HTTPS
### 功能完整性
- **OAuth2密码模式**: 符合标准的OAuth2实现
- **用户管理**: 完整的用户生命周期管理
- **权限验证**: 多层次的权限检查机制
- **错误处理**: 完善的错误处理和状态码返回
### 扩展性
- **模块化设计**: 清晰的分层架构便于扩展
- **配置管理**: 集中的配置管理支持环境切换
- **数据库抽象**: SQLAlchemy ORM支持多种数据库
该认证系统为医院绩效管理系统的其他功能模块提供了可靠的身份验证基础,确保了系统的整体安全性和可用性。

View File

@@ -0,0 +1,396 @@
# 后端开发指南
<cite>
**本文档引用的文件**
- [main.py](file://backend/app/main.py)
- [config.py](file://backend/app/core/config.py)
- [database.py](file://backend/app/core/database.py)
- [security.py](file://backend/app/core/security.py)
- [logging_config.py](file://backend/app/core/logging_config.py)
- [__init__.py](file://backend/app/api/v1/__init__.py)
- [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)
- [staff_service.py](file://backend/app/services/staff_service.py)
- [auth.py](file://backend/app/api/v1/auth.py)
- [staff.py](file://backend/app/api/v1/staff.py)
- [init_db.py](file://backend/init_db.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向后端开发者系统讲解医院绩效管理系统的FastAPI后端开发实践涵盖
- FastAPI框架使用与路由组织
- 数据模型设计与业务实体映射
- 服务层架构、依赖注入与异步编程
- API路由配置、错误处理与日志规范
- 业务服务开发、数据验证与安全控制
- 数据库连接管理、事务处理与性能优化
- 单元测试与集成测试设计、代码质量保证
## 项目结构
后端采用分层架构入口应用层、核心配置与基础设施层、数据模型与Schema层、服务层、API路由层。整体结构清晰职责分离明确。
```mermaid
graph TB
subgraph "应用入口"
MAIN["main.py"]
end
subgraph "核心配置与基础设施"
CFG["config.py"]
DB["database.py"]
SEC["security.py"]
LOG["logging_config.py"]
end
subgraph "数据与接口定义"
MODELS["models.py"]
SCHEMAS["schemas.py"]
end
subgraph "服务层"
SVC_ASSESS["assessment_service.py"]
SVC_STAFF["staff_service.py"]
end
subgraph "API路由"
API_V1["api/v1/__init__.py"]
AUTH["api/v1/auth.py"]
STAFF["api/v1/staff.py"]
end
MAIN --> API_V1
API_V1 --> AUTH
API_V1 --> STAFF
AUTH --> SEC
STAFF --> SVC_STAFF
SVC_STAFF --> MODELS
SVC_ASSESS --> MODELS
SEC --> DB
DB --> MODELS
MODELS --> SCHEMAS
```
**图表来源**
- [main.py](file://backend/app/main.py#L15-L77)
- [config.py](file://backend/app/core/config.py#L9-L46)
- [database.py](file://backend/app/core/database.py#L9-L38)
- [security.py](file://backend/app/core/security.py#L18-L110)
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
- [models.py](file://backend/app/models/models.py#L62-L438)
- [schemas.py](file://backend/app/schemas/schemas.py#L49-L743)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
- [__init__.py](file://backend/app/api/v1/__init__.py#L4-L16)
- [auth.py](file://backend/app/api/v1/auth.py#L17-L74)
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
**章节来源**
- [main.py](file://backend/app/main.py#L15-L77)
- [__init__.py](file://backend/app/api/v1/__init__.py#L4-L16)
## 核心组件
- 应用实例与中间件创建FastAPI实例、CORS跨域、健康检查端点、全局异常处理器。
- 配置中心应用名、版本、API前缀、数据库连接池、JWT密钥与过期时间、CORS白名单、分页参数等。
- 数据库层异步SQLAlchemy引擎、会话工厂、模型基类、依赖注入式会话获取与自动事务提交/回滚。
- 安全模块OAuth2密码流、密码哈希与校验、JWT签发与解析、当前用户解析与权限校验管理员/经理/激活用户)。
- 日志模块:控制台与文件(按日滚动)双通道,错误级别单独文件,统一格式化输出。
- 数据模型与Schema涵盖科室、员工、指标、考核、明细、工资、用户、计划、菜单、模板等实体与枚举。
- 服务层:封装业务逻辑,如员工管理、考核流程(草稿/提交/审核/确认)、批量创建等。
- API路由认证、员工管理等模块化路由统一返回结构与权限控制。
**章节来源**
- [main.py](file://backend/app/main.py#L19-L76)
- [config.py](file://backend/app/core/config.py#L9-L46)
- [database.py](file://backend/app/core/database.py#L9-L38)
- [security.py](file://backend/app/core/security.py#L20-L110)
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
- [models.py](file://backend/app/models/models.py#L62-L438)
- [schemas.py](file://backend/app/schemas/schemas.py#L49-L743)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
## 架构总览
系统采用“路由层-服务层-数据层”的三层架构配合依赖注入与异步IO确保高并发下的稳定与性能。
```mermaid
graph TB
CLIENT["客户端"] --> ROUTER["API路由层<br/>auth.py / staff.py"]
ROUTER --> DEP_DB["依赖注入: get_db()"]
ROUTER --> DEP_SEC["依赖注入: 当前用户/权限"]
ROUTER --> SVC["服务层<br/>staff_service.py / assessment_service.py"]
SVC --> MODEL["数据模型层<br/>models.py"]
MODEL --> DB["数据库引擎<br/>database.py"]
ROUTER --> LOG["日志记录<br/>logging_config.py"]
ROUTER --> CFG["配置中心<br/>config.py"]
```
**图表来源**
- [auth.py](file://backend/app/api/v1/auth.py#L17-L74)
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
- [database.py](file://backend/app/core/database.py#L28-L38)
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
- [config.py](file://backend/app/core/config.py#L9-L46)
## 详细组件分析
### FastAPI应用与路由组织
- 应用创建设置标题、版本、OpenAPI文档路径、CORS策略、健康检查端点。
- 异常处理HTTP异常、请求验证异常、全局异常均记录日志并抛出。
- 路由注册v1路由聚合器统一include各模块路由。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant App as "FastAPI应用"
participant Router as "API路由"
participant Service as "服务层"
participant DB as "数据库"
Client->>App : 请求 /api/v1/staff
App->>Router : 分发到 staff.py
Router->>Service : 调用 StaffService
Service->>DB : 查询/写入
DB-->>Service : 返回结果
Service-->>Router : 业务结果
Router-->>Client : 统一响应结构
```
**图表来源**
- [main.py](file://backend/app/main.py#L50-L56)
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
- [staff_service.py](file://backend/app/services/staff_service.py#L16-L49)
**章节来源**
- [main.py](file://backend/app/main.py#L19-L76)
- [__init__.py](file://backend/app/api/v1/__init__.py#L4-L16)
### 数据模型设计与业务实体
- 实体覆盖:科室、员工、指标、考核、明细、工资、用户、计划、菜单、模板等。
- 枚举类型:科室类型、平衡计分卡维度、员工状态、考核状态、指标类型、计划层级/状态、菜单类型、模板类型等。
- 约束与索引:权重正数约束、多字段索引、唯一组合索引等,提升查询效率与数据一致性。
- 关系映射:一对多/多对多、外键约束、级联删除等,确保业务完整性。
```mermaid
erDiagram
DEPARTMENTS ||--o{ STAFF : "拥有"
STAFF ||--o{ ASSESSMENTS : "被考核"
STAFF ||--o{ SALARY_RECORDS : "薪资记录"
INDICATORS ||--o{ ASSESSMENT_DETAILS : "被用于"
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "包含"
PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : "关联指标"
INDICATORS ||--o{ PLAN_KPI_RELATIONS : "被关联"
USERS ||--o{ ASSESSMENTS : "审核/复核"
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L62-L438)
**章节来源**
- [models.py](file://backend/app/models/models.py#L62-L438)
### Schema与数据验证
- Pydantic模型统一定义请求/响应结构,内置字段长度、范围、枚举校验。
- 通用响应统一code/message结构分页响应包含总数、页码、页大小。
- 类型安全:枚举类型与数据库枚举保持一致,避免非法值进入数据库。
**章节来源**
- [schemas.py](file://backend/app/schemas/schemas.py#L49-L743)
### 服务层架构与依赖注入
- 服务类:以静态方法封装业务逻辑,便于测试与复用。
- 依赖注入通过AsyncSession注入数据库会话通过Depends注入当前用户与权限。
- 异步编程所有数据库操作使用异步IO提高并发吞吐。
```mermaid
classDiagram
class StaffService {
+get_list(db, department_id, status, keyword, page, page_size)
+get_by_id(db, staff_id)
+get_by_employee_id(db, employee_id)
+create(db, staff_data)
+update(db, staff_id, staff_data)
+delete(db, staff_id)
+get_by_department(db, department_id)
}
class AssessmentService {
+get_list(db, staff_id, department_id, period_year, period_month, status, page, page_size)
+get_by_id(db, assessment_id)
+create(db, assessment_data, assessor_id)
+update(db, assessment_id, assessment_data)
+submit(db, assessment_id)
+review(db, assessment_id, reviewer_id, approved, remark)
+finalize(db, assessment_id)
+batch_create_for_department(db, department_id, period_year, period_month, indicators)
}
class Assessment {
+total_score
+weighted_score
+status
}
StaffService --> Assessment : "关联"
AssessmentService --> Assessment : "管理"
```
**图表来源**
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
**章节来源**
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
### 安全与认证
- OAuth2密码模式tokenUrl指向登录接口。
- 密码处理bcrypt哈希与校验。
- JWT签发含过期时间解析校验失败则拒绝。
- 权限控制:当前用户、激活用户、管理员、经理权限装饰器。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Auth as "认证路由"
participant DB as "数据库"
participant Sec as "安全模块"
Client->>Auth : POST /api/v1/auth/login
Auth->>DB : 查询用户
DB-->>Auth : 用户对象
Auth->>Sec : 校验密码
Sec-->>Auth : 校验结果
Auth->>Sec : 生成JWT
Sec-->>Auth : access_token
Auth-->>Client : Token
```
**图表来源**
- [auth.py](file://backend/app/api/v1/auth.py#L17-L37)
- [security.py](file://backend/app/core/security.py#L24-L52)
**章节来源**
- [auth.py](file://backend/app/api/v1/auth.py#L17-L74)
- [security.py](file://backend/app/core/security.py#L20-L110)
### 数据库连接管理与事务
- 异步引擎基于asyncpg驱动支持连接池配置。
- 会话工厂AsyncSessionexpire_on_commit=False减少刷新开销。
- 依赖注入get_db提供上下文生命周期的会话自动commit/rollback/关闭。
- 事务语义异常时回滚finally确保关闭避免资源泄漏。
```mermaid
flowchart TD
Start(["获取会话"]) --> Exec["执行数据库操作"]
Exec --> Success{"是否异常?"}
Success --> |否| Commit["提交事务"]
Success --> |是| Rollback["回滚事务"]
Commit --> Close["关闭会话"]
Rollback --> Close
Close --> End(["结束"])
```
**图表来源**
- [database.py](file://backend/app/core/database.py#L28-L38)
**章节来源**
- [database.py](file://backend/app/core/database.py#L9-L38)
### API路由配置与统一响应
- 路由前缀:/api/v1统一文档路径。
- 权限装饰器:仅管理员/经理可创建/更新/删除敏感资源。
- 统一响应code/message/data/分页字段,便于前端处理。
**章节来源**
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
- [schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
### 错误处理与日志记录
- 异常处理HTTP异常、请求验证异常、全局异常均记录日志并向上抛出。
- 日志策略控制台INFO级别、文件DEBUG级别、错误单独ERROR文件按日滚动。
- 日志获取统一logger与子logger getChild便于模块化追踪。
**章节来源**
- [main.py](file://backend/app/main.py#L58-L74)
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
## 依赖关系分析
- 路由层依赖服务层与安全模块;服务层依赖数据模型与数据库会话;安全模块依赖配置与数据库;日志模块独立但被路由层使用。
- 低耦合高内聚:每个模块职责单一,通过依赖注入解耦。
```mermaid
graph LR
AUTH["auth.py"] --> SEC["security.py"]
AUTH --> SVC_STAFF["staff_service.py"]
STAFF["staff.py"] --> SVC_STAFF
SVC_STAFF --> MODELS["models.py"]
SVC_ASSESS["assessment_service.py"] --> MODELS
SEC --> DB["database.py"]
DB --> MODELS
MAIN["main.py"] --> API_V1["api/v1/__init__.py"]
API_V1 --> AUTH
API_V1 --> STAFF
MAIN --> LOG["logging_config.py"]
MAIN --> CFG["config.py"]
```
**图表来源**
- [auth.py](file://backend/app/api/v1/auth.py#L17-L74)
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
- [security.py](file://backend/app/core/security.py#L18-L110)
- [database.py](file://backend/app/core/database.py#L9-L38)
- [models.py](file://backend/app/models/models.py#L62-L438)
- [main.py](file://backend/app/main.py#L19-L76)
- [__init__.py](file://backend/app/api/v1/__init__.py#L4-L16)
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
- [config.py](file://backend/app/core/config.py#L9-L46)
**章节来源**
- [main.py](file://backend/app/main.py#L19-L76)
- [__init__.py](file://backend/app/api/v1/__init__.py#L4-L16)
## 性能考虑
- 异步IO使用SQLAlchemy 2.0异步引擎与AsyncSession提升并发能力。
- 连接池:通过配置项设置池大小与溢出,平衡内存与并发。
- 查询优化合理使用selectinload预加载关联避免N+1问题为高频查询字段添加索引。
- 缓存策略可结合Redis缓存热点数据如字典、模板降低数据库压力。
- 分页与限制:默认分页大小与最大分页限制,防止大查询导致阻塞。
- 日志级别生产环境建议调整日志级别减少磁盘IO与CPU消耗。
[本节为通用指导,无需列出具体文件来源]
## 故障排除指南
- 登录失败:检查用户名是否存在、密码是否正确、账户是否激活。
- 权限不足确认当前用户角色admin/manager/staff以及是否处于激活状态。
- 数据库连接异常检查DATABASE_URL、连接池配置、PostgreSQL服务状态。
- 事务未提交确认服务层调用await db.flush()/commit(),异常时自动回滚。
- 日志排查:查看应用日志与错误日志,定位异常堆栈与请求上下文。
**章节来源**
- [auth.py](file://backend/app/api/v1/auth.py#L22-L37)
- [security.py](file://backend/app/core/security.py#L55-L109)
- [database.py](file://backend/app/core/database.py#L28-L38)
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
## 结论
本指南梳理了医院绩效系统后端的架构与实现要点强调了FastAPI的异步特性、依赖注入、安全认证与日志体系。通过清晰的分层与严格的Schema验证系统具备良好的扩展性与可维护性。建议在后续迭代中完善单元测试与集成测试持续优化查询与缓存策略确保系统在高并发场景下的稳定性与性能。
[本节为总结性内容,无需列出具体文件来源]
## 附录
### 开发与运行指引
- 初始化数据库:运行数据库初始化脚本,创建表并插入测试数据。
- 启动应用使用uvicorn启动FastAPI应用默认监听0.0.0.0:8000。
- 访问文档:/api/v1/docs 或 /api/v1/redoc。
**章节来源**
- [init_db.py](file://backend/init_db.py#L11-L79)
- [main.py](file://backend/app/main.py#L83-L91)

View File

@@ -0,0 +1,404 @@
# 安全认证
<cite>
**本文引用的文件**
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/.env](file://backend/.env)
- [backend/app/core/security.py](file://backend/app/core/security.py)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.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/core/database.py](file://backend/app/core/database.py)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
- [test_frontend_connection.py](file://test_frontend_connection.py)
- [frontend/public/test-api.html](file://frontend/public/test-api.html)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向“医院绩效系统”的后端安全认证开发,聚焦以下主题:
- JWT 令牌生成、验证与过期处理
- 密码加密、盐值与安全存储
- 用户认证流程、权限验证与角色控制
- CORS 配置、跨域请求处理与安全头策略
- CSRF、XSS、SQL 注入等常见攻击的缓解思路
- 会话管理、令牌过期与安全审计
- OAuth2 集成、第三方认证与 SSO 支持建议
- 安全测试方法、漏洞扫描与安全加固建议
本指南在不泄露具体代码的前提下,结合仓库现有实现进行系统化梳理,并提供可视化图示与实操建议。
## 项目结构
后端采用 FastAPI + SQLAlchemy 2.x 异步 ORM 的分层架构,安全相关能力集中在核心模块与认证路由中:
- 应用入口与中间件FastAPI 应用实例、CORS 中间件、全局异常处理
- 配置中心:环境变量与运行参数(含 JWT、CORS、数据库
- 安全模块JWT 编解码、密码哈希、当前用户解析与权限依赖
- 认证路由:登录、注册、个人信息查询
- 数据模型与模式:用户表、角色字段、令牌载荷
- 数据库会话:异步连接与依赖注入
```mermaid
graph TB
subgraph "应用层"
A["FastAPI 应用<br/>main.py"]
B["CORS 中间件<br/>main.py"]
end
subgraph "配置层"
C["系统配置<br/>core/config.py"]
D[".env 环境变量<br/>.env"]
end
subgraph "安全层"
E["JWT/密码/权限<br/>core/security.py"]
end
subgraph "认证路由"
F["认证路由<br/>api/v1/auth.py"]
end
subgraph "数据层"
G["数据库引擎/会话<br/>core/database.py"]
H["用户模型<br/>models/models.py"]
I["数据模式<br/>schemas/schemas.py"]
end
A --> B
A --> F
F --> E
E --> G
G --> H
C --> A
D --> C
E --> I
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/.env](file://backend/.env#L1-L11)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L313-L346)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/.env](file://backend/.env#L1-L11)
## 核心组件
- JWT 与密码安全
- 使用 HS256 算法与对称密钥生成访问令牌;令牌包含过期时间与主体标识
- 使用 bcrypt 进行密码哈希与校验,自动处理盐值
- 提供从令牌解析当前用户的依赖函数,配合数据库查询与用户状态校验
- 认证路由
- 登录接口:用户名密码校验通过后签发访问令牌
- 注册接口:检查用户名唯一性,生成密码哈希并持久化
- 当前用户信息:基于依赖链完成身份与权限校验
- 配置与中间件
- CORS 允许指定前端源,支持凭证传递
- 全局异常处理记录日志并向上抛出
- 数据模型与模式
- 用户模型包含角色与激活状态字段,支撑角色与权限控制
- Pydantic 模式定义 Token 与用户响应结构
章节来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L110)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L74)
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L30)
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L313-L346)
## 架构总览
下图展示从浏览器到后端的关键交互路径,涵盖 CORS、认证、权限与数据库访问
```mermaid
sequenceDiagram
participant FE as "前端应用"
participant API as "FastAPI 应用"
participant CORS as "CORS 中间件"
participant AUTH as "认证路由"
participant SEC as "安全模块"
participant DB as "数据库"
FE->>API : "OPTIONS /api/v1/auth/login"
API->>CORS : "CORS 预检检查"
CORS-->>FE : "允许的来源/方法/头"
FE->>AUTH : "POST /api/v1/auth/login"
AUTH->>SEC : "校验用户名/密码"
SEC->>DB : "查询用户并比对哈希"
DB-->>SEC : "返回用户记录"
SEC-->>AUTH : "生成访问令牌"
AUTH-->>FE : "返回 {access_token, token_type}"
FE->>API : "携带 Authorization : Bearer ..."
API->>SEC : "解析 JWT 并加载当前用户"
SEC->>DB : "按 ID 查询用户"
DB-->>SEC : "返回用户"
SEC-->>API : "返回当前用户对象"
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
## 详细组件分析
### JWT 令牌生成与验证
- 令牌生成
- 载荷包含过期时间与主体(用户 ID使用对称密钥与指定算法签名
- 默认有效期可在配置中调整
- 令牌验证
- 解析阶段校验签名与过期时间
- 通过依赖注入从令牌提取主体并查询数据库获取用户对象
- 若令牌无效或用户不存在,抛出未授权异常
- 刷新机制
- 当前实现未提供刷新令牌的专用端点与逻辑
- 建议引入短期访问令牌与长期刷新令牌,配合黑名单/白名单与安全存储
```mermaid
flowchart TD
Start(["开始"]) --> Build["构建载荷<br/>设置过期时间/主体"]
Build --> Sign["使用 SECRET_KEY + ALGORITHM 签名"]
Sign --> Token["生成 access_token"]
Token --> Verify["接收 access_token"]
Verify --> Decode["解码并校验签名"]
Decode --> Expired{"是否过期?"}
Expired --> |是| Err["返回错误"]
Expired --> |否| LoadUser["按主体查询用户"]
LoadUser --> Found{"用户是否存在?"}
Found --> |否| Err
Found --> |是| Done(["返回当前用户"])
```
图表来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L53)
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
章节来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L53)
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
### 密码加密、盐值与安全存储
- 加密算法bcrypt
- 盐值处理:由 bcrypt 自动生成并嵌入哈希结果
- 存储:用户模型保存完整哈希字符串
- 校验:登录时将明文密码与存储哈希进行比对
```mermaid
flowchart TD
In(["输入明文密码"]) --> Hash["bcrypt 生成哈希<br/>自动包含盐值"]
Hash --> Store["存储哈希字符串"]
Store --> VerifyIn(["登录输入明文密码"])
VerifyIn --> Compare["bcrypt 校验明文与存储哈希"]
Compare --> Result{"匹配?"}
Result --> |是| Allow["允许登录"]
Result --> |否| Deny["拒绝登录"]
```
图表来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L31)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L31)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
章节来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L31)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L31)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
### 用户认证流程与权限验证
- 认证流程
- 登录:提交用户名/密码,校验后签发访问令牌
- 注册:校验用户名唯一性,生成哈希并创建用户
- 获取当前用户:依赖链解析令牌、校验用户状态、返回用户信息
- 权限验证
- 当前活跃用户:校验用户是否启用
- 管理员:校验角色为 admin
- 管理者:校验角色为 admin 或 manager
- 角色控制
- 用户模型包含角色字段,路由层通过依赖强制权限
```mermaid
sequenceDiagram
participant U as "用户"
participant R as "认证路由"
participant S as "安全模块"
participant M as "模型/数据库"
U->>R : "POST /api/v1/auth/login"
R->>S : "verify_password()"
S->>M : "select user by username"
M-->>S : "返回用户(含哈希)"
S-->>R : "校验通过"
R->>S : "create_access_token(user.id)"
S-->>R : "返回 access_token"
R-->>U : "Token 响应"
U->>R : "GET /api/v1/auth/me"
R->>S : "get_current_active_user()"
S->>S : "decode_token() + 校验过期"
S->>M : "select user by id"
M-->>S : "返回用户"
S-->>R : "返回当前用户"
R-->>U : "用户信息响应"
```
图表来源
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L68-L73)
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
章节来源
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L68-L73)
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
### CORS 配置与跨域请求处理
- CORS 中间件已在应用启动时注册,允许指定来源、凭证、方法与头
- 前端测试脚本通过 OPTIONS 预检与 POST 登录接口验证跨域行为
```mermaid
flowchart TD
Req["浏览器发起请求"] --> Preflight{"是否预检?"}
Preflight --> |是| Options["OPTIONS 预检"]
Options --> Check["CORS 中间件校验 Origin/Method/Headers"]
Check --> Allowed{"允许?"}
Allowed --> |是| Proceed["继续后续请求"]
Allowed --> |否| Block["拒绝请求"]
Preflight --> |否| Proceed
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
- [test_frontend_connection.py](file://test_frontend_connection.py#L38-L54)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
- [test_frontend_connection.py](file://test_frontend_connection.py#L38-L54)
- [frontend/public/test-api.html](file://frontend/public/test-api.html#L53-L74)
### CSRF、XSS 与 SQL 注入防护
- CSRF
- 当前未见专门的 CSRF 令牌或 SameSite Cookie 设置
- 建议:对无状态 API优先通过严格的 CORS 与来源校验;若使用 Cookie启用 SameSite=Lax|Strict 并配合 CSRF 令牌
- XSS
- 建议:前端渲染严格转义、使用 CSP 头限制脚本来源、避免内联脚本
- SQL 注入
- 使用 SQLAlchemy 异步 ORM参数化查询默认生效
- 建议:避免原生 SQL 拼接,统一通过 ORM 或带参查询执行器
章节来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
### 会话管理、令牌过期与安全审计
- 会话管理
- 采用无状态 JWT无需服务端会话存储
- 令牌过期
- 令牌包含 exp 字段,默认有效期可配置
- 建议:在客户端妥善存储 access_token并在 401 时触发重新登录
- 安全审计
- 建议:记录登录尝试、令牌签发/失效、敏感操作审计日志
- 当前全局异常处理器已记录 HTTP 与验证异常
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
### OAuth2 集成、第三方认证与 SSO 支持
- 当前实现基于 OAuth2 密码模式,令牌由后端签发
- 如需第三方认证(如 OIDC/SAML/SSO建议
- 引入第三方 SDK 或反向代理(如 Nginx + Keycloak
- 将外部用户信息映射为内部用户角色与权限
- 保持对称密钥与算法的安全配置
章节来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L21)
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
## 依赖关系分析
- 组件耦合
- 认证路由依赖安全模块与数据库会话
- 安全模块依赖配置与数据库,提供多级权限依赖
- 应用入口集中注册 CORS 与路由,异常处理统一
- 外部依赖
- JWT 编解码、密码哈希、异步数据库驱动
- 潜在问题
- 未发现循环依赖
- CORS 与安全头策略需与前端部署域名一致
```mermaid
graph LR
Auth["api/v1/auth.py"] --> Sec["core/security.py"]
Sec --> DB["core/database.py"]
Sec --> Model["models/models.py"]
Sec --> Conf["core/config.py"]
Main["app/main.py"] --> CORS["CORS 中间件"]
Main --> Auth
Conf --> Main
Env[".env"] --> Conf
```
图表来源
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/.env](file://backend/.env#L1-L11)
章节来源
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
## 性能考量
- JWT 解析与数据库查询
- 令牌解析为内存操作;用户查询需一次数据库往返
- 建议:为用户表与索引字段建立合适索引,减少查询开销
- CORS 预检缓存
- 合理设置预检缓存时间,减少重复 OPTIONS 请求
- 会话与令牌
- 无状态 JWT 降低服务端压力;注意令牌大小与负载字段精简
## 故障排查指南
- 登录失败
- 检查用户名/密码是否正确,确认用户处于启用状态
- 查看后端日志定位异常
- 跨域问题
- 确认前端 Origin 是否在允许列表,预检请求是否返回允许头
- 令牌无效
- 检查令牌是否过期、算法与密钥是否匹配、主体是否正确
- 权限不足
- 确认用户角色满足所需权限依赖
章节来源
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L31)
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
- [test_frontend_connection.py](file://test_frontend_connection.py#L38-L74)
## 结论
本项目在安全认证方面具备清晰的分层与职责划分JWT 与 bcrypt 的组合提供了可靠的令牌与密码安全权限依赖链实现了基于角色的访问控制CORS 中间件与异常处理提升了可用性与可观测性。建议在生产环境中进一步完善令牌刷新、CSRF 防护、安全头策略、审计日志与第三方认证集成,以满足更严格的安全要求。
## 附录
- 安全测试清单
- CORS 配置验证(预检与实际请求)
- 登录与鉴权端点的 401/403 场景
- 令牌过期与权限变更后的行为
- SQL 注入与 XSS 基线扫描
- 安全加固建议
- 生产环境替换默认密钥与最小长度要求
- 引入短期访问令牌与刷新令牌机制
- 启用 HTTPS、安全响应头、CSP
- 对高危操作增加二次确认与审计

View File

@@ -0,0 +1,330 @@
# 开发环境搭建
<cite>
**本文档引用的文件**
- [backend/.env.example](file://backend/.env.example)
- [backend/requirements.txt](file://backend/requirements.txt)
- [backend/alembic.ini](file://backend/alembic.ini)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/init_db.py](file://backend/init_db.py)
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py)
- [backend/create_menu_tables.py](file://backend/create_menu_tables.py)
- [backend/create_plan_tables.py](file://backend/create_plan_tables.py)
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py)
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py)
- [backend/test_api.py](file://backend/test_api.py)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向医院绩效系统后端开发团队提供从零搭建开发环境的完整流程。内容涵盖Python环境要求、虚拟环境创建与依赖安装、环境变量与数据库配置、API配置参数、本地开发服务器启动与热重载、数据库初始化与迁移脚本执行、测试数据准备、IDE配置建议以及常见问题排查。
## 项目结构
后端采用FastAPI + SQLAlchemy 2.0 + 异步数据库连接的现代Python架构主要目录与职责如下
- app核心业务逻辑包含API路由、核心配置、数据库连接、服务层、模型与工具
- alembic数据库迁移脚本与配置
- tests测试用例当前为空或未启用
- scripts初始化脚本与工具脚本
- 根目录:环境变量、依赖清单、迁移配置与数据库文件
```mermaid
graph TB
subgraph "后端根目录"
ENV[".env 环境变量"]
REQ["requirements.txt 依赖"]
ALEMBICINI["alembic.ini 迁移配置"]
DBFILE["hospital_performance.db SQLite 文件"]
end
subgraph "应用核心(app)"
MAIN["app/main.py 应用入口"]
CONFIG["app/core/config.py 配置"]
DB["app/core/database.py 数据库连接"]
MODELS["app/models/* 模型定义"]
SERVICES["app/services/* 服务层"]
APIS["app/api/v1/* API路由"]
SCRIPTS["app/scripts/* 初始化脚本"]
end
subgraph "迁移(alembic)"
ALEMBICENV["alembic/env.py 环境配置"]
VERSIONS["alembic/versions/* 迁移版本"]
end
ENV --> CONFIG
REQ --> MAIN
ALEMBICINI --> ALEMBICENV
CONFIG --> DB
DB --> MODELS
MAIN --> APIS
SCRIPTS --> MODELS
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
## 核心组件
- 应用入口与路由注册负责创建FastAPI实例、配置CORS、注册路由前缀、健康检查与全局异常处理
- 配置模块集中管理应用名称、版本、调试模式、API前缀、数据库连接、JWT密钥与算法、跨域来源、分页参数等
- 数据库连接基于SQLAlchemy 2.0异步引擎与会话工厂支持调试模式下的SQL回显
- 迁移配置Alembic配置文件指定迁移脚本位置、路径前缀与SQLAlchemy URL
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
- [backend/alembic.ini](file://backend/alembic.ini#L3-L7)
## 架构概览
后端采用分层架构,核心交互流程如下:
```mermaid
sequenceDiagram
participant Dev as "开发者"
participant Uvicorn as "Uvicorn 服务器"
participant FastAPI as "FastAPI 应用"
participant Router as "API 路由"
participant Service as "业务服务"
participant DB as "数据库"
Dev->>Uvicorn : 启动开发服务器(热重载)
Uvicorn->>FastAPI : 加载应用实例
FastAPI->>Router : 注册路由前缀 /api/v1
Dev->>FastAPI : 请求 /api/v1/health
FastAPI->>Router : 转发健康检查
Router->>FastAPI : 返回健康状态
FastAPI-->>Dev : 200 OK
Dev->>FastAPI : 认证请求
FastAPI->>Service : 调用认证服务
Service->>DB : 查询用户信息
DB-->>Service : 用户数据
Service-->>FastAPI : 认证结果
FastAPI-->>Dev : 返回访问令牌
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L54-L56)
- [backend/app/main.py](file://backend/app/main.py#L83-L91)
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L19-L51)
## 详细组件分析
### Python环境与依赖安装
- Python版本推荐使用Python 3.10及以上版本
- 虚拟环境建议使用venv创建隔离环境
- 依赖安装通过requirements.txt安装所有后端依赖
- 开发服务器使用uvicorn标准变体运行FastAPI应用
```mermaid
flowchart TD
Start(["开始"]) --> CreateEnv["创建虚拟环境"]
CreateEnv --> ActivateEnv["激活虚拟环境"]
ActivateEnv --> InstallDeps["安装依赖 requirements.txt"]
InstallDeps --> VerifyDeps{"依赖安装完成?"}
VerifyDeps --> |是| SetupEnv["配置环境变量 .env"]
VerifyDeps --> |否| FixDeps["检查并修复依赖问题"]
FixDeps --> InstallDeps
SetupEnv --> Ready["开发环境就绪"]
Ready --> End(["结束"])
```
**图表来源**
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
**章节来源**
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
### 环境变量与数据库配置
- 环境变量文件:.env.example提供了数据库URL、JWT密钥与调试开关的示例
- 数据库连接默认使用PostgreSQL异步驱动可通过DATABASE_URL覆盖
- Alembic配置迁移脚本默认指向SQLite文件便于本地开发与测试
- 配置优先级:应用配置从.env读取同时支持运行时覆盖
```mermaid
flowchart TD
EnvFile[".env.example 示例"] --> LoadEnv["加载环境变量"]
LoadEnv --> ConfigClass["Settings 类解析"]
ConfigClass --> DBURL["DATABASE_URL"]
ConfigClass --> JWT["JWT 密钥/算法"]
ConfigClass --> Debug["DEBUG 调试模式"]
DBURL --> Engine["异步引擎创建"]
Engine --> Session["会话工厂"]
Session --> App["应用使用"]
```
**图表来源**
- [backend/.env.example](file://backend/.env.example#L3-L10)
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26)
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
**章节来源**
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
### API配置参数
- 应用名称与版本用于OpenAPI文档展示
- API前缀统一为/api/v1便于版本管理
- CORS来源允许前端开发服务器跨域访问
- 分页参数:默认每页条数与最大限制
- 异常处理HTTP异常、请求验证异常与全局异常的统一处理
**章节来源**
- [backend/app/core/config.py](file://backend/app/core/config.py#L12-L33)
- [backend/app/main.py](file://backend/app/main.py#L19-L77)
### 本地开发服务器启动与热重载
- 启动命令直接运行app/main.py使用uvicorn标准变体
- 热重载reload=True启用自动重启
- 主机与端口默认监听0.0.0.0:8000
- 日志级别info级别输出运行日志
```mermaid
sequenceDiagram
participant Dev as "开发者"
participant Python as "Python 解释器"
participant Uvicorn as "Uvicorn"
participant App as "FastAPI 应用"
Dev->>Python : python app/main.py
Python->>Uvicorn : 启动服务器(主机=0.0.0.0, 端口=8000, 热重载)
Uvicorn->>App : 加载应用实例
App-->>Uvicorn : 应用就绪
Uvicorn-->>Dev : 服务器启动完成
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L83-L91)
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L83-L91)
### 数据库初始化与迁移脚本
- 初始表创建init_db.py与app/core/init_db.py分别提供不同初始化策略
- 菜单与计划表create_menu_tables.py与create_plan_tables.py按需创建专用表
- 指标模板init_indicator_templates.py批量导入平衡计分卡指标模板
- 迁移字段migrate_indicators.py为现有指标表添加BS维度等新字段
- Alembic迁移alembic.ini配置迁移脚本位置与SQLAlchemy URL
```mermaid
flowchart TD
InitStart["开始初始化"] --> CheckTables["检查表是否存在"]
CheckTables --> |不存在| CreateTable["创建基础表"]
CheckTables --> |存在| SkipInit["跳过初始化"]
CreateTable --> InsertData["插入测试/示例数据"]
InsertData --> InitComplete["初始化完成"]
SkipInit --> InitComplete
```
**图表来源**
- [backend/init_db.py](file://backend/init_db.py#L11-L25)
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L103-L110)
**章节来源**
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L1-L115)
- [backend/create_menu_tables.py](file://backend/create_menu_tables.py#L1-L27)
- [backend/create_plan_tables.py](file://backend/create_plan_tables.py#L1-L20)
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py#L1-L375)
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py#L1-L46)
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
### 测试数据准备与API验证
- 登录测试使用test_api.py模拟登录与获取模板数据
- 默认账户admin/admin123用于快速验证接口
- 接口验证:通过健康检查与模板查询确认服务可用性
**章节来源**
- [backend/test_api.py](file://backend/test_api.py#L1-L33)
### IDE配置与代码规范
- Python版本建议使用Python 3.10+
- 虚拟环境使用venv创建独立环境
- 依赖管理通过requirements.txt安装
- 代码格式化建议使用Black或autopep8
- Linting使用flake8或ruff
- IDE插件启用Python语言服务器与格式化工具
## 依赖关系分析
后端依赖关系清晰,核心模块间耦合度低,便于维护与扩展:
```mermaid
graph LR
FastAPI["FastAPI 应用"] --> Config["配置模块"]
FastAPI --> Router["API 路由"]
Config --> DB["数据库连接"]
DB --> Models["ORM 模型"]
Router --> Services["业务服务"]
Services --> DB
Scripts["初始化脚本"] --> DB
Alembic["Alembic 迁移"] --> DB
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L10-L12)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
## 性能考虑
- 异步数据库使用SQLAlchemy异步引擎提升并发性能
- 连接池:通过配置数据库连接池大小与溢出数量控制资源使用
- 调试模式仅在开发环境开启DEBUG生产环境关闭以减少日志开销
- CORS范围限制允许的来源与方法避免不必要的跨域请求
## 故障排除指南
- 数据库连接失败
- 检查DATABASE_URL格式与凭据
- 确认PostgreSQL服务运行状态
- 如需SQLite请调整Alembic配置与应用配置
- 端口被占用
- 修改app/main.py中的端口或停止占用进程
- 热重载无效
- 确认reload=True且文件保存
- 检查虚拟环境中uvicorn安装
- 权限错误
- 使用虚拟环境并确保pip安装权限
- Alembic迁移问题
- 检查alembic.ini中的SQLAlchemy URL
- 清理历史迁移并重新生成版本
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L83-L91)
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
## 结论
通过本指南,您可以快速搭建医院绩效系统后端开发环境。建议严格遵循环境变量配置、数据库初始化与迁移脚本执行流程,并在开发过程中充分利用热重载与日志功能。遇到问题时,可依据故障排除指南逐项排查。
## 附录
- 快速检查清单
- Python 3.10+ 已安装
- 虚拟环境已创建并激活
- requirements.txt 依赖安装完成
- .env 环境变量配置正确
- 数据库服务运行正常
- 应用健康检查返回200
- 初始化脚本执行成功

View File

@@ -0,0 +1,411 @@
# 数据库集成
<cite>
**本文引用的文件**
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py)
- [backend/app/models/models.py](file://backend/app/models/models.py)
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
- [backend/alembic/env.py](file://backend/alembic/env.py)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
- [backend/app/main.py](file://backend/app/main.py)
- [backend/init_db.py](file://backend/init_db.py)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
- [backend/requirements.txt](file://backend/requirements.txt)
- [backend/.env.example](file://backend/.env.example)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向“医院绩效系统”的数据库集成开发,围绕 SQLAlchemy ORM 配置、数据库连接与会话管理、初始化流程、表结构与关系映射、Alembic 迁移与版本管理、事务与并发控制、连接池配置、数据模型设计原则与索引优化、性能与查询优化、缓存策略、备份恢复与迁移测试、以及生产部署注意事项进行系统化说明。内容基于后端仓库的实际实现,确保可操作与可落地。
## 项目结构
后端采用 FastAPI + SQLAlchemy 2.x 异步 ORM 的架构,数据库层位于 app/core模型定义于 app/models迁移脚本位于 alembic/versions应用入口在 app/main.py。核心文件组织如下
- 配置与连接app/core/config.py、app/core/database.py
- 初始化app/core/init_db.py、init_db.py
- 模型app/models/models.py、app/models/finance.py
- 迁移alembic/env.py、alembic/versions/*.py
- API 与服务app/api/v1/*、app/services/*
- 依赖与环境requirements.txt、.env.example
```mermaid
graph TB
subgraph "应用层"
MAIN["app/main.py"]
API["API 路由<br/>app/api/v1/*"]
SERVICES["服务层<br/>app/services/*"]
end
subgraph "数据访问层"
CORE_DB["连接与会话<br/>app/core/database.py"]
MODELS["模型定义<br/>app/models/models.py<br/>app/models/finance.py"]
INIT_DB["初始化脚本<br/>app/core/init_db.py<br/>init_db.py"]
end
subgraph "迁移与版本"
ALEMBIC_ENV["Alembic 环境<br/>alembic/env.py"]
ALEMBIC_V1["初始迁移<br/>alembic/versions/001_initial.py"]
ALEMBIC_V2["模板迁移<br/>alembic/versions/002_template.py"]
end
MAIN --> API
API --> SERVICES
SERVICES --> CORE_DB
CORE_DB --> MODELS
INIT_DB --> MODELS
ALEMBIC_ENV --> ALEMBIC_V1
ALEMBIC_ENV --> ALEMBIC_V2
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L25)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
- [backend/alembic/env.py](file://backend/alembic/env.py#L18-L18)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L25)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
- [backend/alembic/env.py](file://backend/alembic/env.py#L18-L18)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
## 核心组件
- 异步数据库引擎与会话工厂:通过 asyncpg 驱动创建异步引擎,使用 async_sessionmaker 构建会话工厂;提供 get_db 依赖以在请求生命周期内自动提交/回滚/关闭会话。
- 配置中心Settings 提供 DATABASE_URL、连接池大小等配置项支持从 .env 加载。
- 模型基类与实体Base 作为 DeclarativeBase 子类,统一模型元数据;各业务实体(如 Department、Staff、Assessment 等)定义字段、索引与关系。
- 迁移环境Alembic env.py 使用 async_engine_from_config支持异步迁移执行。
- 初始化脚本app/core/init_db.py 与 init_db.py 提供示例数据与表初始化能力。
章节来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25)
- [backend/alembic/env.py](file://backend/alembic/env.py#L42-L53)
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L103-L115)
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
## 架构总览
系统采用“异步 ORM + 迁移驱动”的数据库集成架构API 层通过依赖注入获取 AsyncSession服务层执行查询与写入模型层定义表结构与关系Alembic 管理数据库版本演进。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "API 路由<br/>app/api/v1/staff.py"
participant Service as "服务层<br/>app/services/staff_service.py"
participant DB as "数据库引擎/会话<br/>app/core/database.py"
participant Models as "模型定义<br/>app/models/models.py"
Client->>API : GET /api/v1/staff
API->>DB : 依赖注入 get_db()
DB-->>API : AsyncSession
API->>Service : 调用 get_list(db, filters...)
Service->>DB : 执行 select 查询含索引
DB->>Models : 映射到 ORM 实体
Models-->>DB : 返回结果
DB-->>Service : 结果集
Service-->>API : 列表与总数
API-->>Client : JSON 响应
```
图表来源
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L49)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L49)
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
## 详细组件分析
### SQLAlchemy ORM 配置与连接管理
- 使用 asyncpg 驱动与 create_async_engine 构建异步引擎echo 由配置开关控制。
- async_sessionmaker(class_=AsyncSession, expire_on_commit=False) 提供会话工厂,避免过早失效导致的懒加载问题。
- get_db 依赖在 try/finally 中自动 commit/rollback/close保证异常安全与资源释放。
```mermaid
flowchart TD
Start(["进入请求"]) --> GetSession["依赖注入 AsyncSession"]
GetSession --> TryExec["执行业务逻辑"]
TryExec --> Commit{"是否异常?"}
Commit --> |否| DoCommit["commit()"]
Commit --> |是| DoRollback["rollback()"]
DoCommit --> Close["close()"]
DoRollback --> Close
Close --> End(["结束请求"])
```
图表来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
章节来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
### 数据库初始化流程
- app/core/init_db.py按顺序创建管理员、科室、指标、员工等初始数据避免重复插入。
- init_db.py直接创建所有表并填充测试数据适合快速启动。
- 两者均使用异步会话,确保与 ORM 协同一致。
```mermaid
sequenceDiagram
participant CLI as "命令行"
participant Init as "初始化脚本<br/>app/core/init_db.py"
participant DB as "AsyncSession"
participant Models as "模型"
CLI->>Init : 运行 main()
Init->>DB : 异步会话创建
Init->>DB : 检查是否存在数据
alt 不存在
Init->>DB : 写入默认数据管理员/科室/指标/员工
DB->>Models : flush/commit
else 已存在
Init-->>CLI : 跳过初始化
end
```
图表来源
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L103-L115)
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
章节来源
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L12-L115)
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
### 表结构定义与关系映射
- Department 与 Staff一对多部门-员工Staff 外键关联 Department。
- Assessment 与 Staff一对多员工-考核记录Assessment 与 Staff 建立双向关系。
- Assessment 与 Indicator多对多通过 AssessmentDetail 关联AssessmentDetail 双向映射。
- PerformancePlan 与 Department/Staff/User多层级计划支持父子计划与审批流。
- Indicator 与 IndicatorTemplate模板与指标的多对多通过 TemplateIndicator 关联。
- Finance 模块DepartmentFinance 记录科室收支,外键关联 Department。
```mermaid
classDiagram
class Department {
+id : int
+name : str
+code : str
+dept_type : Enum
+parent_id : int?
+level : int
+sort_order : int
+is_active : bool
}
class Staff {
+id : int
+employee_id : str
+name : str
+department_id : int
+position : str
+title : str?
+base_salary : float
+performance_ratio : float
+status : Enum
}
class Assessment {
+id : int
+staff_id : int
+period_year : int
+period_month : int
+status : Enum
}
class AssessmentDetail {
+id : int
+assessment_id : int
+indicator_id : int
+score : float
}
class Indicator {
+id : int
+name : str
+code : str
+indicator_type : Enum
}
class PerformancePlan {
+id : int
+plan_level : Enum
+plan_year : int
+status : Enum
}
class IndicatorTemplate {
+id : int
+template_type : Enum
}
class TemplateIndicator {
+id : int
+template_id : int
+indicator_id : int
}
class DepartmentFinance {
+id : int
+department_id : int
+finance_type : Enum
+amount : float
}
Department "1" <-- "many" Staff : "department_id"
Staff "1" <-- "many" Assessment : "staff_id"
Assessment "1" <-- "many" AssessmentDetail : "assessment_id"
Indicator "1" <-- "many" AssessmentDetail : "indicator_id"
PerformancePlan "1" <-- "many" TemplateIndicator : "plan_id"
Indicator "1" <-- "many" TemplateIndicator : "indicator_id"
Department "1" <-- "many" DepartmentFinance : "department_id"
```
图表来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
- [backend/app/models/models.py](file://backend/app/models/models.py#L270-L339)
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L438)
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L74)
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
- [backend/app/models/models.py](file://backend/app/models/models.py#L270-L339)
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L438)
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L74)
### Alembic 迁移脚本与版本管理
- env.py配置 target_metadata 为 Base.metadata使用 async_engine_from_config 执行异步迁移。
- 001_initial.py创建 departments、staff、indicators、assessments、assessment_details、salary_records、users 等核心表及索引。
- 002_template.py新增 indicator_templates 与 template_indicators 表,并为 indicators 表动态添加若干列(带存在性检查)。
```mermaid
flowchart TD
A["执行 alembic revision/upgrade"] --> B["env.py 异步引擎连接"]
B --> C["读取 target_metadata(Base.metadata)"]
C --> D["生成 SQL 并执行"]
D --> E["001_initial.py: 创建核心表与索引"]
D --> F["002_template.py: 新增模板表与列"]
```
图表来源
- [backend/alembic/env.py](file://backend/alembic/env.py#L42-L53)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
章节来源
- [backend/alembic/env.py](file://backend/alembic/env.py#L18-L66)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
### 事务处理与并发控制
- get_db 依赖在 try/finally 中确保异常时回滚、最终关闭会话,避免长事务与连接泄漏。
- 会话工厂 expire_on_commit=False减少后续查询中的额外 SELECT。
- 建议在高并发场景下结合数据库层面的锁与重试策略(例如在服务层对关键更新加排他锁或幂等写入)。
章节来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
### 连接池配置
- 配置项 DATABASE_POOL_SIZE 与 DATABASE_MAX_OVERFLOW 由 Settings 提供,可在 .env 中覆盖。
- 生产环境建议根据并发与数据库资源合理设置池大小,避免连接耗尽或过度占用。
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/.env.example](file://backend/.env.example#L3-L4)
### 数据模型设计原则、字段约束与索引优化
- 字段约束:使用 CheckConstraint 对数值范围进行约束(如指标权重、财务金额非负)。
- 索引优化:为高频过滤与连接字段建立复合索引(如部门类型、员工状态、考核期、工资期等)。
- 枚举映射:通过 Enum 与 values_callable 将 Python 枚举映射为字符串存储,保持一致性与可读性。
- 关系设计:明确主外键、级联策略(如评估明细的级联删除),避免孤儿数据。
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L143-L146)
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L73-L74)
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
- [backend/app/models/models.py](file://backend/app/models/models.py#L174-L178)
- [backend/app/models/models.py](file://backend/app/models/models.py#L227-L230)
- [backend/app/models/models.py](file://backend/app/models/models.py#L334-L338)
### 查询优化与缓存策略
- 查询优化:优先使用索引字段过滤与排序;对关联查询使用 selectinload 或 join减少 N+1 查询。
- 缓存策略:对静态配置与只读数据(如枚举、字典表)使用进程内缓存;对热点统计结果使用 Redis 缓存短期聚合数据。
- 分页与总数:使用子查询统计总数,避免 count(*) 的全表扫描。
章节来源
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L24-L49)
### 数据备份与恢复
- 备份:使用数据库自带工具(如 PostgreSQL 的 pg_dump定期备份生产环境建议增量与全量结合。
- 恢复:在隔离环境中验证备份可用性;迁移前先在预生产环境演练。
(本节为通用实践说明)
### 迁移测试与生产部署注意事项
- 迁移测试:在本地与预生产环境执行升级/降级,验证索引、约束与数据完整性。
- 生产部署:使用只读迁移(避免破坏性变更);变更前冻结写入或切换到只读模式;回滚预案准备充分。
(本节为通用实践说明)
## 依赖分析
- FastAPI 应用通过依赖注入获取 AsyncSession服务层负责业务逻辑与查询组合。
- 模型层定义表结构与关系Alembic 通过 env.py 与版本脚本同步数据库结构。
- 配置层集中管理数据库连接与池参数,.env 提供环境变量覆盖。
```mermaid
graph LR
Config["配置<br/>app/core/config.py"] --> Engine["引擎<br/>app/core/database.py"]
Engine --> Session["会话<br/>app/core/database.py"]
Session --> Services["服务层<br/>app/services/*"]
Services --> Models["模型<br/>app/models/*"]
AlembicEnv["Alembic 环境<br/>alembic/env.py"] --> Versions["版本脚本<br/>alembic/versions/*"]
Versions --> Models
```
图表来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L25)
- [backend/alembic/env.py](file://backend/alembic/env.py#L18-L18)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L25)
- [backend/alembic/env.py](file://backend/alembic/env.py#L18-L18)
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
## 性能考虑
- 连接池:根据并发与数据库承载能力调整池大小与溢出限制。
- 查询:为高频过滤字段建立索引;避免 SELECT *,仅选择必要列。
- 事务:缩短事务时间,批量写入使用 flush/commit 合理拆分。
- 缓存:对稳定数据与统计结果进行缓存,降低数据库压力。
(本节提供通用指导)
## 故障排查指南
- 连接失败:检查 DATABASE_URL 与 .env 是否正确;确认数据库服务可达与账号权限。
- 迁移异常:查看 Alembic 输出与数据库日志;确认版本脚本无破坏性变更。
- 会话异常:确认 get_db 依赖注入是否生效;避免跨请求复用会话对象。
- 数据不一致:检查事务边界与异常处理;必要时引入幂等写入与重试。
章节来源
- [backend/.env.example](file://backend/.env.example#L3-L4)
- [backend/alembic/env.py](file://backend/alembic/env.py#L42-L53)
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
## 结论
本指南基于现有代码实现了“异步 ORM + 迁移驱动”的数据库集成方案,覆盖连接管理、初始化、模型设计、迁移与版本控制、事务与并发、性能与运维等关键环节。建议在生产环境中进一步完善监控、备份与回滚策略,并持续优化查询与索引以满足业务增长需求。
## 附录
- 依赖清单:见 requirements.txt。
- 环境变量示例:见 .env.example。
- API 示例:参考 app/api/v1/staff.py 的依赖注入与服务调用。
章节来源
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L49)

View File

@@ -0,0 +1,350 @@
# 工资服务
<cite>
**本文引用的文件**
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.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/services/assessment_service.py](file://backend/app/services/assessment_service.py)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/init_db.py](file://backend/init_db.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [组件详解](#组件详解)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向“工资服务”的开发与维护,围绕 SalaryService 类的实现架构展开,系统性阐述以下内容:
- 绩效奖金计算算法:基础工资、绩效系数、考核等级对应的奖金计算逻辑
- 工资记录的数据结构、字段含义与业务规则
- 批量生成工资记录的机制:按月度、季度或年度的计算流程
- 与考核服务、员工服务的集成关系与数据一致性保障
- 异常处理、事务管理与性能优化策略
- 实际计算示例与边界条件处理
## 项目结构
后端采用分层架构API 层负责路由与鉴权Service 层封装业务逻辑Model 层定义数据模型Schema 层定义输入输出结构。工资服务位于 Service 层,与考核服务、员工服务协作,最终落库到 SalaryRecord。
```mermaid
graph TB
API["API 路由<br/>salary.py"] --> SVC["服务层<br/>salary_service.py"]
SVC --> MODEL["模型层<br/>models.py 中的 SalaryRecord/Assessment/Staff"]
SVC --> SCHEMA["Schema 定义<br/>schemas.py"]
SVC --> ASSESS_SVC["考核服务<br/>assessment_service.py"]
SVC --> STAFF_SVC["员工服务<br/>staff_service.py"]
SVC --> DB["数据库连接<br/>database.py"]
DB --> CONF["配置<br/>config.py"]
```
图表来源
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L272-L313)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
章节来源
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L272-L313)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
## 核心组件
- 工资服务SalaryService提供查询、创建、更新、生成、确认、批量生成与批量确认等能力核心算法集中在绩效奖金计算与总工资汇总。
- 工资记录模型SalaryRecord持久化存储工资条目包含基础工资、绩效得分、绩效奖金、扣款、补贴、应发工资、状态等字段。
- 考核服务AssessmentService提供考核的创建、提交、审核、确认等流程为工资生成提供“已确认”的考核数据。
- 员工服务StaffService提供员工信息查询与维护为工资生成提供基础工资与绩效系数。
- API 路由salary.py对外暴露查询、生成、确认、批量生成与批量确认等接口并进行权限校验。
章节来源
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
## 架构总览
工资服务的调用链路如下:前端请求经 API 路由进入,由 SalaryService 执行业务逻辑;若需要从考核生成,则联动 AssessmentService 与 StaffService最终写入数据库并返回结果。
```mermaid
sequenceDiagram
participant FE as "前端"
participant API as "API 路由<br/>salary.py"
participant SVC as "服务层<br/>salary_service.py"
participant ASSESS as "考核服务<br/>assessment_service.py"
participant STAFF as "员工服务<br/>staff_service.py"
participant DB as "数据库"
FE->>API : "POST /salary/generate"
API->>SVC : "generate_from_assessment(staff_id, year, month)"
SVC->>DB : "查询员工信息"
DB-->>SVC : "Staff"
SVC->>DB : "查询已确认考核"
DB-->>SVC : "Assessment(finalized)"
SVC->>SVC : "calculate_performance_bonus()"
SVC->>DB : "插入 SalaryRecord"
DB-->>SVC : "返回新记录"
SVC-->>API : "返回记录ID"
API-->>FE : "生成成功"
```
图表来源
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L110)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L195-L205)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L52-L59)
## 组件详解
### 工资记录数据模型与字段语义
- 表名salary_records
- 字段与含义(节选):
- staff_id员工ID
- period_year / period_month所属周期年/月)
- base_salary基本工资
- performance_score绩效得分
- performance_bonus绩效奖金
- allowance补贴
- deduction扣款
- total_salary应发工资base_salary + performance_bonus + allowance - deduction
- status状态默认 pending支持 confirmed
- remark备注
- created_at / updated_at创建与更新时间
业务规则:
- 总工资由服务层在创建/更新时计算并入库
- 状态仅允许在“pending”状态下进行更新与确认
- 生成工资记录前需确保同一员工当月无重复记录
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L272-L313)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L77-L124)
### 绩效奖金计算算法
- 奖金基数PERFORMANCE_BASE静态常量
- 计算公式:奖金 = 奖金基数 × (绩效得分/100) × 员工绩效系数
- 输入来源:
- 绩效得分:来自已确认的 Assessment.weighted_score
- 绩效系数:来自 Staff.performance_ratio
- 输出performance_bonus用于后续总工资计算
```mermaid
flowchart TD
Start(["开始"]) --> LoadAssess["加载已确认考核<br/>Assessment.finalized"]
LoadAssess --> LoadStaff["加载员工信息<br/>Staff.performance_ratio"]
LoadStaff --> CalcBonus["计算奖金<br/>奖金 = 奖金基数 × 得分/100 × 系数"]
CalcBonus --> SumTotal["汇总总工资<br/>总工资 = 基本工资 + 奖金 + 补贴 - 扣款"]
SumTotal --> Persist["持久化 SalaryRecord"]
Persist --> End(["结束"])
```
图表来源
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L167-L170)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L173-L186)
章节来源
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L17-L18)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L167-L170)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L173-L186)
### 工资记录生成与批量处理机制
- 单条生成generate_from_assessment
- 校验员工存在
- 查询当期“已确认”的 Assessment
- 检查是否存在重复工资记录
- 计算奖金与总工资
- 插入 SalaryRecord状态 pending
- 批量生成batch_generate_for_department
- 基于部门与周期,查询所有“已确认”的 Assessment
- 对每个评估逐条调用单条生成
- 批量确认batch_confirm
- 按年/月筛选 pending 状态的记录
- 可选按部门过滤
- 将状态置为 confirmed 并返回确认数量
```mermaid
sequenceDiagram
participant API as "API 路由"
participant SVC as "SalaryService"
participant DB as "数据库"
API->>SVC : "batch_generate_for_department(dept_id, year, month)"
SVC->>DB : "查询已确认考核(按部门+周期)"
DB-->>SVC : "Assessments 列表"
loop 遍历每个 Assessment
SVC->>SVC : "generate_from_assessment()"
SVC->>DB : "插入 SalaryRecord"
end
SVC-->>API : "返回生成的记录列表"
```
图表来源
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L113-L129)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L193-L219)
章节来源
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L129)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L193-L219)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L234-L259)
### 与考核服务、员工服务的集成关系
- 与考核服务AssessmentService
- 生成工资记录的前提是存在“已确认”的 Assessment
- 通过 Assessment.status == "finalized" 进行筛选
- 与员工服务StaffService
- 读取员工的基础工资与绩效系数
- 作为奖金计算的输入参数
- 数据一致性:
- 生成前检查重复记录,避免重复发薪
- 仅对 pending 状态的记录允许更新与确认
章节来源
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L134-L153)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L195-L205)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L52-L59)
### API 接口与权限控制
- 查询列表与详情:普通用户可访问
- 创建、更新、单条生成、确认:需要管理员或经理权限
- 批量生成、批量确认:需要管理员或经理权限
- 返回格式遵循统一响应结构code/message/data
章节来源
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L20-L156)
## 依赖关系分析
- SalaryService 依赖:
- SQLAlchemy 异步会话AsyncSession
- 模型SalaryRecord、Staff、Assessment
- SchemaSalaryRecordCreate、SalaryRecordUpdate
- 服务AssessmentService、StaffService
- 外部依赖:
- 数据库连接与事务管理database.py
- 应用配置config.py
```mermaid
classDiagram
class SalaryService {
+get_list(...)
+get_by_id(...)
+create(...)
+update(...)
+calculate_performance_bonus(...)
+generate_from_assessment(...)
+batch_generate_for_department(...)
+confirm(...)
+batch_confirm(...)
}
class AssessmentService {
+get_by_id(...)
+finalize(...)
}
class StaffService {
+get_by_id(...)
}
class SalaryRecord
class Staff
class Assessment
SalaryService --> AssessmentService : "查询已确认考核"
SalaryService --> StaffService : "读取员工信息"
SalaryService --> SalaryRecord : "创建/更新"
SalaryService --> Staff : "读取基础工资/系数"
SalaryService --> Assessment : "读取加权得分"
```
图表来源
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
章节来源
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
## 性能考量
- 数据库连接池与并发:
- 配置文件提供数据库连接池大小与溢出参数,建议结合业务峰值合理设置
- 查询优化:
- SalaryRecord 与 Assessment 均具备按 staff_id、period、status 的索引,有利于分页与筛选
- 批量生成时建议按部门分批处理,避免一次性加载过多记录
- 事务与回滚:
- 数据库会话在异常时自动回滚,确保数据一致性
- I/O 与序列化:
- API 层对响应进行统一包装,注意避免在高频接口中进行大量对象转换
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26)
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
- [backend/app/models/models.py](file://backend/app/models/models.py#L227-L230)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L193-L219)
## 故障排查指南
- 无法生成工资记录
- 检查是否存在“已确认”的 Assessment
- 检查是否已存在同员工/同周期的工资记录
- 检查员工是否存在且基础工资/绩效系数有效
- 更新失败
- 仅允许对状态为“pending”的记录进行更新
- 确认失败
- 仅允许对状态为“pending”的记录进行确认
- 批量生成/确认
- 确认年/月参数正确
- 如指定部门确认部门ID有效
- 数据库异常
- 查看会话依赖的回滚逻辑是否触发
- 检查连接池配置与数据库可用性
章节来源
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L104-L124)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L222-L231)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L234-L259)
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L156)
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
## 结论
SalaryService 提供了完整的工资核算闭环:从“已确认”的考核数据出发,结合员工基础信息,计算绩效奖金并生成工资记录;支持单条与批量生成、单条与批量确认,并通过严格的权限控制与状态约束保障业务正确性。配合合理的数据库索引与连接池配置,可在高并发场景下保持稳定与高效。
## 附录
### 实际计算示例与边界条件
- 示例场景
- 员工基础工资10000绩效系数1.2
- 考核加权得分90
- 奖金基数3000
- 计算过程:奖金 = 3000 × (90/100) × 1.2;总工资 = 基础工资 + 奖金 + 补贴 - 扣款
- 边界条件
- 绩效得分/系数为 0奖金为 0
- 补贴/扣款为负:不合法,应在输入层约束
- 已存在同周期记录:拒绝重复生成
- 非“已确认”考核:拒绝生成
- 非“pending”状态拒绝更新/确认
章节来源
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L17-L18)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L272-L313)

View File

@@ -0,0 +1,546 @@
# 指标模板服务
<cite>
**本文档引用的文件**
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py)
- [backend/app/services/template_service.py](file://backend/app/services/template_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)
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py)
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/main.py](file://backend/app/main.py)
- [docs/详细设计.md](file://docs/详细设计.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本文档详细阐述了医院绩效管理系统中的指标模板服务重点分析了IndicatorService和TemplateService两个核心服务的实现细节。系统基于平衡计分卡理论实现了完整的考核指标管理和模板管理功能包括指标类型定义、权重设置、评分标准配置、BSC维度关联等。
系统采用FastAPI + SQLAlchemy 2.0 + PostgreSQL的技术栈支持异步IO操作具备良好的扩展性和性能表现。通过标准化的API接口和数据模型设计为医院绩效管理提供了完整的技术解决方案。
## 项目结构
后端项目采用典型的分层架构设计:
```mermaid
graph TB
subgraph "表现层"
Frontend[前端应用]
end
subgraph "应用层"
API[API路由层]
Services[服务层]
end
subgraph "数据层"
Models[数据模型]
Schemas[数据模式]
Database[(PostgreSQL数据库)]
end
Frontend --> API
API --> Services
Services --> Models
Models --> Database
Schemas --> API
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
## 核心组件
### 指标服务 (IndicatorService)
IndicatorService负责考核指标的全生命周期管理包括查询、创建、更新、删除和模板导入等功能。
**主要功能特性:**
- 多条件查询和分页支持
- 指标模板导入和覆盖机制
- 激活指标的快速获取
- 完整的CRUD操作支持
### 模板服务 (TemplateService)
TemplateService专注于指标模板的管理支持模板的创建、关联、更新和删除操作。
**核心能力:**
- 模板列表查询和类型过滤
- 模板指标的增删改查
- 模板类型和维度标签映射
- 批量指标添加功能
**章节来源**
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L13-L197)
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L20-L293)
## 架构概览
系统采用分层架构,清晰分离了表现层、应用层、服务层和数据层:
```mermaid
graph TB
subgraph "表现层"
UI[Web界面]
Mobile[移动端应用]
end
subgraph "应用层"
Auth[认证中间件]
Validation[数据验证]
Logging[日志记录]
end
subgraph "服务层"
IndicatorSvc[指标服务]
TemplateSvc[模板服务]
AssessmentSvc[考核服务]
FinanceSvc[财务服务]
end
subgraph "数据层"
IndicatorModel[指标模型]
TemplateModel[模板模型]
AssessmentModel[考核模型]
UserModel[用户模型]
end
UI --> Auth
Mobile --> Auth
Auth --> Validation
Validation --> IndicatorSvc
Validation --> TemplateSvc
IndicatorSvc --> IndicatorModel
TemplateSvc --> TemplateModel
AssessmentSvc --> AssessmentModel
IndicatorModel --> UserModel
TemplateModel --> UserModel
```
**图表来源**
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L13-L197)
## 详细组件分析
### 数据模型设计
系统采用SQLAlchemy ORM进行数据建模建立了完整的指标和模板数据结构
```mermaid
classDiagram
class Indicator {
+int id
+string code
+string name
+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
+datetime created_at
+datetime updated_at
}
class IndicatorTemplate {
+int id
+string template_code
+string template_name
+TemplateType template_type
+string description
+string dimension_weights
+string assessment_cycle
+bool is_active
+datetime created_at
+datetime updated_at
}
class TemplateIndicator {
+int id
+int template_id
+int indicator_id
+string category
+float target_value
+string target_unit
+float weight
+string scoring_method
+string scoring_params
+int sort_order
+string remark
+datetime created_at
+datetime updated_at
}
IndicatorTemplate "1" -- "many" TemplateIndicator : "包含"
Indicator "many" -- "one" TemplateIndicator : "被关联"
```
**图表来源**
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L404)
- [backend/app/models/models.py](file://backend/app/models/models.py#L411-L432)
#### 指标类型枚举
系统定义了完整的指标类型体系,支持多种考核维度:
| 指标类型 | 描述 | 示例 |
|---------|------|------|
| quality | 质量指标 | 病历甲级率、院感发生率 |
| quantity | 数量指标 | 手术台次、门诊量 |
| efficiency | 效率指标 | 平均住院日、床位使用率 |
| service | 服务指标 | 满意度得分、投诉次数 |
| cost | 成本指标 | 药品比例、材料消耗 |
#### BSC维度配置
平衡计分卡四个维度的权重分配策略:
| 维度 | 编码 | 中文名称 | 典型权重范围 |
|------|------|----------|-------------|
| financial | financial | 财务管理 | 20%-40% |
| customer | customer | 顾客服务 | 25%-35% |
| internal_process | internal_process | 内部流程 | 20%-30% |
| learning_growth | learning_growth | 学习与成长 | 5%-15% |
**章节来源**
- [backend/app/models/models.py](file://backend/app/models/models.py#L54-L61)
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L35)
### API接口设计
系统提供RESTful API接口支持完整的指标和模板管理操作
```mermaid
sequenceDiagram
participant Client as 客户端
participant API as API接口
participant Service as 服务层
participant Model as 数据模型
participant DB as 数据库
Client->>API : GET /api/v1/indicators
API->>Service : get_list()
Service->>Model : 查询指标
Model->>DB : 执行SQL查询
DB-->>Model : 返回结果集
Model-->>Service : 映射实体
Service-->>API : 返回数据
API-->>Client : JSON响应
Note over Client,DB : 异步查询流程
```
**图表来源**
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L46)
#### 指标管理API
| 接口 | 方法 | 功能描述 | 权限要求 |
|------|------|----------|----------|
| /api/v1/indicators | GET | 获取指标列表 | 任意用户 |
| /api/v1/indicators/active | GET | 获取激活指标 | 任意用户 |
| /api/v1/indicators/{id} | GET/PUT/DELETE | 指标详情管理 | 管理员/经理 |
| /api/v1/indicators/templates/list | GET | 获取模板列表 | 任意用户 |
| /api/v1/indicators/templates/import | POST | 导入指标模板 | 管理员/经理 |
#### 模板管理API
| 接口 | 方法 | 功能描述 | 权限要求 |
|------|------|----------|----------|
| /api/v1/templates | GET/POST | 模板列表管理 | 任意用户/管理员 |
| /api/v1/templates/types | GET | 获取模板类型 | 任意用户 |
| /api/v1/templates/dimensions | GET | 获取BSC维度 | 任意用户 |
| /api/v1/templates/{id} | GET/PUT/DELETE | 模板详情管理 | 管理员/经理 |
| /api/v1/templates/{id}/indicators | GET/POST | 模板指标管理 | 管理员/经理 |
**章节来源**
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
### 业务流程实现
#### 指标模板导入流程
```mermaid
flowchart TD
Start([开始导入]) --> Validate[验证模板数据]
Validate --> CheckExisting{检查指标是否存在}
CheckExisting --> |存在且允许覆盖| UpdateExisting[更新现有指标]
CheckExisting --> |不存在| CreateNew[创建新指标]
CheckExisting --> |存在且不允许覆盖| Skip[跳过该指标]
UpdateExisting --> Next[处理下一个指标]
CreateNew --> Next
Skip --> Next
Next --> MoreIndicators{还有指标吗}
MoreIndicators --> |是| Validate
MoreIndicators --> |否| Commit[提交事务]
Commit --> End([导入完成])
```
**图表来源**
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L106-L154)
#### 模板指标管理流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant API as 模板API
participant Service as 模板服务
participant DB as 数据库
Client->>API : POST /templates/{id}/indicators
API->>Service : add_indicator()
Service->>DB : 检查模板存在性
DB-->>Service : 模板存在
Service->>DB : 检查指标是否已关联
DB-->>Service : 未关联
Service->>DB : 获取最大排序号
DB-->>Service : 返回排序号
Service->>DB : 添加模板指标关联
DB-->>Service : 操作成功
Service-->>API : 返回关联ID
API-->>Client : 成功响应
```
**图表来源**
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L160-L206)
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L209-L221)
**章节来源**
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L106-L154)
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L160-L206)
### 配置示例
#### 数据库连接配置
```python
# 数据库URL格式
DATABASE_URL = "postgresql+asyncpg://username:password@host:port/database"
# 示例配置
DATABASE_URL = "postgresql+asyncpg://postgres:postgres@localhost:5432/hospital_performance"
```
#### 分页配置
| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| DEFAULT_PAGE_SIZE | 20 | 默认每页显示条数 |
| MAX_PAGE_SIZE | 100 | 最大每页显示条数 |
| API_PREFIX | /api/v1 | API前缀 |
#### 权限配置
| 角色 | 权限范围 | 可执行操作 |
|------|----------|------------|
| staff | 普通员工 | 查看自己的考核结果 |
| manager | 科室负责人 | 管理本科室指标和模板 |
| admin | 系统管理员 | 完全权限,包括用户管理 |
**章节来源**
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L33)
## 依赖关系分析
系统采用模块化设计,各组件之间保持松耦合:
```mermaid
graph TB
subgraph "核心模块"
CoreConfig[配置模块]
Database[数据库模块]
Security[安全模块]
end
subgraph "业务模块"
IndicatorService[指标服务]
TemplateService[模板服务]
AssessmentService[考核服务]
StaffService[员工服务]
end
subgraph "数据模块"
Models[数据模型]
Schemas[数据模式]
end
subgraph "API模块"
IndicatorsAPI[指标API]
TemplatesAPI[模板API]
AssessmentAPI[考核API]
end
CoreConfig --> Database
CoreConfig --> Security
Database --> Models
Security --> Schemas
IndicatorService --> Models
TemplateService --> Models
AssessmentService --> Models
StaffService --> Models
IndicatorsAPI --> IndicatorService
TemplatesAPI --> TemplateService
AssessmentAPI --> AssessmentService
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L10-L12)
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L9-L10)
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L10-L17)
### 外部依赖
系统依赖的主要外部库:
| 依赖库 | 版本 | 用途 |
|--------|------|------|
| fastapi | 最新稳定版 | Web框架 |
| sqlalchemy | 2.x | ORM框架 |
| asyncpg | 最新稳定版 | PostgreSQL异步驱动 |
| alembic | 最新稳定版 | 数据库迁移 |
| pydantic | 最新稳定版 | 数据验证和序列化 |
| uvicorn | 最新稳定版 | ASGI服务器 |
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L1-L11)
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L17)
## 性能考虑
### 数据库优化
系统采用了多项数据库优化策略:
1. **索引优化**
- 为常用查询字段建立索引
- 使用复合索引提高查询性能
- 合理使用唯一约束避免重复数据
2. **查询优化**
- 使用分页查询避免大数据量加载
- 实现延迟加载减少不必要的数据传输
- 优化复杂查询的执行计划
3. **连接池管理**
- 配置合适的连接池大小
- 启用连接复用机制
- 实现连接超时和重连机制
### 缓存策略
```mermaid
flowchart LR
Request[请求到达] --> CheckCache{检查缓存}
CheckCache --> |命中| ReturnCache[返回缓存数据]
CheckCache --> |未命中| QueryDB[查询数据库]
QueryDB --> ProcessData[处理数据]
ProcessData --> CacheData[缓存数据]
CacheData --> ReturnData[返回响应]
ReturnCache --> End[结束]
ReturnData --> End
```
**图表来源**
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L56-L64)
### 异步处理
系统充分利用异步IO特性
- **异步数据库操作**使用SQLAlchemy 2.0异步特性
- **异步文件处理**:支持大文件的异步导入导出
- **异步API调用**:减少等待时间,提高吞吐量
## 故障排除指南
### 常见问题及解决方案
#### 数据库连接问题
**问题症状:**
- 应用启动时报数据库连接错误
- API调用时出现连接超时
**解决步骤:**
1. 检查DATABASE_URL配置是否正确
2. 验证数据库服务是否正常运行
3. 确认网络连接和防火墙设置
4. 检查连接池配置参数
#### 权限不足问题
**问题症状:**
- API调用返回403权限错误
- 模板创建/更新操作失败
**解决步骤:**
1. 验证用户身份认证状态
2. 检查用户角色权限
3. 确认操作所需的最小权限级别
4. 重新登录获取新的访问令牌
#### 数据验证错误
**问题症状:**
- API返回422数据验证错误
- 指标创建/更新失败
**解决步骤:**
1. 检查请求数据格式是否正确
2. 验证必填字段是否完整
3. 确认数据类型和范围限制
4. 查看详细的错误信息提示
### 日志分析
系统提供了完善的日志记录机制:
```mermaid
graph TD
Request[请求处理] --> InfoLog[信息日志]
Request --> WarnLog[警告日志]
Request --> ErrorLog[错误日志]
Request --> DebugLog[调试日志]
InfoLog --> NormalOps[正常操作记录]
WarnLog --> PotentialIssues[潜在问题预警]
ErrorLog --> Failures[失败事件记录]
DebugLog --> Development[开发调试信息]
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
## 结论
本指标模板服务系统基于平衡计分卡理论实现了完整的医院绩效管理功能。通过标准化的数据模型设计、清晰的分层架构和完善的API接口为医院提供了灵活、可扩展的绩效管理解决方案。
系统的主要优势包括:
1. **完整的功能覆盖**:从指标定义到模板管理,涵盖绩效管理的全流程
2. **灵活的配置机制**:支持多种评分方法和权重设置
3. **良好的扩展性**:模块化设计便于功能扩展和定制
4. **高性能的实现**异步IO和数据库优化确保系统性能
5. **完善的错误处理**:全面的日志记录和异常处理机制
通过持续的优化和迭代,该系统能够满足不同规模医院的绩效管理需求,为提升医疗质量和效率提供有力支撑。

View File

@@ -0,0 +1,503 @@
# 服务层开发
<cite>
**本文档引用的文件**
- [assessment_service.py](file://backend/app/services/assessment_service.py)
- [salary_service.py](file://backend/app/services/salary_service.py)
- [stats_service.py](file://backend/app/services/stats_service.py)
- [department_service.py](file://backend/app/services/department_service.py)
- [staff_service.py](file://backend/app/services/staff_service.py)
- [indicator_service.py](file://backend/app/services/indicator_service.py)
- [finance_service.py](file://backend/app/services/finance_service.py)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
- [template_service.py](file://backend/app/services/template_service.py)
- [menu_service.py](file://backend/app/services/menu_service.py)
- [database.py](file://backend/app/core/database.py)
- [config.py](file://backend/app/core/config.py)
- [models.py](file://backend/app/models/models.py)
- [assessments.py](file://backend/app/api/v1/assessments.py)
- [salary.py](file://backend/app/api/v1/salary.py)
- [stats.py](file://backend/app/api/v1/stats.py)
- [departments.py](file://backend/app/api/v1/departments.py)
- [staff.py](file://backend/app/api/v1/staff.py)
- [indicators.py](file://backend/app/api/v1/indicators.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向医院绩效系统服务层开发系统化阐述服务层架构设计、依赖注入模式、业务逻辑封装与协作机制。文档覆盖考核服务、工资服务、统计服务、部门服务、员工服务、指标服务、财务服务、绩效计划服务、模板服务与菜单服务等核心模块提供方法实现模式、参数校验、返回值处理、事务管理、异常处理与日志记录规范并给出单元测试编写方法与Mock对象使用建议以及性能优化与并发处理策略。
## 项目结构
后端采用分层架构服务层位于API层与数据访问层之间负责业务规则封装与跨实体协调。核心目录与文件关系如下
```mermaid
graph TB
subgraph "API 层"
A1["/api/v1/assessments.py"]
A2["/api/v1/salary.py"]
A3["/api/v1/stats.py"]
A4["/api/v1/departments.py"]
A5["/api/v1/staff.py"]
A6["/api/v1/indicators.py"]
end
subgraph "服务层"
S1["assessment_service.py"]
S2["salary_service.py"]
S3["stats_service.py"]
S4["department_service.py"]
S5["staff_service.py"]
S6["indicator_service.py"]
S7["finance_service.py"]
S8["performance_plan_service.py"]
S9["template_service.py"]
S10["menu_service.py"]
end
subgraph "核心配置"
C1["core/config.py"]
C2["core/database.py"]
C3["models/models.py"]
end
A1 --> S1
A2 --> S2
A3 --> S3
A4 --> S4
A5 --> S5
A6 --> S6
S1 --> C2
S2 --> C2
S3 --> C2
S4 --> C2
S5 --> C2
S6 --> C2
S7 --> C2
S8 --> C2
S9 --> C2
S10 --> C2
S1 --> C3
S2 --> C3
S3 --> C3
S4 --> C3
S5 --> C3
S6 --> C3
S7 --> C3
S8 --> C3
S9 --> C3
S10 --> C3
C1 --> C2
```
**图表来源**
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
- [stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
- [department_service.py](file://backend/app/services/department_service.py#L1-L150)
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
- [finance_service.py](file://backend/app/services/finance_service.py#L1-L368)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
- [template_service.py](file://backend/app/services/template_service.py#L1-L293)
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
- [database.py](file://backend/app/core/database.py#L1-L39)
- [config.py](file://backend/app/core/config.py#L1-L47)
- [models.py](file://backend/app/models/models.py#L1-L438)
**章节来源**
- [database.py](file://backend/app/core/database.py#L1-L39)
- [config.py](file://backend/app/core/config.py#L1-L47)
## 核心组件
服务层由10个核心服务组成分别对应业务领域
- 考核服务AssessmentService创建、更新、提交、审核、确认、批量创建
- 工资服务SalaryService计算绩效奖金、生成工资、批量生成、确认、批量确认
- 统计服务StatsServiceBSC维度分析、科室统计、趋势分析、排名、完成度
- 部门服务DepartmentService列表、树形结构、增删改查
- 员工服务StaffService列表、详情、增删改查、按科室查询
- 指标服务IndicatorService列表、模板导入、模板列表
- 财务服务FinanceService收支明细、收支汇总、分类统计、增删改查
- 绩效计划服务PerformancePlanService计划生命周期管理、树形结构、统计
- 模板服务TemplateService模板增删改查、指标关联、标签映射
- 菜单服务MenuService菜单树、列表、增删改查、默认菜单初始化
每个服务均采用静态方法设计便于在FastAPI依赖注入中直接调用保持无状态与线程安全。
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
- [stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
- [department_service.py](file://backend/app/services/department_service.py#L1-L150)
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
- [finance_service.py](file://backend/app/services/finance_service.py#L1-L368)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
- [template_service.py](file://backend/app/services/template_service.py#L1-L293)
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
## 架构概览
服务层通过依赖注入从API层接收AsyncSession与当前用户上下文执行业务逻辑并返回标准化响应。事务管理由数据库会话自动处理异常通过HTTP异常抛出日志通过应用日志框架记录。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "API路由"
participant Service as "服务层"
participant DB as "数据库会话"
participant Model as "ORM模型"
Client->>API : "HTTP请求"
API->>Service : "调用服务方法(AsyncSession, 参数)"
Service->>DB : "执行SQL查询/更新"
DB->>Model : "映射到ORM模型"
Model-->>DB : "返回结果"
DB-->>Service : "提交/回滚事务"
Service-->>API : "业务结果"
API-->>Client : "标准化响应"
```
**图表来源**
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
- [salary.py](file://backend/app/api/v1/salary.py#L20-L156)
- [stats.py](file://backend/app/api/v1/stats.py#L17-L242)
- [database.py](file://backend/app/core/database.py#L28-L39)
## 详细组件分析
### 考核服务 AssessmentService
- 功能职责
- 列表查询:支持多条件过滤、分页、总数统计
- 详情查询:加载员工、部门、明细与指标
- 创建:计算总分与加权得分,批量写入明细
- 更新:仅草稿或被拒状态下允许修改;重建明细并重算分数
- 提交/审核/确认:状态机流转,记录操作人与时间戳
- 批量创建:按科室与指标集合批量生成考核记录
- 实现模式
- 使用selectinload预加载关联减少N+1查询
- flush/refresh确保持久化与读取一致性
- 状态前置校验,防止非法状态变更
- 参数验证与返回值
- API层进行输入参数校验与权限控制
- 服务层返回实体或None由API层抛出HTTP异常
- 事务管理
- 单次调用内统一commit/rollback保证原子性
- 并发处理
- 批量创建时先查询是否存在,避免重复创建
- 建议在API层增加幂等键与锁机制
```mermaid
flowchart TD
Start(["开始"]) --> CheckState["检查状态是否允许更新"]
CheckState --> |不允许| ReturnNone["返回None"]
CheckState --> |允许| DeleteOld["删除旧明细"]
DeleteOld --> Recalc["遍历新明细计算总分与加权分"]
Recalc --> Save["保存更新后的实体"]
Save --> Refresh["刷新实体"]
Refresh --> End(["结束"])
ReturnNone --> End
```
**图表来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
**章节来源**
- [assessment_service.py](file://backend/app/services/assessment_service.py#L18-L263)
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
### 工资服务 SalaryService
- 功能职责
- 列表查询:支持按员工、科室、周期、状态过滤
- 详情查询:加载员工与部门信息
- 绩效奖金计算:奖金 = 基数 × (得分/100) × 绩效系数
- 创建/更新:计算总工资,仅待确认状态下允许更新
- 生成:从已确认考核生成工资记录
- 批量生成:按科室批量生成
- 确认/批量确认:变更状态并持久化
- 实现模式
- 通过员工信息读取基础工资与绩效系数
- 生成时检查重复,避免重复发薪
- 使用flush/refresh确保状态一致
- 参数验证与返回值
- API层校验周期与权限
- 服务层返回实体或NoneAPI层处理错误
- 事务管理
- 单次操作内commit/rollback
- 性能优化
- 批量生成时一次查询所有已确认考核,减少往返
```mermaid
sequenceDiagram
participant API as "API"
participant SS as "SalaryService"
participant DB as "数据库"
API->>SS : "generate_from_assessment(staff_id, year, month)"
SS->>DB : "查询员工信息"
DB-->>SS : "员工信息"
SS->>DB : "查询已确认考核"
DB-->>SS : "考核记录"
SS->>SS : "计算绩效奖金"
SS->>DB : "创建工资记录"
DB-->>SS : "返回记录"
SS-->>API : "工资记录"
```
**图表来源**
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
- [salary.py](file://backend/app/api/v1/salary.py#L96-L129)
**章节来源**
- [salary_service.py](file://backend/app/services/salary_service.py#L21-L260)
- [salary.py](file://backend/app/api/v1/salary.py#L20-L156)
### 统计服务 StatsService
- 功能职责
- BSC维度统计按维度汇总得分、权重与指标数量
- 科室统计:按科室汇总人数、总分、平均分、最高/最低分
- 趋势分析:月度趋势(支持跨年)
- 排名:员工与科室排名
- 完成度:指标平均分、目标完成率
- 实现模式
- 使用SQL聚合函数与分组避免Python侧聚合
- 条件动态拼接,支持多维过滤
- 性能优化
- 合理使用索引与分页
- 趋势分析中对跨年场景进行区间合并
```mermaid
flowchart TD
Start(["开始"]) --> BuildCond["构建查询条件"]
BuildCond --> ExecQuery["执行聚合查询"]
ExecQuery --> GroupBy["按维度/科室/月份分组"]
GroupBy --> CalcAvg["计算平均分与完成率"]
CalcAvg --> Format["格式化输出"]
Format --> End(["结束"])
```
**图表来源**
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L300)
**章节来源**
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L300)
- [stats.py](file://backend/app/api/v1/stats.py#L17-L242)
### 部门服务 DepartmentService
- 功能职责
- 列表查询:按类型与启用状态过滤
- 树形结构:手动构建父子关系,避免懒加载问题
- 增删改查:层级计算、唯一性校验
- 实现模式
- 手动构建树形结构,确保序列化稳定
- 删除前检查子节点,防止破坏层级
- 错误处理
- 不存在或有子节点时返回False/None由API层抛错
**章节来源**
- [department_service.py](file://backend/app/services/department_service.py#L16-L150)
- [departments.py](file://backend/app/api/v1/departments.py#L20-L108)
### 员工服务 StaffService
- 功能职责
- 列表查询:支持关键字搜索(姓名/工号)
- 详情查询:加载部门信息
- 增删改查:唯一性校验(工号)
- 按科室查询:返回在职员工
- 实现模式
- 使用ilike进行模糊匹配
- selectinload预加载部门
**章节来源**
- [staff_service.py](file://backend/app/services/staff_service.py#L16-L112)
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
### 指标服务 IndicatorService
- 功能职责
- 列表查询:按类型、维度、启用状态过滤
- 模板导入:支持覆盖策略
- 模板列表:内置模板集合
- 实现模式
- JSON字段存储适用科室类型数组
- 导入时检查编码唯一性
**章节来源**
- [indicator_service.py](file://backend/app/services/indicator_service.py#L16-L197)
- [indicators.py](file://backend/app/api/v1/indicators.py#L20-L142)
### 财务服务 FinanceService
- 功能职责
- 收入/支出明细查询与汇总
- 收支结余计算
- 按类别统计收入/支出
- 增删改查财务记录
- 科室汇总:全院科室财务汇总
- 实现模式
- 类别标签映射,增强可读性
- 使用coalesce处理空值
**章节来源**
- [finance_service.py](file://backend/app/services/finance_service.py#L43-L368)
### 绩效计划服务 PerformancePlanService
- 功能职责
- 计划生命周期:草稿→待审批→批准→执行中→完成/取消
- 树形结构:支持层级关系
- 统计:按状态统计数量
- 指标关联:增删改查
- 实现模式
- 状态机严格控制流转
- 树形构建使用字典映射
**章节来源**
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L18-L342)
### 模板服务 TemplateService
- 功能职责
- 模板增删改查与指标关联
- 指标排序与去重
- 标签映射:类型与维度标签
- 实现模式
- 排序字段自动生成
- 关联唯一约束避免重复
**章节来源**
- [template_service.py](file://backend/app/services/template_service.py#L23-L293)
### 菜单服务 MenuService
- 功能职责
- 菜单树形结构与列表查询
- 增删改查与默认菜单初始化
- 实现模式
- 递归转字典,支持前端渲染
- 初始化时检查是否已有数据
**章节来源**
- [menu_service.py](file://backend/app/services/menu_service.py#L15-L137)
## 依赖分析
服务层依赖关系清晰API层通过依赖注入获取AsyncSession与当前用户服务层仅依赖数据库会话与模型定义耦合度低、内聚性强。
```mermaid
graph TB
API_A["/api/v1/assessments.py"] --> SVC_A["AssessmentService"]
API_S["/api/v1/salary.py"] --> SVC_S["SalaryService"]
API_T["/api/v1/stats.py"] --> SVC_T["StatsService"]
API_D["/api/v1/departments.py"] --> SVC_D["DepartmentService"]
API_ST["/api/v1/staff.py"] --> SVC_ST["StaffService"]
API_I["/api/v1/indicators.py"] --> SVC_I["IndicatorService"]
SVC_A --> DB["get_db() AsyncSession"]
SVC_S --> DB
SVC_T --> DB
SVC_D --> DB
SVC_ST --> DB
SVC_I --> DB
SVC_A --> MODELS["models.py ORM"]
SVC_S --> MODELS
SVC_T --> MODELS
SVC_D --> MODELS
SVC_ST --> MODELS
SVC_I --> MODELS
```
**图表来源**
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
- [stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
- [department_service.py](file://backend/app/services/department_service.py#L1-L150)
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
- [database.py](file://backend/app/core/database.py#L28-L39)
- [models.py](file://backend/app/models/models.py#L1-L438)
**章节来源**
- [database.py](file://backend/app/core/database.py#L1-L39)
- [models.py](file://backend/app/models/models.py#L1-L438)
## 性能考虑
- 查询优化
- 使用selectinload预加载关联避免N+1查询
- 合理使用索引如staff、assessment、salary等表的复合索引
- 分页参数限制,避免超大结果集
- 事务与并发
- 服务层单次调用内commit/rollback保证一致性
- 批量操作使用flush减少往返
- 对重复创建场景增加存在性检查
- 缓存与降级
- 对只读统计结果可引入Redis缓存
- 对高频查询结果进行分页与限流
- 日志与监控
- 记录慢查询与异常堆栈
- 结合数据库慢查询日志定位瓶颈
## 故障排除指南
- 常见异常
- 未找到实体返回NoneAPI层抛出404
- 状态不允许返回NoneAPI层抛出400
- 唯一性冲突编码重复导致创建失败API层抛出400
- 事务回滚
- 数据库会话在异常时自动回滚,确保数据一致性
- 日志记录
- 应用日志与错误日志分离,便于排查
- 记录关键业务事件(创建、更新、状态变更)
**章节来源**
- [assessments.py](file://backend/app/api/v1/assessments.py#L60-L115)
- [salary.py](file://backend/app/api/v1/salary.py#L61-L142)
- [indicators.py](file://backend/app/api/v1/indicators.py#L76-L111)
- [database.py](file://backend/app/core/database.py#L31-L36)
## 结论
服务层通过清晰的职责划分、严格的参数校验与状态机控制、完善的事务与异常处理,有效支撑了医院绩效系统的业务闭环。建议在后续迭代中进一步完善单元测试覆盖率、引入缓存与监控告警,并持续优化查询性能与并发处理能力。
## 附录
### 服务方法实现模式清单
- 列表查询:支持多条件过滤、分页、总数统计
- 详情查询:加载关联实体,返回完整信息
- 创建/更新参数校验、业务计算、flush/refresh
- 删除:前置检查(如子节点、状态)
- 批量操作批量查询、循环处理、一次性commit
### 参数验证与返回值处理
- API层负责输入参数校验与权限控制
- 服务层返回实体或None由API层统一抛出HTTP异常
- 响应体遵循统一结构code/message/data/total/page/page_size
### 事务管理与异常处理
- 服务层单次调用内commit/rollback
- 数据库异常自动回滚并抛出
- 建议在API层捕获并记录异常日志
### 日志记录规范
- 记录关键业务事件与异常堆栈
- 区分应用日志与错误日志
- 包含请求ID、用户ID、操作时间
### 单元测试编写方法与Mock对象使用
- Mock数据库会话使用unittest.mock.patch替换get_db依赖
- Mock服务方法对复杂业务逻辑进行隔离测试
- 测试用例覆盖正常路径、边界条件与异常分支
- 使用pytest与factory_boy生成测试数据
### 性能优化与并发处理
- 查询优化:预加载、索引、分页
- 事务优化批量flush、减少往返
- 并发控制:幂等键、锁机制、重试策略
- 监控与告警:慢查询、错误率、吞吐量

View File

@@ -0,0 +1,568 @@
# 系统管理服务
<cite>
**本文档引用的文件**
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
- [menu_service.py](file://backend/app/services/menu_service.py)
- [finance_service.py](file://backend/app/services/finance_service.py)
- [finance.py](file://backend/app/models/finance.py)
- [models.py](file://backend/app/models/models.py)
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py)
- [menus.py](file://backend/app/api/v1/menus.py)
- [finance.py](file://backend/app/api/v1/finance.py)
- [schemas.py](file://backend/app/schemas/schemas.py)
- [security.py](file://backend/app/core/security.py)
- [config.py](file://backend/app/core/config.py)
- [database.py](file://backend/app/core/database.py)
- [main.py](file://backend/app/main.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
本文档详细阐述了医院绩效系统的三大核心管理服务:绩效计划服务、菜单服务和财务服务。这些服务构成了整个系统的管理中枢,负责组织架构管理、权限控制和财务核算等关键业务功能。
系统采用现代化的FastAPI + SQLAlchemy架构支持异步IO操作具备良好的扩展性和维护性。通过清晰的分层设计实现了业务逻辑与数据访问的分离确保了系统的稳定性和可测试性。
## 项目结构
后端项目采用典型的三层架构设计:
```mermaid
graph TB
subgraph "表现层 (API Layer)"
API[API路由]
Schemas[数据模式]
end
subgraph "服务层 (Service Layer)"
PerfService[绩效计划服务]
MenuService[菜单服务]
FinanceService[财务服务]
end
subgraph "数据访问层 (Data Access Layer)"
Models[数据模型]
DB[数据库]
end
subgraph "基础设施层"
Security[安全认证]
Config[系统配置]
Database[数据库连接]
end
API --> PerfService
API --> MenuService
API --> FinanceService
PerfService --> Models
MenuService --> Models
FinanceService --> Models
Models --> DB
Security --> API
Config --> API
Database --> Models
```
**图表来源**
- [main.py](file://backend/app/main.py#L15-L77)
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
- [finance.py](file://backend/app/api/v1/finance.py#L1-L217)
**章节来源**
- [main.py](file://backend/app/main.py#L15-L77)
- [config.py](file://backend/app/core/config.py#L9-L47)
- [database.py](file://backend/app/core/database.py#L9-L39)
## 核心组件
### 绩效计划服务 (PerformancePlanService)
绩效计划服务是系统的核心业务组件,负责完整的绩效计划生命周期管理:
- **计划创建与管理**:支持多层级、多类型的绩效计划创建
- **状态流转控制**:严格的审批流程和状态管理
- **指标关联管理**灵活的KPI指标配置和权重设置
- **统计分析功能**:提供全面的计划执行统计和分析
### 菜单服务 (MenuService)
菜单服务提供完整的前端导航管理能力:
- **树形结构管理**:支持多级菜单的层次化管理
- **权限控制集成**:与用户权限系统深度集成
- **动态菜单生成**:根据用户角色动态生成菜单树
- **默认菜单初始化**:系统启动时自动初始化基础菜单结构
### 财务服务 (FinanceService)
财务服务专注于医院经济核算管理:
- **收支管理**:完整的收入和支出记录管理
- **科室核算**:按科室维度的财务数据分析
- **预算控制**:支持预算执行情况跟踪
- **报表统计**:多维度的财务统计和分析报表
**章节来源**
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L15-L342)
- [menu_service.py](file://backend/app/services/menu_service.py#L12-L137)
- [finance_service.py](file://backend/app/services/finance_service.py#L17-L368)
## 架构概览
系统采用分层架构设计,确保关注点分离和职责明确:
```mermaid
graph TB
subgraph "应用入口"
Main[主应用]
Router[API路由器]
end
subgraph "认证与授权"
Security[安全模块]
Auth[认证中间件]
end
subgraph "业务服务层"
PerfSvc[绩效计划服务]
MenuSvc[菜单服务]
FinanceSvc[财务服务]
end
subgraph "数据模型层"
PerfModel[绩效模型]
MenuModel[菜单模型]
FinanceModel[财务模型]
end
subgraph "数据存储层"
DB[(PostgreSQL)]
Cache[(Redis)]
end
Main --> Router
Router --> Security
Security --> PerfSvc
Security --> MenuSvc
Security --> FinanceSvc
PerfSvc --> PerfModel
MenuSvc --> MenuModel
FinanceSvc --> FinanceModel
PerfModel --> DB
MenuModel --> DB
FinanceModel --> DB
DB --> Cache
```
**图表来源**
- [main.py](file://backend/app/main.py#L19-L51)
- [security.py](file://backend/app/core/security.py#L55-L110)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L15-L342)
- [menu_service.py](file://backend/app/services/menu_service.py#L12-L137)
- [finance_service.py](file://backend/app/services/finance_service.py#L17-L368)
## 详细组件分析
### 绩效计划管理功能
#### 计划生命周期管理
```mermaid
stateDiagram-v2
[*] --> 草稿
草稿 --> 待审批 : 提交申请
待审批 --> 已批准 : 审批通过
待审批 --> 已驳回 : 审批驳回
已批准 --> 执行中 : 激活计划
执行中 --> 已完成 : 计划结束
执行中 --> 已取消 : 主动取消
已批准 --> 已取消 : 主动取消
已驳回 --> 草稿 : 修改后重新提交
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L233-L242)
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
#### KPI指标关联管理
绩效计划与KPI指标的关联管理提供了灵活的指标配置能力
- **权重分配**:支持不同指标的权重设置
- **目标值设定**:为每个指标设置目标值和单位
- **评分方法**:支持自定义评分方法和参数
- **动态调整**:运行期可调整指标配置
**章节来源**
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L196-L249)
- [models.py](file://backend/app/models/models.py#L314-L338)
### 菜单权限管理功能
#### 菜单树形结构管理
```mermaid
classDiagram
class Menu {
+int id
+int parent_id
+MenuType menu_type
+string menu_name
+string menu_icon
+string path
+string component
+string permission
+int sort_order
+bool is_visible
+bool is_active
+DateTime created_at
+DateTime updated_at
}
class MenuService {
+get_tree(visible_only) Dict[]
+get_list(menu_type, is_visible) Menu[]
+get_by_id(menu_id) Menu
+create(menu_data) Menu
+update(menu_id, menu_data) Menu
+delete(menu_id) bool
+init_default_menus() void
}
MenuService --> Menu : manages
Menu --> Menu : children
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L347-L372)
- [menu_service.py](file://backend/app/services/menu_service.py#L12-L137)
#### 权限控制机制
系统实现了基于角色的权限控制RBAC
- **用户角色**admin管理员、manager经理、staff员工
- **权限验证**@get_current_active_user(普通用户)、@get_current_manager_user(管理员/经理)
- **菜单权限**通过permission字段控制菜单显示和访问
- **操作权限**:针对不同操作设置不同的权限要求
**章节来源**
- [security.py](file://backend/app/core/security.py#L85-L110)
- [menus.py](file://backend/app/api/v1/menus.py#L98-L163)
### 财务相关功能
#### 科室财务核算
```mermaid
classDiagram
class DepartmentFinance {
+int id
+int department_id
+int period_year
+int period_month
+FinanceType finance_type
+string category
+float amount
+string source
+string remark
+DateTime created_at
+DateTime updated_at
}
class FinanceService {
+get_department_revenue(department_id, year, month) Dict[]
+get_department_expense(department_id, year, month) Dict[]
+get_department_balance(department_id, year, month) Dict
+get_revenue_by_category(department_id, year, month) Dict[]
+get_expense_by_category(department_id, year, month) Dict[]
+create_finance_record(params) DepartmentFinance
+update_finance_record(id, params) DepartmentFinance
+delete_finance_record(id) bool
+get_department_summary(year, month) Dict[]
}
FinanceService --> DepartmentFinance : manages
DepartmentFinance --> Department : belongs_to
```
**图表来源**
- [finance.py](file://backend/app/models/finance.py#L45-L74)
- [finance_service.py](file://backend/app/services/finance_service.py#L17-L368)
#### 财务类别管理
系统支持标准化的财务类别管理:
- **收入类别**:检查费、检验费、放射费、床位费、护理费、治疗费、手术费、注射费、吸氧费、其他
- **支出类别**:材料费、人员支出、维修费、水电费、其他
- **类别验证**:严格的类别有效性检查
- **标签本地化**:支持中文标签显示
**章节来源**
- [finance_service.py](file://backend/app/services/finance_service.py#L20-L41)
- [finance.py](file://backend/app/models/finance.py#L16-L43)
### 系统配置管理
#### 环境配置管理
系统采用集中式配置管理:
- **数据库配置**支持PostgreSQL异步连接池
- **JWT配置**Token过期时间和算法设置
- **CORS配置**:跨域资源共享设置
- **分页配置**:默认和最大分页大小设置
#### 数据库连接管理
```mermaid
sequenceDiagram
participant Client as 客户端
participant API as API服务
participant Session as 数据库会话
participant Pool as 连接池
participant DB as PostgreSQL
Client->>API : 请求数据
API->>Session : 获取数据库会话
Session->>Pool : 从连接池获取连接
Pool->>DB : 建立数据库连接
DB-->>Pool : 返回连接
Pool-->>Session : 返回连接
Session-->>API : 返回数据
API-->>Client : 响应数据
API->>Session : 提交事务
Session->>DB : 提交数据
DB-->>Session : 确认提交
Session->>Pool : 归还连接
```
**图表来源**
- [database.py](file://backend/app/core/database.py#L28-L39)
- [config.py](file://backend/app/core/config.py#L18-L26)
**章节来源**
- [config.py](file://backend/app/core/config.py#L9-L47)
- [database.py](file://backend/app/core/database.py#L9-L39)
## 依赖关系分析
### 服务间依赖关系
```mermaid
graph TD
subgraph "API层"
PerfAPI[绩效计划API]
MenuAPI[菜单API]
FinanceAPI[财务API]
end
subgraph "服务层"
PerfService[绩效计划服务]
MenuService[菜单服务]
FinanceService[财务服务]
end
subgraph "模型层"
PerfModel[绩效模型]
MenuModel[菜单模型]
FinanceModel[财务模型]
UserModel[用户模型]
end
subgraph "基础设施"
Security[安全模块]
DB[数据库]
Config[配置模块]
end
PerfAPI --> PerfService
MenuAPI --> MenuService
FinanceAPI --> FinanceService
PerfService --> PerfModel
MenuService --> MenuModel
FinanceService --> FinanceModel
PerfService --> UserModel
Security --> PerfService
Security --> MenuService
Security --> FinanceService
PerfModel --> DB
MenuModel --> DB
FinanceModel --> DB
UserModel --> DB
Config --> PerfAPI
Config --> MenuAPI
Config --> FinanceAPI
```
**图表来源**
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L15-L16)
- [menus.py](file://backend/app/api/v1/menus.py#L11-L12)
- [finance.py](file://backend/app/api/v1/finance.py#L14-L16)
### 数据模型依赖关系
```mermaid
erDiagram
PERFORMANCE_PLANS {
int id PK
string plan_name
string plan_code UK
enum plan_level
int plan_year
int plan_month
enum status
int department_id FK
int staff_id FK
int parent_plan_id FK
bool is_active
datetime created_at
datetime updated_at
}
PLAN_KPI_RELATIONS {
int id PK
int plan_id FK
int indicator_id FK
float target_value
string target_unit
float weight
datetime created_at
datetime updated_at
}
MENUS {
int id PK
int parent_id FK
enum menu_type
string menu_name
string menu_icon
string path
string component
string permission
int sort_order
bool is_visible
bool is_active
datetime created_at
datetime updated_at
}
DEPARTMENT_FINANCES {
int id PK
int department_id FK
int period_year
int period_month
enum finance_type
string category
float amount
datetime created_at
datetime updated_at
}
USERS {
int id PK
string username UK
string password_hash
int staff_id FK
string role
bool is_active
datetime last_login
datetime created_at
datetime updated_at
}
PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : contains
MENUS ||--o{ MENUS : children
DEPARTMENT_FINANCES }o--|| DEPARTMENTS : belongs_to
PLAN_KPI_RELATIONS }o--|| INDICATORS : links_to
PERFORMANCE_PLANS }o--|| DEPARTMENTS : belongs_to
PERFORMANCE_PLANS }o--|| STAFF : responsible_for
PERFORMANCE_PLANS }o--|| USERS : submitted_by
DEPARTMENT_FINANCES }o--|| DEPARTMENTS : belongs_to
```
**图表来源**
- [models.py](file://backend/app/models/models.py#L270-L338)
- [finance.py](file://backend/app/models/finance.py#L45-L74)
**章节来源**
- [models.py](file://backend/app/models/models.py#L62-L438)
- [finance.py](file://backend/app/models/finance.py#L16-L79)
## 性能考虑
### 数据库性能优化
系统采用了多项数据库性能优化策略:
- **索引优化**:为常用查询字段建立复合索引
- **连接池管理**:配置合理的连接池大小和溢出限制
- **异步操作**使用SQLAlchemy异步引擎提升并发性能
- **查询优化**采用selectinload进行N+1查询优化
### 缓存策略
```mermaid
flowchart TD
Request[请求到达] --> CheckCache{检查缓存}
CheckCache --> |命中| ReturnCache[返回缓存数据]
CheckCache --> |未命中| QueryDB[查询数据库]
QueryDB --> ProcessData[处理数据]
ProcessData --> UpdateCache[更新缓存]
UpdateCache --> ReturnData[返回数据]
ReturnCache --> End[请求结束]
ReturnData --> End
```
### 异步处理
系统充分利用异步特性:
- **异步数据库操作**:避免阻塞主线程
- **异步文件处理**:支持大文件上传和下载
- **异步任务队列**:后台任务处理(如报表生成)
## 故障排除指南
### 常见问题诊断
#### 认证失败问题
当遇到认证失败时,检查以下方面:
1. **Token有效性**确认Token未过期且格式正确
2. **用户状态**:验证用户账户是否被激活
3. **权限级别**:确认用户具有执行操作的权限
4. **JWT配置**:检查密钥和算法配置
#### 数据库连接问题
```mermaid
flowchart TD
ConnectFail[连接失败] --> CheckURL{检查数据库URL}
CheckURL --> URLCorrect{URL格式正确?}
URLCorrect --> |否| FixURL[修复数据库URL]
URLCorrect --> |是| CheckPool{检查连接池配置}
CheckPool --> PoolOK{连接池正常?}
PoolOK --> |否| AdjustPool[调整连接池参数]
PoolOK --> |是| CheckAuth{检查认证信息}
CheckAuth --> AuthOK{认证成功?}
AuthOK --> |否| FixAuth[修复认证信息]
AuthOK --> |是| Success[连接成功]
```
#### 权限控制问题
当权限控制出现问题时:
1. **检查用户角色**:确认用户角色设置正确
2. **验证菜单权限**检查菜单的permission字段
3. **审查API装饰器**:确认使用了正确的权限装饰器
4. **查看日志信息**:分析认证和授权日志
**章节来源**
- [security.py](file://backend/app/core/security.py#L55-L110)
- [database.py](file://backend/app/core/database.py#L28-L39)
## 结论
本系统通过精心设计的三层架构,成功实现了医院绩效管理的核心功能。三大管理服务各司其职,既保持了高度的内聚性,又确保了适当的耦合度。
系统的主要优势包括:
- **模块化设计**:清晰的职责分离便于维护和扩展
- **安全性保障**:完善的认证授权机制确保系统安全
- **性能优化**:异步架构和数据库优化提升系统性能
- **可扩展性**:灵活的数据模型支持业务发展需求
通过持续的优化和完善,该系统能够有效支撑医院的绩效管理工作,为提升医疗服务质量提供有力的技术保障。

View File

@@ -0,0 +1,448 @@
# 统计分析服务
<cite>
**本文引用的文件**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py)
- [backend/app/models/models.py](file://backend/app/models/models.py)
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
- [docs/详细设计.md](file://docs/详细设计.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向“统计分析服务”的开发与使用,围绕 StatsService 类的实现原理展开,系统阐述多维度统计分析、数据聚合与报表生成能力,重点覆盖以下主题:
- BSC平衡计分卡维度分析财务、客户、内部流程、学习与成长四个维度的指标计算与聚合
- 科室绩效统计:按科室汇总、平均分、最高/最低分、人员列表与排序
- 趋势分析:按月度的时间序列趋势(平均分、加权分)
- 排名统计:按加权分的绩效排名
- 指标完成度:指标平均分、最大/最小分、完成率
- 数据库交互模式、查询优化与潜在缓存策略
- 统计结果的数据格式化、图表数据准备与 API 接口设计
- 具体统计场景示例与性能考虑
## 项目结构
后端采用 FastAPI + SQLAlchemy 2.x 异步 ORM 的架构统计分析服务位于服务层API 层负责请求参数解析与响应封装,模型层定义数据结构与枚举,数据库层提供异步连接与会话管理。
```mermaid
graph TB
subgraph "应用层"
API["API 路由<br/>stats.py"]
SVC["服务层<br/>stats_service.py"]
end
subgraph "模型层"
MODELS["数据模型与枚举<br/>models.py"]
end
subgraph "基础设施"
CFG["配置<br/>config.py"]
DB["数据库连接<br/>database.py"]
MAIN["应用入口<br/>main.py"]
end
API --> SVC
SVC --> MODELS
API --> DB
SVC --> DB
DB --> CFG
MAIN --> API
```
**图表来源**
- [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)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
**章节来源**
- [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)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
## 核心组件
- StatsService提供 BSC 维度统计、科室统计、趋势分析、排名、指标完成度等统计方法
- API 路由 stats.py定义 /stats 前缀下的统计接口,负责参数校验、默认值处理与统一响应包装
- 数据模型与枚举:包含 BSC 维度、评估状态、科室类型、指标类型等,支撑统计逻辑
- 数据库与配置:异步连接、会话工厂、数据库 URL 与池参数
**章节来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L52)
## 架构总览
统计分析服务遵循“API → 服务 → 模型/数据库”的分层架构。API 层负责输入参数与响应格式标准化;服务层执行复杂聚合与计算;模型层提供数据结构与枚举;数据库层提供异步连接与事务管理。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "API(stats.py)"
participant Svc as "StatsService"
participant DB as "AsyncSession"
participant Model as "ORM模型"
Client->>API : GET /api/v1/stats/bsc-dimension
API->>API : 参数校验与默认值处理
API->>Svc : 调用 get_bsc_dimension_stats(...)
Svc->>DB : 异步查询SQLAlchemy select + func
DB->>Model : 映射到 Assessment/AssessmentDetail/Indicator/Department/Staff
Svc-->>API : 返回聚合结果
API-->>Client : 统一响应 {code,message,data}
```
**图表来源**
- [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)
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L181)
## 详细组件分析
### StatsService 类与方法族
- get_bsc_dimension_stats按 BSC 四维度聚合得分、权重与指标数量,计算平均分
- get_department_stats按科室汇总人员、总分、平均分、最高/最低分与人员列表,并整体排序
- get_trend_stats按月度聚合平均分与加权分支持跨年范围与科室过滤
- get_ranking_stats按加权分排名前 N 的员工
- get_completion_stats按指标统计平均分、最大/最小分、完成率与样本数
```mermaid
classDiagram
class StatsService {
+get_bsc_dimension_stats(db, department_id, period_year, period_month) Dict
+get_department_stats(db, period_year, period_month) List
+get_trend_stats(db, department_id, period_year, months) List
+get_ranking_stats(db, period_year, period_month, limit) List
+get_completion_stats(db, indicator_id, period_year, period_month) Dict
}
class Assessment {
+int id
+int staff_id
+int period_year
+int period_month
+float total_score
+float weighted_score
+AssessmentStatus status
}
class AssessmentDetail {
+int id
+int assessment_id
+int indicator_id
+float actual_value
+float score
}
class Indicator {
+int id
+string name
+string code
+IndicatorType indicator_type
+BSCDimension bs_dimension
+float weight
+float max_score
+float target_value
}
class Department {
+int id
+string name
+string code
+DeptType dept_type
}
class Staff {
+int id
+string employee_id
+string name
+int department_id
}
StatsService --> Assessment : "查询"
StatsService --> AssessmentDetail : "连接"
StatsService --> Indicator : "按维度聚合"
StatsService --> Department : "科室汇总"
StatsService --> Staff : "关联人员"
```
**图表来源**
- [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#L117-L181)
**章节来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L299)
#### BSC 维度分析get_bsc_dimension_stats
- 输入:可选科室 ID、年、月
- 过滤:仅统计已确认的考核记录
- 聚合:按 BSC 维度分组,计算总分(加权)、总权重、指标数量与平均分
- 输出:包含各维度的得分、权重、指标数与平均分,以及统计周期
```mermaid
flowchart TD
Start(["进入 get_bsc_dimension_stats"]) --> BuildCond["构建查询条件<br/>状态=FINALIZED(+年+月+科室)"]
BuildCond --> ExecSel["执行聚合查询<br/>按维度分组(sum(score*weight), sum(weight), count)"]
ExecSel --> Iterate["遍历结果<br/>填充维度字典"]
Iterate --> CalcAvg["计算平均分=总分/总权重"]
CalcAvg --> Ret["返回 {dimensions, period}"]
```
**图表来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
**章节来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
#### 科室绩效统计get_department_stats
- 输入:年、月
- 过滤:仅统计已确认的考核记录
- 聚合:按科室汇总人员数、总分、平均分、最高/最低分,并收集人员得分列表
- 排序:按平均分降序
```mermaid
flowchart TD
S(["进入 get_department_stats"]) --> Q["查询关联数据<br/>Staff→Assessment→Department"]
Q --> Group["按科室分组聚合<br/>计数/求和/记录人员列表"]
Group --> Compute["计算平均分=总分/人数"]
Compute --> Sort["按平均分降序排序"]
Sort --> R(["返回科室统计列表"])
```
**图表来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
**章节来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
#### 趋势分析get_trend_stats
- 输入:可选科室 ID、年为空则使用当前年、月份数默认 6
- 范围:若未指定年份,按当前年份与最近 N 个月推导起止月份,支持跨年
- 聚合:按月度 group by计算平均分与加权分、样本数
```mermaid
flowchart TD
Enter(["进入 get_trend_stats"]) --> YearCheck{"是否指定年份?"}
YearCheck -- 否 --> SetCur["设置为当前年份"]
YearCheck -- 是 --> KeepYear["使用传入年份"]
SetCur --> Range["计算起始月=当前月-N+1<br/>处理跨年"]
KeepYear --> Range
Range --> Cond["构造月份范围条件"]
Cond --> Join["连接 Staff 并过滤 FINALIZED"]
Join --> GroupBy["按月分组聚合"]
GroupBy --> Out(["返回月度趋势列表"])
```
**图表来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
**章节来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
#### 排名统计get_ranking_stats
- 输入:年、月、限制条数
- 过滤:仅统计已确认的考核记录
- 排序:按加权分降序,返回前 N 条并标注排名
```mermaid
sequenceDiagram
participant API as "API"
participant Svc as "StatsService"
participant DB as "AsyncSession"
API->>Svc : get_ranking_stats(year, month, limit)
Svc->>DB : select Staff/Assessment/Department
DB-->>Svc : 结果集
Svc-->>API : 按加权分降序,标注 rank
API-->>API : 统一响应
```
**图表来源**
- [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#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#L210-L224)
#### 指标完成度get_completion_stats
- 输入:可选指标 ID、年、月
- 过滤:仅统计已确认的考核记录
- 聚合:按指标 group by计算平均分、最大/最小分、样本数与完成率(平均分/目标值)
```mermaid
flowchart TD
In(["进入 get_completion_stats"]) --> Cond["构造条件<br/>FINALIZED(+年+月+指标ID?)"]
Cond --> Sel["select 指标字段 + avg/max/min/count"]
Sel --> Group["group by 指标"]
Group --> Rate["完成率=avg/max(target_value)"]
Rate --> Ret(["返回指标完成度列表"])
```
**图表来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L246-L299)
**章节来源**
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L246-L299)
### API 接口设计与数据格式
- 统一响应结构:包含 code、message、data 字段
- 参数校验与默认值:
- 年/月未传时,趋势与周期统计接口会使用当前年/月
- 排名与周期统计支持 limit 控制返回数量
- 接口一览:
- GET /stats/bsc-dimensionBSC 维度分析
- GET /stats/department科室绩效统计
- GET /stats/trend趋势分析月度
- GET /stats/department-ranking科室绩效排名前 N
- GET /stats/ranking个人绩效排名前 N
- GET /stats/completion指标完成度
- GET /stats/period周期统计含汇总
- GET /stats/alerts、/stats/kpi-gauges、/stats/finance-trend预留接口当前返回模拟数据
```mermaid
sequenceDiagram
participant Client as "客户端"
participant Router as "FastAPI 路由"
participant Handler as "stats.py 处理函数"
participant Svc as "StatsService"
participant DB as "AsyncSession"
Client->>Router : GET /api/v1/stats/bsc-dimension?year&month&dept_id
Router->>Handler : 参数解析与默认值
Handler->>Svc : 调用对应统计方法
Svc->>DB : 异步查询
DB-->>Svc : 结果
Svc-->>Handler : 聚合结果
Handler-->>Client : {code,message,data}
```
**图表来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L242)
**章节来源**
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L242)
### 数据模型与枚举(支撑统计)
- BSCDimensionfinancial、customer、internal_process、learning_growth
- AssessmentStatusFINALIZED 等
- DeptType、IndicatorType 等枚举用于过滤与分类
- 关键实体Assessment、AssessmentDetail、Indicator、Department、Staff
```mermaid
classDiagram
class BSCDimension {
<<enum>>
+FINANCIAL
+CUSTOMER
+INTERNAL_PROCESS
+LEARNING_GROWTH
}
class AssessmentStatus {
<<enum>>
+FINALIZED
}
class DeptType {
<<enum>>
+CLINICAL_SURGICAL
+...
}
class IndicatorType {
<<enum>>
+QUALITY
+QUANTITY
+EFFICIENCY
+SERVICE
+COST
}
```
**图表来源**
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L61)
**章节来源**
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L61)
## 依赖分析
- 统计服务依赖 SQLAlchemy 异步会话与 ORM 模型,通过 select + func 实现聚合
- API 层依赖服务层与数据库会话注入
- 配置层提供数据库连接参数与池大小,影响并发与吞吐
```mermaid
graph LR
API["api/v1/stats.py"] --> SVC["services/stats_service.py"]
SVC --> MODELS["models/models.py"]
API --> DB["core/database.py"]
SVC --> DB
DB --> CFG["core/config.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)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
**章节来源**
- [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/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
## 性能考量
- 查询优化
- 使用 group by 与聚合函数sum、avg、count减少应用侧循环计算
- 通过索引字段过滤Assessment.status、Assessment.period_year/month、Assessment.staff_id降低扫描范围
- 趋势分析中按月分组,避免大结果集内存占用
- 数据库连接与并发
- 异步连接与会话工厂支持高并发;数据库池参数可在配置中调优
- 缓存策略(建议)
- 对高频但不频繁变化的统计结果(如 BSC 维度、指标完成度)引入短期缓存(如 Redis
- 按参数组合生成缓存键(年、月、科室、指标等)
- 响应格式化
- 将数值统一为浮点并限制精度,便于前端图表渲染
- 提供图表友好的数组结构(时间序列、排名列表)
[本节为通用性能指导,不直接分析具体文件]
## 故障排查指南
- 常见问题
- 参数缺失:年/月未传导致默认值逻辑异常,检查 API 层默认值处理
- 权限与认证:确保请求携带有效 Token
- 数据缺失:仅统计已确认的考核记录,若无数据请检查 Assessment.status
- 日志与异常
- 应用层已注册全局异常处理器,便于定位错误
- 建议在服务层增加关键步骤的日志输出(如查询条件、聚合结果规模)
**章节来源**
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L52-L70)
## 结论
统计分析服务以 StatsService 为核心,围绕 BSC 四维度、科室统计、趋势分析、排名与指标完成度构建了完整的多维统计能力。通过 SQLAlchemy 异步 ORM 与合理的查询策略,实现了高效的数据聚合与报表生成。建议在生产环境中引入缓存与更细粒度的索引优化,并持续完善财务、预警与仪表盘等预留接口的实际数据来源。
[本节为总结性内容,不直接分析具体文件]
## 附录
### 统计场景示例
- BSC 维度分析:按月查看财务、客户、内部流程、学习与成长四个维度的加权得分与平均分
- 科室绩效:按月汇总各科室平均分、最高/最低分与人员列表,用于科室排名与改进
- 趋势分析:查看近 6 个月的平均分与加权分变化,识别波动与改善趋势
- 排名统计:查看个人绩效排名前 10 的员工及其所在科室
- 指标完成度:查看各指标的平均分、完成率与样本数,辅助指标优化
[本节为概念性场景说明,不直接分析具体文件]
### 与系统设计文档的对应关系
- 系统设计强调“多维度考核”“科学量化”“流程自动化”“报表与分析中心”,统计分析服务正对应“报表与分析中心”的实现。
**章节来源**
- [docs/详细设计.md](file://docs/详细设计.md#L155-L164)

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. **完善的权限控制**:基于角色的精细化权限管理
该服务为后续的薪资计算、统计分析等功能奠定了坚实的基础,是整个绩效管理系统的核心支柱。

View File

@@ -0,0 +1,423 @@
# 部门员工服务
<cite>
**本文引用的文件**
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
- [backend/app/models/models.py](file://backend/app/models/models.py)
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/app/core/security.py](file://backend/app/core/security.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向“部门与员工服务”的开发与运维,围绕 DepartmentService 与 StaffService 的实现架构进行系统化说明。内容涵盖:
- 部门管理:树形结构管理、层级关系维护、增删改查与有效性校验
- 员工管理:信息维护、职位与职称字段、基本工资与绩效系数、状态管理
- 数据模型关系映射:部门与员工的外键约束、索引与级联策略
- 高级能力:树形查询、分页与统计、权限控制、事务处理
- 实际业务场景示例与最佳实践
## 项目结构
后端采用 FastAPI + SQLAlchemy Async 异步 ORM 架构,服务层位于 app/servicesAPI 路由位于 app/api/v1数据模型位于 app/models配置与安全位于 app/core。
```mermaid
graph TB
subgraph "API 层"
A1["/api/v1/departments.py"]
A2["/api/v1/staff.py"]
end
subgraph "服务层"
S1["services/department_service.py"]
S2["services/staff_service.py"]
end
subgraph "模型层"
M1["models/models.py"]
M2["models/finance.py"]
end
subgraph "基础设施"
C1["core/config.py"]
C2["core/database.py"]
C3["core/security.py"]
end
A1 --> S1
A2 --> S2
S1 --> M1
S2 --> M1
M1 --> C2
M2 --> C2
C1 --> C2
C1 --> C3
```
图表来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L74)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
章节来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
## 核心组件
- DepartmentService提供科室列表、树形结构、按编码/ID 查询、创建、更新、删除等能力;自动计算层级并校验删除前置条件(无子部门)
- StaffService提供员工列表、按工号/ID 查询、创建、更新、删除、按科室查询在职员工等能力
- 数据模型 Department/Staff定义字段、枚举、索引与关系Department 与 Staff 通过外键建立一对多关系
- API 路由:提供 REST 接口,绑定权限装饰器,调用服务层并返回统一响应格式
- 安全与配置JWT 认证、权限校验、数据库连接池与事务管理
章节来源
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L13-L150)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L19-L107)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L123)
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
## 架构总览
部门与员工服务遵循“API → 服务 → 模型 → 数据库”的分层架构,配合统一响应体与权限控制,确保数据一致性与安全性。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant API as "FastAPI 路由"
participant Service as "服务层"
participant DB as "数据库"
Client->>API : "HTTP 请求"
API->>API : "权限校验(Active/Manager)"
API->>Service : "调用服务方法(参数校验)"
Service->>DB : "SQL 查询/写入(异步)"
DB-->>Service : "结果集/受影响行"
Service-->>API : "领域对象/聚合"
API-->>Client : "统一响应体(code,message,data,total/page/page_size)"
```
图表来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L19-L107)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L123)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L111)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L101)
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
## 详细组件分析
### 部门服务 DepartmentService
- 列表查询:支持按类型与启用状态过滤、分页与总数统计
- 树形结构:手动构建树,避免懒加载导致的 N+1 问题
- 创建逻辑:根据父级计算层级 level插入后刷新实体
- 删除逻辑:先检查是否存在子部门,避免破坏树形结构
- 更新与查询:按 ID/编码查询,支持部分字段更新
```mermaid
classDiagram
class DepartmentService {
+get_list(db, dept_type, is_active, page, page_size) tuple
+get_by_id(db, dept_id) Department?
+get_by_code(db, code) Department?
+create(db, dept_data) Department
+update(db, dept_id, dept_data) Department?
+delete(db, dept_id) bool
+get_tree(db, dept_type) DepartmentTree[]
}
class Department {
+id : int
+name : string
+code : string
+dept_type : DeptType
+parent_id : int?
+level : int
+sort_order : int
+is_active : bool
+description : string?
+children : Department[]
+staff : Staff[]
}
DepartmentService --> Department : "读写/树构建"
```
图表来源
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L13-L150)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
章节来源
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L149)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
### 员工服务 StaffService
- 列表查询:支持按科室、状态、关键词搜索;预加载部门关系
- 详情查询:按 ID 查询并注入部门名称
- 创建/更新/删除:基础 CRUD删除不涉及子记录级联
- 按科室查询:筛选在职员工
```mermaid
classDiagram
class StaffService {
+get_list(db, department_id, status, keyword, page, page_size) tuple
+get_by_id(db, staff_id) Staff?
+get_by_employee_id(db, employee_id) Staff?
+create(db, staff_data) Staff
+update(db, staff_id, staff_data) Staff?
+delete(db, staff_id) bool
+get_by_department(db, department_id) Staff[]
}
class Staff {
+id : int
+employee_id : string
+name : string
+department_id : int
+position : string
+title : string?
+phone : string?
+email : string?
+base_salary : float
+performance_ratio : float
+status : StaffStatus
+hire_date : datetime?
+department : Department
+assessments : Assessment[]
+salary_records : SalaryRecord[]
}
StaffService --> Staff : "读写/关联查询"
```
图表来源
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
章节来源
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L111)
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
### 数据模型与关系映射
- Department 与 Staff一对多外键关联Department 作为父表Staff 通过 department_id 关联
- 索引:部门表对类型与父级建立索引;员工表对部门与状态建立索引
- 枚举:科室类型、员工状态、考核状态、指标类型等
- 财务模型DepartmentFinance 与 Department 建立一对多关系,用于科室财务核算
```mermaid
erDiagram
DEPARTMENTS {
int id PK
string name
string code UK
enum dept_type
int parent_id FK
int level
int sort_order
bool is_active
text description
datetime created_at
datetime updated_at
}
STAFF {
int id PK
string employee_id UK
string name
int department_id FK
string position
string title
string phone
string email
numeric base_salary
numeric performance_ratio
enum status
datetime hire_date
datetime created_at
datetime updated_at
}
DEPARTMENTS ||--o{ STAFF : "拥有"
```
图表来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
### API 路由与权限控制
- 部门路由:列表、树形、详情、创建、更新、删除;创建/更新/删除需管理员或经理权限
- 员工路由:列表、详情、创建、更新、删除、按科室查询;创建/更新/删除需管理员或经理权限
- 统一响应code/message/data/total/page/page_size
- 权限装饰器get_current_active_user 与 get_current_manager_user
```mermaid
sequenceDiagram
participant Client as "客户端"
participant DeptAPI as "部门路由"
participant StaffAPI as "员工路由"
participant Sec as "安全模块"
participant Svc as "服务层"
Client->>DeptAPI : "POST /api/v1/departments"
DeptAPI->>Sec : "get_current_manager_user()"
Sec-->>DeptAPI : "用户(管理员/经理)"
DeptAPI->>Svc : "DepartmentService.create()"
Svc-->>DeptAPI : "Department"
DeptAPI-->>Client : "统一响应"
Client->>StaffAPI : "POST /api/v1/staff"
StaffAPI->>Sec : "get_current_manager_user()"
Sec-->>StaffAPI : "用户(管理员/经理)"
StaffAPI->>Svc : "StaffService.create()"
Svc-->>StaffAPI : "Staff"
StaffAPI-->>Client : "统一响应"
```
图表来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L67-L80)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L81)
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
章节来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L19-L107)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L123)
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
### 处理流程与算法
#### 部门树形构建流程
```mermaid
flowchart TD
Start(["进入 get_tree"]) --> Query["查询所有部门并排序"]
Query --> BuildMap["构建 id->DepartmentTree 映射"]
BuildMap --> Iterate["遍历部门构造树节点"]
Iterate --> HasParent{"存在父节点?"}
HasParent --> |是| AppendChild["加入父节点 children"]
HasParent --> |否| AddRoot["加入根节点列表"]
AppendChild --> Next["下一个部门"]
AddRoot --> Next
Next --> Done(["返回根节点树"])
```
图表来源
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L113-L149)
章节来源
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L113-L149)
#### 删除部门前置校验流程
```mermaid
flowchart TD
Start(["进入 delete"]) --> Load["按 ID 加载部门"]
Load --> Exists{"是否存在?"}
Exists --> |否| Fail["返回 False"]
Exists --> |是| CountChildren["统计子部门数量"]
CountChildren --> HasChild{"是否有子部门?"}
HasChild --> |是| Block["返回 False(不可删除)"]
HasChild --> |否| Remove["删除部门并返回 True"]
```
图表来源
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L96-L110)
章节来源
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L96-L110)
## 依赖分析
- 服务层依赖模型层ORM 映射)与数据库会话(异步)
- API 层依赖服务层与安全模块(权限校验)
- 配置模块提供数据库 URL、JWT 参数与分页默认值
- 数据库模块提供异步引擎与会话生命周期commit/rollback/close
```mermaid
graph LR
API_D["/api/v1/departments.py"] --> SVC_D["services/department_service.py"]
API_S["/api/v1/staff.py"] --> SVC_S["services/staff_service.py"]
SVC_D --> MODELS["models/models.py"]
SVC_S --> MODELS
MODELS --> DB["core/database.py"]
API_D --> SEC["core/security.py"]
API_S --> SEC
CFG["core/config.py"] --> DB
CFG --> SEC
```
图表来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
章节来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
## 性能考虑
- 异步数据库:使用 AsyncSession 提升并发吞吐
- 分页与统计:列表查询先统计总数再分页,避免全量扫描
- 关系预加载:员工列表预加载部门关系,减少 N+1 查询
- 索引优化:部门类型与父级、员工部门与状态建立索引
- 事务边界:每个请求会话在依赖中 commit/rollback异常自动回滚
- 连接池:配置池大小与溢出,避免高并发下的连接争用
章节来源
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L26-L49)
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
- [backend/app/models/models.py](file://backend/app/models/models.py#L112-L114)
## 故障排查指南
- 404 未找到:查询员工或部门不存在时返回 404
- 400 编码冲突:创建部门/员工时编码或工号重复
- 400 无法删除:删除部门时存在子部门
- 403 权限不足:非管理员/经理用户尝试创建/更新/删除
- 500 服务器错误:数据库异常触发回滚并抛出
章节来源
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L62-L107)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L75-L108)
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L110)
- [backend/app/core/database.py](file://backend/app/core/database.py#L34-L36)
## 结论
DepartmentService 与 StaffService 通过清晰的分层与严格的权限控制,实现了部门与员工的基础管理能力,并以树形结构与分页查询满足了常见的组织管理需求。结合模型层的索引与关系设计,以及异步数据库与事务管理,系统具备良好的扩展性与稳定性。建议后续在批量导入导出、数据同步与审计日志方面继续完善。
## 附录
### 统一响应体与分页
- 响应体包含 code、message、data、total、page、page_size
- 分页参数默认值与最大值由配置提供
章节来源
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
- [backend/app/core/config.py](file://backend/app/core/config.py#L31-L33)
### 数据模型枚举参考
- 科室类型:临床、医技、护理、行政、财务、后勤等
- 员工状态:在职、休假、离职、退休
- 考核状态:草稿、已提交、已审核、已确认、已驳回
- 指标类型:质量、数量、效率、服务、成本
章节来源
- [backend/app/models/models.py](file://backend/app/models/models.py#L16-L52)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L12-L45)

View File

@@ -0,0 +1,333 @@
# 错误处理与日志
<cite>
**本文引用的文件**
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/core/security.py](file://backend/app/core/security.py)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
- [backend/app/models/models.py](file://backend/app/models/models.py)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py)
- [backend/FIX_SUMMARY.md](file://backend/FIX_SUMMARY.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向“医院绩效系统”的后端工程团队,聚焦于错误处理与日志体系的设计与落地实践。内容涵盖:
- 全局异常处理机制与自定义异常类的使用
- 错误响应格式与统一返回结构
- 日志配置、日志级别、输出格式与轮转策略
- 结构化日志记录、上下文信息捕获与性能监控集成
- 错误追踪、堆栈信息收集与调试信息输出
- 日志轮转、文件管理与日志分析工具使用
- 生产环境日志监控、告警配置与故障诊断方法
- 安全日志记录、审计跟踪与合规性要求
## 项目结构
后端采用 FastAPI + SQLAlchemy 异步 ORM 的分层架构,错误处理与日志主要分布在应用入口、核心配置与日志模块中,并在各 API 路由中体现统一的异常抛出与响应格式。
```mermaid
graph TB
subgraph "应用入口"
MAIN["backend/app/main.py<br/>应用创建与全局异常处理器"]
CONFIG["backend/app/core/config.py<br/>应用配置"]
end
subgraph "日志与安全"
LOGCONF["backend/app/core/logging_config.py<br/>日志配置与轮转"]
SECURITY["backend/app/core/security.py<br/>认证与权限校验"]
end
subgraph "API 层"
API_INIT["backend/app/api/v1/__init__.py<br/>路由聚合"]
AUTH["backend/app/api/v1/auth.py<br/>认证接口"]
STAFF["backend/app/api/v1/staff.py<br/>员工接口"]
DEPT["backend/app/api/v1/departments.py<br/>科室接口"]
ASSESS["backend/app/api/v1/assessments.py<br/>考核接口"]
end
subgraph "领域模型与服务"
MODELS["backend/app/models/models.py<br/>数据模型"]
SCHEMAS["backend/app/schemas/schemas.py<br/>Pydantic 模式"]
SVC_STAFF["backend/app/services/staff_service.py"]
SVC_DEPT["backend/app/services/department_service.py"]
end
MAIN --> LOGCONF
MAIN --> CONFIG
MAIN --> API_INIT
API_INIT --> AUTH
API_INIT --> STAFF
API_INIT --> DEPT
API_INIT --> ASSESS
AUTH --> SECURITY
STAFF --> SVC_STAFF
DEPT --> SVC_DEPT
ASSESS --> SVC_STAFF
ASSESS --> SVC_DEPT
SVC_STAFF --> MODELS
SVC_DEPT --> MODELS
AUTH --> MODELS
STAFF --> MODELS
DEPT --> MODELS
ASSESS --> MODELS
SCHEMAS --> MODELS
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [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/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
## 核心组件
- 全局异常处理:在应用入口集中注册 HTTP 异常、请求验证异常与全局异常处理器,统一记录日志并向上抛出。
- 日志系统:集中配置控制台与文件输出,按级别分离,支持日志轮转与日期命名。
- 统一响应结构:在各 API 路由中返回统一的响应体结构,便于前端与监控系统解析。
- 安全与权限:在认证与权限校验中抛出标准化 HTTP 异常,确保错误语义清晰。
章节来源
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L26-L59)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
## 架构总览
下图展示从请求进入应用到异常处理与日志记录的关键交互路径。
```mermaid
sequenceDiagram
participant Client as "客户端"
participant FastAPI as "FastAPI 应用"
participant Router as "API 路由"
participant Service as "业务服务"
participant DB as "数据库"
participant Logger as "日志系统"
Client->>FastAPI : "HTTP 请求"
FastAPI->>Router : "路由匹配与依赖注入"
Router->>Service : "调用业务逻辑"
Service->>DB : "SQLAlchemy 异步查询/写入"
DB-->>Service : "结果或异常"
alt "正常响应"
Service-->>Router : "业务结果"
Router-->>Client : "统一响应体"
else "异常场景"
Service-->>Router : "抛出 HTTP 异常"
Router-->>FastAPI : "异常冒泡"
FastAPI->>Logger : "记录异常日志(含堆栈)"
FastAPI-->>Client : "异常响应"
end
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L81)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L67-L80)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L80-L88)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L26-L59)
## 详细组件分析
### 全局异常处理机制
- HTTP 异常处理器记录请求方法、URL、状态码与详情便于快速定位资源访问问题。
- 请求验证异常处理器:记录请求与验证错误,便于前端与接口调试。
- 全局异常处理器:记录未知异常并打印堆栈信息,确保问题可追溯。
```mermaid
flowchart TD
Start(["请求进入"]) --> Route["路由匹配与依赖注入"]
Route --> CallSvc["调用业务服务"]
CallSvc --> SvcOK{"业务执行成功?"}
SvcOK --> |是| BuildResp["构造统一响应"]
SvcOK --> |否| ThrowHTTP["抛出 HTTP 异常"]
ThrowHTTP --> GlobalLog["全局异常处理器记录日志(含堆栈)"]
GlobalLog --> RaiseExc["向上抛出异常"]
BuildResp --> End(["返回响应"])
RaiseExc --> End
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
章节来源
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
### 自定义异常类与错误响应格式
- 统一响应基类:包含状态码与消息字段,便于前端统一处理。
- 分页响应:扩展统一基类,增加总数、页码与页大小字段。
- API 路由中的错误响应:在业务逻辑中抛出 HTTP 异常,由全局异常处理器统一记录与返回。
```mermaid
classDiagram
class ResponseBase {
+int code
+string message
}
class PaginatedResponse {
+int total
+int page
+int page_size
}
ResponseBase <|-- PaginatedResponse
```
图表来源
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
章节来源
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L37)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L76-L81)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L74-L80)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L86-L88)
### 日志配置与输出格式
- 日志目录:自动创建 logs 目录,按日期生成日志文件。
- 输出目标:控制台 INFO 级别输出;应用日志文件 DEBUG 级别滚动保存;错误日志文件 ERROR 级别单独滚动保存。
- 格式:包含时间戳、记录器名称、级别与消息;日期格式统一。
```mermaid
flowchart TD
Init["初始化日志系统"] --> MakeDir["创建 logs 目录"]
MakeDir --> Paths["生成日期文件路径"]
Paths --> SetupConsole["配置控制台处理器(INFO)"]
Paths --> SetupAppFile["配置应用文件处理器(DEBUG)<br/>10MB 大小限制保留7份"]
Paths --> SetupErrorFile["配置错误文件处理器(ERROR)<br/>10MB 大小限制保留7份"]
SetupConsole --> GetLogger["提供子记录器"]
SetupAppFile --> GetLogger
SetupErrorFile --> GetLogger
GetLogger --> Ready["日志系统就绪"]
```
图表来源
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L10-L64)
章节来源
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L10-L64)
### 上下文信息捕获与性能监控集成
- 请求上下文:全局异常处理器记录请求方法与 URL便于定位具体接口与参数。
- 堆栈信息:全局异常处理器开启堆栈打印,便于定位异常根因。
- 性能监控:建议在业务服务层埋点耗时指标,结合日志进行性能分析。
章节来源
- [backend/app/main.py](file://backend/app/main.py#L60-L73)
### 安全日志与审计跟踪
- 认证与权限:在安全模块中对无效凭据、禁用用户、权限不足等情况抛出标准化异常,便于统一记录与审计。
- 审计建议:对关键操作(如创建、更新、删除)记录操作人、对象、变更前后摘要等信息,结合日志系统进行持久化与检索。
章节来源
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L109)
### 日志轮转、文件管理与分析
- 轮转策略:单文件最大 10MB保留最近 7 份备份,按日期命名,便于按天检索。
- 文件位置:应用日志与错误日志分别存放,便于区分与分析。
- 分析工具:建议配合系统日志采集工具(如 Filebeat/Fluent Bit与可视化平台如 ELK/Graylog进行集中分析。
章节来源
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L40-L59)
- [backend/FIX_SUMMARY.md](file://backend/FIX_SUMMARY.md#L121-L124)
## 依赖关系分析
- 应用入口依赖日志配置模块以初始化日志系统。
- API 路由依赖安全模块进行权限校验,异常统一由全局处理器处理。
- 业务服务层依赖数据库会话与模型,异常通过路由抛出。
- 统一响应结构由 Pydantic 模式定义,保证前后端契约一致。
```mermaid
graph LR
MAIN["main.py"] --> LOGCONF["logging_config.py"]
MAIN --> API_INIT["api/v1/__init__.py"]
API_INIT --> AUTH["auth.py"]
API_INIT --> STAFF["staff.py"]
API_INIT --> DEPT["departments.py"]
API_INIT --> ASSESS["assessments.py"]
AUTH --> SECURITY["security.py"]
STAFF --> SVC_STAFF["staff_service.py"]
DEPT --> SVC_DEPT["department_service.py"]
ASSESS --> SVC_STAFF
ASSESS --> SVC_DEPT
SVC_STAFF --> MODELS["models.py"]
SVC_DEPT --> MODELS
AUTH --> MODELS
STAFF --> MODELS
DEPT --> MODELS
ASSESS --> MODELS
SCHEMAS["schemas.py"] --> MODELS
```
图表来源
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
- [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/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
## 性能考量
- 日志级别与频率:生产环境建议降低 DEBUG 级别日志量,仅在问题定位阶段临时提升。
- 文件轮转:合理设置单文件大小与备份数量,避免磁盘占用过高。
- 异常处理链路:尽量在业务层尽早捕获并抛出语义明确的 HTTP 异常,减少全局异常处理的开销。
- 监控指标:在关键业务路径埋点耗时与错误率,结合日志进行聚合分析。
## 故障排查指南
- 快速定位:查看全局异常处理器记录的请求方法与 URL结合错误日志文件定位问题。
- 堆栈分析:全局异常处理器开启堆栈打印,便于定位异常根因。
- 常见错误:参考测试与修复文档中的常见错误与处理建议,定位前端与后端问题。
- 日志位置:应用日志与错误日志按日期命名,便于按天检索与分析。
章节来源
- [backend/app/main.py](file://backend/app/main.py#L60-L73)
- [backend/FIX_SUMMARY.md](file://backend/FIX_SUMMARY.md#L116-L124)
## 结论
通过在应用入口集中配置全局异常处理器与日志系统,结合统一的响应结构与安全模块的标准化异常抛出,本项目实现了清晰、可追踪且可维护的错误处理与日志体系。建议在生产环境中进一步完善性能监控埋点、日志采集与可视化分析,并强化安全审计与合规性检查,以满足医院绩效系统的高可靠运行需求。
## 附录
- 配置项参考应用名称、版本、API 前缀、数据库连接、JWT 参数、跨域配置等。
- 模块职责日志配置负责日志输出与轮转安全模块负责认证与权限校验API 路由负责业务编排与异常抛出;服务层负责业务逻辑与数据访问;模型与模式定义数据结构与约束。
章节来源
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
- [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)

View File

@@ -0,0 +1,673 @@
# 项目结构说明
<cite>
**本文档引用的文件**
- [backend/app/main.py](file://backend/app/main.py)
- [backend/app/core/config.py](file://backend/app/core/config.py)
- [backend/app/core/database.py](file://backend/app/core/database.py)
- [backend/app/core/security.py](file://backend/app/core/security.py)
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.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/services/assessment_service.py](file://backend/app/services/assessment_service.py)
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py)
- [backend/alembic/env.py](file://backend/alembic/env.py)
- [backend/.env.example](file://backend/.env.example)
- [backend/requirements.txt](file://backend/requirements.txt)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
这是一个基于FastAPI的医院绩效管理系统后端项目。系统采用现代化的Python异步Web框架使用SQLAlchemy 2.0进行数据库操作PostgreSQL作为数据存储实现了完整的绩效考核管理功能。
## 项目结构
项目采用清晰的分层架构设计,主要目录组织如下:
```mermaid
graph TB
subgraph "后端应用 (backend)"
subgraph "应用主体 (app)"
MAIN[app/main.py<br/>应用入口]
CORE[app/core/<br/>核心配置]
API[app/api/v1/<br/>API路由]
MODELS[app/models/<br/>数据模型]
SCHEMAS[app/schemas/<br/>数据模式]
SERVICES[app/services/<br/>业务服务]
UTILS[app/utils/<br/>工具函数]
SCRIPTS[app/scripts/<br/>初始化脚本]
LOGS[app/logs/<br/>日志文件]
end
subgraph "数据库迁移 (alembic)"
ALEMBIC[alembic/versions/<br/>版本化迁移]
ENV[alembic/env.py<br/>迁移环境]
end
subgraph "配置文件"
ENV_EXAMPLE[.env.example<br/>环境配置示例]
REQUIREMENTS[requirements.txt<br/>依赖包]
end
subgraph "测试文件"
TESTS[tests/<br/>测试用例]
end
end
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
### 目录组织说明
**app目录** - 应用主体
- `main.py`: 应用程序入口点创建FastAPI实例并配置中间件
- `core/`: 核心配置模块,包含配置管理、数据库连接、安全认证、日志配置
- `api/v1/`: API路由模块按功能模块划分的RESTful接口
- `models/`: 数据模型定义使用SQLAlchemy ORM映射数据库表
- `schemas/`: Pydantic数据模式用于请求响应的数据验证和序列化
- `services/`: 业务逻辑服务层,实现具体的业务规则和数据处理
- `scripts/`: 初始化脚本,用于数据预填充和系统初始化
- `logs/`: 日志文件存储目录
**alembic目录** - 数据库迁移管理
- `versions/`: 版本化的数据库迁移文件
- `env.py`: Alembic迁移环境配置
**配置文件**
- `.env.example`: 环境变量配置示例文件
- `requirements.txt`: Python依赖包清单
**Section sources**
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
## 核心组件
### 应用配置系统
系统采用集中式配置管理通过Pydantic Settings实现类型安全的配置读取
```mermaid
classDiagram
class Settings {
+str APP_NAME
+str APP_VERSION
+bool DEBUG
+str API_PREFIX
+str DATABASE_URL
+int DATABASE_POOL_SIZE
+int DATABASE_MAX_OVERFLOW
+str SECRET_KEY
+str ALGORITHM
+int ACCESS_TOKEN_EXPIRE_MINUTES
+str[] CORS_ORIGINS
+int DEFAULT_PAGE_SIZE
+int MAX_PAGE_SIZE
}
class Config {
+str env_file
+bool case_sensitive
}
Settings --> Config : "继承"
```
**图表来源**
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
### 数据库连接层
使用SQLAlchemy 2.0的异步ORM特性提供高效的数据库操作能力
```mermaid
classDiagram
class Base {
<<DeclarativeBase>>
}
class AsyncEngine {
+create_async_engine()
}
class AsyncSession {
+AsyncSession()
}
class SessionMaker {
+async_session_maker
}
Base <|-- Department
Base <|-- Staff
Base <|-- Indicator
Base <|-- Assessment
Base <|-- AssessmentDetail
AsyncEngine --> AsyncSession : "创建"
SessionMaker --> AsyncSession : "管理"
```
**图表来源**
- [backend/app/core/database.py](file://backend/app/core/database.py#L23-L39)
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L200)
### 安全认证系统
集成JWT令牌认证和密码加密提供多层级的权限控制
```mermaid
classDiagram
class SecurityModule {
+OAuth2PasswordBearer oauth2_scheme
+verify_password()
+get_password_hash()
+create_access_token()
+decode_token()
+get_current_user()
+get_current_active_user()
+get_current_admin_user()
+get_current_manager_user()
}
class TokenPayload {
+str exp
+str sub
}
class User {
+int id
+str username
+str role
+bool is_active
}
SecurityModule --> TokenPayload : "验证"
SecurityModule --> User : "获取"
```
**图表来源**
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
**Section sources**
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
## 架构概览
系统采用经典的三层架构模式,实现了清晰的关注点分离:
```mermaid
graph TB
subgraph "表示层 (API Layer)"
ROUTERS[API路由器]
ENDPOINTS[端点处理器]
end
subgraph "业务逻辑层 (Service Layer)"
ASSESSMENT_SERVICE[考核服务]
DEPARTMENT_SERVICE[科室服务]
STAFF_SERVICE[员工服务]
SALARY_SERVICE[薪资服务]
end
subgraph "数据访问层 (Data Access Layer)"
MODELS[ORM模型]
DATABASE[(PostgreSQL数据库)]
end
subgraph "基础设施层"
CONFIG[配置管理]
SECURITY[安全认证]
LOGGING[日志系统]
end
ROUTERS --> ENDPOINTS
ENDPOINTS --> ASSESSMENT_SERVICE
ENDPOINTS --> DEPARTMENT_SERVICE
ENDPOINTS --> STAFF_SERVICE
ASSESSMENT_SERVICE --> MODELS
DEPARTMENT_SERVICE --> MODELS
STAFF_SERVICE --> MODELS
MODELS --> DATABASE
ROUTERS --> SECURITY
ENDPOINTS --> SECURITY
ASSESSMENT_SERVICE --> LOGGING
CONFIG --> ROUTERS
CONFIG --> DATABASE
```
**图表来源**
- [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-L200)
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L200)
### 模块间依赖关系
系统遵循依赖倒置原则,上层模块不依赖下层模块的具体实现:
```mermaid
graph LR
subgraph "外部依赖"
FASTAPI[FastAPI框架]
SQLALCHEMY[SQLAlchemy 2.0]
POSTGRESQL[PostgreSQL]
end
subgraph "应用层"
MAIN[main.py]
ROUTERS[API路由器]
SERVICES[业务服务]
MODELS[数据模型]
SCHEMAS[数据模式]
end
subgraph "核心模块"
CONFIG[配置管理]
DATABASE[数据库连接]
SECURITY[安全认证]
LOGGING[日志系统]
end
FASTAPI --> MAIN
SQLALCHEMY --> MODELS
POSTGRESQL --> DATABASE
MAIN --> ROUTERS
ROUTERS --> SERVICES
SERVICES --> MODELS
MODELS --> DATABASE
MAIN --> CONFIG
ROUTERS --> CONFIG
SERVICES --> CONFIG
SERVICES --> SECURITY
MODELS --> SECURITY
MAIN --> LOGGING
SERVICES --> LOGGING
```
**图表来源**
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
**Section sources**
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
## 详细组件分析
### API路由模块
系统采用版本化的API设计v1版本包含完整的功能模块
```mermaid
graph TB
subgraph "API版本控制"
V1_API[API v1 路由器]
end
subgraph "功能模块"
AUTH[认证模块]
DEPARTMENTS[科室管理]
STAFF[员工管理]
INDICATORS[指标管理]
ASSESSMENTS[考核管理]
SALARY[薪资计算]
STATS[统计分析]
FINANCE[财务管理]
PERFORMANCE_PLANS[绩效计划]
MENUS[菜单管理]
TEMPLATES[模板管理]
end
V1_API --> AUTH
V1_API --> DEPARTMENTS
V1_API --> STAFF
V1_API --> INDICATORS
V1_API --> ASSESSMENTS
V1_API --> SALARY
V1_API --> STATS
V1_API --> FINANCE
V1_API --> PERFORMANCE_PLANS
V1_API --> MENUS
V1_API --> TEMPLATES
```
**图表来源**
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
#### 考核管理API流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant Router as 路由器
participant Service as 服务层
participant Model as 数据模型
participant DB as 数据库
Client->>Router : GET /api/v1/assessments
Router->>Service : get_list()
Service->>DB : 查询考核记录
DB-->>Service : 返回结果集
Service->>Service : 处理分页和过滤
Service-->>Router : 返回处理后的数据
Router-->>Client : JSON响应
Note over Router,Service : 考核状态流转
Client->>Router : POST /api/v1/assessments/{id}/submit
Router->>Service : submit()
Service->>DB : 更新状态为SUBMITTED
DB-->>Service : 确认更新
Service-->>Router : 返回提交结果
Router-->>Client : 状态更新确认
```
**图表来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L18-L200)
**Section sources**
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
- [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-L200)
### 数据模型设计
系统采用枚举类型确保数据完整性,支持平衡计分卡的四个维度:
```mermaid
erDiagram
DEPARTMENT {
int id PK
string name
string code UK
enum dept_type
int parent_id FK
int level
int sort_order
boolean is_active
datetime created_at
datetime updated_at
}
STAFF {
int id PK
string employee_id UK
string name
int department_id FK
string position
string title
string phone
string email
numeric base_salary
numeric performance_ratio
enum status
datetime hire_date
datetime created_at
datetime updated_at
}
INDICATOR {
int id PK
string name
string code UK
enum indicator_type
enum bs_dimension
numeric weight
numeric max_score
numeric target_value
string target_unit
text calculation_method
text assessment_method
text deduction_standard
string data_source
string applicable_dept_types
boolean is_veto
boolean is_active
datetime created_at
datetime updated_at
}
ASSESSMENT {
int id PK
int staff_id FK
int period_year
int period_month
string period_type
numeric total_score
numeric weighted_score
enum status
int assessor_id FK
int reviewer_id FK
datetime submit_time
datetime review_time
text remark
datetime created_at
datetime updated_at
}
ASSESSMENT_DETAIL {
int id PK
int assessment_id FK
int indicator_id FK
numeric actual_value
numeric score
text evidence
text remark
datetime created_at
datetime updated_at
}
DEPARTMENT ||--o{ STAFF : "拥有"
STAFF ||--o{ ASSESSMENT : "参与"
INDICATOR ||--o{ ASSESSMENT_DETAIL : "被评估"
ASSESSMENT ||--o{ ASSESSMENT_DETAIL : "包含"
```
**图表来源**
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L200)
#### 数据验证流程
```mermaid
flowchart TD
START([请求到达]) --> VALIDATE_INPUT[验证输入参数]
VALIDATE_INPUT --> INPUT_VALID{参数有效?}
INPUT_VALID --> |否| RETURN_ERROR[返回错误响应]
INPUT_VALID --> |是| CHECK_AUTH[检查认证状态]
CHECK_AUTH --> AUTH_VALID{认证有效?}
AUTH_VALID --> |否| RETURN_AUTH_ERROR[返回认证错误]
AUTH_VALID --> |是| CHECK_PERMISSION[检查权限]
CHECK_PERMISSION --> HAS_PERMISSION{有权限?}
HAS_PERMISSION --> |否| RETURN_PERM_ERROR[返回权限错误]
HAS_PERMISSION --> |是| PROCESS_REQUEST[处理业务逻辑]
PROCESS_REQUEST --> SERVICE_CALL[调用服务层]
SERVICE_CALL --> DB_OPERATION[数据库操作]
DB_OPERATION --> DB_SUCCESS{操作成功?}
DB_SUCCESS --> |否| HANDLE_DB_ERROR[处理数据库错误]
DB_SUCCESS --> |是| FORMAT_RESPONSE[格式化响应]
HANDLE_DB_ERROR --> RETURN_ERROR
FORMAT_RESPONSE --> RETURN_SUCCESS[返回成功响应]
RETURN_AUTH_ERROR --> END([结束])
RETURN_PERM_ERROR --> END
RETURN_ERROR --> END
RETURN_SUCCESS --> END
```
**图表来源**
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
**Section sources**
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L200)
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L200)
### 初始化脚本系统
系统提供完整的数据初始化功能,支持多种科室类型的指标模板:
```mermaid
graph TB
subgraph "初始化流程"
INIT_SCRIPT[init_templates.py]
DATA_SOURCE[指标模板数据]
ENGINE[数据库引擎]
SESSION[异步会话]
end
subgraph "模板类型"
GENERAL[通用模板]
SURGICAL[手术科室模板]
MEDICAL_TECH[医技科室模板]
ADMIN[行政科室模板]
LOGISTICS[后勤科室模板]
end
INIT_SCRIPT --> DATA_SOURCE
INIT_SCRIPT --> ENGINE
ENGINE --> SESSION
DATA_SOURCE --> INIT_SCRIPT
GENERAL --> INIT_SCRIPT
SURGICAL --> INIT_SCRIPT
MEDICAL_TECH --> INIT_SCRIPT
ADMIN --> INIT_SCRIPT
LOGISTICS --> INIT_SCRIPT
```
**图表来源**
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L1-L200)
**Section sources**
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L1-L200)
## 依赖关系分析
### 外部依赖管理
系统使用requirements.txt统一管理所有Python依赖
```mermaid
graph TB
subgraph "Web框架"
FASTAPI[fastapi>=0.115.0]
UVICORN[uvicorn[standard]>=0.32.0]
end
subgraph "数据库相关"
SQLALCHEMY[sqlalchemy>=2.0.36]
ASYNCPG[asyncpg>=0.30.0]
ALEMBIC[alembic>=1.14.0]
end
subgraph "数据验证"
PYDANTIC[pydantic>=2.10.0]
SETTINGS[pydantic-settings>=2.6.0]
EMAIL[email-validator>=2.2.0]
end
subgraph "安全认证"
JOSE[python-jose[cryptography]>=3.3.0]
PASSLIB[passlib[bcrypt]>=1.7.4]
end
subgraph "开发工具"
DOTENV[python-dotenv>=1.0.0]
HTTPX[httpx>=0.28.0]
PYTEST[pytest>=8.0.0]
ASYNCIO[pytest-asyncio>=0.24.0]
end
FASTAPI --> UVICORN
SQLALCHEMY --> ASYNCPG
PYDANTIC --> SETTINGS
JOSE --> PASSLIB
```
**图表来源**
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
### 环境配置管理
系统采用.env.example文件提供配置模板支持多环境部署
```mermaid
flowchart LR
ENV_EXAMPLE[.env.example] --> ENV_FILE[实际.env文件]
ENV_FILE --> CONFIG[配置加载]
CONFIG --> SETTINGS[Settings对象]
SETTINGS --> APPLICATION[应用程序]
subgraph "配置类别"
DB_CONFIG[数据库配置]
JWT_CONFIG[JWT配置]
DEBUG_CONFIG[调试配置]
CORS_CONFIG[CORS配置]
end
ENV_FILE --> DB_CONFIG
ENV_FILE --> JWT_CONFIG
ENV_FILE --> DEBUG_CONFIG
ENV_FILE --> CORS_CONFIG
```
**图表来源**
- [backend/.env.example](file://backend/.env.example#L1-L11)
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
**Section sources**
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
- [backend/.env.example](file://backend/.env.example#L1-L11)
## 性能考虑
### 异步数据库操作
系统全面采用SQLAlchemy 2.0的异步特性,提升并发处理能力:
- 使用异步引擎和会话工厂
- 支持连接池管理和溢出控制
- 实现自动事务管理和异常回滚
### 缓存策略
- 配置LRU缓存的Settings单例
- 数据库连接池优化
- 请求级别的中间件缓存
### 日志性能优化
- 文件轮转避免日志文件过大
- 多级别日志分离(应用日志、错误日志)
- 异步日志写入减少阻塞
## 故障排除指南
### 常见问题诊断
**数据库连接问题**
- 检查DATABASE_URL配置
- 验证PostgreSQL服务状态
- 确认网络连接和防火墙设置
**JWT认证失败**
- 验证SECRET_KEY配置
- 检查令牌过期时间设置
- 确认用户状态为激活
**API路由错误**
- 检查API_PREFIX配置
- 验证路由注册顺序
- 确认中间件配置正确
### 调试技巧
1. **启用调试模式**: 设置DEBUG=True查看详细日志
2. **检查环境变量**: 确保.env文件配置正确
3. **验证数据库迁移**: 运行alembic升级检查
4. **测试API端点**: 使用OpenAPI文档测试接口
**Section sources**
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
## 结论
该医院绩效管理系统采用了现代化的软件架构设计,具有以下特点:
**架构优势**
- 清晰的分层设计,职责分离明确
- 异步编程模型,提升系统性能
- 类型安全的配置管理
- 完整的认证授权机制
**扩展性考虑**
- 模块化设计便于功能扩展
- 数据库迁移机制支持版本演进
- 标准化的API设计便于前端集成
**最佳实践建议**
- 遵循单一职责原则
- 使用类型注解提高代码可读性
- 实施完善的错误处理机制
- 定期进行性能监控和优化
该系统为医院绩效管理提供了完整的技术解决方案,具备良好的可维护性和扩展性。