提交文件
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支持多种数据库
|
||||
|
||||
该认证系统为医院绩效管理系统的其他功能模块提供了可靠的身份验证基础,确保了系统的整体安全性和可用性。
|
||||
Reference in New Issue
Block a user