提交文件
This commit is contained in:
534
.qoder/repowiki/zh/content/后端开发指南/API路由实现/API路由实现.md
Normal file
534
.qoder/repowiki/zh/content/后端开发指南/API路由实现/API路由实现.md
Normal 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目录包含配置、数据库连接、安全认证等基础设施
|
||||
- 数据模型与Schema:models与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、延迟与错误率
|
||||
|
||||
[本节为通用指导,不涉及具体文件分析]
|
||||
438
.qoder/repowiki/zh/content/后端开发指南/API路由实现/基础数据接口.md
Normal file
438
.qoder/repowiki/zh/content/后端开发指南/API路由实现/基础数据接口.md
Normal 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)
|
||||
|
||||
## 结论
|
||||
本系统通过清晰的分层架构与统一的数据契约,实现了基础数据管理的核心能力。科室管理支持树形结构与层级维护,员工管理提供灵活的查询与状态管理,指标管理具备模板导入与权重配置能力,工资管理覆盖从生成到确认的完整流程。建议后续在高并发场景引入缓存与异步处理,并持续完善数据校验与审计日志。
|
||||
598
.qoder/repowiki/zh/content/后端开发指南/API路由实现/工资财务接口.md
Normal file
598
.qoder/repowiki/zh/content/后端开发指南/API路由实现/工资财务接口.md
Normal 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接口和清晰的业务逻辑,为医院的绩效管理和财务核算提供了强有力的技术支撑。未来可以进一步集成税务计算、社保扣款等高级功能,满足更复杂的业务需求。
|
||||
411
.qoder/repowiki/zh/content/后端开发指南/API路由实现/系统管理接口.md
Normal file
411
.qoder/repowiki/zh/content/后端开发指南/API路由实现/系统管理接口.md
Normal 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)
|
||||
388
.qoder/repowiki/zh/content/后端开发指南/API路由实现/统计报表接口.md
Normal file
388
.qoder/repowiki/zh/content/后端开发指南/API路由实现/统计报表接口.md
Normal 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(可选)、months(1-24,默认6)
|
||||
- 返回:月度平均分趋势
|
||||
- 预警数据:GET /api/v1/stats/alerts
|
||||
- 参数:limit(1-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
|
||||
- 参数:months(1-24,默认6)
|
||||
- 返回:月度收入、支出、利润
|
||||
- 科室绩效排名:GET /api/v1/stats/department-ranking
|
||||
- 参数:period_year(可选)、period_month(可选)、limit(1-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)
|
||||
626
.qoder/repowiki/zh/content/后端开发指南/API路由实现/考核管理接口.md
Normal file
626
.qoder/repowiki/zh/content/后端开发指南/API路由实现/考核管理接口.md
Normal 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)
|
||||
480
.qoder/repowiki/zh/content/后端开发指南/API路由实现/认证接口.md
Normal file
480
.qoder/repowiki/zh/content/后端开发指南/API路由实现/认证接口.md
Normal 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支持多种数据库
|
||||
|
||||
该认证系统为医院绩效管理系统的其他功能模块提供了可靠的身份验证基础,确保了系统的整体安全性和可用性。
|
||||
396
.qoder/repowiki/zh/content/后端开发指南/后端开发指南.md
Normal file
396
.qoder/repowiki/zh/content/后端开发指南/后端开发指南.md
Normal 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驱动,支持连接池配置。
|
||||
- 会话工厂:AsyncSession,expire_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)
|
||||
404
.qoder/repowiki/zh/content/后端开发指南/安全认证.md
Normal file
404
.qoder/repowiki/zh/content/后端开发指南/安全认证.md
Normal 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
|
||||
- 对高危操作增加二次确认与审计
|
||||
330
.qoder/repowiki/zh/content/后端开发指南/开发环境搭建.md
Normal file
330
.qoder/repowiki/zh/content/后端开发指南/开发环境搭建.md
Normal 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
|
||||
- 初始化脚本执行成功
|
||||
411
.qoder/repowiki/zh/content/后端开发指南/数据库集成.md
Normal file
411
.qoder/repowiki/zh/content/后端开发指南/数据库集成.md
Normal 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)
|
||||
350
.qoder/repowiki/zh/content/后端开发指南/服务层开发/工资服务.md
Normal file
350
.qoder/repowiki/zh/content/后端开发指南/服务层开发/工资服务.md
Normal 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
|
||||
- Schema:SalaryRecordCreate、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)
|
||||
546
.qoder/repowiki/zh/content/后端开发指南/服务层开发/指标模板服务.md
Normal file
546
.qoder/repowiki/zh/content/后端开发指南/服务层开发/指标模板服务.md
Normal 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. **完善的错误处理**:全面的日志记录和异常处理机制
|
||||
|
||||
通过持续的优化和迭代,该系统能够满足不同规模医院的绩效管理需求,为提升医疗质量和效率提供有力支撑。
|
||||
503
.qoder/repowiki/zh/content/后端开发指南/服务层开发/服务层开发.md
Normal file
503
.qoder/repowiki/zh/content/后端开发指南/服务层开发/服务层开发.md
Normal 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(计算绩效奖金、生成工资、批量生成、确认、批量确认)
|
||||
- 统计服务:StatsService(BSC维度分析、科室统计、趋势分析、排名、完成度)
|
||||
- 部门服务: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层校验周期与权限
|
||||
- 服务层返回实体或None,API层处理错误
|
||||
- 事务管理
|
||||
- 单次操作内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缓存
|
||||
- 对高频查询结果进行分页与限流
|
||||
- 日志与监控
|
||||
- 记录慢查询与异常堆栈
|
||||
- 结合数据库慢查询日志定位瓶颈
|
||||
|
||||
## 故障排除指南
|
||||
- 常见异常
|
||||
- 未找到实体:返回None,API层抛出404
|
||||
- 状态不允许:返回None,API层抛出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、减少往返
|
||||
- 并发控制:幂等键、锁机制、重试策略
|
||||
- 监控与告警:慢查询、错误率、吞吐量
|
||||
568
.qoder/repowiki/zh/content/后端开发指南/服务层开发/系统管理服务.md
Normal file
568
.qoder/repowiki/zh/content/后端开发指南/服务层开发/系统管理服务.md
Normal 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)
|
||||
|
||||
## 结论
|
||||
|
||||
本系统通过精心设计的三层架构,成功实现了医院绩效管理的核心功能。三大管理服务各司其职,既保持了高度的内聚性,又确保了适当的耦合度。
|
||||
|
||||
系统的主要优势包括:
|
||||
|
||||
- **模块化设计**:清晰的职责分离便于维护和扩展
|
||||
- **安全性保障**:完善的认证授权机制确保系统安全
|
||||
- **性能优化**:异步架构和数据库优化提升系统性能
|
||||
- **可扩展性**:灵活的数据模型支持业务发展需求
|
||||
|
||||
通过持续的优化和完善,该系统能够有效支撑医院的绩效管理工作,为提升医疗服务质量提供有力的技术保障。
|
||||
448
.qoder/repowiki/zh/content/后端开发指南/服务层开发/统计分析服务.md
Normal file
448
.qoder/repowiki/zh/content/后端开发指南/服务层开发/统计分析服务.md
Normal 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-dimension:BSC 维度分析
|
||||
- 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)
|
||||
|
||||
### 数据模型与枚举(支撑统计)
|
||||
- BSCDimension:financial、customer、internal_process、learning_growth
|
||||
- AssessmentStatus:FINALIZED 等
|
||||
- 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)
|
||||
473
.qoder/repowiki/zh/content/后端开发指南/服务层开发/考核服务.md
Normal file
473
.qoder/repowiki/zh/content/后端开发指南/服务层开发/考核服务.md
Normal 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. **完善的权限控制**:基于角色的精细化权限管理
|
||||
|
||||
该服务为后续的薪资计算、统计分析等功能奠定了坚实的基础,是整个绩效管理系统的核心支柱。
|
||||
423
.qoder/repowiki/zh/content/后端开发指南/服务层开发/部门员工服务.md
Normal file
423
.qoder/repowiki/zh/content/后端开发指南/服务层开发/部门员工服务.md
Normal 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/services,API 路由位于 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)
|
||||
333
.qoder/repowiki/zh/content/后端开发指南/错误处理与日志.md
Normal file
333
.qoder/repowiki/zh/content/后端开发指南/错误处理与日志.md
Normal 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)
|
||||
673
.qoder/repowiki/zh/content/后端开发指南/项目结构说明.md
Normal file
673
.qoder/repowiki/zh/content/后端开发指南/项目结构说明.md
Normal 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设计便于前端集成
|
||||
|
||||
**最佳实践建议**
|
||||
- 遵循单一职责原则
|
||||
- 使用类型注解提高代码可读性
|
||||
- 实施完善的错误处理机制
|
||||
- 定期进行性能监控和优化
|
||||
|
||||
该系统为医院绩效管理提供了完整的技术解决方案,具备良好的可维护性和扩展性。
|
||||
Reference in New Issue
Block a user