提交文件
This commit is contained in:
738
.qoder/repowiki/zh/content/API接口文档/API接口文档.md
Normal file
738
.qoder/repowiki/zh/content/API接口文档/API接口文档.md
Normal file
@@ -0,0 +1,738 @@
|
||||
# API接口文档
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/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/performance_plans.py](file://backend/app/api/v1/performance_plans.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/finance.py](file://backend/app/api/v1/finance.py)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件为医院绩效管理系统API接口的完整文档。系统采用FastAPI + SQLAlchemy 2.0架构,支持异步IO操作,提供RESTful API接口,涵盖认证授权、基础数据管理、绩效考核、工资核算、财务统计、系统管理等核心功能模块。
|
||||
|
||||
系统采用JWT令牌认证机制,支持管理员(admin)、经理(manager)、普通员工(staff)三种角色权限控制,确保数据安全和业务流程的规范性。
|
||||
|
||||
## 项目结构
|
||||
|
||||
后端采用模块化架构设计,主要目录结构如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端应用结构"
|
||||
A["app/"] --> B["api/v1/"]
|
||||
A --> C["core/"]
|
||||
A --> D["models/"]
|
||||
A --> E["services/"]
|
||||
A --> F["schemas/"]
|
||||
B --> B1["认证接口(auth.py)"]
|
||||
B --> B2["基础数据(departments.py, staff.py, indicators.py)"]
|
||||
B --> B3["考核管理(performance_plans.py, assessments.py)"]
|
||||
B --> B4["工资核算(salary.py)"]
|
||||
B --> B5["财务核算(finance.py)"]
|
||||
B --> B6["统计分析(stats.py)"]
|
||||
B --> B7["系统管理(menus.py, templates.py)"]
|
||||
C --> C1["安全配置(security.py)"]
|
||||
C --> C2["数据库配置(database.py)"]
|
||||
C --> C3["配置管理(config.py)"]
|
||||
D --> D1["数据模型(models.py)"]
|
||||
F --> F1["数据模式(schemas.py)"]
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 认证与安全机制
|
||||
|
||||
系统采用JWT令牌进行身份认证,支持多种权限级别:
|
||||
|
||||
- **用户认证**: OAuth2密码模式,支持用户名密码登录
|
||||
- **权限控制**:
|
||||
- 普通用户: 仅能查看和基本操作
|
||||
- 经理用户: 可进行数据维护和审批操作
|
||||
- 管理员: 拥有系统完全管理权限
|
||||
- **密码安全**: 使用bcrypt进行密码哈希存储
|
||||
|
||||
### 数据模型架构
|
||||
|
||||
系统采用SQLAlchemy ORM映射,核心实体包括:
|
||||
|
||||
- **基础实体**: 科室、员工、指标
|
||||
- **业务实体**: 考核记录、工资记录、绩效计划
|
||||
- **系统实体**: 用户、菜单、指标模板
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L18-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
|
||||
|
||||
## 架构概览
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "客户端层"
|
||||
Web[Web前端]
|
||||
Mobile[移动端]
|
||||
API[第三方系统]
|
||||
end
|
||||
subgraph "API网关层"
|
||||
FastAPI[FastAPI应用]
|
||||
CORS[CORS中间件]
|
||||
Router[路由分发]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
Auth[认证模块]
|
||||
Services[业务服务层]
|
||||
Security[安全控制]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
DB[(PostgreSQL数据库)]
|
||||
ORM[SQLAlchemy ORM]
|
||||
end
|
||||
subgraph "配置层"
|
||||
Config[应用配置]
|
||||
Logging[日志配置]
|
||||
end
|
||||
Web --> FastAPI
|
||||
Mobile --> FastAPI
|
||||
API --> FastAPI
|
||||
FastAPI --> CORS
|
||||
FastAPI --> Router
|
||||
FastAPI --> Auth
|
||||
FastAPI --> Services
|
||||
FastAPI --> Security
|
||||
Services --> ORM
|
||||
ORM --> DB
|
||||
FastAPI --> Config
|
||||
Auth --> Config
|
||||
Security --> Config
|
||||
Logging --> Config
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L19-L48)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L21-L53)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 认证接口模块
|
||||
|
||||
#### 用户登录
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/auth/login`
|
||||
- **请求参数**:
|
||||
- username: 字符串,最小长度3,最大长度50
|
||||
- password: 字符串,最小长度6,最大长度100
|
||||
- **响应格式**:
|
||||
```json
|
||||
{
|
||||
"access_token": "字符串",
|
||||
"token_type": "bearer"
|
||||
}
|
||||
```
|
||||
- **错误码**: 401(用户名或密码错误),403(账户已禁用)
|
||||
|
||||
#### 用户注册
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/auth/register`
|
||||
- **请求参数**:
|
||||
- username: 字符串,唯一性约束
|
||||
- password: 字符串,密码哈希处理
|
||||
- staff_id: 整数,关联员工信息
|
||||
- role: 字符串,角色类型
|
||||
- **响应格式**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "注册成功",
|
||||
"data": {"id": 1}
|
||||
}
|
||||
```
|
||||
|
||||
#### 获取当前用户信息
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/auth/me`
|
||||
- **权限要求**: 需要有效JWT令牌
|
||||
- **响应格式**: 用户基本信息
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
|
||||
### 基础数据接口模块
|
||||
|
||||
#### 科室管理接口
|
||||
|
||||
##### 获取科室列表
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/departments`
|
||||
- **查询参数**:
|
||||
- dept_type: 科室类型过滤
|
||||
- is_active: 是否启用过滤
|
||||
- page/page_size: 分页参数
|
||||
- **响应格式**: 分页响应,包含科室列表和统计信息
|
||||
|
||||
##### 创建科室
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/departments`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
- **请求验证**: 科室编码唯一性检查
|
||||
|
||||
##### 更新科室
|
||||
- **HTTP方法**: PUT
|
||||
- **URL模式**: `/api/v1/departments/{dept_id}`
|
||||
|
||||
##### 删除科室
|
||||
- **HTTP方法**: DELETE
|
||||
- **URL模式**: `/api/v1/departments/{dept_id}`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
- **业务规则**: 无法删除存在子科室的科室
|
||||
|
||||
#### 员工管理接口
|
||||
|
||||
##### 获取员工列表
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/staff`
|
||||
- **查询参数**:
|
||||
- department_id: 科室ID过滤
|
||||
- status: 员工状态过滤
|
||||
- keyword: 搜索关键词
|
||||
- **响应格式**: 包含科室名称的员工列表
|
||||
|
||||
##### 创建员工
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/staff`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
- **请求验证**: 工号唯一性检查
|
||||
|
||||
##### 获取科室员工
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/staff/department/{department_id}`
|
||||
|
||||
#### 指标管理接口
|
||||
|
||||
##### 获取指标列表
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/indicators`
|
||||
- **查询参数**:
|
||||
- indicator_type: 指标类型
|
||||
- bs_dimension: 平衡计分卡维度
|
||||
- is_active: 是否启用
|
||||
|
||||
##### 创建指标
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/indicators`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
- **请求验证**: 指标编码唯一性检查
|
||||
|
||||
##### 指标模板管理
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/indicators/templates/list`
|
||||
- **业务功能**: 获取可用的指标模板列表
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L108)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L142)
|
||||
|
||||
### 考核管理接口模块
|
||||
|
||||
#### 绩效计划管理
|
||||
|
||||
##### 获取计划列表
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/plans`
|
||||
- **查询参数**:
|
||||
- plan_level: 计划层级
|
||||
- plan_year: 计划年度
|
||||
- department_id: 科室ID
|
||||
- status: 状态过滤
|
||||
|
||||
##### 创建绩效计划
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/plans`
|
||||
- **请求参数**: 计划基本信息和KPI关联
|
||||
|
||||
##### 提交计划
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/plans/{plan_id}/submit`
|
||||
|
||||
##### 审批计划
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/plans/{plan_id}/approve`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 激活计划
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/plans/{plan_id}/activate`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
#### 绩效考核管理
|
||||
|
||||
##### 获取考核列表
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/assessments`
|
||||
- **查询参数**:
|
||||
- staff_id: 员工ID
|
||||
- department_id: 科室ID
|
||||
- period_year: 年度
|
||||
- period_month: 月份
|
||||
- status: 状态
|
||||
|
||||
##### 创建考核记录
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/assessments`
|
||||
|
||||
##### 批量创建考核
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/assessments/batch-create`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 审核考核
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/assessments/{assessment_id}/review`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L310)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
|
||||
### 工资核算接口模块
|
||||
|
||||
#### 工资记录管理
|
||||
|
||||
##### 获取工资记录列表
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/salary`
|
||||
- **查询参数**:
|
||||
- staff_id: 员工ID
|
||||
- department_id: 科室ID
|
||||
- period_year: 年度
|
||||
- period_month: 月份
|
||||
- status: 状态
|
||||
|
||||
##### 创建工资记录
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/salary`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 根据考核生成工资
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/salary/generate`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 批量生成工资
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/salary/batch-generate`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 确认工资
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/salary/{record_id}/confirm`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
|
||||
### 财务核算接口模块
|
||||
|
||||
#### 财务数据查询
|
||||
|
||||
##### 获取科室收入
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/finance/revenue`
|
||||
|
||||
##### 获取科室支出
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/finance/expense`
|
||||
|
||||
##### 获取收支结余
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/finance/balance`
|
||||
|
||||
##### 按类别统计收入/支出
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/finance/revenue/by-category`
|
||||
- **URL模式**: `/api/v1/finance/expense/by-category`
|
||||
|
||||
##### 获取财务汇总
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/finance/summary`
|
||||
|
||||
#### 财务记录管理
|
||||
|
||||
##### 创建财务记录
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/finance`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
- **请求验证**: 类别有效性检查
|
||||
|
||||
##### 更新财务记录
|
||||
- **HTTP方法**: PUT
|
||||
- **URL模式**: `/api/v1/finance/{record_id}`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 删除财务记录
|
||||
- **HTTP方法**: DELETE
|
||||
- **URL模式**: `/api/v1/finance/{record_id}`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L21-L217)
|
||||
|
||||
### 统计分析接口模块
|
||||
|
||||
#### 绩效统计分析
|
||||
|
||||
##### BSC维度分析
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/stats/bsc-dimension`
|
||||
|
||||
##### 科室绩效统计
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/stats/department`
|
||||
|
||||
##### 趋势分析
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/stats/trend`
|
||||
- **查询参数**: months(最近几个月)
|
||||
|
||||
##### 周期统计
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/stats/period`
|
||||
|
||||
##### 关键指标仪表盘
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/stats/kpi-gauges`
|
||||
|
||||
#### 排名统计
|
||||
|
||||
##### 科室绩效排名
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/stats/department-ranking`
|
||||
|
||||
##### 绩效排名
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/stats/ranking`
|
||||
|
||||
#### 指标完成度
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/stats/completion`
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L242)
|
||||
|
||||
### 系统管理接口模块
|
||||
|
||||
#### 菜单管理
|
||||
|
||||
##### 获取菜单树
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/menus/tree`
|
||||
- **查询参数**: visible_only(是否只返回可见菜单)
|
||||
|
||||
##### 获取菜单列表
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/menus`
|
||||
|
||||
##### 创建菜单
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/menus`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 更新菜单
|
||||
- **HTTP方法**: PUT
|
||||
- **URL模式**: `/api/v1/menus/{menu_id}`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 删除菜单
|
||||
- **HTTP方法**: DELETE
|
||||
- **URL模式**: `/api/v1/menus/{menu_id}`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 初始化默认菜单
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/menus/init`
|
||||
- **权限要求**: 管理员权限
|
||||
|
||||
#### 指标模板管理
|
||||
|
||||
##### 获取模板列表
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/templates`
|
||||
|
||||
##### 获取模板类型列表
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/templates/types`
|
||||
|
||||
##### 获取BSC维度列表
|
||||
- **HTTP方法**: GET
|
||||
- **URL模式**: `/api/v1/templates/dimensions`
|
||||
|
||||
##### 创建模板
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/templates`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 添加模板指标
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/templates/{template_id}/indicators`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
##### 批量添加模板指标
|
||||
- **HTTP方法**: POST
|
||||
- **URL模式**: `/api/v1/templates/{template_id}/indicators/batch`
|
||||
- **权限要求**: 管理员或经理权限
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L17-L164)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L272)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API层"
|
||||
AuthAPI[认证API]
|
||||
BasicAPI[基础数据API]
|
||||
AssessmentAPI[考核API]
|
||||
SalaryAPI[工资API]
|
||||
FinanceAPI[财务API]
|
||||
StatsAPI[统计API]
|
||||
MenuAPI[菜单API]
|
||||
TemplateAPI[模板API]
|
||||
end
|
||||
subgraph "服务层"
|
||||
AuthService[认证服务]
|
||||
DeptService[科室服务]
|
||||
StaffService[员工服务]
|
||||
IndService[指标服务]
|
||||
PlanService[计划服务]
|
||||
AssessService[考核服务]
|
||||
SalaryService[工资服务]
|
||||
FinanceService[财务服务]
|
||||
StatsService[统计服务]
|
||||
MenuService[菜单服务]
|
||||
TemplateService[模板服务]
|
||||
end
|
||||
subgraph "数据层"
|
||||
UserModel[用户模型]
|
||||
DeptModel[科室模型]
|
||||
StaffModel[员工模型]
|
||||
IndModel[指标模型]
|
||||
PlanModel[计划模型]
|
||||
AssessModel[考核模型]
|
||||
SalaryModel[工资模型]
|
||||
FinanceModel[财务模型]
|
||||
MenuModel[菜单模型]
|
||||
TemplateModel[模板模型]
|
||||
end
|
||||
AuthAPI --> AuthService
|
||||
BasicAPI --> DeptService
|
||||
BasicAPI --> StaffService
|
||||
BasicAPI --> IndService
|
||||
AssessmentAPI --> PlanService
|
||||
AssessmentAPI --> AssessService
|
||||
SalaryAPI --> SalaryService
|
||||
FinanceAPI --> FinanceService
|
||||
StatsAPI --> StatsService
|
||||
MenuAPI --> MenuService
|
||||
TemplateAPI --> TemplateService
|
||||
AuthService --> UserModel
|
||||
DeptService --> DeptModel
|
||||
StaffService --> StaffModel
|
||||
IndService --> IndModel
|
||||
PlanService --> PlanModel
|
||||
AssessService --> AssessModel
|
||||
SalaryService --> SalaryModel
|
||||
FinanceService --> FinanceModel
|
||||
MenuService --> MenuModel
|
||||
TemplateService --> TemplateModel
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [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/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L1-L217)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化策略
|
||||
|
||||
1. **索引优化**
|
||||
- 关键查询字段建立复合索引
|
||||
- 时间范围查询优化
|
||||
- 多条件过滤查询优化
|
||||
|
||||
2. **查询优化**
|
||||
- 分页查询避免全表扫描
|
||||
- 连接查询优化
|
||||
- 子查询优化
|
||||
|
||||
3. **缓存策略**
|
||||
- 配置热点数据缓存
|
||||
- 结果集缓存
|
||||
- 查询结果缓存
|
||||
|
||||
### 异步处理
|
||||
|
||||
系统采用异步IO架构,支持高并发请求处理:
|
||||
|
||||
- **异步数据库操作**: SQLAlchemy 2.0异步支持
|
||||
- **异步文件处理**: 日志和配置文件异步读取
|
||||
- **异步任务队列**: 后台任务处理
|
||||
|
||||
### 安全考虑
|
||||
|
||||
1. **认证安全**
|
||||
- JWT令牌过期时间控制
|
||||
- 密码哈希存储
|
||||
- 会话管理
|
||||
|
||||
2. **授权控制**
|
||||
- 基于角色的访问控制(RBAC)
|
||||
- 请求权限验证
|
||||
- 数据访问权限控制
|
||||
|
||||
3. **输入验证**
|
||||
- 参数类型验证
|
||||
- 长度和范围验证
|
||||
- 格式验证
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见错误码
|
||||
|
||||
| 错误码 | 描述 | 可能原因 |
|
||||
|--------|------|----------|
|
||||
| 400 | 请求参数错误 | 参数类型不正确或缺失 |
|
||||
| 401 | 未授权 | JWT令牌无效或过期 |
|
||||
| 403 | 禁止访问 | 权限不足或账户被禁用 |
|
||||
| 404 | 资源不存在 | 请求的资源不存在 |
|
||||
| 422 | 数据验证错误 | 业务规则验证失败 |
|
||||
| 500 | 服务器内部错误 | 服务器异常 |
|
||||
|
||||
### 调试步骤
|
||||
|
||||
1. **检查认证状态**
|
||||
- 验证JWT令牌有效性
|
||||
- 检查用户权限级别
|
||||
- 确认账户状态正常
|
||||
|
||||
2. **验证请求参数**
|
||||
- 检查必填参数
|
||||
- 验证参数格式
|
||||
- 确认参数范围
|
||||
|
||||
3. **查看系统日志**
|
||||
- 应用程序日志
|
||||
- 数据库查询日志
|
||||
- 错误日志分析
|
||||
|
||||
4. **测试API端点**
|
||||
- 使用Swagger UI测试
|
||||
- 编写单元测试
|
||||
- 集成测试验证
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
|
||||
|
||||
## 结论
|
||||
|
||||
本API接口文档涵盖了医院绩效管理系统的核心功能模块,提供了完整的RESTful API规范。系统采用现代化的技术栈,具备良好的扩展性和安全性。通过清晰的权限控制和数据验证机制,确保了系统的稳定运行。
|
||||
|
||||
建议在实际部署时:
|
||||
1. 配置适当的环境变量和数据库连接
|
||||
2. 设置合理的JWT令牌过期时间
|
||||
3. 实施监控和日志记录
|
||||
4. 定期备份数据库
|
||||
5. 进行安全审计和渗透测试
|
||||
|
||||
## 附录
|
||||
|
||||
### API版本管理
|
||||
|
||||
系统采用URL前缀版本控制:
|
||||
- 版本前缀: `/api/v1`
|
||||
- 开放API文档: `/api/v1/docs`
|
||||
- Redoc文档: `/api/v1/redoc`
|
||||
|
||||
### 速率限制
|
||||
|
||||
系统支持多种速率限制策略:
|
||||
- 基于IP的请求频率限制
|
||||
- 基于用户的API调用限制
|
||||
- 针对敏感操作的额外限制
|
||||
|
||||
### 请求响应示例
|
||||
|
||||
#### 成功响应格式
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {},
|
||||
"total": 0,
|
||||
"page": 1,
|
||||
"page_size": 20
|
||||
}
|
||||
```
|
||||
|
||||
#### 错误响应格式
|
||||
```json
|
||||
{
|
||||
"code": 400,
|
||||
"message": "错误描述",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
### 参数验证规则
|
||||
|
||||
1. **字符串类型**: 最小长度、最大长度、字符集验证
|
||||
2. **数值类型**: 最小值、最大值、精度验证
|
||||
3. **日期时间**: 格式验证、范围验证
|
||||
4. **枚举类型**: 值域验证
|
||||
5. **复合类型**: 结构验证、嵌套验证
|
||||
577
.qoder/repowiki/zh/content/API接口文档/基础数据接口/员工管理接口.md
Normal file
577
.qoder/repowiki/zh/content/API接口文档/基础数据接口/员工管理接口.md
Normal file
@@ -0,0 +1,577 @@
|
||||
# 员工管理接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [staff_service.py](file://backend/app/services/staff_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)
|
||||
- [staff.js](file://frontend/src/api/staff.js)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue)
|
||||
- [request.js](file://frontend/src/api/request.js)
|
||||
- [api.md](file://docs/api.md)
|
||||
- [backend.md](file://docs/backend.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [数据模型](#数据模型)
|
||||
7. [API接口规范](#api接口规范)
|
||||
8. [权限控制机制](#权限控制机制)
|
||||
9. [员工状态管理](#员工状态管理)
|
||||
10. [导入导出功能](#导入导出功能)
|
||||
11. [性能考虑](#性能考虑)
|
||||
12. [故障排除指南](#故障排除指南)
|
||||
13. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
员工管理接口是医院绩效考核管理系统的核心功能模块,负责员工信息的完整生命周期管理。该系统采用现代化的前后端分离架构,后端基于FastAPI和SQLAlchemy,前端使用Vue.js和Element Plus,实现了完整的员工信息管理功能。
|
||||
|
||||
系统支持员工信息的增删改查、多条件筛选、分页查询、状态管理等功能,并集成了完善的权限控制机制和数据验证体系。
|
||||
|
||||
## 项目结构
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端架构"
|
||||
A[API路由层] --> B[服务层]
|
||||
B --> C[数据模型层]
|
||||
C --> D[数据库]
|
||||
A --> E[安全认证]
|
||||
E --> F[JWT令牌]
|
||||
G[前端界面] --> H[API接口]
|
||||
H --> A
|
||||
end
|
||||
subgraph "核心模块"
|
||||
I[员工管理] --> J[科室关联]
|
||||
K[权限控制] --> L[角色管理]
|
||||
M[数据验证] --> N[Pydantic模式]
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
|
||||
**章节来源**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 后端核心组件
|
||||
|
||||
系统采用经典的三层架构模式,包含以下核心组件:
|
||||
|
||||
1. **API路由层**:处理HTTP请求和响应,实现RESTful接口
|
||||
2. **服务层**:封装业务逻辑,提供数据访问服务
|
||||
3. **数据模型层**:定义数据库表结构和关系映射
|
||||
4. **安全认证层**:实现JWT令牌认证和权限控制
|
||||
|
||||
### 前端核心组件
|
||||
|
||||
前端采用Vue.js单页面应用架构:
|
||||
|
||||
1. **员工管理界面**:提供员工信息的CRUD操作界面
|
||||
2. **数据表格组件**:展示员工列表和操作功能
|
||||
3. **表单组件**:处理员工信息的输入和验证
|
||||
4. **API客户端**:封装HTTP请求和响应处理
|
||||
|
||||
**章节来源**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L17-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L1-L313)
|
||||
|
||||
## 架构概览
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant Frontend as 前端界面
|
||||
participant API as API路由
|
||||
participant Service as 服务层
|
||||
participant Model as 数据模型
|
||||
participant DB as 数据库
|
||||
Client->>Frontend : 用户操作
|
||||
Frontend->>API : HTTP请求
|
||||
API->>Service : 业务逻辑调用
|
||||
Service->>Model : 数据查询/更新
|
||||
Model->>DB : SQL操作
|
||||
DB-->>Model : 查询结果
|
||||
Model-->>Service : 数据对象
|
||||
Service-->>API : 处理结果
|
||||
API-->>Frontend : JSON响应
|
||||
Frontend-->>Client : 界面更新
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L108)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L16-L101)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 员工管理API路由
|
||||
|
||||
员工管理API路由实现了完整的RESTful接口,包含以下主要功能:
|
||||
|
||||
#### GET /staff - 获取员工列表
|
||||
支持多条件筛选和分页查询:
|
||||
- `department_id`:按科室ID筛选
|
||||
- `status`:按员工状态筛选
|
||||
- `keyword`:按姓名或工号模糊搜索
|
||||
- `page`:页码,默认1
|
||||
- `page_size`:每页数量,默认20,最大100
|
||||
|
||||
#### GET /staff/{id} - 获取员工详情
|
||||
根据员工ID获取详细信息,包含科室名称关联。
|
||||
|
||||
#### POST /staff - 创建员工
|
||||
需要管理员或经理权限,支持批量创建。
|
||||
|
||||
#### PUT /staff/{id} - 更新员工
|
||||
需要管理员或经理权限,支持部分字段更新。
|
||||
|
||||
#### DELETE /staff/{id} - 删除员工
|
||||
需要管理员或经理权限。
|
||||
|
||||
#### GET /staff/department/{department_id} - 获取科室员工
|
||||
获取指定科室的所有在职员工。
|
||||
|
||||
**章节来源**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
|
||||
### 服务层实现
|
||||
|
||||
服务层提供了员工数据访问和业务逻辑处理:
|
||||
|
||||
#### 核心方法
|
||||
|
||||
1. **get_list()**:实现多条件查询和分页
|
||||
2. **get_by_id()**:按ID获取员工信息
|
||||
3. **get_by_employee_id()**:按工号查询唯一员工
|
||||
4. **create()**:创建新员工记录
|
||||
5. **update()**:更新员工信息
|
||||
6. **delete()**:删除员工记录
|
||||
7. **get_by_department()**:获取科室员工列表
|
||||
|
||||
#### 查询优化
|
||||
|
||||
- 使用`selectinload`预加载关联的科室信息
|
||||
- 实现条件动态构建,支持多种筛选组合
|
||||
- 使用子查询统计总数,提高分页查询性能
|
||||
|
||||
**章节来源**
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L16-L112)
|
||||
|
||||
### 数据模型设计
|
||||
|
||||
员工数据模型采用SQLAlchemy ORM映射:
|
||||
|
||||
```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
|
||||
+assessments List[Assessment]
|
||||
+salary_records List[SalaryRecord]
|
||||
}
|
||||
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
|
||||
+parent Department
|
||||
+staff List[Staff]
|
||||
}
|
||||
Staff --> Department : "属于"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [models.py](file://backend/app/models/models.py#L62-L81)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
|
||||
## 数据模型
|
||||
|
||||
### 员工信息字段
|
||||
|
||||
| 字段名 | 类型 | 必填 | 描述 | 默认值 |
|
||||
|--------|------|------|------|--------|
|
||||
| id | int | 否 | 员工ID | 自增 |
|
||||
| employee_id | string | 是 | 工号 | 唯一约束 |
|
||||
| name | string | 是 | 姓名 | - |
|
||||
| department_id | int | 是 | 所属科室ID | - |
|
||||
| position | string | 是 | 职位 | - |
|
||||
| title | string | 否 | 职称 | - |
|
||||
| phone | string | 否 | 联系电话 | - |
|
||||
| email | string | 否 | 邮箱 | - |
|
||||
| base_salary | float | 是 | 基本工资 | 0 |
|
||||
| performance_ratio | float | 是 | 绩效系数 | 1.0 |
|
||||
| status | enum | 是 | 员工状态 | active |
|
||||
| hire_date | datetime | 否 | 入职日期 | - |
|
||||
| created_at | datetime | 否 | 创建时间 | 当前时间 |
|
||||
| updated_at | datetime | 否 | 更新时间 | 当前时间 |
|
||||
|
||||
### 员工状态枚举
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> ACTIVE
|
||||
ACTIVE --> LEAVE : 休假
|
||||
LEAVE --> ACTIVE : 返回
|
||||
ACTIVE --> RESIGNED : 离职
|
||||
ACTIVE --> RETIRED : 退休
|
||||
RESIGNED --> [*]
|
||||
RETIRED --> [*]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L37-L43)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L24-L29)
|
||||
|
||||
## API接口规范
|
||||
|
||||
### 通用响应格式
|
||||
|
||||
所有API接口遵循统一的响应格式:
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {},
|
||||
"total": 0,
|
||||
"page": 1,
|
||||
"page_size": 20
|
||||
}
|
||||
```
|
||||
|
||||
### 员工管理接口详情
|
||||
|
||||
#### 获取员工列表
|
||||
|
||||
**请求**
|
||||
```
|
||||
GET /api/v1/staff
|
||||
Authorization: Bearer {token}
|
||||
```
|
||||
|
||||
**查询参数**
|
||||
| 参数 | 类型 | 必填 | 描述 |
|
||||
|------|------|------|------|
|
||||
| department_id | int | 否 | 科室ID |
|
||||
| status | string | 否 | 员工状态 |
|
||||
| keyword | string | 否 | 搜索关键词 |
|
||||
| page | int | 否 | 页码,默认1 |
|
||||
| page_size | int | 否 | 每页数量,默认20 |
|
||||
|
||||
**响应示例**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": 1,
|
||||
"employee_id": "EMP001",
|
||||
"name": "张三",
|
||||
"department_id": 1,
|
||||
"department_name": "内科",
|
||||
"position": "医师",
|
||||
"title": "主治医师",
|
||||
"phone": "13800138000",
|
||||
"email": "zhangsan@example.com",
|
||||
"base_salary": 5000.00,
|
||||
"performance_ratio": 1.2,
|
||||
"status": "active",
|
||||
"hire_date": "2020-01-01T00:00:00",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
],
|
||||
"total": 50,
|
||||
"page": 1,
|
||||
"page_size": 20
|
||||
}
|
||||
```
|
||||
|
||||
#### 创建员工
|
||||
|
||||
**请求**
|
||||
```
|
||||
POST /api/v1/staff
|
||||
Authorization: Bearer {token}
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
**请求体**
|
||||
```json
|
||||
{
|
||||
"employee_id": "EMP001",
|
||||
"name": "张三",
|
||||
"department_id": 1,
|
||||
"position": "医师",
|
||||
"title": "主治医师",
|
||||
"phone": "13800138000",
|
||||
"email": "zhangsan@example.com",
|
||||
"base_salary": 5000.00,
|
||||
"performance_ratio": 1.2,
|
||||
"status": "active",
|
||||
"hire_date": "2020-01-01T00:00:00"
|
||||
}
|
||||
```
|
||||
|
||||
#### 更新员工
|
||||
|
||||
**请求**
|
||||
```
|
||||
PUT /api/v1/staff/{id}
|
||||
Authorization: Bearer {token}
|
||||
Content-Type: application/json
|
||||
```
|
||||
|
||||
**请求体**(可选字段)
|
||||
```json
|
||||
{
|
||||
"name": "李四",
|
||||
"department_id": 2,
|
||||
"position": "副主任医师",
|
||||
"title": "副主任医师",
|
||||
"phone": "13900139000",
|
||||
"email": "lisi@example.com",
|
||||
"base_salary": 6000.00,
|
||||
"performance_ratio": 1.3,
|
||||
"status": "active"
|
||||
}
|
||||
```
|
||||
|
||||
#### 删除员工
|
||||
|
||||
**请求**
|
||||
```
|
||||
DELETE /api/v1/staff/{id}
|
||||
Authorization: Bearer {token}
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [api.md](file://docs/api.md#L158-L236)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
|
||||
## 权限控制机制
|
||||
|
||||
### 角色权限体系
|
||||
|
||||
系统采用基于角色的访问控制(RBAC)机制:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "用户角色"
|
||||
A[普通员工] --> B[科室经理]
|
||||
B --> C[系统管理员]
|
||||
end
|
||||
subgraph "权限级别"
|
||||
D[只读权限] --> E[读写权限]
|
||||
E --> F[管理权限]
|
||||
end
|
||||
A --> D
|
||||
B --> E
|
||||
C --> F
|
||||
```
|
||||
|
||||
### 权限验证流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([请求到达]) --> CheckAuth["验证JWT令牌"]
|
||||
CheckAuth --> TokenValid{"令牌有效?"}
|
||||
TokenValid --> |否| Error401["返回401未授权"]
|
||||
TokenValid --> |是| GetUser["获取用户信息"]
|
||||
GetUser --> CheckActive{"用户激活?"}
|
||||
CheckActive --> |否| Error400["返回400用户禁用"]
|
||||
CheckActive --> |是| CheckRole["检查角色权限"]
|
||||
CheckRole --> RoleValid{"权限足够?"}
|
||||
RoleValid --> |否| Error403["返回403权限不足"]
|
||||
RoleValid --> |是| ProcessReq["处理业务请求"]
|
||||
ProcessReq --> Success["返回成功响应"]
|
||||
Error401 --> End([结束])
|
||||
Error400 --> End
|
||||
Error403 --> End
|
||||
Success --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [security.py](file://backend/app/core/security.py#L55-L110)
|
||||
|
||||
### 权限控制实现
|
||||
|
||||
1. **get_current_active_user()**:验证用户是否激活
|
||||
2. **get_current_manager_user()**:验证是否为管理员或经理
|
||||
3. **get_current_admin_user()**:验证是否为管理员
|
||||
|
||||
这些装饰器确保只有具备相应权限的用户才能执行敏感操作。
|
||||
|
||||
**章节来源**
|
||||
- [security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L68-L108)
|
||||
|
||||
## 员工状态管理
|
||||
|
||||
### 状态流转图
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> ACTIVE : 创建时默认
|
||||
ACTIVE --> LEAVE : 主动申请
|
||||
LEAVE --> ACTIVE : 返回工作
|
||||
ACTIVE --> RESIGNED : 辞职
|
||||
ACTIVE --> RETIRED : 退休
|
||||
RESIGNED --> [*] : 离职结束
|
||||
RETIRED --> [*] : 退休结束
|
||||
LEAVE --> [*] : 休假结束
|
||||
```
|
||||
|
||||
### 状态管理策略
|
||||
|
||||
1. **在职状态**:正常工作状态,参与绩效考核
|
||||
2. **休假状态**:临时离岗,不影响数据完整性
|
||||
3. **离职状态**:正式离开,不再参与考核
|
||||
4. **退休状态**:达到退休年龄,不再参与考核
|
||||
|
||||
### 状态查询优化
|
||||
|
||||
系统在查询员工列表时,会自动过滤掉离职和退休状态的员工,确保统计数据的准确性。
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L37-L43)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L103-L112)
|
||||
|
||||
## 导入导出功能
|
||||
|
||||
### 导入功能
|
||||
|
||||
系统支持批量员工信息导入,建议采用以下最佳实践:
|
||||
|
||||
1. **数据准备**:确保Excel文件包含所有必填字段
|
||||
2. **格式要求**:使用标准的CSV或Excel格式
|
||||
3. **数据验证**:导入前进行数据完整性检查
|
||||
4. **批量处理**:支持大量数据的分批导入
|
||||
5. **错误处理**:对无效数据进行标记和报告
|
||||
|
||||
### 导出功能
|
||||
|
||||
系统支持员工信息的批量导出:
|
||||
|
||||
1. **筛选导出**:根据当前筛选条件导出结果
|
||||
2. **全量导出**:支持导出所有员工信息
|
||||
3. **格式选择**:支持Excel、CSV等多种格式
|
||||
4. **字段定制**:可选择导出的字段范围
|
||||
|
||||
### 性能优化
|
||||
|
||||
- **分页处理**:大数据量时采用分页导出
|
||||
- **并发处理**:支持多线程并发处理
|
||||
- **进度反馈**:提供导入导出进度显示
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化
|
||||
|
||||
1. **索引策略**:
|
||||
- `idx_staff_dept`:按科室ID查询优化
|
||||
- `idx_staff_status`:按状态查询优化
|
||||
- `idx_dept_type`:按科室类型查询优化
|
||||
|
||||
2. **查询优化**:
|
||||
- 使用`selectinload`预加载关联数据
|
||||
- 实现条件动态构建,避免不必要的查询
|
||||
- 使用子查询统计总数,减少查询次数
|
||||
|
||||
### 缓存策略
|
||||
|
||||
1. **会话缓存**:缓存活跃用户的权限信息
|
||||
2. **数据缓存**:缓存常用的科室信息
|
||||
3. **查询缓存**:缓存频繁访问的统计数据
|
||||
|
||||
### 异步处理
|
||||
|
||||
系统采用异步数据库连接,支持高并发场景下的性能表现。
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **401 未授权**
|
||||
- 检查JWT令牌是否正确传递
|
||||
- 验证令牌是否过期
|
||||
- 确认用户账户状态正常
|
||||
|
||||
2. **403 权限不足**
|
||||
- 验证用户角色是否具备相应权限
|
||||
- 检查操作是否需要管理员权限
|
||||
- 确认用户是否被禁用
|
||||
|
||||
3. **404 资源不存在**
|
||||
- 验证员工ID是否正确
|
||||
- 检查数据库中是否存在该记录
|
||||
- 确认查询条件是否准确
|
||||
|
||||
4. **400 参数错误**
|
||||
- 检查请求参数格式
|
||||
- 验证字段长度和范围
|
||||
- 确认必填字段是否完整
|
||||
|
||||
### 调试建议
|
||||
|
||||
1. **前端调试**:使用浏览器开发者工具查看网络请求
|
||||
2. **后端日志**:检查服务器日志获取详细错误信息
|
||||
3. **数据库查询**:直接查询数据库验证数据状态
|
||||
4. **API测试**:使用Postman或curl测试接口
|
||||
|
||||
**章节来源**
|
||||
- [request.js](file://frontend/src/api/request.js#L28-L63)
|
||||
|
||||
## 结论
|
||||
|
||||
员工管理接口模块实现了完整的员工信息生命周期管理,具有以下特点:
|
||||
|
||||
1. **功能完整**:支持员工信息的增删改查、状态管理、权限控制
|
||||
2. **性能优秀**:采用异步架构和数据库优化策略
|
||||
3. **安全可靠**:完善的JWT认证和权限控制机制
|
||||
4. **易于扩展**:清晰的架构设计便于功能扩展
|
||||
5. **用户体验良好**:前后端分离,界面友好
|
||||
|
||||
该系统为医院的绩效考核管理提供了坚实的基础,能够满足现代医院对员工管理的各种需求。
|
||||
463
.qoder/repowiki/zh/content/API接口文档/基础数据接口/基础数据接口.md
Normal file
463
.qoder/repowiki/zh/content/API接口文档/基础数据接口/基础数据接口.md
Normal file
@@ -0,0 +1,463 @@
|
||||
# 基础数据接口
|
||||
|
||||
<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/templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.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/template_service.py](file://backend/app/services/template_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.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/template.js](file://frontend/src/api/template.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文件为医院绩效管理系统的"基础数据管理接口"提供全面的API文档,覆盖以下四大模块:
|
||||
- 科室管理:支持科室的增删改查、树形结构查询、层级计算与父子关系维护
|
||||
- 员工管理:支持员工的增删改查、按科室筛选、状态管理与关联查询
|
||||
- 考核指标管理:支持指标的增删改查、启用状态管理、模板导入与批量操作
|
||||
- 指标模板管理:支持模板的增删改查、模板类型与BSC维度枚举、模板指标的增删改查与批量添加
|
||||
|
||||
文档详细说明每个模块的接口规范、数据验证规则、关联关系处理、级联操作、分页查询、搜索过滤、排序功能、数据导入导出与批量操作的使用方法。
|
||||
|
||||
## 项目结构
|
||||
后端采用FastAPI + SQLAlchemy 2.0 + 异步数据库访问,遵循分层架构:
|
||||
- API层:定义路由与请求/响应处理
|
||||
- 服务层:封装业务逻辑与数据访问
|
||||
- 模型层:定义数据库表结构与关系
|
||||
- 模式层:定义Pydantic数据模式与枚举类型
|
||||
- 前端层:通过统一请求封装调用后端接口
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_API["前端API封装<br/>department.js / staff.js / indicator.js / template.js"]
|
||||
end
|
||||
subgraph "后端"
|
||||
MAIN["FastAPI应用<br/>app/main.py"]
|
||||
API_DEPT["科室API<br/>api/v1/departments.py"]
|
||||
API_STAFF["员工API<br/>api/v1/staff.py"]
|
||||
API_INDICATOR["指标API<br/>api/v1/indicators.py"]
|
||||
API_TEMPLATE["模板API<br/>api/v1/templates.py"]
|
||||
SVC_DEPT["科室服务<br/>services/department_service.py"]
|
||||
SVC_STAFF["员工服务<br/>services/staff_service.py"]
|
||||
SVC_INDICATOR["指标服务<br/>services/indicator_service.py"]
|
||||
SVC_TEMPLATE["模板服务<br/>services/template_service.py"]
|
||||
MODELS["数据模型<br/>models/models.py"]
|
||||
SCHEMAS["数据模式<br/>schemas/schemas.py"]
|
||||
end
|
||||
FE_API --> MAIN
|
||||
MAIN --> API_DEPT
|
||||
MAIN --> API_STAFF
|
||||
MAIN --> API_INDICATOR
|
||||
MAIN --> API_TEMPLATE
|
||||
API_DEPT --> SVC_DEPT
|
||||
API_STAFF --> SVC_STAFF
|
||||
API_INDICATOR --> SVC_INDICATOR
|
||||
API_TEMPLATE --> SVC_TEMPLATE
|
||||
SVC_DEPT --> MODELS
|
||||
SVC_STAFF --> MODELS
|
||||
SVC_INDICATOR --> MODELS
|
||||
SVC_TEMPLATE --> MODELS
|
||||
API_DEPT --> SCHEMAS
|
||||
API_STAFF --> SCHEMAS
|
||||
API_INDICATOR --> SCHEMAS
|
||||
API_TEMPLATE --> SCHEMAS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [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/templates.py](file://backend/app/api/v1/templates.py#L19-L272)
|
||||
- [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/template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L200)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L10-L743)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
|
||||
## 核心组件
|
||||
- 数据模型与枚举
|
||||
- 科室类型:包含临床、医技、护理、行政、后勤等类型
|
||||
- 员工状态:在职、休假、离职、退休
|
||||
- 指标类型:质量、数量、效率、服务、成本
|
||||
- 平衡计分卡维度:财务、客户、内部流程、学习与成长
|
||||
- 考核状态:草稿、已提交、已审核、已确认、已驳回
|
||||
- 数据模式
|
||||
- 基础模式:定义字段约束、长度限制、取值范围
|
||||
- 创建/更新模式:用于请求体校验
|
||||
- 响应模式:用于序列化输出,包含额外字段如部门名称、指标名称等
|
||||
- 服务层方法
|
||||
- 列表查询:支持分页、过滤条件、排序
|
||||
- 详情查询:支持关联加载
|
||||
- 创建/更新/删除:包含唯一性校验与级联检查
|
||||
- 树形结构:手动构建树避免懒加载问题
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L16-L61)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L10-L743)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L150)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L112)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L197)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L23-L293)
|
||||
|
||||
## 架构概览
|
||||
后端采用分层架构,API层负责路由与权限控制,服务层封装业务逻辑,模型层定义数据库结构,模式层定义数据校验与序列化。前端通过统一的请求封装调用后端接口。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "API路由"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库"
|
||||
FE->>API : 发起HTTP请求
|
||||
API->>SVC : 调用业务方法
|
||||
SVC->>DB : 执行SQL查询/更新
|
||||
DB-->>SVC : 返回结果
|
||||
SVC-->>API : 返回业务结果
|
||||
API-->>FE : 返回标准化响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L108)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L142)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L272)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L150)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L112)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L197)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L23-L293)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 科室管理接口
|
||||
- 接口列表
|
||||
- GET /departments:获取科室列表(支持类型过滤、启用状态过滤、分页)
|
||||
- GET /departments/tree:获取科室树形结构(支持类型过滤)
|
||||
- GET /departments/{dept_id}:获取科室详情
|
||||
- POST /departments:创建科室(需管理员或经理权限)
|
||||
- PUT /departments/{dept_id}:更新科室(需管理员或经理权限)
|
||||
- DELETE /departments/{dept_id}:删除科室(需管理员或经理权限,存在子科室时拒绝删除)
|
||||
- 数据验证规则
|
||||
- 编码唯一性:创建前检查编码是否已存在
|
||||
- 层级计算:根据父级科室自动计算层级
|
||||
- 权限控制:创建、更新、删除接口要求管理员或经理角色
|
||||
- 关联关系与级联
|
||||
- 科室与员工:一对多关系,删除前检查是否存在子科室
|
||||
- 树形结构:手动构建避免懒加载问题
|
||||
- 分页、搜索与排序
|
||||
- 分页:页码与每页数量参数,支持最小1、最大100
|
||||
- 过滤:类型、启用状态
|
||||
- 排序:按排序字段与ID排序
|
||||
- 响应结构
|
||||
- 列表接口返回分页响应对象,包含总数、当前页、每页数量与数据数组
|
||||
- 详情接口返回单个实体对象
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "departments.py"
|
||||
participant Service as "DepartmentService"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /departments?dept_type=&is_active=&page=&page_size=
|
||||
API->>Service : get_list(dept_type, is_active, page, page_size)
|
||||
Service->>DB : 查询科室列表
|
||||
DB-->>Service : 返回结果集
|
||||
Service-->>API : 返回列表与总数
|
||||
API-->>Client : 返回分页响应
|
||||
Client->>API : POST /departments
|
||||
API->>Service : create(dept_data)
|
||||
Service->>DB : 插入新科室
|
||||
DB-->>Service : 返回新记录
|
||||
Service-->>API : 返回创建结果
|
||||
API-->>Client : 返回成功响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [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/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-L86)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L64-L103)
|
||||
|
||||
### 员工管理接口
|
||||
- 接口列表
|
||||
- GET /staff:获取员工列表(支持科室ID、状态、关键词搜索、分页)
|
||||
- GET /staff/{staff_id}:获取员工详情(包含部门名称)
|
||||
- POST /staff:创建员工(需管理员或经理权限)
|
||||
- PUT /staff/{staff_id}:更新员工(需管理员或经理权限)
|
||||
- DELETE /staff/{staff_id}:删除员工(需管理员或经理权限)
|
||||
- GET /staff/department/{department_id}:获取指定科室所有员工
|
||||
- 数据验证规则
|
||||
- 工号唯一性:创建前检查工号是否已存在
|
||||
- 状态枚举:仅允许预定义状态
|
||||
- 权限控制:创建、更新、删除接口要求管理员或经理角色
|
||||
- 关联关系与级联
|
||||
- 员工与科室:多对一关系,查询时加载部门信息
|
||||
- 状态过滤:默认仅显示在职员工
|
||||
- 分页、搜索与排序
|
||||
- 分页:页码与每页数量参数,支持最小1、最大100
|
||||
- 过滤:科室ID、状态
|
||||
- 搜索:姓名或工号模糊匹配
|
||||
- 排序:按ID倒序
|
||||
- 响应结构
|
||||
- 列表接口返回分页响应对象,数据数组中包含部门名称字段
|
||||
- 详情接口返回单个实体对象,包含部门名称字段
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "staff.py"
|
||||
participant Service as "StaffService"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /staff?department_id=&status=&keyword=&page=&page_size=
|
||||
API->>Service : get_list(department_id, status, keyword, page, page_size)
|
||||
Service->>DB : 查询员工列表含部门信息
|
||||
DB-->>Service : 返回结果集
|
||||
Service-->>API : 返回列表与总数
|
||||
API-->>Client : 返回分页响应含部门名称
|
||||
Client->>API : POST /staff
|
||||
API->>Service : create(staff_data)
|
||||
Service->>DB : 插入新员工
|
||||
DB-->>Service : 返回新记录
|
||||
Service-->>API : 返回创建结果
|
||||
API-->>Client : 返回成功响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [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/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-L115)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L107-L150)
|
||||
|
||||
### 考核指标管理接口
|
||||
- 接口列表
|
||||
- GET /indicators:获取指标列表(支持类型、BSC维度、启用状态、分页)
|
||||
- GET /indicators/active:获取所有启用的指标
|
||||
- GET /indicators/{indicator_id}:获取指标详情
|
||||
- POST /indicators:创建指标(需管理员或经理权限)
|
||||
- PUT /indicators/{indicator_id}:更新指标(需管理员或经理权限)
|
||||
- DELETE /indicators/{indicator_id}:删除指标(需管理员或经理权限)
|
||||
- GET /indicators/templates/list:获取指标模板列表
|
||||
- POST /indicators/templates/import:导入指标模板(支持覆盖选项)
|
||||
- 数据验证规则
|
||||
- 编码唯一性:创建前检查编码是否已存在
|
||||
- 权重范围:权重必须在合理范围内
|
||||
- 启用状态:支持启用/禁用切换
|
||||
- 权限控制:创建、更新、删除、模板导入接口要求管理员或经理角色
|
||||
- 关联关系与级联
|
||||
- 指标与考核明细:一对多关系,删除前需确保无关联明细
|
||||
- 模板导入:支持覆盖现有指标或跳过
|
||||
- 分页、搜索与排序
|
||||
- 分页:页码与每页数量参数,支持最小1、最大100
|
||||
- 过滤:类型、BSC维度、启用状态
|
||||
- 排序:按类型与ID排序
|
||||
- 响应结构
|
||||
- 列表接口返回分页响应对象
|
||||
- 详情接口返回单个实体对象
|
||||
- 模板导入接口返回导入数量统计
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "indicators.py"
|
||||
participant Service as "IndicatorService"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /indicators?indicator_type=&bs_dimension=&is_active=&page=&page_size=
|
||||
API->>Service : get_list(...)
|
||||
Service->>DB : 查询指标列表
|
||||
DB-->>Service : 返回结果集
|
||||
Service-->>API : 返回列表与总数
|
||||
API-->>Client : 返回分页响应
|
||||
Client->>API : POST /indicators/templates/import?overwrite=false
|
||||
API->>Service : import_template(template_data, overwrite)
|
||||
Service->>DB : 批量插入或更新指标
|
||||
DB-->>Service : 返回插入数量
|
||||
Service-->>API : 返回导入统计
|
||||
API-->>Client : 返回成功响应含创建数量
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [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/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-L193)
|
||||
|
||||
### 指标模板管理接口
|
||||
- 接口列表
|
||||
- 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:批量添加模板指标(需管理员或经理权限)
|
||||
- 数据验证规则
|
||||
- 模板编码唯一性:创建前检查编码是否已存在
|
||||
- 权重范围:权重必须在合理范围内
|
||||
- 排序字段:支持自定义排序,未提供时按最大排序+1
|
||||
- 权限控制:所有模板相关接口要求管理员或经理角色
|
||||
- 关联关系与级联
|
||||
- 模板与模板指标:一对多关系,支持增删改查与批量添加
|
||||
- 模板指标与指标:多对一关系,查询时加载指标详细信息
|
||||
- 分页、搜索与排序
|
||||
- 分页:页码与每页数量参数,支持最小1、最大100
|
||||
- 过滤:类型、启用状态
|
||||
- 排序:按类型与ID排序
|
||||
- 响应结构
|
||||
- 列表接口返回分页响应对象,包含指标数量统计
|
||||
- 详情接口返回模板对象与指标详情数组
|
||||
- 批量添加接口返回添加数量统计
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "templates.py"
|
||||
participant Service as "TemplateService"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /templates?template_type=&is_active=&page=&page_size=
|
||||
API->>Service : get_list(...)
|
||||
Service->>DB : 查询模板列表含指标数量
|
||||
DB-->>Service : 返回结果集
|
||||
Service-->>API : 返回列表与总数
|
||||
API-->>Client : 返回分页响应含指标数量
|
||||
Client->>API : POST /templates/{template_id}/indicators/batch
|
||||
API->>Service : batch_add_template_indicators(template_id, indicators_data)
|
||||
Service->>DB : 批量插入模板指标
|
||||
DB-->>Service : 返回插入结果
|
||||
Service-->>API : 返回批量统计
|
||||
API-->>Client : 返回成功响应含添加数量
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L272)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L23-L293)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L272)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L23-L293)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L200)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L640-L743)
|
||||
|
||||
## 依赖分析
|
||||
- 模块耦合
|
||||
- API层仅依赖服务层,不直接操作数据库
|
||||
- 服务层依赖模型层进行数据库操作
|
||||
- 模式层为API与服务层提供数据校验与序列化
|
||||
- 外部依赖
|
||||
- FastAPI:Web框架与路由装饰器
|
||||
- SQLAlchemy 2.0:异步ORM与查询构建
|
||||
- Pydantic:数据模式与验证
|
||||
- 权限控制
|
||||
- 部分接口要求管理员或经理角色
|
||||
- 使用依赖注入获取当前用户并进行权限校验
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
API["API层<br/>departments.py / staff.py / indicators.py / templates.py"]
|
||||
SVC["服务层<br/>department_service.py / staff_service.py / indicator_service.py / template_service.py"]
|
||||
MODELS["模型层<br/>models.py"]
|
||||
SCHEMAS["模式层<br/>schemas.py"]
|
||||
API --> SVC
|
||||
SVC --> MODELS
|
||||
API --> SCHEMAS
|
||||
SVC --> SCHEMAS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [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/templates.py](file://backend/app/api/v1/templates.py#L19-L272)
|
||||
- [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/template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L200)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L10-L743)
|
||||
|
||||
**章节来源**
|
||||
- [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/templates.py](file://backend/app/api/v1/templates.py#L19-L272)
|
||||
|
||||
## 性能考虑
|
||||
- 分页与索引
|
||||
- 列表查询均支持分页,避免一次性返回大量数据
|
||||
- 数据库表建立了必要的索引以提升查询性能
|
||||
- 关联查询
|
||||
- 使用selectinload优化N+1查询问题
|
||||
- 树形结构查询手动构建,避免懒加载导致的性能问题
|
||||
- 数据验证
|
||||
- Pydantic模式在请求进入业务层前完成数据验证
|
||||
- 唯一性检查在创建前执行,减少无效写入
|
||||
- 异步处理
|
||||
- 使用异步数据库连接,提升并发处理能力
|
||||
|
||||
## 故障排除指南
|
||||
- 常见错误与处理
|
||||
- 404错误:资源不存在(科室、员工、指标、模板)
|
||||
- 400错误:删除失败(存在子资源或状态不允许)
|
||||
- 400错误:创建失败(编码已存在)
|
||||
- 权限不足:需要管理员或经理角色
|
||||
- 日志与异常
|
||||
- 全局异常处理器记录异常信息
|
||||
- HTTP异常与验证异常分别处理
|
||||
- 前端调用参考
|
||||
- 前端通过统一的API封装调用后端接口
|
||||
- 支持分页参数传递与响应解析
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L60-L107)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L58-L108)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L64-L111)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L83-L169)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
|
||||
- [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/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
|
||||
## 结论
|
||||
本API文档全面覆盖了基础数据管理的四大模块,提供了详细的接口规范、数据验证规则、关联关系处理、分页查询、搜索过滤、排序功能以及批量操作的使用方法。通过清晰的分层架构与严格的权限控制,系统能够稳定地支撑医院绩效管理的各项业务需求。建议在生产环境中结合前端封装进行集成测试,确保接口调用的正确性与性能表现。
|
||||
454
.qoder/repowiki/zh/content/API接口文档/基础数据接口/模板管理接口.md
Normal file
454
.qoder/repowiki/zh/content/API接口文档/基础数据接口/模板管理接口.md
Normal file
@@ -0,0 +1,454 @@
|
||||
# 模板管理接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [templates.py](file://backend/app/api/v1/templates.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)
|
||||
- [template.js](file://frontend/src/api/template.js)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
模板管理接口是医院绩效管理系统的核心功能模块,负责管理各类绩效考核模板的完整生命周期。该系统实现了基于平衡计分卡理论的多维度绩效考核模板管理,支持通用模板、手术科室模板、医技科室模板等多种模板类型,为不同科室提供定制化的绩效考核方案。
|
||||
|
||||
系统采用FastAPI框架构建,基于异步数据库连接,确保高并发场景下的性能表现。模板管理功能涵盖了从模板创建、配置到删除的完整流程,同时支持模板指标的精细化管理,包括指标权重设置、评分方法配置等高级功能。
|
||||
|
||||
## 项目结构
|
||||
|
||||
模板管理模块在项目中的组织结构如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端架构"
|
||||
API[API路由层<br/>templates.py]
|
||||
Service[服务层<br/>template_service.py]
|
||||
Model[数据模型层<br/>models.py]
|
||||
Schema[数据模式层<br/>schemas.py]
|
||||
end
|
||||
subgraph "前端架构"
|
||||
FrontAPI[前端API封装<br/>template.js]
|
||||
FrontView[模板管理界面<br/>Templates.vue]
|
||||
end
|
||||
subgraph "数据层"
|
||||
DB[(数据库)]
|
||||
Alembic[Alembic迁移<br/>002_template.py]
|
||||
end
|
||||
FrontAPI --> API
|
||||
FrontView --> FrontAPI
|
||||
API --> Service
|
||||
Service --> Model
|
||||
Model --> DB
|
||||
Schema --> API
|
||||
Alembic --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [models.py](file://backend/app/models/models.py#L387-L437)
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [models.py](file://backend/app/models/models.py#L387-L437)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 数据模型组件
|
||||
|
||||
系统采用三层架构的数据模型设计,包含以下核心实体:
|
||||
|
||||
#### 模板实体 (IndicatorTemplate)
|
||||
- **主键**: 自增ID
|
||||
- **模板标识**: 唯一模板编码和名称
|
||||
- **模板类型**: 支持8种预定义类型
|
||||
- **配置属性**: 维度权重、考核周期、启用状态
|
||||
- **关联关系**: 一对多关联到模板指标
|
||||
|
||||
#### 指标实体 (TemplateIndicator)
|
||||
- **主键**: 自增ID
|
||||
- **关联属性**: 模板ID、指标ID
|
||||
- **配置属性**: 分类、目标值、权重、评分方法
|
||||
- **排序机制**: 支持自定义排序顺序
|
||||
- **唯一约束**: 模板ID+指标ID组合唯一
|
||||
|
||||
#### 枚举类型
|
||||
- **模板类型**: 通用、手术、非手术有病房、非手术无病房、医技、护理、行政、后勤
|
||||
- **BSC维度**: 财务管理、顾客服务、内部流程、学习与成长
|
||||
- **指标类型**: 质量、数量、效率、服务、成本
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L375-L437)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L640-L743)
|
||||
|
||||
### 服务层组件
|
||||
|
||||
#### TemplateService 类
|
||||
提供完整的模板管理业务逻辑:
|
||||
- **查询功能**: 列表查询、详情获取、按类型过滤
|
||||
- **CRUD操作**: 创建、更新、删除模板
|
||||
- **指标管理**: 添加、更新、删除模板指标
|
||||
- **批量操作**: 批量添加模板指标
|
||||
- **工具方法**: 类型标签转换、维度标签转换
|
||||
|
||||
**章节来源**
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
|
||||
### API路由组件
|
||||
|
||||
#### 模板管理路由
|
||||
- **GET /templates**: 获取模板列表,支持类型过滤和分页
|
||||
- **GET /templates/types**: 获取模板类型列表
|
||||
- **GET /templates/dimensions**: 获取BSC维度列表
|
||||
- **GET /templates/{id}**: 获取模板详情
|
||||
- **POST /templates**: 创建模板
|
||||
- **PUT /templates/{id}**: 更新模板
|
||||
- **DELETE /templates/{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**: 批量添加模板指标
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L22-L272)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构设计,确保关注点分离和代码可维护性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 前端客户端
|
||||
participant API as API路由层
|
||||
participant Service as 服务层
|
||||
participant DB as 数据库
|
||||
participant Model as 数据模型
|
||||
Client->>API : GET /templates
|
||||
API->>Service : get_list()
|
||||
Service->>DB : 查询模板列表
|
||||
DB->>Service : 返回模板数据
|
||||
Service->>Service : 统计指标数量
|
||||
Service->>API : 返回处理后的数据
|
||||
API->>Client : JSON响应
|
||||
Note over Client,DB : 异步数据库操作,支持高并发
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L22-L42)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L24-L71)
|
||||
|
||||
### 数据流架构
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
subgraph "前端层"
|
||||
FE_API[前端API调用]
|
||||
FE_VIEW[模板管理界面]
|
||||
end
|
||||
subgraph "后端层"
|
||||
ROUTER[路由处理]
|
||||
SERVICE[业务逻辑]
|
||||
VALIDATION[数据验证]
|
||||
end
|
||||
subgraph "数据层"
|
||||
MODEL[ORM模型]
|
||||
DATABASE[(数据库)]
|
||||
end
|
||||
FE_API --> ROUTER
|
||||
FE_VIEW --> FE_API
|
||||
ROUTER --> VALIDATION
|
||||
VALIDATION --> SERVICE
|
||||
SERVICE --> MODEL
|
||||
MODEL --> DATABASE
|
||||
DATABASE --> MODEL
|
||||
MODEL --> SERVICE
|
||||
SERVICE --> ROUTER
|
||||
ROUTER --> FE_API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 模板类型分类系统
|
||||
|
||||
系统支持8种预定义的模板类型,每种类型针对特定的科室特点设计:
|
||||
|
||||
#### 通用模板 (GENERAL)
|
||||
- **适用范围**: 全院各科室
|
||||
- **特点**: 基于平衡计分卡四维度设计
|
||||
- **典型权重**: 财务35%、客户30%、内部流程25%、学习成长10%
|
||||
|
||||
#### 手术科室模板 (SURGICAL)
|
||||
- **适用范围**: 外科、妇科、眼科等手术科室
|
||||
- **特点**: 结合RBRVS和DRG理念
|
||||
- **重点指标**: DRG组数、CMI值、费用消耗指数
|
||||
|
||||
#### 医技科室模板 (MEDICAL_TECH)
|
||||
- **适用范围**: 检验科、放射科、超声科等
|
||||
- **特点**: 质量效率双核心
|
||||
- **重点指标**: 报告准确率、危急值及时率
|
||||
|
||||
#### 行政科室模板 (ADMIN)
|
||||
- **适用范围**: 院办、党办、医务科等
|
||||
- **特点**: 服务支持导向
|
||||
- **重点指标**: 服务态度、遵纪守法
|
||||
|
||||
#### 后勤科室模板 (LOGISTICS)
|
||||
- **适用范围**: 总务科、设备科等
|
||||
- **特点**: 后勤保障核心
|
||||
- **重点指标**: 保障及时率、设备完好率
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L375-L384)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L642-L651)
|
||||
|
||||
### 模板数据结构定义
|
||||
|
||||
#### 模板基础结构
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|--------|------|------|------|
|
||||
| template_name | String | 模板名称 | 是 |
|
||||
| template_code | String | 模板编码 | 是 |
|
||||
| template_type | Enum | 模板类型 | 是 |
|
||||
| description | Text | 模板描述 | 否 |
|
||||
| dimension_weights | JSON | 维度权重配置 | 否 |
|
||||
| assessment_cycle | String | 考核周期 | 否 |
|
||||
| is_active | Boolean | 是否启用 | 否 |
|
||||
|
||||
#### 模板指标结构
|
||||
| 字段名 | 类型 | 描述 | 必填 |
|
||||
|--------|------|------|------|
|
||||
| indicator_id | Integer | 指标ID | 是 |
|
||||
| category | String | 指标分类 | 否 |
|
||||
| target_value | Float | 目标值 | 否 |
|
||||
| target_unit | String | 目标值单位 | 否 |
|
||||
| weight | Float | 权重 | 否 |
|
||||
| scoring_method | String | 评分方法 | 否 |
|
||||
| scoring_params | JSON | 评分参数 | 否 |
|
||||
| sort_order | Integer | 排序 | 否 |
|
||||
| remark | Text | 备注 | 否 |
|
||||
|
||||
**章节来源**
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L698-L743)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L654-L696)
|
||||
|
||||
### 模板继承与复用机制
|
||||
|
||||
系统通过模板继承机制实现模板的复用和扩展:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class IndicatorTemplate {
|
||||
+Integer id
|
||||
+String template_code
|
||||
+String template_name
|
||||
+TemplateType template_type
|
||||
+String description
|
||||
+String dimension_weights
|
||||
+String assessment_cycle
|
||||
+Boolean is_active
|
||||
+DateTime created_at
|
||||
+DateTime updated_at
|
||||
+TemplateIndicator[] indicators
|
||||
}
|
||||
class TemplateIndicator {
|
||||
+Integer id
|
||||
+Integer template_id
|
||||
+Integer indicator_id
|
||||
+String category
|
||||
+Float target_value
|
||||
+String target_unit
|
||||
+Float weight
|
||||
+String scoring_method
|
||||
+String scoring_params
|
||||
+Integer sort_order
|
||||
+String remark
|
||||
+DateTime created_at
|
||||
+DateTime updated_at
|
||||
}
|
||||
class Indicator {
|
||||
+Integer id
|
||||
+String code
|
||||
+String name
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+Float weight
|
||||
+Float max_score
|
||||
+Float target_value
|
||||
+String target_unit
|
||||
+String calculation_method
|
||||
+String assessment_method
|
||||
+String deduction_standard
|
||||
+String data_source
|
||||
+Boolean is_veto
|
||||
+Boolean is_active
|
||||
}
|
||||
IndicatorTemplate "1" -- "many" TemplateIndicator : "包含"
|
||||
TemplateIndicator "many" -- "1" Indicator : "关联"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L437)
|
||||
|
||||
### 版本控制实现
|
||||
|
||||
虽然模板管理接口没有直接的版本控制功能,但系统通过以下机制实现版本管理:
|
||||
|
||||
1. **模板历史记录**: 每个模板都有创建时间和更新时间
|
||||
2. **状态管理**: 通过`is_active`字段控制模板启用状态
|
||||
3. **数据完整性**: 使用数据库约束确保数据一致性
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L391-L400)
|
||||
|
||||
### 批量操作功能
|
||||
|
||||
系统提供了完善的批量操作功能:
|
||||
|
||||
#### 批量添加模板指标
|
||||
- **接口**: POST `/templates/{template_id}/indicators/batch`
|
||||
- **功能**: 支持一次性添加多个模板指标
|
||||
- **特性**: 自动设置排序顺序,支持部分字段配置
|
||||
|
||||
#### 批量处理流程
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始批量添加]) --> Validate["验证模板ID"]
|
||||
Validate --> Loop{"遍历指标数组"}
|
||||
Loop --> |是| CheckOrder["检查排序设置"]
|
||||
CheckOrder --> AddIndicator["添加模板指标"]
|
||||
AddIndicator --> UpdateCount["增加成功计数"]
|
||||
UpdateCount --> Loop
|
||||
Loop --> |否| ReturnResult["返回处理结果"]
|
||||
ReturnResult --> End([结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L252-L271)
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L252-L271)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 组件耦合关系
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API层"
|
||||
TPL_API[templates.py]
|
||||
end
|
||||
subgraph "服务层"
|
||||
TPL_SERVICE[template_service.py]
|
||||
end
|
||||
subgraph "模型层"
|
||||
MODELS[models.py]
|
||||
ENUMS[枚举类型]
|
||||
end
|
||||
subgraph "数据层"
|
||||
SCHEMAS[schemas.py]
|
||||
DB[(数据库)]
|
||||
end
|
||||
TPL_API --> TPL_SERVICE
|
||||
TPL_SERVICE --> MODELS
|
||||
MODELS --> ENUMS
|
||||
MODELS --> DB
|
||||
TPL_API --> SCHEMAS
|
||||
SCHEMAS --> MODELS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
|
||||
### 外部依赖
|
||||
|
||||
系统主要依赖以下外部组件:
|
||||
- **FastAPI**: Web框架,提供异步API支持
|
||||
- **SQLAlchemy**: ORM框架,处理数据库操作
|
||||
- **Alembic**: 数据库迁移工具
|
||||
- **Pydantic**: 数据验证和序列化
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L18)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L1-L18)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化策略
|
||||
|
||||
1. **索引优化**: 模板类型和启用状态字段建立了复合索引
|
||||
2. **查询优化**: 使用分页查询避免大数据集加载
|
||||
3. **连接池**: 异步数据库连接池提高并发性能
|
||||
|
||||
### 缓存策略
|
||||
|
||||
系统目前采用懒加载策略,通过`selectinload`优化N+1查询问题,减少数据库访问次数。
|
||||
|
||||
### 并发处理
|
||||
|
||||
- **异步操作**: 所有数据库操作都是异步的
|
||||
- **事务管理**: 自动事务提交和回滚
|
||||
- **错误处理**: 完善的异常处理机制
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 模板编码重复
|
||||
**问题**: 创建模板时报错"模板编码已存在"
|
||||
**原因**: 模板编码必须唯一
|
||||
**解决**: 修改模板编码或使用系统生成的新编码
|
||||
|
||||
#### 模板不存在
|
||||
**问题**: 更新或删除模板时报错"模板不存在"
|
||||
**原因**: 模板ID无效或已被删除
|
||||
**解决**: 检查模板ID有效性或重新获取模板列表
|
||||
|
||||
#### 指标已存在
|
||||
**问题**: 添加模板指标时报错"指标已存在"
|
||||
**原因**: 同一模板中重复添加相同指标
|
||||
**解决**: 移除重复指标或使用新的指标ID
|
||||
|
||||
#### 权限不足
|
||||
**问题**: 访问受保护的模板管理功能被拒绝
|
||||
**原因**: 当前用户角色不满足管理员或经理权限要求
|
||||
**解决**: 登录具有相应权限的账户或联系系统管理员
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L136-L168)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L167-L182)
|
||||
|
||||
## 结论
|
||||
|
||||
模板管理接口为医院绩效管理系统提供了完整的模板生命周期管理能力。通过8种预定义的模板类型、灵活的指标配置和强大的批量操作功能,系统能够满足不同类型科室的绩效考核需求。
|
||||
|
||||
系统采用现代化的架构设计,基于FastAPI和SQLAlchemy构建,确保了高性能和高可用性。模板继承机制和复用策略使得系统具有良好的扩展性和维护性。
|
||||
|
||||
未来可以考虑的功能增强包括:
|
||||
- 模板版本控制功能
|
||||
- 模板复制和导入导出功能
|
||||
- 更丰富的模板指标评分算法
|
||||
- 模板使用统计和分析功能
|
||||
849
.qoder/repowiki/zh/content/API接口文档/基础数据接口/科室管理接口.md
Normal file
849
.qoder/repowiki/zh/content/API接口文档/基础数据接口/科室管理接口.md
Normal file
@@ -0,0 +1,849 @@
|
||||
# 科室管理接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_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/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js)
|
||||
- [frontend/public/test-api.html](file://frontend/public/test-api.html)
|
||||
- [docs/api.md](file://docs/api.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细接口文档](#详细接口文档)
|
||||
6. [树形结构查询实现原理](#树形结构查询实现原理)
|
||||
7. [权限控制机制](#权限控制机制)
|
||||
8. [数据模型](#数据模型)
|
||||
9. [性能考虑](#性能考虑)
|
||||
10. [故障排除指南](#故障排除指南)
|
||||
11. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档详细介绍了医院绩效管理系统的科室管理接口。该系统基于FastAPI构建,提供了完整的科室CRUD操作,包括获取科室列表(支持按类型和状态过滤)、获取树形结构、获取科室详情、创建科室、更新科室和删除科室。系统采用JWT认证机制,支持管理员和经理两种权限级别,并提供了完整的分页查询功能。
|
||||
|
||||
## 项目结构
|
||||
|
||||
后端采用分层架构设计,主要包含以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端层"
|
||||
FE[Vue.js 前端]
|
||||
API[API 请求封装]
|
||||
end
|
||||
subgraph "接口层"
|
||||
Router[FastAPI 路由器]
|
||||
Auth[认证中间件]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
Service[科室服务层]
|
||||
Validation[数据验证]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
Model[数据模型]
|
||||
Schema[Pydantic 模式]
|
||||
Security[安全认证]
|
||||
end
|
||||
subgraph "基础设施"
|
||||
DB[(PostgreSQL 数据库)]
|
||||
Config[配置管理]
|
||||
end
|
||||
FE --> API
|
||||
API --> Router
|
||||
Router --> Auth
|
||||
Router --> Service
|
||||
Service --> Model
|
||||
Service --> Schema
|
||||
Auth --> Security
|
||||
Model --> DB
|
||||
Config --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L18)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### API路由器
|
||||
- **位置**: `backend/app/api/v1/departments.py`
|
||||
- **功能**: 定义所有科室管理相关的HTTP端点
|
||||
- **标签**: "科室管理"
|
||||
|
||||
### 服务层
|
||||
- **位置**: `backend/app/services/department_service.py`
|
||||
- **职责**: 实现业务逻辑,包括数据查询、验证和操作
|
||||
- **特点**: 异步操作,支持事务处理
|
||||
|
||||
### 数据模型
|
||||
- **位置**: `backend/app/models/models.py`
|
||||
- **实体**: Department(科室表)
|
||||
- **特性**: 支持层级关系,自引用外键
|
||||
|
||||
### 数据验证
|
||||
- **位置**: `backend/app/schemas/schemas.py`
|
||||
- **用途**: Pydantic模型用于请求验证和响应序列化
|
||||
- **类型**: DepartmentCreate, DepartmentUpdate, DepartmentResponse
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L17-L18)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L13-L15)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L64-L103)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用经典的MVC架构模式,结合现代的异步编程:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API路由器
|
||||
participant Auth as 认证中间件
|
||||
participant Service as 服务层
|
||||
participant DB as 数据库
|
||||
participant Model as 数据模型
|
||||
Client->>API : HTTP请求
|
||||
API->>Auth : 验证JWT令牌
|
||||
Auth->>Auth : 验证用户权限
|
||||
Auth-->>API : 通过验证
|
||||
API->>Service : 调用业务逻辑
|
||||
Service->>DB : 执行数据库操作
|
||||
DB->>Model : 映射到模型
|
||||
Model-->>DB : 返回数据
|
||||
DB-->>Service : 查询结果
|
||||
Service-->>API : 处理后的数据
|
||||
API-->>Client : JSON响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L40)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L109)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L43)
|
||||
|
||||
## 详细接口文档
|
||||
|
||||
### 获取科室列表
|
||||
|
||||
**HTTP方法**: GET
|
||||
**URL路径**: `/api/v1/departments`
|
||||
**权限要求**: 需要激活用户权限
|
||||
|
||||
**查询参数**:
|
||||
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|
||||
|--------|------|------|--------|------|
|
||||
| dept_type | string | 否 | 无 | 科室类型过滤 |
|
||||
| is_active | boolean | 否 | 无 | 启用状态过滤 |
|
||||
| page | int | 否 | 1 | 页码,最小值1 |
|
||||
| page_size | int | 否 | 20 | 每页数量,范围1-100 |
|
||||
|
||||
**响应数据结构**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": null,
|
||||
"level": 1,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "内科描述",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
],
|
||||
"total": 10,
|
||||
"page": 1,
|
||||
"page_size": 20
|
||||
}
|
||||
```
|
||||
|
||||
**请求示例**:
|
||||
```bash
|
||||
curl -X GET "http://localhost:8000/api/v1/departments?page=1&page_size=20&dept_type=clinical_surgical&is_active=true" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN"
|
||||
```
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": null,
|
||||
"level": 1,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
],
|
||||
"total": 1,
|
||||
"page": 1,
|
||||
"page_size": 20
|
||||
}
|
||||
```
|
||||
|
||||
**错误处理**:
|
||||
- 401 未授权:无效或过期的JWT令牌
|
||||
- 403 禁止:用户权限不足
|
||||
- 404 未找到:无匹配的数据
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L40)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L17-L43)
|
||||
|
||||
### 获取科室树形结构
|
||||
|
||||
**HTTP方法**: GET
|
||||
**URL路径**: `/api/v1/departments/tree`
|
||||
**权限要求**: 需要激活用户权限
|
||||
|
||||
**查询参数**:
|
||||
| 参数名 | 类型 | 必填 | 默认值 | 描述 |
|
||||
|--------|------|------|--------|------|
|
||||
| dept_type | string | 否 | 无 | 科室类型过滤 |
|
||||
|
||||
**响应数据结构**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "医院",
|
||||
"code": "HOSPITAL",
|
||||
"dept_type": "admin",
|
||||
"parent_id": null,
|
||||
"level": 1,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00",
|
||||
"children": [
|
||||
{
|
||||
"id": 2,
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": 1,
|
||||
"level": 2,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00",
|
||||
"children": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**请求示例**:
|
||||
```bash
|
||||
curl -X GET "http://localhost:8000/api/v1/departments/tree?dept_type=clinical_surgical" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN"
|
||||
```
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "医院",
|
||||
"code": "HOSPITAL",
|
||||
"dept_type": "admin",
|
||||
"parent_id": null,
|
||||
"level": 1,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00",
|
||||
"children": [
|
||||
{
|
||||
"id": 2,
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": 1,
|
||||
"level": 2,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00",
|
||||
"children": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**错误处理**:
|
||||
- 401 未授权:无效或过期的JWT令牌
|
||||
- 403 禁止:用户权限不足
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L43-L51)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L112-L149)
|
||||
|
||||
### 获取科室详情
|
||||
|
||||
**HTTP方法**: GET
|
||||
**URL路径**: `/api/v1/departments/{dept_id}`
|
||||
**权限要求**: 需要激活用户权限
|
||||
|
||||
**路径参数**:
|
||||
| 参数名 | 类型 | 必填 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| dept_id | int | 是 | 科室ID |
|
||||
|
||||
**响应数据结构**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": null,
|
||||
"level": 1,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "内科描述",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**请求示例**:
|
||||
```bash
|
||||
curl -X GET "http://localhost:8000/api/v1/departments/1" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN"
|
||||
```
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": null,
|
||||
"level": 1,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**错误处理**:
|
||||
- 401 未授权:无效或过期的JWT令牌
|
||||
- 403 禁止:用户权限不足
|
||||
- 404 未找到:科室不存在
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L54-L64)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L46-L51)
|
||||
|
||||
### 创建科室
|
||||
|
||||
**HTTP方法**: POST
|
||||
**URL路径**: `/api/v1/departments`
|
||||
**权限要求**: 需要管理员或经理权限
|
||||
|
||||
**请求体参数**:
|
||||
| 参数名 | 类型 | 必填 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| name | string | 是 | 科室名称,最大100字符 |
|
||||
| code | string | 是 | 科室编码,最大20字符,必须唯一 |
|
||||
| dept_type | string | 是 | 科室类型 |
|
||||
| parent_id | int | 否 | 上级科室ID |
|
||||
| level | int | 否 | 层级,默认1 |
|
||||
| sort_order | int | 否 | 排序 |
|
||||
| description | string | 否 | 描述 |
|
||||
|
||||
**响应数据结构**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "创建成功",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": null,
|
||||
"level": 1,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**请求示例**:
|
||||
```bash
|
||||
curl -X POST "http://localhost:8000/api/v1/departments" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": null,
|
||||
"sort_order": 1,
|
||||
"description": "内科描述"
|
||||
}'
|
||||
```
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "创建成功",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": null,
|
||||
"level": 1,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "内科描述",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**错误处理**:
|
||||
- 400 错误请求:科室编码已存在
|
||||
- 401 未授权:无效或过期的JWT令牌
|
||||
- 403 禁止:用户权限不足
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L67-L80)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L62-L78)
|
||||
|
||||
### 更新科室
|
||||
|
||||
**HTTP方法**: PUT
|
||||
**URL路径**: `/api/v1/departments/{dept_id}`
|
||||
**权限要求**: 需要管理员或经理权限
|
||||
|
||||
**路径参数**:
|
||||
| 参数名 | 类型 | 必填 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| dept_id | int | 是 | 科室ID |
|
||||
|
||||
**请求体参数**:
|
||||
| 参数名 | 类型 | 必填 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| name | string | 否 | 科室名称,最大100字符 |
|
||||
| dept_type | string | 否 | 科室类型 |
|
||||
| parent_id | int | 否 | 上级科室ID |
|
||||
| sort_order | int | 否 | 排序 |
|
||||
| is_active | boolean | 否 | 是否启用 |
|
||||
| description | string | 否 | 描述 |
|
||||
|
||||
**响应数据结构**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "更新成功",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": null,
|
||||
"level": 1,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "更新后的描述",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**请求示例**:
|
||||
```bash
|
||||
curl -X PUT "http://localhost:8000/api/v1/departments/1" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"name": "内科",
|
||||
"description": "更新后的描述"
|
||||
}'
|
||||
```
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "更新成功",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"name": "内科",
|
||||
"code": "NK001",
|
||||
"dept_type": "clinical_surgical",
|
||||
"parent_id": null,
|
||||
"level": 1,
|
||||
"sort_order": 1,
|
||||
"is_active": true,
|
||||
"description": "更新后的描述",
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**错误处理**:
|
||||
- 401 未授权:无效或过期的JWT令牌
|
||||
- 403 禁止:用户权限不足
|
||||
- 404 未找到:科室不存在
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L83-L94)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L81-L93)
|
||||
|
||||
### 删除科室
|
||||
|
||||
**HTTP方法**: DELETE
|
||||
**URL路径**: `/api/v1/departments/{dept_id}`
|
||||
**权限要求**: 需要管理员或经理权限
|
||||
|
||||
**路径参数**:
|
||||
| 参数名 | 类型 | 必填 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| dept_id | int | 是 | 科室ID |
|
||||
|
||||
**响应数据结构**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "删除成功"
|
||||
}
|
||||
```
|
||||
|
||||
**请求示例**:
|
||||
```bash
|
||||
curl -X DELETE "http://localhost:8000/api/v1/departments/1" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN"
|
||||
```
|
||||
|
||||
**响应示例**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "删除成功"
|
||||
}
|
||||
```
|
||||
|
||||
**错误处理**:
|
||||
- 400 错误请求:无法删除,科室下存在子科室
|
||||
- 401 未授权:无效或过期的JWT令牌
|
||||
- 403 禁止:用户权限不足
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L97-L107)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L95-L110)
|
||||
|
||||
## 树形结构查询实现原理
|
||||
|
||||
### 数据模型设计
|
||||
|
||||
科室表采用自引用外键设计,支持无限层级的组织结构:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
boolean is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS ||--o{ DEPARTMENTS : "parent"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L86)
|
||||
|
||||
### 树形构建算法
|
||||
|
||||
服务层实现了高效的树形结构构建算法:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始构建树形结构]) --> LoadData["加载所有科室数据"]
|
||||
LoadData --> CreateMap["创建科室映射表<br/>ID -> Tree节点"]
|
||||
CreateMap --> InitChildren["初始化所有节点的children为空数组"]
|
||||
InitChildren --> BuildTree["遍历所有科室构建树"]
|
||||
BuildTree --> CheckParent{"是否有上级科室?"}
|
||||
CheckParent --> |是| AddToParent["添加到上级节点的children"]
|
||||
CheckParent --> |否| AddToRoots["添加到根节点列表"]
|
||||
AddToParent --> NextDept{"还有下一个科室?"}
|
||||
AddToRoots --> NextDept
|
||||
NextDept --> |是| BuildTree
|
||||
NextDept --> |否| ReturnTree["返回根节点列表"]
|
||||
ReturnTree --> End([结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
### 层级关系处理
|
||||
|
||||
系统自动计算和维护科室层级关系:
|
||||
|
||||
1. **层级计算**: 新建科室时,如果指定parent_id,则level = parent.level + 1
|
||||
2. **排序规则**: 按sort_order和id进行排序
|
||||
3. **层级限制**: 支持最多5级深度
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L62-L78)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L69-L71)
|
||||
|
||||
## 权限控制机制
|
||||
|
||||
### 角色定义
|
||||
|
||||
系统支持三种用户角色:
|
||||
- **admin**: 系统管理员,拥有最高权限
|
||||
- **manager**: 科室经理,具有业务操作权限
|
||||
- **staff**: 普通员工,只读权限
|
||||
|
||||
### 权限验证流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API端点
|
||||
participant Auth as 认证中间件
|
||||
participant Role as 角色验证
|
||||
participant DB as 数据库
|
||||
Client->>API : 发送带JWT的请求
|
||||
API->>Auth : 验证JWT令牌
|
||||
Auth->>DB : 验证用户有效性
|
||||
DB-->>Auth : 用户信息
|
||||
Auth->>Role : 检查角色权限
|
||||
Role-->>API : 权限验证结果
|
||||
API-->>Client : 返回响应或错误
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L109)
|
||||
|
||||
### 权限矩阵
|
||||
|
||||
| 操作 | 激活用户 | 管理员 | 经理 |
|
||||
|------|----------|--------|------|
|
||||
| 获取列表 | ✅ | ✅ | ✅ |
|
||||
| 获取树形结构 | ✅ | ✅ | ✅ |
|
||||
| 获取详情 | ✅ | ✅ | ✅ |
|
||||
| 创建科室 | ❌ | ✅ | ✅ |
|
||||
| 更新科室 | ❌ | ✅ | ✅ |
|
||||
| 删除科室 | ❌ | ✅ | ✅ |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L109)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L67-L107)
|
||||
|
||||
## 数据模型
|
||||
|
||||
### 科室实体
|
||||
|
||||
科室表包含以下字段:
|
||||
|
||||
| 字段名 | 类型 | 约束 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| id | int | 主键,自增 | 科室ID |
|
||||
| name | string | 非空,最大100 | 科室名称 |
|
||||
| code | string | 非空,唯一,最大20 | 科室编码 |
|
||||
| dept_type | enum | 非空 | 科室类型 |
|
||||
| parent_id | int | 外键到departments.id | 上级科室ID |
|
||||
| level | int | 默认1,范围1-5 | 层级 |
|
||||
| sort_order | int | 默认0 | 排序 |
|
||||
| is_active | boolean | 默认true | 是否启用 |
|
||||
| description | text | 可空 | 描述信息 |
|
||||
| created_at | datetime | 默认当前时间 | 创建时间 |
|
||||
| updated_at | datetime | 默认当前时间,更新时自动 | 更新时间 |
|
||||
|
||||
### 科室类型枚举
|
||||
|
||||
系统支持9种科室类型:
|
||||
- `clinical_surgical`: 手术临床科室
|
||||
- `clinical_nonsurgical_ward`: 非手术有病房科室
|
||||
- `clinical_nonsurgical_noward`: 非手术无病房科室
|
||||
- `medical_tech`: 医技科室
|
||||
- `medical_auxiliary`: 医辅科室
|
||||
- `nursing`: 护理单元
|
||||
- `admin`: 行政科室
|
||||
- `finance`: 财务科室
|
||||
- `logistics`: 后勤保障科室
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L16-L27)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化
|
||||
|
||||
1. **索引策略**:
|
||||
- `idx_dept_type`: 科室类型索引
|
||||
- `idx_dept_parent`: 上级科室索引
|
||||
- `idx_dept_code`: 编码唯一索引
|
||||
|
||||
2. **查询优化**:
|
||||
- 使用异步查询避免阻塞
|
||||
- 分页查询限制结果集大小
|
||||
- 批量操作减少数据库往返
|
||||
|
||||
3. **连接池管理**:
|
||||
- 默认池大小20,溢出10
|
||||
- 自动事务管理和回滚
|
||||
|
||||
### 缓存策略
|
||||
|
||||
- **树形结构缓存**: 对于静态的组织架构数据,建议实现Redis缓存
|
||||
- **用户权限缓存**: 缓存用户角色信息减少数据库查询
|
||||
- **配置信息缓存**: 使用LRU缓存配置项
|
||||
|
||||
### 异步处理
|
||||
|
||||
系统采用异步编程模型:
|
||||
- 使用SQLAlchemy异步引擎
|
||||
- 异步数据库会话管理
|
||||
- 非阻塞I/O操作
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见错误及解决方案
|
||||
|
||||
#### 1. 认证失败
|
||||
**症状**: 401 未授权错误
|
||||
**原因**: JWT令牌无效或过期
|
||||
**解决方案**:
|
||||
- 重新登录获取新令牌
|
||||
- 检查令牌格式和有效期
|
||||
- 验证服务器时间同步
|
||||
|
||||
#### 2. 权限不足
|
||||
**症状**: 403 禁止访问
|
||||
**原因**: 用户角色不满足操作要求
|
||||
**解决方案**:
|
||||
- 确认用户角色为admin或manager
|
||||
- 检查用户状态是否激活
|
||||
- 验证用户是否被禁用
|
||||
|
||||
#### 3. 数据重复
|
||||
**症状**: 400 错误请求,提示编码已存在
|
||||
**原因**: 科室编码重复
|
||||
**解决方案**:
|
||||
- 修改唯一的科室编码
|
||||
- 检查现有数据避免冲突
|
||||
- 使用系统提供的唯一性约束
|
||||
|
||||
#### 4. 删除失败
|
||||
**症状**: 400 错误请求,提示无法删除
|
||||
**原因**: 科室下存在子科室
|
||||
**解决方案**:
|
||||
- 先删除所有子科室
|
||||
- 或者调整层级关系
|
||||
- 使用树形结构查看层级
|
||||
|
||||
### 调试工具
|
||||
|
||||
#### 前端测试页面
|
||||
系统提供了测试页面用于调试API:
|
||||
- **路径**: `frontend/public/test-api.html`
|
||||
- **功能**: 包含健康检查、登录测试、科室列表测试等
|
||||
- **使用**: 直接在浏览器中打开测试页面
|
||||
|
||||
#### 日志监控
|
||||
- **应用日志**: `backend/app/logs/`
|
||||
- **错误日志**: `backend/app/logs/error_*.log`
|
||||
- **数据库日志**: SQL查询语句和执行时间
|
||||
|
||||
**章节来源**
|
||||
- [frontend/public/test-api.html](file://frontend/public/test-api.html#L1-L133)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L75-L77)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L102-L107)
|
||||
|
||||
## 结论
|
||||
|
||||
科室管理接口提供了完整的CRUD操作,支持复杂的树形结构查询和权限控制。系统采用现代化的技术栈,具有良好的扩展性和维护性。通过合理的数据模型设计和权限控制机制,确保了系统的安全性和稳定性。
|
||||
|
||||
主要优势:
|
||||
1. **完整的功能覆盖**: 支持所有必要的科室管理操作
|
||||
2. **灵活的查询能力**: 支持多条件过滤和分页查询
|
||||
3. **强大的权限控制**: 细粒度的角色权限管理
|
||||
4. **高性能设计**: 异步架构和数据库优化
|
||||
5. **易于扩展**: 清晰的分层架构便于功能扩展
|
||||
|
||||
建议后续改进方向:
|
||||
1. 添加树形结构缓存机制
|
||||
2. 实现批量操作功能
|
||||
3. 增强数据导入导出能力
|
||||
4. 完善审计日志功能
|
||||
753
.qoder/repowiki/zh/content/API接口文档/基础数据接口/考核指标管理接口.md
Normal file
753
.qoder/repowiki/zh/content/API接口文档/基础数据接口/考核指标管理接口.md
Normal file
@@ -0,0 +1,753 @@
|
||||
# 考核指标管理接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_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/init_indicator_templates.py](file://backend/init_indicator_templates.py)
|
||||
- [docs/api.md](file://docs/api.md)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md)
|
||||
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js)
|
||||
- [frontend/src/views/basic/Indicators.vue](file://frontend/src/views/basic/Indicators.vue)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件为医院绩效管理系统中的考核指标管理接口提供详细的API文档。系统基于平衡计分卡理论,实现了完整的指标生命周期管理,包括指标的创建、查询、更新、删除以及模板管理功能。
|
||||
|
||||
系统支持四个维度的平衡计分卡指标管理:
|
||||
- **财务维度**:关注医院的经济效益和成本控制
|
||||
- **客户维度**:关注患者满意度和服务质量
|
||||
- **内部流程维度**:关注医疗质量和运营效率
|
||||
- **学习与成长维度**:关注员工发展和能力提升
|
||||
|
||||
## 项目结构
|
||||
|
||||
后端采用FastAPI框架,遵循MVC架构模式,主要分为以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
Frontend[前端Vue.js应用]
|
||||
end
|
||||
subgraph "应用层"
|
||||
API[API路由层]
|
||||
Service[业务服务层]
|
||||
end
|
||||
subgraph "数据层"
|
||||
Model[数据模型层]
|
||||
Database[(PostgreSQL数据库)]
|
||||
end
|
||||
Frontend --> API
|
||||
API --> Service
|
||||
Service --> Model
|
||||
Model --> Database
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 指标管理核心组件
|
||||
|
||||
系统的核心组件包括指标模型、服务层和API路由,形成了完整的指标管理功能体系。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class IndicatorService {
|
||||
+get_list() tuple
|
||||
+get_by_id() Indicator
|
||||
+get_active_indicators() List[Indicator]
|
||||
+create() Indicator
|
||||
+update() Indicator
|
||||
+delete() bool
|
||||
+import_template() int
|
||||
+get_templates() List[Dict]
|
||||
}
|
||||
class IndicatorRouter {
|
||||
+get_indicators() Response
|
||||
+get_active_indicators() Response
|
||||
+get_indicator() Response
|
||||
+create_indicator() Response
|
||||
+update_indicator() Response
|
||||
+delete_indicator() Response
|
||||
+get_indicator_templates() Response
|
||||
+import_indicator_template() Response
|
||||
}
|
||||
IndicatorService --> Indicator : "管理"
|
||||
IndicatorRouter --> IndicatorService : "调用"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L13-L197)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L17-L142)
|
||||
|
||||
### 指标类型和维度体系
|
||||
|
||||
系统定义了完整的指标分类体系,支持多维度的指标管理:
|
||||
|
||||
| 指标类型 | 描述 | 示例 |
|
||||
|---------|------|------|
|
||||
| quality | 质量指标 | 病历合格率、满意度 |
|
||||
| quantity | 数量指标 | 门诊量、手术量 |
|
||||
| efficiency | 效率指标 | 平均住院日、床位使用率 |
|
||||
| service | 服务指标 | 服务态度、响应时间 |
|
||||
| cost | 成本指标 | 药品占比、能耗成本 |
|
||||
|
||||
| 平衡计分卡维度 | 权重范围 | 描述 |
|
||||
|---------------|----------|------|
|
||||
| financial | 30%-40% | 财务效益和成本控制 |
|
||||
| customer | 25%-35% | 患者满意度和市场地位 |
|
||||
| internal_process | 20%-30% | 内部流程效率和质量 |
|
||||
| learning_growth | 5%-15% | 员工能力和创新 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L35)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L39-L44)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构设计,确保了良好的可维护性和扩展性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "API路由层"
|
||||
participant Service as "服务层"
|
||||
participant Model as "数据模型层"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /indicators
|
||||
API->>Service : get_list()
|
||||
Service->>Model : 查询指标
|
||||
Model->>DB : SQL查询
|
||||
DB-->>Model : 查询结果
|
||||
Model-->>Service : 指标列表
|
||||
Service-->>API : 指标数据
|
||||
API-->>Client : JSON响应
|
||||
Note over Client,DB : 异步数据库操作支持
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L46)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 指标管理API接口
|
||||
|
||||
#### 指标列表查询
|
||||
|
||||
**接口定义**
|
||||
- 方法:GET
|
||||
- 路径:`/indicators`
|
||||
- 权限:所有用户
|
||||
|
||||
**查询参数**
|
||||
|
||||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||||
|-------|------|------|--------|------|
|
||||
| indicator_type | string | 否 | 无 | 指标类型过滤 |
|
||||
| bs_dimension | string | 否 | 无 | 平衡计分卡维度过滤 |
|
||||
| is_active | boolean | 否 | 无 | 是否启用过滤 |
|
||||
| page | int | 是 | 1 | 页码 |
|
||||
| page_size | int | 是 | 20 | 每页数量 |
|
||||
|
||||
**响应结构**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "门诊量",
|
||||
"code": "IND001",
|
||||
"indicator_type": "quantity",
|
||||
"weight": 1.0,
|
||||
"max_score": 100.0,
|
||||
"target_value": 500.0,
|
||||
"unit": "人次",
|
||||
"calculation_method": "实际值/目标值*100",
|
||||
"description": "月度门诊接诊量",
|
||||
"is_active": true,
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
],
|
||||
"total": 20,
|
||||
"page": 1,
|
||||
"page_size": 20
|
||||
}
|
||||
```
|
||||
|
||||
#### 启用的指标查询
|
||||
|
||||
**接口定义**
|
||||
- 方法:GET
|
||||
- 路径:`/indicators/active`
|
||||
- 权限:所有用户
|
||||
|
||||
**响应结构**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": 1,
|
||||
"name": "门诊量",
|
||||
"code": "IND001",
|
||||
"indicator_type": "quantity",
|
||||
"weight": 1.0,
|
||||
"max_score": 100.0,
|
||||
"target_value": 500.0,
|
||||
"unit": "人次",
|
||||
"calculation_method": "实际值/目标值*100",
|
||||
"description": "月度门诊接诊量",
|
||||
"is_active": true,
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### 指标详情获取
|
||||
|
||||
**接口定义**
|
||||
- 方法:GET
|
||||
- 路径:`/indicators/{indicator_id}`
|
||||
- 权限:所有用户
|
||||
|
||||
**路径参数**
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 |
|
||||
|-------|------|------|------|
|
||||
| indicator_id | int | 是 | 指标ID |
|
||||
|
||||
**响应结构**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"name": "门诊量",
|
||||
"code": "IND001",
|
||||
"indicator_type": "quantity",
|
||||
"weight": 1.0,
|
||||
"max_score": 100.0,
|
||||
"target_value": 500.0,
|
||||
"unit": "人次",
|
||||
"calculation_method": "实际值/目标值*100",
|
||||
"description": "月度门诊接诊量",
|
||||
"is_active": true,
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 指标创建
|
||||
|
||||
**接口定义**
|
||||
- 方法:POST
|
||||
- 路径:`/indicators`
|
||||
- 权限:管理员/经理
|
||||
|
||||
**请求体结构**
|
||||
```json
|
||||
{
|
||||
"name": "门诊量",
|
||||
"code": "IND001",
|
||||
"indicator_type": "quantity",
|
||||
"weight": 1.0,
|
||||
"max_score": 100.0,
|
||||
"target_value": 500.0,
|
||||
"unit": "人次",
|
||||
"calculation_method": "实际值/目标值*100",
|
||||
"description": "月度门诊接诊量"
|
||||
}
|
||||
```
|
||||
|
||||
**响应结构**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "创建成功",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"name": "门诊量",
|
||||
"code": "IND001",
|
||||
"indicator_type": "quantity",
|
||||
"weight": 1.0,
|
||||
"max_score": 100.0,
|
||||
"target_value": 500.0,
|
||||
"unit": "人次",
|
||||
"calculation_method": "实际值/目标值*100",
|
||||
"description": "月度门诊接诊量",
|
||||
"is_active": true,
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 指标更新
|
||||
|
||||
**接口定义**
|
||||
- 方法:PUT
|
||||
- 路径:`/indicators/{indicator_id}`
|
||||
- 权限:管理员/经理
|
||||
|
||||
**请求体结构**
|
||||
```json
|
||||
{
|
||||
"name": "更新后的指标名称",
|
||||
"weight": 1.5,
|
||||
"max_score": 120.0,
|
||||
"is_active": false
|
||||
}
|
||||
```
|
||||
|
||||
**响应结构**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "更新成功",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"name": "更新后的指标名称",
|
||||
"code": "IND001",
|
||||
"indicator_type": "quantity",
|
||||
"weight": 1.5,
|
||||
"max_score": 120.0,
|
||||
"target_value": 500.0,
|
||||
"unit": "人次",
|
||||
"calculation_method": "实际值/目标值*100",
|
||||
"description": "月度门诊接诊量",
|
||||
"is_active": false,
|
||||
"created_at": "2024-01-01T00:00:00",
|
||||
"updated_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 指标删除
|
||||
|
||||
**接口定义**
|
||||
- 方法:DELETE
|
||||
- 路径:`/indicators/{indicator_id}`
|
||||
- 权限:管理员/经理
|
||||
|
||||
**响应结构**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "删除成功"
|
||||
}
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L112)
|
||||
- [docs/api.md](file://docs/api.md#L239-L296)
|
||||
|
||||
### 指标模板管理
|
||||
|
||||
#### 模板列表查询
|
||||
|
||||
**接口定义**
|
||||
- 方法:GET
|
||||
- 路径:`/templates`
|
||||
- 权限:所有用户
|
||||
|
||||
**查询参数**
|
||||
|
||||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||||
|-------|------|------|--------|------|
|
||||
| template_type | string | 否 | 无 | 模板类型过滤 |
|
||||
| is_active | boolean | 否 | 无 | 是否启用过滤 |
|
||||
| page | int | 是 | 1 | 页码 |
|
||||
| page_size | int | 是 | 20 | 每页数量 |
|
||||
|
||||
#### 模板类型列表
|
||||
|
||||
**接口定义**
|
||||
- 方法:GET
|
||||
- 路径:`/templates/types`
|
||||
- 权限:所有用户
|
||||
|
||||
**响应结构**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{"value": "general", "label": "通用模板"},
|
||||
{"value": "surgical", "label": "手术临床科室"},
|
||||
{"value": "nonsurgical_ward", "label": "非手术有病房科室"},
|
||||
{"value": "nonsurgical_noward", "label": "非手术无病房科室"},
|
||||
{"value": "medical_tech", "label": "医技科室"},
|
||||
{"value": "nursing", "label": "护理单元"},
|
||||
{"value": "admin", "label": "行政科室"},
|
||||
{"value": "logistics", "label": "后勤科室"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### BSC维度列表
|
||||
|
||||
**接口定义**
|
||||
- 方法:GET
|
||||
- 路径:`/templates/dimensions`
|
||||
- 权限:所有用户
|
||||
|
||||
**响应结构**
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "success",
|
||||
"data": [
|
||||
{"value": "financial", "label": "财务管理", "weight_range": "30%-40%"},
|
||||
{"value": "customer", "label": "顾客服务", "weight_range": "25%-35%"},
|
||||
{"value": "internal_process", "label": "内部流程", "weight_range": "20%-30%"},
|
||||
{"value": "learning_growth", "label": "学习与成长", "weight_range": "5%-15%"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L74)
|
||||
|
||||
### 权重计算和评分规则
|
||||
|
||||
系统支持多种评分方法和权重计算方式:
|
||||
|
||||
#### 权重计算流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始计算]) --> GetIndicators["获取指标列表"]
|
||||
GetIndicators --> CheckVeto{"是否包含一票否决"}
|
||||
CheckVeto --> |是| ApplyVeto["应用一票否决规则"]
|
||||
CheckVeto --> |否| CalcWeight["计算权重"]
|
||||
ApplyVeto --> CalcWeight
|
||||
CalcWeight --> CalcScore["计算指标得分"]
|
||||
CalcScore --> CalcFinal["计算最终得分"]
|
||||
CalcFinal --> End([结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L134-L136)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L106-L154)
|
||||
|
||||
#### 评分规则
|
||||
|
||||
| 评分方法 | 适用场景 | 计算公式示例 |
|
||||
|---------|----------|-------------|
|
||||
| 目标参照法 | 有明确目标值的指标 | 得分 = min(100, 实际值/目标值 × 100) |
|
||||
| 区间法 | 有合理区间范围的指标 | 根据区间位置线性计算得分 |
|
||||
| 扣分法 | 违规或负面指标 | 得分 = 最高分 - 扣分标准 × 违规次数 |
|
||||
| 加分法 | 表现优异的指标 | 得分 = 基础分 + 超额完成奖励 |
|
||||
| 比较法 | 相对排名指标 | 根据相对排名计算得分 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L130-L133)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md#L96-L109)
|
||||
|
||||
### 指标模板使用方法
|
||||
|
||||
#### 模板导入流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Admin as "管理员"
|
||||
participant API as "模板API"
|
||||
participant Service as "模板服务"
|
||||
participant DB as "数据库"
|
||||
Admin->>API : POST /templates/import
|
||||
API->>Service : import_template()
|
||||
Service->>Service : 检查模板数据
|
||||
Service->>DB : 查询现有指标
|
||||
DB-->>Service : 查询结果
|
||||
Service->>Service : 判断覆盖策略
|
||||
Service->>DB : 批量插入指标
|
||||
DB-->>Service : 插入结果
|
||||
Service-->>API : 导入统计
|
||||
API-->>Admin : 导入成功响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L128-L141)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L106-L154)
|
||||
|
||||
#### 自定义指标创建流程
|
||||
|
||||
**步骤1:基础信息配置**
|
||||
- 指标编码:唯一标识符,如 FIN001
|
||||
- 指标名称:简洁明了的指标描述
|
||||
- 指标类型:选择质量/数量/效率/服务/成本之一
|
||||
- 权重设置:根据重要程度设置权重值
|
||||
|
||||
**步骤2:维度映射**
|
||||
- 平衡计分卡维度:财务/客户/内部流程/学习成长
|
||||
- 适用科室类型:选择适用的科室类型数组
|
||||
|
||||
**步骤3:计算规则配置**
|
||||
- 计算方法:描述计算公式和步骤
|
||||
- 目标值:设定期望达到的目标值
|
||||
- 最高分值:设定指标满分对应的分值
|
||||
|
||||
**步骤4:数据验证**
|
||||
- 数据来源:指定数据采集系统
|
||||
- 扣分标准:设定违规或不达标时的扣分规则
|
||||
- 一票否决:设置是否为强制性指标
|
||||
|
||||
**章节来源**
|
||||
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py#L22-L232)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md#L69-L81)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统采用清晰的依赖层次结构,确保了模块间的松耦合:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "外部依赖"
|
||||
FastAPI[FastAPI框架]
|
||||
SQLAlchemy[SQLAlchemy ORM]
|
||||
PostgreSQL[PostgreSQL数据库]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
API[API路由层]
|
||||
Service[服务层]
|
||||
Model[模型层]
|
||||
Schema[数据模式层]
|
||||
end
|
||||
subgraph "业务模块"
|
||||
Indicator[指标管理]
|
||||
Template[模板管理]
|
||||
Assessment[考核管理]
|
||||
PerformancePlan[绩效计划]
|
||||
end
|
||||
FastAPI --> API
|
||||
SQLAlchemy --> Model
|
||||
PostgreSQL --> Model
|
||||
API --> Service
|
||||
Service --> Model
|
||||
Model --> Schema
|
||||
Service --> Schema
|
||||
API --> Indicator
|
||||
API --> Template
|
||||
API --> Assessment
|
||||
API --> PerformancePlan
|
||||
Indicator --> Template
|
||||
Assessment --> PerformancePlan
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L17)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L1-L13)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L17)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化
|
||||
|
||||
系统采用了多项数据库优化策略:
|
||||
|
||||
1. **索引优化**
|
||||
- 指标类型索引:加速指标类型查询
|
||||
- 科室类型索引:优化科室相关查询
|
||||
- 状态索引:快速筛选启用/停用指标
|
||||
|
||||
2. **查询优化**
|
||||
- 分页查询:避免一次性加载大量数据
|
||||
- 条件查询:支持多维度过滤查询
|
||||
- 异步查询:使用异步数据库连接池
|
||||
|
||||
3. **缓存策略**
|
||||
- 模板数据缓存:减少重复查询
|
||||
- 权重计算缓存:避免重复计算
|
||||
|
||||
### 前端性能优化
|
||||
|
||||
1. **懒加载**
|
||||
- 指标表格按需加载
|
||||
- 模态框内容延迟渲染
|
||||
|
||||
2. **虚拟滚动**
|
||||
- 大数据量表格的虚拟滚动支持
|
||||
|
||||
3. **请求去重**
|
||||
- 避免重复的相同查询请求
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
**问题1:指标编码重复**
|
||||
- 现象:创建指标时报错"指标编码已存在"
|
||||
- 解决方案:使用唯一的指标编码,遵循系统约定的编码规则
|
||||
|
||||
**问题2:权限不足**
|
||||
- 现象:更新或删除指标返回403权限错误
|
||||
- 解决方案:确保当前用户具有管理员或经理权限
|
||||
|
||||
**问题3:指标不存在**
|
||||
- 现象:查询特定ID指标返回404错误
|
||||
- 解决方案:确认指标ID是否正确,检查数据库中是否存在该记录
|
||||
|
||||
**问题4:模板导入失败**
|
||||
- 现象:模板导入接口报错
|
||||
- 解决方案:检查模板数据格式,确认必填字段完整
|
||||
|
||||
### 日志和监控
|
||||
|
||||
系统提供了完善的日志记录机制:
|
||||
|
||||
1. **访问日志**:记录所有API请求的详细信息
|
||||
2. **错误日志**:捕获和记录系统异常
|
||||
3. **性能日志**:监控数据库查询性能
|
||||
4. **审计日志**:记录关键业务操作
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L78-L81)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L96-L98)
|
||||
|
||||
## 结论
|
||||
|
||||
本考核指标管理接口实现了完整的平衡计分卡指标管理体系,具有以下特点:
|
||||
|
||||
1. **完整的指标生命周期管理**:从创建到删除的全流程支持
|
||||
2. **灵活的分类体系**:支持多维度、多类型的指标分类
|
||||
3. **强大的模板功能**:支持标准化模板的创建和导入
|
||||
4. **完善的权限控制**:基于角色的细粒度权限管理
|
||||
5. **高性能的架构设计**:采用异步处理和数据库优化
|
||||
|
||||
系统为医院绩效管理提供了坚实的技术基础,能够满足不同科室和岗位的差异化考核需求。
|
||||
|
||||
## 附录
|
||||
|
||||
### API接口完整列表
|
||||
|
||||
| 接口名称 | 方法 | 路径 | 权限 | 功能描述 |
|
||||
|---------|------|------|------|----------|
|
||||
| 获取指标列表 | GET | /indicators | 所有用户 | 查询所有考核指标 |
|
||||
| 获取启用指标 | GET | /indicators/active | 所有用户 | 获取所有启用的指标 |
|
||||
| 获取指标详情 | GET | /indicators/{id} | 所有用户 | 获取指定指标详情 |
|
||||
| 创建指标 | POST | /indicators | 管理员/经理 | 创建新的考核指标 |
|
||||
| 更新指标 | PUT | /indicators/{id} | 管理员/经理 | 更新现有指标信息 |
|
||||
| 删除指标 | DELETE | /indicators/{id} | 管理员/经理 | 删除指定指标 |
|
||||
| 获取模板列表 | GET | /templates | 所有用户 | 查询指标模板列表 |
|
||||
| 获取模板详情 | GET | /templates/{id} | 所有用户 | 获取模板详细信息 |
|
||||
| 创建模板 | POST | /templates | 管理员/经理 | 创建新的指标模板 |
|
||||
| 更新模板 | PUT | /templates/{id} | 管理员/经理 | 更新模板信息 |
|
||||
| 删除模板 | DELETE | /templates/{id} | 管理员/经理 | 删除指定模板 |
|
||||
|
||||
### 数据模型关系图
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum indicator_type
|
||||
enum bs_dimension
|
||||
decimal weight
|
||||
decimal max_score
|
||||
decimal target_value
|
||||
string target_unit
|
||||
string calculation_method
|
||||
string assessment_method
|
||||
string deduction_standard
|
||||
string data_source
|
||||
string applicable_dept_types
|
||||
boolean is_veto
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATOR_TEMPLATES {
|
||||
int id PK
|
||||
string template_name
|
||||
string template_code UK
|
||||
enum template_type
|
||||
text description
|
||||
text dimension_weights
|
||||
string assessment_cycle
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
TEMPLATE_INDICATORS {
|
||||
int id PK
|
||||
int template_id FK
|
||||
int indicator_id FK
|
||||
string category
|
||||
decimal target_value
|
||||
string target_unit
|
||||
decimal weight
|
||||
string scoring_method
|
||||
text scoring_params
|
||||
int sort_order
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATORS ||--o{ TEMPLATE_INDICATORS : "包含"
|
||||
INDICATOR_TEMPLATES ||--o{ TEMPLATE_INDICATORS : "定义"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L437)
|
||||
657
.qoder/repowiki/zh/content/API接口文档/工资财务接口.md
Normal file
657
.qoder/repowiki/zh/content/API接口文档/工资财务接口.md
Normal file
@@ -0,0 +1,657 @@
|
||||
# 工资财务接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [backend/app/services/finance_service.py](file://backend/app/services/finance_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js)
|
||||
- [frontend/src/api/finance.js](file://frontend/src/api/finance.js)
|
||||
- [docs/api.md](file://docs/api.md)
|
||||
- [docs/database.md](file://docs/database.md)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
|
||||
本项目是一个基于FastAPI的医院绩效管理系统,专注于工资核算和财务管理接口。系统实现了完整的工资计算流程,包括绩效奖金计算、基本工资处理、补贴扣除规则等核心功能。同时提供了全面的财务数据统计功能,涵盖收入、支出、收支结余等多维度分析。
|
||||
|
||||
系统采用前后端分离架构,后端使用Python FastAPI框架,前端使用Vue.js,数据库采用SQLAlchemy ORM。通过RESTful API接口,实现了与考核系统的数据关联和实时更新机制。
|
||||
|
||||
## 项目结构
|
||||
|
||||
项目采用模块化设计,主要分为以下几个核心模块:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端层"
|
||||
FE_API[前端API接口]
|
||||
FE_VIEW[视图组件]
|
||||
end
|
||||
subgraph "后端层"
|
||||
API_ROUTER[API路由层]
|
||||
SERVICE_LAYER[服务层]
|
||||
MODEL_LAYER[模型层]
|
||||
SCHEMA_LAYER[数据模式层]
|
||||
end
|
||||
subgraph "数据层"
|
||||
DATABASE[(数据库)]
|
||||
ASSESSMENT_DB[考核数据库]
|
||||
SALARY_DB[工资数据库]
|
||||
FINANCE_DB[财务数据库]
|
||||
end
|
||||
FE_API --> API_ROUTER
|
||||
API_ROUTER --> SERVICE_LAYER
|
||||
SERVICE_LAYER --> MODEL_LAYER
|
||||
MODEL_LAYER --> DATABASE
|
||||
MODEL_LAYER --> ASSESSMENT_DB
|
||||
MODEL_LAYER --> SALARY_DB
|
||||
MODEL_LAYER --> FINANCE_DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L1-L217)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L1-L217)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 工资核算模块
|
||||
|
||||
工资核算模块实现了完整的工资计算和管理功能,包括:
|
||||
|
||||
- **工资计算算法**:基于基本工资、绩效得分、绩效系数计算绩效奖金
|
||||
- **工资记录管理**:支持创建、更新、查询、确认工资记录
|
||||
- **批量处理功能**:支持按科室批量生成和确认工资记录
|
||||
- **状态管理**:支持pending、confirmed等状态流转
|
||||
|
||||
### 财务核算模块
|
||||
|
||||
财务核算模块提供了全面的财务数据统计和分析功能:
|
||||
|
||||
- **收入统计**:按科室、类别、时间段统计收入数据
|
||||
- **支出统计**:按科室、类别、时间段统计支出数据
|
||||
- **收支结余**:计算科室的总收入、总支出和结余
|
||||
- **财务汇总**:提供全院范围的财务数据汇总
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/services/finance_service.py](file://backend/app/services/finance_service.py#L1-L368)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构设计,确保了良好的可维护性和扩展性:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
Frontend[Vue.js前端]
|
||||
API_Client[API客户端]
|
||||
end
|
||||
subgraph "应用层"
|
||||
Auth_API[认证API]
|
||||
Salary_API[工资API]
|
||||
Finance_API[财务API]
|
||||
Stats_API[统计API]
|
||||
end
|
||||
subgraph "服务层"
|
||||
Auth_Service[认证服务]
|
||||
Salary_Service[工资服务]
|
||||
Finance_Service[财务服务]
|
||||
Stats_Service[统计服务]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
ORM_Models[ORM模型]
|
||||
Database[(数据库)]
|
||||
end
|
||||
Frontend --> API_Client
|
||||
API_Client --> Auth_API
|
||||
API_Client --> Salary_API
|
||||
API_Client --> Finance_API
|
||||
API_Client --> Stats_API
|
||||
Auth_API --> Auth_Service
|
||||
Salary_API --> Salary_Service
|
||||
Finance_API --> Finance_Service
|
||||
Stats_API --> Stats_Service
|
||||
Auth_Service --> ORM_Models
|
||||
Salary_Service --> ORM_Models
|
||||
Finance_Service --> ORM_Models
|
||||
Stats_Service --> ORM_Models
|
||||
ORM_Models --> Database
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L1-L217)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 工资计算算法
|
||||
|
||||
系统实现了标准化的工资计算算法,确保计算的准确性和一致性:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始计算]) --> GetStaff[获取员工信息]
|
||||
GetStaff --> GetAssessment[获取考核记录]
|
||||
GetAssessment --> CheckExisting{检查是否存在工资记录}
|
||||
CheckExisting --> |存在| ReturnNull[返回空值]
|
||||
CheckExisting --> |不存在| CalcBonus[计算绩效奖金]
|
||||
CalcBonus --> CalcTotal[计算总工资]
|
||||
CalcTotal --> CreateRecord[创建工资记录]
|
||||
CreateRecord --> SetPending[设置状态为pending]
|
||||
SetPending --> End([计算完成])
|
||||
ReturnNull --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
|
||||
#### 绩效奖金计算公式
|
||||
|
||||
系统采用标准化的绩效奖金计算公式:
|
||||
|
||||
```
|
||||
绩效奖金 = 绩效基数 × (绩效得分/100) × 绩效系数
|
||||
```
|
||||
|
||||
其中:
|
||||
- **绩效基数**:固定数值,可根据医院实际情况调整
|
||||
- **绩效得分**:来自考核系统的加权得分
|
||||
- **绩效系数**:来自员工档案的个人绩效系数
|
||||
|
||||
#### 工资总额计算
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class 工资总额计算 {
|
||||
+基本工资 : float
|
||||
+绩效奖金 : float
|
||||
+补贴 : float
|
||||
+扣款 : float
|
||||
+计算公式 : 总额 = 基本工资 + 绩效奖金 + 补贴 - 扣款
|
||||
}
|
||||
class 基本工资处理 {
|
||||
+从员工档案获取
|
||||
+支持手动调整
|
||||
+参与总额计算
|
||||
}
|
||||
class 绩效奖金处理 {
|
||||
+自动计算
|
||||
+基于考核结果
|
||||
+参与总额计算
|
||||
}
|
||||
class 补贴处理 {
|
||||
+支持多种类型
|
||||
+可手动调整
|
||||
+参与总额计算
|
||||
}
|
||||
class 扣款处理 {
|
||||
+支持多种类型
|
||||
+可手动调整
|
||||
+参与总额计算
|
||||
}
|
||||
工资总额计算 --> 基本工资处理
|
||||
工资总额计算 --> 绩效奖金处理
|
||||
工资总额计算 --> 补贴处理
|
||||
工资总额计算 --> 扣款处理
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L85-L91)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L274-L311)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L274-L311)
|
||||
|
||||
### 工资记录管理
|
||||
|
||||
系统提供了完整的工资记录生命周期管理:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿 : 创建记录
|
||||
草稿 --> 待确认 : 更新记录
|
||||
待确认 --> 已确认 : 确认操作
|
||||
已确认 --> 发放中 : 工资发放
|
||||
已确认 --> 草稿 : 修改记录
|
||||
发放中 --> 已完成 : 发放完成
|
||||
草稿 --> [*] : 删除记录
|
||||
待确认 --> [*] : 删除记录
|
||||
已确认 --> [*] : 删除记录
|
||||
```
|
||||
|
||||
#### 工资记录状态流转
|
||||
|
||||
| 状态 | 描述 | 权限要求 | 功能限制 |
|
||||
|------|------|----------|----------|
|
||||
| pending | 待确认 | 管理员/经理 | 可修改、可删除 |
|
||||
| confirmed | 已确认 | 管理员/经理 | 只读状态 |
|
||||
| paid | 已发放 | 管理员/经理 | 只读状态 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L299-L311)
|
||||
|
||||
### 财务数据统计
|
||||
|
||||
财务核算模块提供了多维度的财务数据分析功能:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "财务数据源"
|
||||
HIS[HIS系统]
|
||||
财务系统[财务系统]
|
||||
人事系统[人事系统]
|
||||
end
|
||||
subgraph "数据处理"
|
||||
数据采集[数据采集]
|
||||
数据清洗[数据清洗]
|
||||
数据计算[数据计算]
|
||||
end
|
||||
subgraph "统计分析"
|
||||
收入统计[收入统计]
|
||||
支出统计[支出统计]
|
||||
结余分析[结余分析]
|
||||
趋势分析[趋势分析]
|
||||
end
|
||||
HIS --> 数据采集
|
||||
财务系统 --> 数据采集
|
||||
人事系统 --> 数据采集
|
||||
数据采集 --> 数据清洗
|
||||
数据清洗 --> 数据计算
|
||||
数据计算 --> 收入统计
|
||||
数据计算 --> 支出统计
|
||||
数据计算 --> 结余分析
|
||||
数据计算 --> 趋势分析
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/finance_service.py](file://backend/app/services/finance_service.py#L43-L91)
|
||||
- [backend/app/services/finance_service.py](file://backend/app/services/finance_service.py#L93-L141)
|
||||
|
||||
#### 财务类别管理
|
||||
|
||||
系统支持两类财务类别:
|
||||
|
||||
**收入类别**:
|
||||
- 检查费、检验费、放射费
|
||||
- 床位费、护理费、治疗费
|
||||
- 手术费、注射费、吸氧费
|
||||
- 其他收入
|
||||
|
||||
**支出类别**:
|
||||
- 材料费、人员支出
|
||||
- 维修费、水电费
|
||||
- 其他支出
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L16-L43)
|
||||
- [backend/app/services/finance_service.py](file://backend/app/services/finance_service.py#L20-L42)
|
||||
|
||||
### 批量处理功能
|
||||
|
||||
系统提供了高效的批量处理能力:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Manager as 管理员
|
||||
participant API as 工资API
|
||||
participant Service as 工资服务
|
||||
participant DB as 数据库
|
||||
Manager->>API : POST /salary/batch-generate
|
||||
API->>Service : batch_generate_for_department()
|
||||
Service->>DB : 查询已确认考核记录
|
||||
DB-->>Service : 考核记录列表
|
||||
loop 为每个员工生成工资记录
|
||||
Service->>Service : generate_from_assessment()
|
||||
Service->>DB : 创建工资记录
|
||||
end
|
||||
Service-->>API : 工资记录列表
|
||||
API-->>Manager : 批量生成结果
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L192-L219)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L192-L219)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L113-L129)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统采用了清晰的依赖层次结构,确保了模块间的松耦合:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "外部依赖"
|
||||
FastAPI[FastAPI框架]
|
||||
SQLAlchemy[SQLAlchemy ORM]
|
||||
PostgreSQL[PostgreSQL数据库]
|
||||
end
|
||||
subgraph "核心依赖"
|
||||
Pydantic[Pydantic数据验证]
|
||||
AsyncIO[异步I/O支持]
|
||||
JWT[JWT认证]
|
||||
end
|
||||
subgraph "业务依赖"
|
||||
AssessmentService[考核服务]
|
||||
StaffService[员工服务]
|
||||
DepartmentService[科室服务]
|
||||
end
|
||||
FastAPI --> Pydantic
|
||||
FastAPI --> SQLAlchemy
|
||||
FastAPI --> JWT
|
||||
SQLAlchemy --> PostgreSQL
|
||||
AssessmentService --> StaffService
|
||||
StaffService --> DepartmentService
|
||||
Pydantic --> AssessmentService
|
||||
AsyncIO --> FastAPI
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
|
||||
### 数据模型关系
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
float base_salary
|
||||
float performance_ratio
|
||||
}
|
||||
ASSESSMENT {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
float weighted_score
|
||||
string status
|
||||
}
|
||||
SALARY_RECORD {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
float base_salary
|
||||
float performance_score
|
||||
float performance_bonus
|
||||
float allowance
|
||||
float deduction
|
||||
float total_salary
|
||||
string status
|
||||
}
|
||||
DEPARTMENT {
|
||||
int id PK
|
||||
string name
|
||||
string code
|
||||
string dept_type
|
||||
}
|
||||
STAFF ||--o{ ASSESSMENT : has
|
||||
STAFF ||--o{ SALARY_RECORD : has
|
||||
DEPARTMENT ||--o{ STAFF : has
|
||||
ASSESSMENT ||--|| SALARY_RECORD : generates
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L231)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L231)
|
||||
- [docs/database.md](file://docs/database.md#L197-L216)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化
|
||||
|
||||
系统在数据库层面采用了多项优化策略:
|
||||
|
||||
- **索引优化**:为常用查询字段建立复合索引
|
||||
- **查询优化**:使用selectinload避免N+1查询问题
|
||||
- **分页处理**:支持大数据量的分页查询
|
||||
- **连接池**:使用异步连接池提高并发性能
|
||||
|
||||
### 缓存策略
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "缓存层"
|
||||
Redis[Redis缓存]
|
||||
Session[会话缓存]
|
||||
end
|
||||
subgraph "应用层"
|
||||
API[API接口]
|
||||
Service[服务层]
|
||||
CacheManager[缓存管理器]
|
||||
end
|
||||
subgraph "数据层"
|
||||
Database[(数据库)]
|
||||
end
|
||||
API --> CacheManager
|
||||
Service --> CacheManager
|
||||
CacheManager --> Redis
|
||||
CacheManager --> Session
|
||||
Redis --> Database
|
||||
Session --> Database
|
||||
```
|
||||
|
||||
### 异步处理
|
||||
|
||||
系统广泛采用异步编程模式:
|
||||
|
||||
- **异步数据库操作**:使用SQLAlchemy异步引擎
|
||||
- **异步文件处理**:支持大文件的异步导入导出
|
||||
- **异步任务队列**:支持长时间运行的任务处理
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
| 问题类型 | 症状描述 | 可能原因 | 解决方案 |
|
||||
|----------|----------|----------|----------|
|
||||
| 工资生成失败 | 返回400错误 | 未找到已确认的考核记录 | 检查考核状态是否为finalized |
|
||||
| 权限不足 | 返回403错误 | 用户权限不足 | 确保用户具有管理员或经理权限 |
|
||||
| 数据重复 | 生成工资记录失败 | 工资记录已存在 | 检查是否存在重复的工资记录 |
|
||||
| 计算错误 | 工资计算结果异常 | 数据类型转换错误 | 验证输入数据的数值格式 |
|
||||
|
||||
### 日志记录
|
||||
|
||||
系统提供了完善的日志记录机制:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "日志级别"
|
||||
ERROR[错误日志]
|
||||
WARN[警告日志]
|
||||
INFO[信息日志]
|
||||
DEBUG[调试日志]
|
||||
end
|
||||
subgraph "日志内容"
|
||||
AUTH[认证日志]
|
||||
SALARY[工资日志]
|
||||
FINANCE[财务日志]
|
||||
SYSTEM[系统日志]
|
||||
end
|
||||
ERROR --> AUTH
|
||||
ERROR --> SALARY
|
||||
ERROR --> FINANCE
|
||||
ERROR --> SYSTEM
|
||||
WARN --> AUTH
|
||||
WARN --> SALARY
|
||||
WARN --> FINANCE
|
||||
WARN --> SYSTEM
|
||||
INFO --> AUTH
|
||||
INFO --> SALARY
|
||||
INFO --> FINANCE
|
||||
INFO --> SYSTEM
|
||||
DEBUG --> AUTH
|
||||
DEBUG --> SALARY
|
||||
DEBUG --> FINANCE
|
||||
DEBUG --> SYSTEM
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
|
||||
|
||||
## 结论
|
||||
|
||||
本工资财务接口系统实现了医院绩效管理的核心功能,具有以下特点:
|
||||
|
||||
1. **完整性**:涵盖了工资核算和财务管理的所有核心功能
|
||||
2. **准确性**:采用标准化的计算算法,确保计算结果的准确性
|
||||
3. **可扩展性**:模块化设计,易于功能扩展和维护
|
||||
4. **安全性**:完善的权限控制和数据验证机制
|
||||
5. **高效性**:异步处理和数据库优化,支持高并发场景
|
||||
|
||||
系统通过与考核系统的深度集成,实现了从考核到工资发放的完整业务流程自动化,为医院的绩效管理提供了强有力的技术支撑。
|
||||
|
||||
## 附录
|
||||
|
||||
### API接口规范
|
||||
|
||||
#### 工资核算接口
|
||||
|
||||
| 接口 | 方法 | 描述 | 权限要求 |
|
||||
|------|------|------|----------|
|
||||
| `/salary` | GET | 获取工资记录列表 | 普通用户 |
|
||||
| `/salary/{id}` | GET | 获取工资记录详情 | 普通用户 |
|
||||
| `/salary` | POST | 创建工资记录 | 管理员/经理 |
|
||||
| `/salary/{id}` | PUT | 更新工资记录 | 管理员/经理 |
|
||||
| `/salary/generate` | POST | 根据考核生成工资 | 管理员/经理 |
|
||||
| `/salary/batch-generate` | POST | 批量生成工资 | 管理员/经理 |
|
||||
| `/salary/{id}/confirm` | POST | 确认工资 | 管理员/经理 |
|
||||
| `/salary/batch-confirm` | POST | 批量确认工资 | 管理员/经理 |
|
||||
|
||||
#### 财务核算接口
|
||||
|
||||
| 接口 | 方法 | 描述 | 权限要求 |
|
||||
|------|------|------|----------|
|
||||
| `/finance/revenue` | GET | 获取科室收入 | 普通用户 |
|
||||
| `/finance/expense` | GET | 获取科室支出 | 普通用户 |
|
||||
| `/finance/balance` | GET | 获取收支结余 | 普通用户 |
|
||||
| `/finance/revenue/by-category` | GET | 按类别统计收入 | 普通用户 |
|
||||
| `/finance/expense/by-category` | GET | 按类别统计支出 | 普通用户 |
|
||||
| `/finance/summary` | GET | 获取科室财务汇总 | 普通用户 |
|
||||
| `/finance/categories` | GET | 获取财务类别 | 普通用户 |
|
||||
| `/finance` | POST | 创建财务记录 | 管理员/经理 |
|
||||
| `/finance/{id}` | PUT | 更新财务记录 | 管理员/经理 |
|
||||
| `/finance/{id}` | DELETE | 删除财务记录 | 管理员/经理 |
|
||||
|
||||
### 数据模型说明
|
||||
|
||||
#### 工资记录字段
|
||||
|
||||
| 字段名 | 类型 | 描述 | 默认值 |
|
||||
|--------|------|------|--------|
|
||||
| id | Integer | 主键 | 自增 |
|
||||
| staff_id | Integer | 员工ID | 外键 |
|
||||
| period_year | Integer | 年度 | 必填 |
|
||||
| period_month | Integer | 月份 | 必填 |
|
||||
| base_salary | Numeric(10,2) | 基本工资 | 0.00 |
|
||||
| performance_score | Numeric(5,2) | 绩效得分 | 0.00 |
|
||||
| performance_bonus | Numeric(10,2) | 绩效奖金 | 0.00 |
|
||||
| allowance | Numeric(10,2) | 补贴 | 0.00 |
|
||||
| deduction | Numeric(10,2) | 扣款 | 0.00 |
|
||||
| total_salary | Numeric(10,2) | 应发工资 | 0.00 |
|
||||
| status | String(20) | 状态 | pending |
|
||||
| remark | Text | 备注 | null |
|
||||
| created_at | DateTime | 创建时间 | 当前时间 |
|
||||
| updated_at | DateTime | 更新时间 | 当前时间 |
|
||||
|
||||
#### 财务记录字段
|
||||
|
||||
| 字段名 | 类型 | 描述 | 默认值 |
|
||||
|--------|------|------|--------|
|
||||
| id | Integer | 主键 | 自增 |
|
||||
| department_id | Integer | 科室ID | 外键 |
|
||||
| period_year | Integer | 年度 | 必填 |
|
||||
| period_month | Integer | 月份 | 必填 |
|
||||
| finance_type | Enum | 财务类型 | 必填 |
|
||||
| category | String(50) | 类别 | 必填 |
|
||||
| amount | Numeric(12,2) | 金额 | 0.00 |
|
||||
| source | String(100) | 数据来源 | null |
|
||||
| remark | Text | 备注 | null |
|
||||
| created_at | DateTime | 创建时间 | 当前时间 |
|
||||
| updated_at | DateTime | 更新时间 | 当前时间 |
|
||||
|
||||
### 使用示例
|
||||
|
||||
#### 工资计算示例
|
||||
|
||||
```javascript
|
||||
// 获取工资列表
|
||||
const response = await getSalaryRecords({
|
||||
department_id: 1,
|
||||
period_year: 2024,
|
||||
period_month: 1,
|
||||
status: 'confirmed'
|
||||
});
|
||||
|
||||
// 生成工资记录
|
||||
const generateResponse = await generateSalary({
|
||||
staff_id: 1,
|
||||
period_year: 2024,
|
||||
period_month: 1
|
||||
});
|
||||
|
||||
// 批量生成工资
|
||||
const batchResponse = await batchGenerateSalary({
|
||||
department_id: 1,
|
||||
period_year: 2024,
|
||||
period_month: 1
|
||||
});
|
||||
```
|
||||
|
||||
#### 财务统计示例
|
||||
|
||||
```javascript
|
||||
// 获取收入统计
|
||||
const revenue = await getRevenue({
|
||||
department_id: 1,
|
||||
period_year: 2024,
|
||||
period_month: 1
|
||||
});
|
||||
|
||||
// 获取支出统计
|
||||
const expense = await getExpense({
|
||||
department_id: 1,
|
||||
period_year: 2024,
|
||||
period_month: 1
|
||||
});
|
||||
|
||||
// 获取收支结余
|
||||
const balance = await getBalance({
|
||||
department_id: 1,
|
||||
period_year: 2024,
|
||||
period_month: 1
|
||||
});
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [docs/api.md](file://docs/api.md#L401-L469)
|
||||
- [docs/api.md](file://docs/api.md#L471-L538)
|
||||
563
.qoder/repowiki/zh/content/API接口文档/系统管理接口.md
Normal file
563
.qoder/repowiki/zh/content/API接口文档/系统管理接口.md
Normal file
@@ -0,0 +1,563 @@
|
||||
# 系统管理接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_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/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/views/system/Menus.vue](file://frontend/src/views/system/Menus.vue)
|
||||
- [frontend/dist/assets/menu-CltzMZXm.js](file://frontend/dist/assets/menu-CltzMZXm.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档为医院绩效管理系统的系统管理接口提供全面的API文档。该系统采用FastAPI + SQLAlchemy 2.0架构,实现了完整的菜单权限管理、系统配置和用户角色管理功能。
|
||||
|
||||
系统的核心特性包括:
|
||||
- **菜单权限管理**:支持树形菜单结构的增删改查操作
|
||||
- **RBAC权限控制**:基于角色的访问控制模型
|
||||
- **动态菜单生成**:根据用户权限动态生成前端路由
|
||||
- **系统配置管理**:集中化的系统参数配置
|
||||
- **日志管理和审计追踪**:完整的操作日志记录
|
||||
- **用户角色管理**:灵活的角色权限模型
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统采用分层架构设计,主要分为以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端层"
|
||||
FE_Router[Vue Router]
|
||||
FE_API[API请求封装]
|
||||
FE_Components[业务组件]
|
||||
end
|
||||
subgraph "后端层"
|
||||
API_Router[FastAPI Router]
|
||||
Security[安全认证]
|
||||
Services[业务服务层]
|
||||
Models[数据模型层]
|
||||
Schemas[数据模式层]
|
||||
end
|
||||
subgraph "基础设施层"
|
||||
Database[(PostgreSQL数据库)]
|
||||
Logging[日志系统]
|
||||
Config[配置管理]
|
||||
end
|
||||
FE_Router --> FE_API
|
||||
FE_API --> API_Router
|
||||
API_Router --> Security
|
||||
API_Router --> Services
|
||||
Services --> Models
|
||||
Models --> Database
|
||||
Services --> Schemas
|
||||
API_Router --> Logging
|
||||
API_Router --> Config
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [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-L16)
|
||||
|
||||
**章节来源**
|
||||
- [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-L16)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 菜单管理模块
|
||||
|
||||
菜单管理是系统权限控制的核心组件,提供了完整的菜单树形结构管理功能:
|
||||
|
||||
- **菜单树形结构**:支持无限级菜单嵌套
|
||||
- **权限标识**:每个菜单可绑定特定的权限标识
|
||||
- **动态显示**:根据用户权限动态过滤可见菜单
|
||||
- **排序控制**:支持菜单排序和层级管理
|
||||
|
||||
### 用户认证与授权
|
||||
|
||||
系统实现了基于JWT的认证机制和RBAC权限控制:
|
||||
|
||||
- **多角色支持**:admin(管理员)、manager(经理)、staff(普通员工)
|
||||
- **权限验证**:不同操作需要不同的权限级别
|
||||
- **会话管理**:Token过期自动失效
|
||||
|
||||
### 系统配置管理
|
||||
|
||||
集中化的配置管理确保了系统的灵活性和可维护性:
|
||||
|
||||
- **环境配置**:支持多种部署环境
|
||||
- **数据库连接池**:优化数据库连接性能
|
||||
- **CORS配置**:灵活的跨域访问控制
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L110)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用经典的三层架构模式,确保了良好的可维护性和扩展性:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
Frontend[Vue.js前端]
|
||||
Router[路由系统]
|
||||
Store[状态管理]
|
||||
end
|
||||
subgraph "应用层"
|
||||
API[FastAPI API]
|
||||
Auth[认证服务]
|
||||
MenuSvc[菜单服务]
|
||||
StaffSvc[员工服务]
|
||||
DeptSvc[科室服务]
|
||||
end
|
||||
subgraph "数据层"
|
||||
ORM[SQLAlchemy ORM]
|
||||
DB[(PostgreSQL)]
|
||||
Redis[(Redis缓存)]
|
||||
end
|
||||
Frontend --> API
|
||||
API --> Auth
|
||||
API --> MenuSvc
|
||||
API --> StaffSvc
|
||||
API --> DeptSvc
|
||||
MenuSvc --> ORM
|
||||
StaffSvc --> ORM
|
||||
DeptSvc --> ORM
|
||||
ORM --> DB
|
||||
Auth --> Redis
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 菜单权限管理API
|
||||
|
||||
#### 菜单树形结构查询
|
||||
|
||||
系统提供了获取菜单树形结构的接口,支持根据权限过滤可见菜单:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "菜单API"
|
||||
participant Service as "菜单服务"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /menus/tree?visible_only=true
|
||||
API->>Service : get_tree(visible_only=True)
|
||||
Service->>DB : 查询根菜单
|
||||
DB-->>Service : 返回菜单列表
|
||||
Service->>Service : 递归构建树形结构
|
||||
Service-->>API : 返回菜单树
|
||||
API-->>Client : 菜单树形结构
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L17-L29)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
|
||||
#### 菜单增删改查操作
|
||||
|
||||
系统提供了完整的菜单管理操作接口:
|
||||
|
||||
| 接口 | 方法 | 路径 | 权限要求 | 功能描述 |
|
||||
|------|------|------|----------|----------|
|
||||
| 获取菜单树 | GET | /menus/tree | 任意用户 | 获取完整的菜单树形结构 |
|
||||
| 获取菜单列表 | GET | /menus | 任意用户 | 获取菜单列表(可筛选) |
|
||||
| 获取菜单详情 | GET | /menus/{menu_id} | 任意用户 | 获取指定菜单详情 |
|
||||
| 创建菜单 | POST | /menus | 管理员/经理 | 创建新的菜单项 |
|
||||
| 更新菜单 | PUT | /menus/{menu_id} | 管理员/经理 | 更新现有菜单 |
|
||||
| 删除菜单 | DELETE | /menus/{menu_id} | 管理员/经理 | 删除菜单项 |
|
||||
| 初始化菜单 | POST | /menus/init | 管理员 | 初始化默认菜单结构 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L17-L164)
|
||||
|
||||
#### 菜单数据模型
|
||||
|
||||
菜单系统的核心数据模型定义:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Menu {
|
||||
+int id
|
||||
+int parent_id
|
||||
+MenuType menu_type
|
||||
+string menu_name
|
||||
+string menu_icon
|
||||
+string path
|
||||
+string component
|
||||
+string permission
|
||||
+int sort_order
|
||||
+bool is_visible
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+Menu[] children
|
||||
+Menu parent
|
||||
}
|
||||
class MenuType {
|
||||
<<enumeration>>
|
||||
MENU
|
||||
BUTTON
|
||||
}
|
||||
Menu --> MenuType : uses
|
||||
Menu --> Menu : parent_child
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L347-L373)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L347-L373)
|
||||
|
||||
### RBAC权限控制模型
|
||||
|
||||
#### 角色权限架构
|
||||
|
||||
系统实现了基于角色的访问控制(RBAC)模型:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "用户角色"
|
||||
Admin[管理员 - admin]
|
||||
Manager[经理 - manager]
|
||||
Staff[员工 - staff]
|
||||
end
|
||||
subgraph "权限级别"
|
||||
Level1[读取权限]
|
||||
Level2[写入权限]
|
||||
Level3[管理权限]
|
||||
end
|
||||
subgraph "权限矩阵"
|
||||
MenuAccess[菜单访问]
|
||||
UserManage[用户管理]
|
||||
SystemConfig[系统配置]
|
||||
end
|
||||
Admin --> Level3
|
||||
Manager --> Level2
|
||||
Staff --> Level1
|
||||
Level3 --> MenuAccess
|
||||
Level3 --> UserManage
|
||||
Level3 --> SystemConfig
|
||||
Level2 --> MenuAccess
|
||||
Level2 --> UserManage
|
||||
Level1 --> MenuAccess
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L110)
|
||||
|
||||
#### 权限验证机制
|
||||
|
||||
系统通过装饰器实现权限验证:
|
||||
|
||||
| 装饰器 | 权限要求 | 用途 |
|
||||
|--------|----------|------|
|
||||
| get_current_active_user | 有效用户 | 基础用户验证 |
|
||||
| get_current_manager_user | 管理员或经理 | 管理操作权限 |
|
||||
| get_current_admin_user | 管理员 | 系统管理权限 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
|
||||
|
||||
### 用户角色管理
|
||||
|
||||
#### 用户认证流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant AuthAPI as "认证API"
|
||||
participant Security as "安全模块"
|
||||
participant DB as "用户表"
|
||||
participant Token as "JWT Token"
|
||||
Client->>AuthAPI : POST /auth/login
|
||||
AuthAPI->>Security : 验证用户名密码
|
||||
Security->>DB : 查询用户信息
|
||||
DB-->>Security : 返回用户数据
|
||||
Security->>Security : 验证密码
|
||||
Security->>Token : 生成访问令牌
|
||||
Security-->>AuthAPI : 返回Token
|
||||
AuthAPI-->>Client : {access_token, token_type}
|
||||
Note over Client,Token : 用户登录成功
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [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)
|
||||
|
||||
#### 员工管理API
|
||||
|
||||
系统提供了完整的员工信息管理功能:
|
||||
|
||||
| 接口 | 方法 | 路径 | 权限要求 | 功能描述 |
|
||||
|------|------|------|----------|----------|
|
||||
| 获取员工列表 | GET | /staff | 任意用户 | 获取员工列表(支持分页和筛选) |
|
||||
| 获取员工详情 | GET | /staff/{staff_id} | 任意用户 | 获取指定员工详情 |
|
||||
| 创建员工 | POST | /staff | 管理员/经理 | 创建新员工 |
|
||||
| 更新员工 | PUT | /staff/{staff_id} | 管理员/经理 | 更新员工信息 |
|
||||
| 删除员工 | DELETE | /staff/{staff_id} | 管理员/经理 | 删除员工 |
|
||||
| 科室员工列表 | GET | /staff/department/{department_id} | 任意用户 | 获取科室所有员工 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
|
||||
### 科室管理API
|
||||
|
||||
#### 科室树形结构管理
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> GetTree["获取科室树形结构"]
|
||||
GetTree --> FilterType{"按类型筛选?"}
|
||||
FilterType --> |是| ApplyFilter["应用类型过滤条件"]
|
||||
FilterType --> |否| BuildTree["构建树形结构"]
|
||||
ApplyFilter --> BuildTree
|
||||
BuildTree --> ManualBuild["手动构建树节点"]
|
||||
ManualBuild --> CheckParent{"检查父节点"}
|
||||
CheckParent --> |有父节点| AddChild["添加到父节点"]
|
||||
CheckParent --> |无父节点| AddRoot["添加到根节点"]
|
||||
AddChild --> NextNode["处理下一个节点"]
|
||||
AddRoot --> NextNode
|
||||
NextNode --> MoreNodes{"还有节点?"}
|
||||
MoreNodes --> |是| ManualBuild
|
||||
MoreNodes --> |否| ReturnTree["返回树形结构"]
|
||||
ReturnTree --> End([结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L112-L149)
|
||||
|
||||
**章节来源**
|
||||
- [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#L112-L149)
|
||||
|
||||
### 系统配置管理
|
||||
|
||||
#### 配置文件结构
|
||||
|
||||
系统采用集中式配置管理:
|
||||
|
||||
| 配置项 | 类型 | 默认值 | 描述 |
|
||||
|--------|------|--------|------|
|
||||
| APP_NAME | string | "医院绩效考核管理系统" | 应用名称 |
|
||||
| APP_VERSION | string | "1.0.0" | 应用版本 |
|
||||
| DEBUG | boolean | true | 调试模式 |
|
||||
| API_PREFIX | string | "/api/v1" | API前缀 |
|
||||
| DATABASE_URL | string | PostgreSQL连接串 | 数据库连接地址 |
|
||||
| SECRET_KEY | string | JWT密钥 | JWT签名密钥 |
|
||||
| ACCESS_TOKEN_EXPIRE_MINUTES | integer | 480 | Token过期时间(分钟) |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
|
||||
### 日志管理和审计追踪
|
||||
|
||||
#### 日志系统架构
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "日志级别"
|
||||
INFO[INFO - 控制台输出]
|
||||
DEBUG[DEBUG - 文件输出]
|
||||
ERROR[ERROR - 错误文件输出]
|
||||
end
|
||||
subgraph "日志处理器"
|
||||
ConsoleHandler[控制台处理器]
|
||||
FileHandler[文件处理器]
|
||||
ErrorHandler[错误处理器]
|
||||
end
|
||||
subgraph "日志文件"
|
||||
AppLog[app_YYYYMMDD.log]
|
||||
ErrorLog[error_YYYYMMDD.log]
|
||||
end
|
||||
INFO --> ConsoleHandler
|
||||
DEBUG --> FileHandler
|
||||
ERROR --> ErrorHandler
|
||||
ConsoleHandler --> AppLog
|
||||
FileHandler --> AppLog
|
||||
ErrorHandler --> ErrorLog
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L26-L59)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 前后端交互关系
|
||||
|
||||
系统实现了前后端分离的架构模式:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "前端应用"
|
||||
Router[Vue Router]
|
||||
API[API封装]
|
||||
Components[业务组件]
|
||||
end
|
||||
subgraph "后端服务"
|
||||
FastAPI[FastAPI应用]
|
||||
Auth[认证中间件]
|
||||
MenuAPI[菜单API]
|
||||
StaffAPI[员工API]
|
||||
DeptAPI[科室API]
|
||||
end
|
||||
subgraph "外部服务"
|
||||
PostgreSQL[(PostgreSQL)]
|
||||
Redis[(Redis)]
|
||||
end
|
||||
Router --> API
|
||||
API --> FastAPI
|
||||
FastAPI --> Auth
|
||||
FastAPI --> MenuAPI
|
||||
FastAPI --> StaffAPI
|
||||
FastAPI --> DeptAPI
|
||||
MenuAPI --> PostgreSQL
|
||||
StaffAPI --> PostgreSQL
|
||||
DeptAPI --> PostgreSQL
|
||||
Auth --> Redis
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L98-L115)
|
||||
- [frontend/src/views/system/Menus.vue](file://frontend/src/views/system/Menus.vue#L84-L102)
|
||||
|
||||
### 菜单权限与前端路由同步
|
||||
|
||||
系统实现了菜单权限与前端路由的实时同步机制:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端应用"
|
||||
participant API as "后端API"
|
||||
participant MenuSvc as "菜单服务"
|
||||
participant Store as "状态管理"
|
||||
FE->>Store : 请求菜单权限
|
||||
Store->>API : GET /menus/tree
|
||||
API->>MenuSvc : get_tree(visible_only=True)
|
||||
MenuSvc->>MenuSvc : 过滤可见菜单
|
||||
MenuSvc->>MenuSvc : 构建权限树
|
||||
MenuSvc-->>API : 返回权限菜单树
|
||||
API-->>Store : 菜单权限数据
|
||||
Store->>Store : 更新路由配置
|
||||
Store-->>FE : 渲染权限路由
|
||||
Note over FE,Store : 实时权限更新
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/dist/assets/menu-CltzMZXm.js](file://frontend/dist/assets/menu-CltzMZXm.js#L1-L1)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L17-L29)
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L82-L96)
|
||||
- [frontend/src/views/system/Menus.vue](file://frontend/src/views/system/Menus.vue#L84-L102)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化策略
|
||||
|
||||
系统采用了多项数据库优化措施:
|
||||
|
||||
- **连接池管理**:配置合理的连接池大小,避免连接过多导致的性能问题
|
||||
- **索引优化**:为常用查询字段建立索引,提高查询效率
|
||||
- **异步操作**:使用异步数据库操作,提升并发处理能力
|
||||
- **查询优化**:使用selectinload进行关联查询,避免N+1查询问题
|
||||
|
||||
### 缓存策略
|
||||
|
||||
系统实现了多层次的缓存机制:
|
||||
|
||||
- **Redis缓存**:用于存储用户会话和热点数据
|
||||
- **数据库查询缓存**:缓存常用的查询结果
|
||||
- **静态资源缓存**:前端静态资源的长期缓存
|
||||
|
||||
### 性能监控
|
||||
|
||||
系统提供了基本的性能监控能力:
|
||||
|
||||
- **健康检查**:提供系统健康状态检查接口
|
||||
- **日志监控**:详细的日志记录和错误追踪
|
||||
- **异常处理**:完善的异常处理和错误恢复机制
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题诊断
|
||||
|
||||
#### 认证相关问题
|
||||
|
||||
| 问题症状 | 可能原因 | 解决方案 |
|
||||
|----------|----------|----------|
|
||||
| 登录失败 | 用户名或密码错误 | 检查用户凭据是否正确 |
|
||||
| Token过期 | 访问令牌超时 | 重新登录获取新Token |
|
||||
| 权限不足 | 用户角色权限不够 | 检查用户角色配置 |
|
||||
|
||||
#### 菜单权限问题
|
||||
|
||||
| 问题症状 | 可能原因 | 解决方案 |
|
||||
|----------|----------|----------|
|
||||
| 菜单不显示 | 权限过滤导致 | 检查菜单的is_visible和is_active状态 |
|
||||
| 路由无法访问 | 权限标识不匹配 | 验证菜单的permission字段 |
|
||||
| 菜单层级错误 | 父子关系配置错误 | 检查parent_id字段设置 |
|
||||
|
||||
#### 数据库连接问题
|
||||
|
||||
| 问题症状 | 可能原因 | 解决方案 |
|
||||
|----------|----------|----------|
|
||||
| 连接超时 | 数据库负载过高 | 检查数据库连接池配置 |
|
||||
| 查询缓慢 | 缺少索引 | 为常用查询字段添加索引 |
|
||||
| 连接数过多 | 未正确关闭连接 | 检查数据库连接管理 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L58-L74)
|
||||
|
||||
### 系统监控接口
|
||||
|
||||
系统提供了基本的监控和诊断接口:
|
||||
|
||||
- **健康检查**:`GET /health` - 检查系统运行状态
|
||||
- **日志查看**:系统自动记录应用日志和错误日志
|
||||
- **配置检查**:验证系统配置的有效性
|
||||
|
||||
## 结论
|
||||
|
||||
本系统管理接口文档详细介绍了医院绩效管理系统的菜单权限管理、用户角色管理和系统配置功能。系统采用现代化的技术栈和架构设计,实现了:
|
||||
|
||||
1. **完整的权限控制**:基于RBAC的细粒度权限管理
|
||||
2. **灵活的菜单系统**:支持树形结构和动态权限过滤
|
||||
3. **可靠的认证机制**:基于JWT的安全认证
|
||||
4. **完善的日志系统**:全面的操作审计和错误追踪
|
||||
5. **良好的扩展性**:清晰的分层架构便于功能扩展
|
||||
|
||||
通过本文档,开发者可以快速理解和使用系统管理接口,同时为系统的进一步开发和维护提供了清晰的指导。
|
||||
423
.qoder/repowiki/zh/content/API接口文档/统计分析接口.md
Normal file
423
.qoder/repowiki/zh/content/API接口文档/统计分析接口.md
Normal file
@@ -0,0 +1,423 @@
|
||||
# 统计分析接口
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js)
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue)
|
||||
- [docs/api.md](file://docs/api.md)
|
||||
- [docs/详细设计文档.md](file://docs/详细设计文档.md)
|
||||
- [backend/init_db.py](file://backend/init_db.py)
|
||||
- [TEST_REPORT.md](file://TEST_REPORT.md)
|
||||
- [frontend/public/test-api.html](file://frontend/public/test-api.html)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“统计分析与报表接口”的使用者与维护者,系统化梳理后端统计接口、服务层实现、数据模型与前端调用方式,并补充计算逻辑、时间范围选择、聚合方式、同比环比分析、多维交叉分析、数据钻取与筛选、报表导出、缓存策略与性能优化建议,以及移动端适配与响应时间优化思路。文档同时给出接口参数、响应结构与图表数据格式,帮助快速集成与扩展。
|
||||
|
||||
## 项目结构
|
||||
统计分析相关代码分布在后端 API、服务层、模型与前端调用层,配合通用响应与数据模式定义,形成清晰的分层架构。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_API["frontend/src/api/stats.js"]
|
||||
FE_VIEW["frontend/src/views/reports/Reports.vue"]
|
||||
end
|
||||
subgraph "后端"
|
||||
API["backend/app/api/v1/stats.py"]
|
||||
SVC["backend/app/services/stats_service.py"]
|
||||
MODELS["backend/app/models/models.py"]
|
||||
SCHEMAS["backend/app/schemas/schemas.py"]
|
||||
end
|
||||
FE_API --> API
|
||||
FE_VIEW --> FE_API
|
||||
API --> SVC
|
||||
SVC --> MODELS
|
||||
API --> SCHEMAS
|
||||
SVC --> SCHEMAS
|
||||
```
|
||||
|
||||
图示来源
|
||||
- [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-L200)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
|
||||
章节来源
|
||||
- [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-L200)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
|
||||
## 核心组件
|
||||
- 统计 API 路由器:提供 BSC 维度分析、科室绩效统计、趋势分析、周期统计、KPI 仪表盘、收支趋势、科室/员工排名、指标完成度等接口。
|
||||
- 统计服务层:封装 SQL 查询与聚合逻辑,负责跨表联结、条件过滤、分组统计与排序。
|
||||
- 数据模型:定义 BSC 维度、指标类型、评估状态、部门类型等枚举与实体关系。
|
||||
- 前端调用与视图:封装 axios 请求、发起多路并发请求、渲染 ECharts 图表与表格。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L61)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L112-L308)
|
||||
|
||||
## 架构总览
|
||||
统计接口采用 FastAPI + SQLAlchemy 异步 ORM 的分层设计,前端通过统一的 API 封装进行调用,后端服务层负责复杂聚合与排序,最终以统一响应体返回。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端报表页面"
|
||||
participant API as "统计API(stats.py)"
|
||||
participant SVC as "统计服务(stats_service.py)"
|
||||
participant DB as "数据库(异步会话)"
|
||||
FE->>API : GET /stats/department?period_year&period_month
|
||||
API->>SVC : get_department_stats(...)
|
||||
SVC->>DB : 执行SQL聚合(按科室分组)
|
||||
DB-->>SVC : 聚合结果集
|
||||
SVC-->>API : 汇总后的科室统计列表
|
||||
API-->>FE : 统一响应体(data : 列表)
|
||||
```
|
||||
|
||||
图示来源
|
||||
- [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#L75-L146)
|
||||
|
||||
章节来源
|
||||
- [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)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### BSC 维度分析
|
||||
- 接口:GET /stats/bsc-dimension
|
||||
- 功能:按财务、客户、内部流程、学习与成长四个维度统计得分、权重、指标数量与平均分。
|
||||
- 时间范围:支持按年/月过滤;未指定时返回全部。
|
||||
- 聚合方式:按维度分组,计算总分=Σ(明细得分×指标权重),总权重=Σ权重,平均分=总分/总权重。
|
||||
- 筛选条件:可按科室过滤。
|
||||
- 响应结构:包含维度字典与统计周期字符串。
|
||||
|
||||
章节来源
|
||||
- [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)
|
||||
|
||||
### 科室绩效统计
|
||||
- 接口:GET /stats/department
|
||||
- 功能:返回各科室的员工数、总分、平均分、最高/最低分、员工得分列表,并按平均分降序排列。
|
||||
- 时间范围:按年/月过滤;未指定则返回全部。
|
||||
- 聚合方式:按科室分组,累计加权得分,计算平均分,记录员工明细。
|
||||
- 响应结构:数组,元素包含科室信息、统计指标与员工列表。
|
||||
|
||||
章节来源
|
||||
- [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#L75-L146)
|
||||
|
||||
### 趋势分析(月度)
|
||||
- 接口:GET /stats/trend
|
||||
- 功能:按最近 N 个月的趋势统计,支持按科室过滤。
|
||||
- 时间范围:若未指定年份,默认使用当前年;按最近 N 个月聚合,跨年处理。
|
||||
- 聚合方式:按月分组,计算平均总分、平均加权分与记录数。
|
||||
- 响应结构:数组,元素包含月份、平均分与计数。
|
||||
|
||||
章节来源
|
||||
- [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#L149-L199)
|
||||
|
||||
### 周期统计
|
||||
- 接口:GET /stats/period
|
||||
- 功能:返回指定周期的汇总统计(总科室数、总员工数、平均分),并包含各科室明细。
|
||||
- 时间范围:若未指定年/月,默认使用当前年/月。
|
||||
- 聚合方式:对当期科室统计结果做二次汇总。
|
||||
- 响应结构:包含周期字符串、汇总指标与明细数组。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L93-L125)
|
||||
|
||||
### KPI 仪表盘
|
||||
- 接口:GET /stats/kpi-gauges
|
||||
- 功能:返回关键指标仪表盘数据(床位使用率、药占比、材料占比、患者满意度等)。
|
||||
- 时间范围:若未指定年/月,默认使用当前年/月。
|
||||
- 注意:当前为演示数据,后续需替换为真实数据库查询。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L128-L153)
|
||||
|
||||
### 收支趋势
|
||||
- 接口:GET /stats/finance-trend
|
||||
- 功能:返回最近 N 个月的收入、支出、利润趋势。
|
||||
- 时间范围:按最近 N 个月聚合。
|
||||
- 注意:当前为演示数据,后续需替换为真实数据库查询。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L156-L183)
|
||||
|
||||
### 科室绩效排名
|
||||
- 接口:GET /stats/department-ranking
|
||||
- 功能:返回指定周期内科室的平均分排名前 N。
|
||||
- 时间范围:若未指定年/月,默认使用当前年/月。
|
||||
- 聚合方式:基于科室统计结果取前 N。
|
||||
- 响应结构:数组,元素为科室排名数据。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L186-L207)
|
||||
|
||||
### 员工绩效排名
|
||||
- 接口:GET /stats/ranking
|
||||
- 功能:返回指定周期内员工的加权得分排名前 N。
|
||||
- 时间范围:必须提供年/月。
|
||||
- 聚合方式:按加权得分降序取前 N。
|
||||
- 响应结构:数组,元素包含员工信息与排名。
|
||||
|
||||
章节来源
|
||||
- [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)
|
||||
|
||||
### 指标完成度
|
||||
- 接口:GET /stats/completion
|
||||
- 功能:返回指标的平均分、最大/最小分、完成率与统计数量。
|
||||
- 时间范围:按年/月过滤;可按指标 ID 过滤。
|
||||
- 聚合方式:按指标分组,计算平均分与完成率=平均分/目标值×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#L247-L299)
|
||||
|
||||
### 预警数据
|
||||
- 接口:GET /stats/alerts
|
||||
- 功能:返回预警数据(低分员工、未完成考核科室、异常数据)。
|
||||
- 注意:当前为演示数据,后续需替换为真实数据库查询。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L73-L90)
|
||||
|
||||
## 依赖关系分析
|
||||
- API 层依赖服务层,服务层依赖模型层与异步数据库会话。
|
||||
- 前端通过封装的 API 模块调用后端接口,视图组件负责并发请求与图表渲染。
|
||||
- 统一响应体与 Pydantic 模式用于前后端契约约束。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StatsAPI {
|
||||
+get_bsc_dimension_stats()
|
||||
+get_department_stats()
|
||||
+get_trend_stats()
|
||||
+get_period_stats()
|
||||
+get_kpi_gauges()
|
||||
+get_finance_trend()
|
||||
+get_department_ranking()
|
||||
+get_ranking_stats()
|
||||
+get_completion_stats()
|
||||
}
|
||||
class StatsService {
|
||||
+get_bsc_dimension_stats()
|
||||
+get_department_stats()
|
||||
+get_trend_stats()
|
||||
+get_ranking_stats()
|
||||
+get_completion_stats()
|
||||
}
|
||||
class Models {
|
||||
+Assessment
|
||||
+AssessmentDetail
|
||||
+Indicator
|
||||
+Department
|
||||
+Staff
|
||||
+BSCDimension
|
||||
+AssessmentStatus
|
||||
}
|
||||
StatsAPI --> StatsService : "调用"
|
||||
StatsService --> Models : "查询/聚合"
|
||||
```
|
||||
|
||||
图示来源
|
||||
- [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#L117-L200)
|
||||
|
||||
章节来源
|
||||
- [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-L200)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 使用分组与聚合函数减少往返,避免在 Python 层重复计算。
|
||||
- 对常用过滤条件建立索引(如评估状态、周期、科室等)。
|
||||
- 并发与缓存
|
||||
- 前端并发请求多个统计接口,减少等待时间。
|
||||
- 对热点报表(如周期统计)可引入 Redis 缓存,设置合理 TTL。
|
||||
- 分页与限制
|
||||
- 排名类接口限制返回数量(如 limit),避免大结果集。
|
||||
- 前端渲染
|
||||
- 图表仅在数据就绪后初始化,避免重复渲染。
|
||||
- 响应时间优化建议
|
||||
- 后端:开启连接池、使用异步 ORM、避免 N+1 查询。
|
||||
- 前端:懒加载图表、骨架屏、分页加载。
|
||||
|
||||
[本节为通用性能指导,不直接分析具体文件]
|
||||
|
||||
## 故障排查指南
|
||||
- 常见问题
|
||||
- 参数缺失:确保提供年/月参数或允许默认使用当前年/月。
|
||||
- 数据为空:确认数据库中存在对应周期的评估数据。
|
||||
- 权限问题:确保携带有效 JWT Token。
|
||||
- 快速定位
|
||||
- 使用内置测试页面与后端日志定位接口状态与错误信息。
|
||||
- 前端 Network 标签查看失败请求详情。
|
||||
- 建议步骤
|
||||
- 清除浏览器缓存与本地存储,硬刷新页面。
|
||||
- 重启后端与前端服务,确认端口占用与代理配置。
|
||||
|
||||
章节来源
|
||||
- [frontend/public/test-api.html](file://frontend/public/test-api.html#L113-L129)
|
||||
- [TEST_REPORT.md](file://TEST_REPORT.md#L62-L95)
|
||||
|
||||
## 结论
|
||||
统计分析接口围绕“BSC 维度、科室/员工绩效、趋势与排名、指标完成度”等核心主题,提供了清晰的分层实现与统一响应格式。结合前端并发请求与 ECharts 图表渲染,能够满足日常报表与移动端展示需求。后续可在真实数据接入、缓存策略与性能优化方面持续改进。
|
||||
|
||||
[本节为总结性内容,不直接分析具体文件]
|
||||
|
||||
## 附录
|
||||
|
||||
### 接口清单与参数说明
|
||||
- BSC 维度分析
|
||||
- 方法:GET
|
||||
- 路径:/stats/bsc-dimension
|
||||
- 查询参数:department_id(可选)、period_year、period_month
|
||||
- 响应:包含维度字典与周期字符串
|
||||
- 科室绩效统计
|
||||
- 方法:GET
|
||||
- 路径:/stats/department
|
||||
- 查询参数:period_year、period_month
|
||||
- 响应:科室统计数组
|
||||
- 趋势分析
|
||||
- 方法:GET
|
||||
- 路径:/stats/trend
|
||||
- 查询参数:department_id(可选)、period_year(可选)、months(默认 6,范围 1-24)
|
||||
- 响应:按月聚合的趋势数组
|
||||
- 周期统计
|
||||
- 方法:GET
|
||||
- 路径:/stats/period
|
||||
- 查询参数:period_year(可选)、period_month(可选)
|
||||
- 响应:周期汇总与明细数组
|
||||
- KPI 仪表盘
|
||||
- 方法:GET
|
||||
- 路径:/stats/kpi-gauges
|
||||
- 查询参数:period_year(可选)、period_month(可选)
|
||||
- 响应:关键指标仪表盘数据
|
||||
- 收支趋势
|
||||
- 方法:GET
|
||||
- 路径:/stats/finance-trend
|
||||
- 查询参数:months(默认 6,范围 1-24)
|
||||
- 响应:收入/支出/利润趋势数组
|
||||
- 科室绩效排名
|
||||
- 方法:GET
|
||||
- 路径:/stats/department-ranking
|
||||
- 查询参数:period_year(可选)、period_month(可选)、limit(默认 10,范围 1-100)
|
||||
- 响应:科室排名数组
|
||||
- 员工绩效排名
|
||||
- 方法:GET
|
||||
- 路径:/stats/ranking
|
||||
- 查询参数:period_year、period_month、limit(默认 10,范围 1-100)
|
||||
- 响应:员工排名数组
|
||||
- 指标完成度
|
||||
- 方法:GET
|
||||
- 路径:/stats/completion
|
||||
- 查询参数:indicator_id(可选)、period_year、period_month
|
||||
- 响应:指标完成度数组
|
||||
- 预警数据
|
||||
- 方法:GET
|
||||
- 路径:/stats/alerts
|
||||
- 查询参数:limit(默认 10,范围 1-100)
|
||||
- 响应:预警数据对象
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L241)
|
||||
- [docs/api.md](file://docs/api.md#L471-L538)
|
||||
|
||||
### 响应数据结构与图表数据格式
|
||||
- 统一响应体
|
||||
- 字段:code、message、data(根据接口不同而异)
|
||||
- 科室统计
|
||||
- 字段:department_id、department_name、staff_count、avg_score、total_bonus、staff_list
|
||||
- 趋势数据
|
||||
- 字段:month、avg_score、avg_weighted_score、count
|
||||
- KPI 仪表盘
|
||||
- 字段:bed_usage_rate、drug_ratio、material_ratio、satisfaction_rate
|
||||
- 收支趋势
|
||||
- 字段:period、income、expense、profit
|
||||
- 排名数据
|
||||
- 字段:department 或 staff 的基本信息、score、weighted_score、rank
|
||||
- 指标完成度
|
||||
- 字段:indicator_id、indicator_name、indicator_code、target_value、max_score、avg_score、completion_rate、count
|
||||
|
||||
章节来源
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L347-L375)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L128-L183)
|
||||
|
||||
### 计算逻辑与时间范围选择
|
||||
- BSC 维度分析
|
||||
- 总分=Σ(明细得分×指标权重),总权重=Σ权重,平均分=总分/总权重
|
||||
- 科室统计
|
||||
- 平均分=总加权分/员工数;最高/最低分在员工列表中比较得出
|
||||
- 趋势分析
|
||||
- 若未指定年份,默认使用当前年;按最近 N 个月聚合,跨年处理
|
||||
- 指标完成度
|
||||
- 完成率=平均分/目标值×100,上限 100
|
||||
- 同比环比分析
|
||||
- 可通过前端按月序列与后端趋势接口实现同比(同月去年)与环比(相邻月份)对比
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L149-L199)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L247-L299)
|
||||
|
||||
### 多维度交叉分析、数据钻取与筛选
|
||||
- 多维度:BSC 维度、科室类型、指标类型、评估状态等
|
||||
- 数据钻取:从周期统计到科室明细,再到员工明细
|
||||
- 筛选条件:按年/月、科室、指标 ID、状态等
|
||||
- 前端实现:报表页面通过日期选择器与并发请求实现钻取与筛选
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
|
||||
### 报表导出与移动端适配
|
||||
- 报表导出:建议在前端将 ECharts 图表导出为 PNG/SVG,或将表格数据导出为 Excel/CSV
|
||||
- 移动端适配:图表容器自适应窗口大小,表格采用紧凑布局与分页加载
|
||||
- 响应时间优化:后端异步查询、前端懒加载与骨架屏、缓存热点数据
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L173-L295)
|
||||
|
||||
### 数据模型与枚举参考
|
||||
- BSC 维度:financial、customer、internal_process、learning_growth
|
||||
- 指标类型:quality、quantity、efficiency、service、cost
|
||||
- 评估状态:draft、submitted、reviewed、finalized、rejected
|
||||
- 科室类型:多种类型枚举,覆盖临床、医技、行政、护理、后勤等
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L61)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [docs/详细设计文档.md](file://docs/详细设计文档.md#L85-L120)
|
||||
495
.qoder/repowiki/zh/content/API接口文档/考核管理接口.md
Normal file
495
.qoder/repowiki/zh/content/API接口文档/考核管理接口.md
Normal file
@@ -0,0 +1,495 @@
|
||||
# 考核管理接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_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/salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py)
|
||||
- [backend/app/services/finance_service.py](file://backend/app/services/finance_service.py)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md)
|
||||
- [docs/api.md](file://docs/api.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
|
||||
本项目是一个基于FastAPI的医院绩效管理系统,专注于构建完整的绩效考核管理接口。系统采用现代化的分层架构设计,包含三个核心功能模块:
|
||||
|
||||
- **考核记录管理**:负责员工绩效考核的全流程管理,包括草稿保存、提交审核、审核通过、确认完成等状态转换
|
||||
- **考核明细处理**:管理具体的考核指标明细,支持批量操作和历史记录查询
|
||||
- **绩效计划管理**:涵盖医院级、科室级、个人级的多层次绩效计划制定、审批和执行
|
||||
|
||||
系统实现了完整的绩效管理闭环,从指标定义到结果应用,支持与工资核算系统的深度集成,为医院建立科学的激励约束机制提供技术支撑。
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统采用典型的三层架构设计,遵循RESTful API设计原则:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层 (API层)"
|
||||
A[Assessment API]
|
||||
B[Performance Plan API]
|
||||
C[Salary API]
|
||||
D[Finance API]
|
||||
end
|
||||
subgraph "业务逻辑层 (Service层)"
|
||||
E[Assessment Service]
|
||||
F[Performance Plan Service]
|
||||
G[Salary Service]
|
||||
H[Finance Service]
|
||||
end
|
||||
subgraph "数据访问层 (Model层)"
|
||||
I[Assessment Model]
|
||||
J[Performance Plan Model]
|
||||
K[Salary Record Model]
|
||||
L[Finance Model]
|
||||
end
|
||||
A --> E
|
||||
B --> F
|
||||
C --> G
|
||||
D --> H
|
||||
E --> I
|
||||
F --> J
|
||||
G --> K
|
||||
H --> L
|
||||
I --> J
|
||||
K --> L
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 考核管理模块
|
||||
|
||||
考核管理模块提供完整的绩效考核生命周期管理,支持多层级的状态流转和权限控制:
|
||||
|
||||
- **状态管理**:草稿(draft) → 已提交(submitted) → 已审核(reviewed) → 已确认(finalized) → 已驳回(rejected)
|
||||
- **权限控制**:不同状态支持不同角色的操作权限
|
||||
- **批量操作**:支持批量创建考核记录和批量生成工资记录
|
||||
- **历史追踪**:完整的操作日志和状态变更记录
|
||||
|
||||
### 绩效计划模块
|
||||
|
||||
绩效计划模块实现多层次的计划管理体系:
|
||||
|
||||
- **计划层级**:医院级(hospital) → 科室级(department) → 个人级(individual)
|
||||
- **状态流程**:草稿(draft) → 待审批(pending) → 已批准(approved) → 执行中(active) → 已完成(completed)
|
||||
- **指标关联**:支持计划与KPI指标的灵活关联和权重配置
|
||||
- **版本管理**:支持计划的版本控制和历史追溯
|
||||
|
||||
### 工资核算模块
|
||||
|
||||
工资核算模块与考核结果深度集成:
|
||||
|
||||
- **自动计算**:基于考核得分自动计算绩效奖金
|
||||
- **系数应用**:结合员工绩效系数和个人基本工资
|
||||
- **批量处理**:支持科室级批量生成工资记录
|
||||
- **状态管理**:pending → confirmed 的确认流程
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L51)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L233-L242)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构设计,确保职责分离和代码可维护性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API层
|
||||
participant Service as 服务层
|
||||
participant Model as 模型层
|
||||
participant DB as 数据库
|
||||
Client->>API : 发起考核请求
|
||||
API->>Service : 调用业务逻辑
|
||||
Service->>Model : 操作数据模型
|
||||
Model->>DB : 执行数据库操作
|
||||
DB-->>Model : 返回查询结果
|
||||
Model-->>Service : 返回业务数据
|
||||
Service-->>API : 返回处理结果
|
||||
API-->>Client : 返回响应数据
|
||||
Note over Client,DB : 完整的CRUD操作流程
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L80-L103)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
|
||||
系统还实现了异步数据库操作,支持高并发场景下的性能优化:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[异步数据库连接池] --> B[SQLAlchemy AsyncSession]
|
||||
B --> C[查询操作]
|
||||
B --> D[事务处理]
|
||||
C --> E[结果返回]
|
||||
D --> E
|
||||
style A fill:#e1f5fe
|
||||
style B fill:#f3e5f5
|
||||
style E fill:#e8f5e8
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L6-L8)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L11)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 考核记录管理
|
||||
|
||||
#### 接口设计
|
||||
|
||||
考核管理模块提供了完整的RESTful 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` | 批量创建考核 |
|
||||
|
||||
#### 状态转换流程
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 已提交 : 提交考核
|
||||
已提交 --> 已审核 : 审核通过
|
||||
已提交 --> 已驳回 : 审核驳回
|
||||
已审核 --> 已确认 : 确认完成
|
||||
已确认 --> [*]
|
||||
已驳回 --> 草稿 : 修改后重新提交
|
||||
note right of 草稿 : 可编辑状态
|
||||
note right of 已提交 : 等待审核
|
||||
note right of 已审核 : 审核完成
|
||||
note right of 已确认 : 最终状态
|
||||
note right of 已驳回 : 需要修改
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L51)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L159-L205)
|
||||
|
||||
#### 评分计算逻辑
|
||||
|
||||
系统实现了灵活的评分计算机制:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始计算] --> B[遍历考核明细]
|
||||
B --> C[获取指标权重]
|
||||
C --> D[计算加权得分]
|
||||
D --> E[累加总分]
|
||||
E --> F[设置状态]
|
||||
F --> G[保存记录]
|
||||
G --> H[结束]
|
||||
D --> I[加权得分 = 明细得分 × 指标权重]
|
||||
E --> J[总分 = 所有明细得分之和]
|
||||
style I fill:#fff3e0
|
||||
style J fill:#fff3e0
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L74-L84)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L129-L149)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L18-L263)
|
||||
|
||||
### 绩效计划管理
|
||||
|
||||
#### 计划层级结构
|
||||
|
||||
系统支持多层级的绩效计划管理:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[医院级计划] --> B[科室级计划]
|
||||
B --> C[个人级计划]
|
||||
A --> D[年度计划]
|
||||
A --> E[月度计划]
|
||||
B --> F[季度计划]
|
||||
B --> G[专项计划]
|
||||
C --> H[个人目标]
|
||||
C --> I[能力发展计划]
|
||||
style A fill:#ffebee
|
||||
style B fill:#e8f5e8
|
||||
style C fill:#e3f2fd
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L263-L268)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L233-L242)
|
||||
|
||||
#### 计划审批流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Creator as 计划创建者
|
||||
participant Manager as 科室负责人
|
||||
participant Leader as 分管院领导
|
||||
participant Office as 绩效办
|
||||
Creator->>Manager : 提交计划
|
||||
Manager->>Leader : 审批请求
|
||||
Leader->>Office : 最终审批
|
||||
Office->>Creator : 审批结果
|
||||
Note over Creator,Office : 多级审批流程
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L194-L226)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L144-L182)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L310)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L18-L342)
|
||||
|
||||
### 工资核算集成
|
||||
|
||||
#### 薪酬计算公式
|
||||
|
||||
系统实现了标准化的薪酬计算机制:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[基本工资] --> C[总薪酬计算]
|
||||
B[绩效奖金] --> C
|
||||
D[补贴] --> C
|
||||
E[扣款] --> C
|
||||
C --> F[应发工资 = 基本工资 + 绩效奖金 + 补贴 - 扣款]
|
||||
G[绩效得分] --> H[绩效奖金计算]
|
||||
I[绩效系数] --> H
|
||||
H --> B
|
||||
H --> J[绩效奖金 = 基础基数 × (绩效得分/100) × 绩效系数]
|
||||
style J fill:#fff8e1
|
||||
style F fill:#e8f5e8
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
|
||||
#### 自动化生成流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant HR as 人事系统
|
||||
participant Perf as 绩效系统
|
||||
participant Payroll as 工资系统
|
||||
participant Finance as 财务系统
|
||||
HR->>Perf : 触发工资生成
|
||||
Perf->>Perf : 查询已确认考核
|
||||
Perf->>Perf : 计算绩效奖金
|
||||
Perf->>Payroll : 创建工资记录
|
||||
Payroll->>Finance : 生成发放清单
|
||||
Finance-->>HR : 薪资发放完成
|
||||
Note over HR,Finance : 完整的薪资发放流程
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L130)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L219)
|
||||
|
||||
**章节来源**
|
||||
- [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#L14-L260)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统采用清晰的依赖层次结构,确保模块间的松耦合:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "外部依赖"
|
||||
A[FastAPI]
|
||||
B[SQLAlchemy]
|
||||
C[AsyncIO]
|
||||
D[Pydantic]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
E[API层]
|
||||
F[服务层]
|
||||
G[模型层]
|
||||
H[Schema层]
|
||||
end
|
||||
subgraph "数据库层"
|
||||
I[Assessment表]
|
||||
J[PerformancePlan表]
|
||||
K[SalaryRecord表]
|
||||
L[Finance表]
|
||||
end
|
||||
A --> E
|
||||
B --> F
|
||||
C --> F
|
||||
D --> H
|
||||
E --> F
|
||||
F --> G
|
||||
G --> H
|
||||
G --> I
|
||||
G --> J
|
||||
G --> K
|
||||
G --> L
|
||||
style A fill:#e3f2fd
|
||||
style B fill:#e8f5e8
|
||||
style E fill:#fff3e0
|
||||
style F fill:#f3e5f5
|
||||
style G fill:#e0f2f1
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L17)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L11)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L14)
|
||||
|
||||
### 权限控制机制
|
||||
|
||||
系统实现了基于角色的权限控制(RBAC):
|
||||
|
||||
| 角色 | 权限范围 | 可执行操作 |
|
||||
|------|----------|------------|
|
||||
| staff | 普通员工 | 查看自己的考核记录 |
|
||||
| manager | 科室负责人 | 审核下级考核、管理科室计划 |
|
||||
| admin | 系统管理员 | 完全权限,包括数据维护 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L124-L139)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化
|
||||
|
||||
系统采用了多项性能优化策略:
|
||||
|
||||
1. **索引优化**:为常用查询字段建立复合索引
|
||||
2. **异步操作**:使用async/await模式提高并发处理能力
|
||||
3. **连接池**:配置数据库连接池减少连接开销
|
||||
4. **分页查询**:默认每页20条记录,支持最大100条限制
|
||||
|
||||
### 缓存策略
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[请求缓存] --> B[查询缓存]
|
||||
B --> C[会话缓存]
|
||||
C --> D[响应缓存]
|
||||
E[热点数据] --> F[内存缓存]
|
||||
F --> G[分布式缓存]
|
||||
style A fill:#e8f5e8
|
||||
style E fill:#fff3e0
|
||||
```
|
||||
|
||||
### 并发处理
|
||||
|
||||
系统支持高并发场景下的稳定运行:
|
||||
|
||||
- **异步数据库操作**:避免阻塞主线程
|
||||
- **批量操作**:减少数据库往返次数
|
||||
- **状态锁机制**:防止并发状态冲突
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
| 问题类型 | 症状 | 可能原因 | 解决方案 |
|
||||
|----------|------|----------|----------|
|
||||
| 权限错误 | 403 Forbidden | 用户权限不足 | 检查用户角色和权限配置 |
|
||||
| 数据验证错误 | 422 Unprocessable Entity | 请求数据格式不正确 | 验证请求参数和数据类型 |
|
||||
| 资源不存在 | 404 Not Found | ID不存在或已被删除 | 确认资源ID的有效性 |
|
||||
| 状态冲突 | 400 Bad Request | 状态转换不符合规则 | 检查当前状态和允许的操作 |
|
||||
|
||||
### 日志记录
|
||||
|
||||
系统提供了完整的日志记录机制:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[操作请求] --> B[请求日志]
|
||||
B --> C[业务日志]
|
||||
C --> D[错误日志]
|
||||
D --> E[性能日志]
|
||||
F[审计日志] --> G[操作追踪]
|
||||
G --> H[合规记录]
|
||||
style B fill:#e8f5e8
|
||||
style D fill:#ffebee
|
||||
style F fill:#f3e5f5
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [docs/api.md](file://docs/api.md#L540-L551)
|
||||
|
||||
## 结论
|
||||
|
||||
本绩效考核管理接口系统具有以下特点:
|
||||
|
||||
1. **完整性**:覆盖了从指标定义到结果应用的完整生命周期
|
||||
2. **灵活性**:支持多层级、多类型的绩效管理需求
|
||||
3. **可扩展性**:模块化设计便于功能扩展和维护
|
||||
4. **安全性**:完善的权限控制和数据验证机制
|
||||
5. **集成性**:与工资核算系统无缝集成,实现数据共享
|
||||
|
||||
系统采用先进的技术栈和架构设计,能够满足现代医院对绩效管理的复杂需求,为建立科学的激励约束机制提供强有力的技术支撑。
|
||||
|
||||
## 附录
|
||||
|
||||
### API接口规范
|
||||
|
||||
系统遵循RESTful API设计原则,提供统一的接口规范:
|
||||
|
||||
- **响应格式**:统一的JSON响应格式,包含状态码、消息和数据
|
||||
- **分页机制**:支持页码和每页数量的参数配置
|
||||
- **错误处理**:标准化的错误响应格式
|
||||
- **认证机制**:JWT Bearer Token认证方式
|
||||
|
||||
### 数据模型设计
|
||||
|
||||
系统采用关系型数据库设计,确保数据的一致性和完整性:
|
||||
|
||||
- **主键设计**:使用自增主键确保唯一性
|
||||
- **外键约束**:建立合理的外键关系保证数据完整性
|
||||
- **索引优化**:为查询频繁的字段建立索引
|
||||
- **数据类型**:使用合适的数据类型确保数据精度
|
||||
|
||||
### 集成接口
|
||||
|
||||
系统支持与其他医院信息系统(HIS)的集成:
|
||||
|
||||
- **数据同步**:支持定时或实时的数据同步机制
|
||||
- **接口适配**:提供标准化的接口适配器
|
||||
- **错误处理**:完善的异常处理和重试机制
|
||||
- **监控告警**:实时监控接口调用状态
|
||||
346
.qoder/repowiki/zh/content/API接口文档/认证接口.md
Normal file
346
.qoder/repowiki/zh/content/API接口文档/认证接口.md
Normal file
@@ -0,0 +1,346 @@
|
||||
# 认证接口
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.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/models/models.py](file://backend/app/models/models.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/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文件为“用户认证接口”的完整API文档,覆盖以下三个核心接口:
|
||||
- 用户登录
|
||||
- 用户注册
|
||||
- 获取当前用户信息
|
||||
|
||||
内容涵盖HTTP方法、URL路径、请求参数格式、响应数据结构、错误码、JWT令牌生成机制、密码验证流程、用户权限验证、OAuth2密码模式使用方法与安全注意事项、以及令牌过期处理与刷新机制的实现细节。同时提供成功与失败场景的请求/响应示例,并给出前后端集成要点。
|
||||
|
||||
## 项目结构
|
||||
认证相关代码主要分布在后端的API层、安全模块、数据模型与配置模块;前端通过Axios封装统一请求,自动携带Authorization头。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
A["API路由<br/>backend/app/api/v1/auth.py"]
|
||||
B["安全模块<br/>backend/app/core/security.py"]
|
||||
C["数据模型<br/>backend/app/models/models.py"]
|
||||
D["配置<br/>backend/app/core/config.py"]
|
||||
E["数据库连接<br/>backend/app/core/database.py"]
|
||||
F["主应用入口<br/>backend/app/main.py"]
|
||||
G["API聚合<br/>backend/app/api/v1/__init__.py"]
|
||||
end
|
||||
subgraph "前端"
|
||||
H["认证API封装<br/>frontend/src/api/auth.js"]
|
||||
I["请求拦截器<br/>frontend/src/api/request.js"]
|
||||
J["用户状态存储<br/>frontend/src/stores/user.js"]
|
||||
end
|
||||
H --> I
|
||||
I --> F
|
||||
F --> G
|
||||
G --> A
|
||||
A --> B
|
||||
A --> C
|
||||
B --> D
|
||||
B --> E
|
||||
J --> H
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
## 核心组件
|
||||
- 认证路由与控制器:定义登录、注册、获取当前用户三个接口,使用OAuth2密码模式进行认证。
|
||||
- 安全模块:负责密码哈希与校验、JWT令牌生成与解析、当前用户与权限校验。
|
||||
- 数据模型:User模型包含用户名、密码哈希、角色、激活状态等字段。
|
||||
- 配置模块:提供API前缀、JWT密钥、算法、过期时间等配置。
|
||||
- 数据库连接:异步SQLAlchemy会话管理。
|
||||
- 前端请求封装:统一添加Authorization头,处理401等错误并跳转登录。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L15-L26)
|
||||
|
||||
## 架构概览
|
||||
认证流程采用OAuth2密码模式,客户端向登录接口发送用户名/密码,服务端验证后签发JWT访问令牌;后续请求由前端在请求头中携带Authorization: Bearer <token>,后端通过依赖注入解析并校验令牌,获取当前用户。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端应用"
|
||||
participant API as "认证接口<br/>/api/v1/auth"
|
||||
participant SEC as "安全模块<br/>JWT/密码"
|
||||
participant DB as "数据库<br/>User表"
|
||||
FE->>API : POST /api/v1/auth/login
|
||||
API->>DB : 查询用户(用户名)
|
||||
DB-->>API : 用户记录
|
||||
API->>SEC : 校验密码
|
||||
SEC-->>API : 校验结果
|
||||
API->>SEC : 生成访问令牌
|
||||
SEC-->>API : 返回JWT
|
||||
API-->>FE : {access_token, token_type}
|
||||
FE->>API : GET /api/v1/auth/me<br/>Authorization : Bearer <token>
|
||||
API->>SEC : 解析JWT并校验
|
||||
SEC->>DB : 查询用户(根据sub)
|
||||
DB-->>SEC : 用户记录
|
||||
SEC-->>API : 当前用户
|
||||
API-->>FE : 用户信息
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L91)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L4-L21)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L15-L26)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 接口定义与行为
|
||||
|
||||
- 用户登录
|
||||
- 方法与路径:POST /api/v1/auth/login
|
||||
- 认证方式:OAuth2密码模式(form-data)
|
||||
- 请求体字段:
|
||||
- username: 字符串,最小长度3,最大长度50
|
||||
- password: 字符串,最小长度6,最大长度100
|
||||
- 成功响应:
|
||||
- access_token: 字符串(JWT)
|
||||
- token_type: 字符串,默认"bearer"
|
||||
- 错误码:
|
||||
- 401:用户名或密码错误
|
||||
- 403:账户已禁用
|
||||
- 处理逻辑:
|
||||
- 根据用户名查询用户
|
||||
- 使用bcrypt校验密码
|
||||
- 校验用户是否激活
|
||||
- 生成JWT访问令牌并返回
|
||||
|
||||
- 用户注册
|
||||
- 方法与路径:POST /api/v1/auth/register
|
||||
- 请求体字段:
|
||||
- username: 字符串,最小长度3,最大长度50
|
||||
- password: 字符串,最小长度6,最大长度100
|
||||
- staff_id: 可选整数
|
||||
- role: 字符串,枚举(admin|manager|staff),默认staff
|
||||
- 成功响应:
|
||||
- code: 整数,默认200
|
||||
- message: 字符串,默认"注册成功"
|
||||
- data.id: 新用户ID
|
||||
- 错误码:
|
||||
- 400:用户名已存在
|
||||
- 处理逻辑:
|
||||
- 检查用户名是否重复
|
||||
- 生成密码哈希
|
||||
- 创建用户记录并持久化
|
||||
|
||||
- 获取当前用户信息
|
||||
- 方法与路径:GET /api/v1/auth/me
|
||||
- 认证方式:Bearer Token(Authorization头)
|
||||
- 成功响应:
|
||||
- id: 整数
|
||||
- username: 字符串
|
||||
- role: 字符串
|
||||
- is_active: 布尔
|
||||
- last_login: 可选时间戳
|
||||
- created_at: 时间戳
|
||||
- 错误码:
|
||||
- 401:无法验证凭据(无效/过期令牌)
|
||||
- 403:需要管理员权限(若使用管理员依赖)
|
||||
- 处理逻辑:
|
||||
- 通过OAuth2 Bearer Scheme获取令牌
|
||||
- 解析JWT载荷(sub为用户ID)
|
||||
- 查询用户并返回
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L315-L345)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L91)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
### JWT令牌生成机制
|
||||
- 令牌内容:
|
||||
- exp:过期时间(UTC)
|
||||
- sub:用户ID(字符串)
|
||||
- 签发过程:
|
||||
- 使用配置中的SECRET_KEY与ALGORITHM(如HS256)进行签名
|
||||
- 默认过期时间为ACCESS_TOKEN_EXPIRE_MINUTES(8小时)
|
||||
- 解析过程:
|
||||
- 从Authorization头提取Bearer Token
|
||||
- 使用相同密钥与算法解码,获取payload
|
||||
- 从payload取sub作为用户ID,查询用户是否存在且激活
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L53)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L91)
|
||||
|
||||
### 密码验证流程
|
||||
- 存储:密码以哈希形式保存(bcrypt)
|
||||
- 校验:接收明文密码与存储的哈希,使用bcrypt.checkpw进行比对
|
||||
- 注册:注册时对明文密码生成哈希再存入数据库
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L31)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L40-L65)
|
||||
|
||||
### 用户权限验证
|
||||
- 当前用户:通过Bearer Token解析并查询用户
|
||||
- 激活状态:仅激活用户可访问受保护资源
|
||||
- 角色权限:提供管理员与经理权限校验依赖(用于特定接口)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L109)
|
||||
|
||||
### OAuth2密码模式使用方法与安全考虑
|
||||
- 使用方法:
|
||||
- 前端以application/x-www-form-urlencoded方式提交username与password到/login
|
||||
- 服务端返回access_token
|
||||
- 后续请求在Authorization头中携带Bearer <token>
|
||||
- 安全考虑:
|
||||
- 必须通过HTTPS传输,避免令牌被窃听
|
||||
- 令牌过期时间较短(默认8小时),建议实现刷新机制
|
||||
- 前端仅本地存储令牌,避免泄露
|
||||
- 服务端严格校验令牌与用户状态
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L4-L11)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L15-L26)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
|
||||
### 令牌过期处理与刷新机制
|
||||
- 过期处理:
|
||||
- 前端在401时提示“登录已过期”,清除本地令牌并跳转登录页
|
||||
- 刷新机制:
|
||||
- 当前实现未提供refresh_token接口
|
||||
- 建议新增刷新令牌接口,或延长ACCESS_TOKEN_EXPIRE_MINUTES并配合短期会话策略
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L39-L57)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class AuthRouter{
|
||||
+POST /auth/login
|
||||
+POST /auth/register
|
||||
+GET /auth/me
|
||||
}
|
||||
class SecurityModule{
|
||||
+verify_password()
|
||||
+get_password_hash()
|
||||
+create_access_token()
|
||||
+decode_token()
|
||||
+get_current_user()
|
||||
+get_current_active_user()
|
||||
}
|
||||
class UserModel{
|
||||
+id
|
||||
+username
|
||||
+password_hash
|
||||
+role
|
||||
+is_active
|
||||
}
|
||||
class Config{
|
||||
+SECRET_KEY
|
||||
+ALGORITHM
|
||||
+ACCESS_TOKEN_EXPIRE_MINUTES
|
||||
+API_PREFIX
|
||||
}
|
||||
class Database{
|
||||
+get_db()
|
||||
}
|
||||
AuthRouter --> SecurityModule : "依赖"
|
||||
AuthRouter --> UserModel : "读写"
|
||||
SecurityModule --> Config : "读取"
|
||||
SecurityModule --> Database : "依赖"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 性能考量
|
||||
- 密码哈希:bcrypt计算开销较高,建议在高并发场景下适当调整密钥迭代次数或使用更高效的硬件
|
||||
- JWT解析:每次受保护请求均需解码与用户查询,建议缓存活跃用户信息或使用Redis等缓存层
|
||||
- 数据库连接:使用异步连接池,合理设置池大小与超时,避免阻塞
|
||||
- 前端拦截器:统一处理401错误,减少重复逻辑
|
||||
|
||||
[本节为通用指导,不直接分析具体文件]
|
||||
|
||||
## 故障排查指南
|
||||
- 登录失败(401):
|
||||
- 检查用户名/密码是否正确
|
||||
- 确认用户是否激活
|
||||
- 无法访问受保护接口(401):
|
||||
- 检查Authorization头是否正确携带Bearer Token
|
||||
- 确认令牌未过期
|
||||
- 权限不足(403):
|
||||
- 确认用户角色是否满足接口要求
|
||||
- CORS问题:
|
||||
- 检查CORS允许的源与预检请求
|
||||
- 前端401自动跳转:
|
||||
- 确认本地存储的token是否被清理
|
||||
- 检查请求拦截器是否正确添加Authorization头
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L39-L63)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L34-L39)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L36)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L91)
|
||||
|
||||
## 结论
|
||||
该认证系统基于OAuth2密码模式与JWT实现,具备基本的用户登录、注册与当前用户信息获取能力。建议后续增强刷新令牌机制与更细粒度的权限控制,并在生产环境强化安全配置(如HTTPS、密钥轮换、令牌审计等)。
|
||||
384
.qoder/repowiki/zh/content/业务逻辑设计/业务规则验证.md
Normal file
384
.qoder/repowiki/zh/content/业务逻辑设计/业务规则验证.md
Normal file
@@ -0,0 +1,384 @@
|
||||
# 业务规则验证
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_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/assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [AGENTS.md](file://AGENTS.md)
|
||||
- [docs/frontend.md](file://docs/frontend.md)
|
||||
- [frontend/DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件聚焦于医院绩效系统的“业务规则验证”能力,系统性梳理并解释以下方面:
|
||||
- 考核周期限制、重复数据检查、数据完整性校验与业务冲突处理
|
||||
- 规则引擎实现、动态规则配置与扩展机制
|
||||
- 异常数据处理策略、错误提示与用户反馈机制
|
||||
- 业务规则的自定义配置、规则测试与维护指南
|
||||
|
||||
系统采用 FastAPI + SQLAlchemy 的后端架构,结合 Pydantic 数据模式进行输入输出校验;数据库层面通过索引与约束保证数据一致性;API 层对业务状态流转进行严格控制;前端通过统一错误处理与消息提示提升用户体验。
|
||||
|
||||
## 项目结构
|
||||
后端采用分层架构:API 路由层负责请求接入与权限控制,服务层封装业务规则与状态机,模型层定义数据结构与约束,模式层定义输入输出结构。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API 层"
|
||||
A1["/assessments<br/>考核管理"]
|
||||
A2["/indicators<br/>指标管理"]
|
||||
A3["/staff<br/>员工管理"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
S1["AssessmentService<br/>考核服务"]
|
||||
S2["PerformancePlanService<br/>绩效计划服务"]
|
||||
S3["IndicatorService<br/>指标服务"]
|
||||
S4["StaffService<br/>员工服务"]
|
||||
end
|
||||
subgraph "模型层"
|
||||
M1["Assessment<br/>考核记录"]
|
||||
M2["AssessmentDetail<br/>考核明细"]
|
||||
M3["Indicator<br/>考核指标"]
|
||||
M4["Staff<br/>员工"]
|
||||
M5["PerformancePlan<br/>绩效计划"]
|
||||
end
|
||||
subgraph "模式层"
|
||||
P1["AssessmentCreate/Update/Response"]
|
||||
P2["IndicatorCreate/Update/Response"]
|
||||
P3["StaffCreate/Update/Response"]
|
||||
end
|
||||
A1 --> S1
|
||||
A2 --> S3
|
||||
A3 --> S4
|
||||
S1 --> M1
|
||||
S1 --> M2
|
||||
S1 --> M3
|
||||
S2 --> M5
|
||||
S3 --> M3
|
||||
S4 --> M4
|
||||
S1 --> P1
|
||||
S3 --> P2
|
||||
S4 --> P3
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L203)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L194-L311)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L203)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L194-L311)
|
||||
|
||||
## 核心组件
|
||||
- 考核服务(AssessmentService):实现考核记录的创建、更新、提交、审核、确认与批量创建;内置状态机与关键业务约束(如草稿/已提交/已审核/已确认状态流转限制、重复考核记录检查)。
|
||||
- 绩效计划服务(PerformancePlanService):实现计划的创建、提交、审批、激活与统计;支持 KPI 关联的增删改查。
|
||||
- 指标服务(IndicatorService):实现指标的 CRUD、模板导入与去重策略。
|
||||
- 员工服务(StaffService):实现员工的 CRUD、按科室检索与关键字搜索。
|
||||
- 数据模型(models.py):定义实体、枚举、索引与约束(如权重>0、唯一索引、外键关系)。
|
||||
- 数据模式(schemas.py):定义输入输出结构与 Pydantic 校验规则(范围、长度、枚举、必填等)。
|
||||
- API 路由(assessments.py、indicators.py、staff.py):暴露 REST 接口,集成权限依赖与错误处理。
|
||||
- 安全模块(security.py):JWT 解析、用户鉴权与角色权限控制。
|
||||
- 主程序(main.py):全局异常处理与日志记录。
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L15-L342)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L203)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L194-L311)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
|
||||
|
||||
## 架构总览
|
||||
系统通过 API 路由接收请求,经由安全中间件与权限依赖进行身份与角色校验,随后调用对应服务层执行业务规则与状态机控制,最终持久化到数据库并通过模式层进行序列化返回。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "API 路由"
|
||||
participant SEC as "安全模块"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库"
|
||||
FE->>API : "提交请求"
|
||||
API->>SEC : "解析JWT/校验权限"
|
||||
SEC-->>API : "返回当前用户"
|
||||
API->>SVC : "调用业务方法"
|
||||
SVC->>DB : "读写数据/执行约束"
|
||||
DB-->>SVC : "返回结果"
|
||||
SVC-->>API : "返回领域对象"
|
||||
API-->>FE : "标准化响应"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 考核记录业务规则验证
|
||||
- 状态机与流转控制
|
||||
- 草稿(draft)→ 提交(submitted)→ 审核(reviewed/rejected)→ 确认(finalized)
|
||||
- 仅允许特定状态下的操作,防止逆向或越权变更
|
||||
- 重复数据检查
|
||||
- 批量创建时按“员工+年度+月份”组合检查是否存在重复记录
|
||||
- 总分与加权得分计算
|
||||
- 总分:明细得分求和
|
||||
- 加权得分:明细得分×指标权重求和
|
||||
- 明细完整性
|
||||
- 每条明细包含指标ID、实际值、得分、佐证材料、备注等字段
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 已提交 : "提交"
|
||||
已提交 --> 已审核 : "审核通过"
|
||||
已提交 --> 已驳回 : "审核不通过"
|
||||
已审核 --> 已确认 : "确认"
|
||||
已确认 --> [*]
|
||||
已驳回 --> [*]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L51)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178)
|
||||
|
||||
### 绩效计划业务规则验证
|
||||
- 计划状态机
|
||||
- 草稿(draft)→ 待审批(pending)→ 批准(approved)→ 执行中(active)→ 完成(completed)
|
||||
- 审批与版本
|
||||
- 审批通过/拒绝时记录审批人、审批时间与意见
|
||||
- 激活后标记为生效
|
||||
- KPI 关联管理
|
||||
- 支持增删改查 KPI 关联,包含目标值、权重、评分方法与参数
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["创建计划"]) --> Draft["保存为草稿"]
|
||||
Draft --> Pending["提交审批"]
|
||||
Pending --> Approved{"审批通过?"}
|
||||
Approved --> |是| Active["激活执行"]
|
||||
Approved --> |否| Rejected["标记为已驳回"]
|
||||
Active --> Completed["完成"]
|
||||
Rejected --> End(["结束"])
|
||||
Completed --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L270-L296)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L130-L182)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L195-L249)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L15-L342)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L270-L338)
|
||||
|
||||
### 指标与模板业务规则验证
|
||||
- 指标唯一性
|
||||
- 指标编码唯一,创建前需检查重复
|
||||
- 权重约束
|
||||
- 指标权重>0,数据库层通过 CheckConstraint 保证
|
||||
- 模板导入
|
||||
- 支持覆盖或跳过已存在指标,避免重复创建
|
||||
- 适用科室类型
|
||||
- 指标可标注适用科室类型集合(JSON 字符串),用于筛选与过滤
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Import["导入模板"] --> CheckCode["按编码检查是否已存在"]
|
||||
CheckCode --> Exists{"已存在?"}
|
||||
Exists --> |是且覆盖| Update["更新现有指标"]
|
||||
Exists --> |是且不覆盖| Skip["跳过该指标"]
|
||||
Exists --> |否| Create["创建新指标"]
|
||||
Update --> Done["提交事务"]
|
||||
Skip --> Done
|
||||
Create --> Done
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L128-L141)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L106-L154)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L143-L146)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L71-L112)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L67-L104)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L146)
|
||||
|
||||
### 员工业务规则验证
|
||||
- 工号唯一性
|
||||
- 创建时检查工号是否已存在
|
||||
- 关键字搜索
|
||||
- 支持姓名或工号模糊匹配
|
||||
- 状态与部门过滤
|
||||
- 支持按部门与状态筛选
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L108)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L69-L112)
|
||||
|
||||
### 数据模型与约束
|
||||
- 考核记录与明细
|
||||
- 考核记录:staff_id、period_year、period_month、status、assessor_id、reviewer_id 等
|
||||
- 明细:assessment_id、indicator_id、actual_value、score、evidence、remark
|
||||
- 索引:staff、period_year+month、status
|
||||
- 指标
|
||||
- code 唯一;weight>0;bs_dimension、target_unit、assessment_method、deduction_standard、data_source、applicable_dept_types、is_veto
|
||||
- 模板与关联
|
||||
- 模板:template_code 唯一;模板指标关联唯一约束(template_id, indicator_id)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L87-L131)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L63)
|
||||
|
||||
### 规则引擎与动态配置
|
||||
- 当前实现
|
||||
- 业务规则主要以内置服务方法与状态机形式实现,例如:状态流转限制、重复记录检查、权重>0 约束等
|
||||
- 动态规则配置建议
|
||||
- 可引入“规则配置表”,存储规则表达式(如 JSON/脚本片段),在服务层按配置动态执行
|
||||
- 对于“一票否决”等强约束,可在模型层增加布尔标志并在服务层强制执行
|
||||
- 扩展机制
|
||||
- 通过插件化或策略模式扩展不同科室类型的评分策略
|
||||
- 为 KPI 关联增加“评分参数(JSON)”字段,支持动态参数化评分
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L133-L136)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L314-L338)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L195-L249)
|
||||
|
||||
### 异常数据处理与用户反馈
|
||||
- 后端异常处理
|
||||
- HTTP 异常与校验异常分别捕获并记录日志,保持接口稳定性
|
||||
- 前端错误处理
|
||||
- 统一使用 Element Plus 的消息与确认框,区分成功/警告/错误场景
|
||||
- 错误提示
|
||||
- 员工不存在、工号已存在、指标编码已存在、状态不允许等明确提示
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
|
||||
- [AGENTS.md](file://AGENTS.md#L112-L134)
|
||||
- [docs/frontend.md](file://docs/frontend.md#L291-L325)
|
||||
|
||||
## 依赖分析
|
||||
- API 依赖安全模块进行用户鉴权与角色校验
|
||||
- 服务层依赖模型层进行数据读写与约束校验
|
||||
- 模式层为 API 与服务层提供输入输出结构与 Pydantic 校验
|
||||
- 数据库迁移脚本定义表结构、索引与约束
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
API_A["/assessments"] --> SEC["security.py"]
|
||||
API_I["/indicators"] --> SEC
|
||||
API_S["/staff"] --> SEC
|
||||
SEC --> SVC_A["AssessmentService"]
|
||||
SEC --> SVC_P["PerformancePlanService"]
|
||||
SEC --> SVC_I["IndicatorService"]
|
||||
SEC --> SVC_S["StaffService"]
|
||||
SVC_A --> MODELS["models.py"]
|
||||
SVC_P --> MODELS
|
||||
SVC_I --> MODELS
|
||||
SVC_S --> MODELS
|
||||
MODELS --> SCHEMAS["schemas.py"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [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/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [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)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 使用 selectinload 预加载关联对象,减少 N+1 查询
|
||||
- 为高频查询字段建立索引(如 staff_id、period_year+month、status)
|
||||
- 分页与总数统计
|
||||
- 使用子查询统计总数,避免重复扫描
|
||||
- 并发与事务
|
||||
- 批量创建时使用 flush/commit 控制事务边界,确保一致性
|
||||
- 缓存与热点
|
||||
- 对常用指标与模板可引入缓存层,降低数据库压力
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L28-L55)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L28-L59)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L110-L112)
|
||||
|
||||
## 故障排查指南
|
||||
- 后端健康检查
|
||||
- 访问 /health 确认服务可用
|
||||
- 日志定位
|
||||
- 查看后端日志目录中的 app_*.log 与 error_*.log
|
||||
- 常见问题
|
||||
- 404:检查路由前缀与接口路径
|
||||
- 500:查看后端异常堆栈与数据库约束冲突
|
||||
- CORS:确认前端代理与后端 CORS 配置一致
|
||||
- 前端调试
|
||||
- 使用浏览器开发者工具查看 Console 与 Network 标签,确认请求头与响应体
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L54-L56)
|
||||
- [frontend/DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L1-L60)
|
||||
|
||||
## 结论
|
||||
系统在业务规则验证方面具备完善的层次化实现:API 层进行权限与输入校验,服务层执行状态机与关键约束,模型层通过索引与约束保障数据完整性。对于动态规则与扩展需求,建议引入规则配置表与参数化评分机制,以增强灵活性与可维护性。
|
||||
|
||||
## 附录
|
||||
- 自定义配置建议
|
||||
- 新增“规则配置表”,支持按科室类型/指标类型配置评分策略
|
||||
- 为 KPI 关联增加“评分参数(JSON)”字段,支持动态参数化
|
||||
- 规则测试
|
||||
- 单元测试覆盖状态机边界条件(草稿→提交→审核→确认)
|
||||
- 集成测试覆盖重复数据检查与约束触发场景
|
||||
- 维护指南
|
||||
- 通过 Alembic 迁移管理数据库结构演进
|
||||
- 保持 Pydantic 模式与数据库约束同步,避免运行时异常
|
||||
449
.qoder/repowiki/zh/content/业务逻辑设计/业务逻辑设计.md
Normal file
449
.qoder/repowiki/zh/content/业务逻辑设计/业务逻辑设计.md
Normal file
@@ -0,0 +1,449 @@
|
||||
# 业务逻辑设计
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [backend/app/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/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 引言
|
||||
|
||||
本文件为医院绩效系统的业务逻辑设计文档,旨在全面阐述系统的业务规则、流程控制、状态转换、权限控制、并发处理和事务管理等核心机制。通过对考核流程、工资计算算法、统计分析逻辑以及权限控制机制的深入解析,帮助开发者和运维人员准确理解系统的设计思路与实现细节,并为后续的功能扩展、性能优化和维护提供指导。
|
||||
|
||||
## 项目结构
|
||||
|
||||
后端采用 FastAPI + SQLAlchemy 2.0 的异步架构,遵循分层设计模式,主要分为以下层次:
|
||||
|
||||
- 应用入口层:负责应用实例创建、中间件配置、路由注册与异常处理
|
||||
- API 层:定义 REST 接口,处理请求参数校验与响应封装
|
||||
- 服务层:实现业务逻辑,协调数据访问与跨表操作
|
||||
- 数据模型层:定义数据库实体与关系映射
|
||||
- 核心配置层:提供数据库连接、安全认证、配置管理等基础设施
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用入口层"
|
||||
MAIN["main.py<br/>应用实例创建"]
|
||||
ROUTER_INIT["api/v1/__init__.py<br/>路由注册"]
|
||||
end
|
||||
subgraph "API 层"
|
||||
ASSESSMENTS_API["assessments.py<br/>考核接口"]
|
||||
SALARY_API["salary.py<br/>工资接口"]
|
||||
STATS_API["stats.py<br/>统计接口"]
|
||||
AUTH_API["auth.py<br/>认证接口"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
ASSESSMENT_SERVICE["assessment_service.py<br/>考核服务"]
|
||||
SALARY_SERVICE["salary_service.py<br/>工资服务"]
|
||||
STATS_SERVICE["stats_service.py<br/>统计服务"]
|
||||
TEMPLATE_SERVICE["template_service.py<br/>模板服务"]
|
||||
PLAN_SERVICE["performance_plan_service.py<br/>计划服务"]
|
||||
end
|
||||
subgraph "数据模型层"
|
||||
MODELS["models.py<br/>数据模型"]
|
||||
SCHEMAS["schemas.py<br/>数据模式"]
|
||||
end
|
||||
subgraph "核心配置层"
|
||||
CONFIG["config.py<br/>系统配置"]
|
||||
DATABASE["database.py<br/>数据库连接"]
|
||||
SECURITY["security.py<br/>安全认证"]
|
||||
end
|
||||
MAIN --> ROUTER_INIT
|
||||
ROUTER_INIT --> ASSESSMENTS_API
|
||||
ROUTER_INIT --> SALARY_API
|
||||
ROUTER_INIT --> STATS_API
|
||||
ROUTER_INIT --> AUTH_API
|
||||
ASSESSMENTS_API --> ASSESSMENT_SERVICE
|
||||
SALARY_API --> SALARY_SERVICE
|
||||
STATS_API --> STATS_SERVICE
|
||||
ASSESSMENT_SERVICE --> MODELS
|
||||
SALARY_SERVICE --> MODELS
|
||||
STATS_SERVICE --> MODELS
|
||||
TEMPLATE_SERVICE --> MODELS
|
||||
PLAN_SERVICE --> MODELS
|
||||
MODELS --> DATABASE
|
||||
ASSESSMENTS_API --> SECURITY
|
||||
SALARY_API --> SECURITY
|
||||
STATS_API --> SECURITY
|
||||
AUTH_API --> SECURITY
|
||||
CONFIG --> DATABASE
|
||||
CONFIG --> SECURITY
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [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/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [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/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
|
||||
**章节来源**
|
||||
- [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)
|
||||
|
||||
## 核心组件
|
||||
|
||||
本节概述系统的核心业务组件及其职责边界:
|
||||
|
||||
- 考核管理:支持个人与批量考核创建、状态流转(草稿→提交→审核→确认)、明细评分与加权计算
|
||||
- 工资核算:基于考核结果自动计算绩效奖金,支持单条与批量工资生成、确认与批量确认
|
||||
- 统计分析:提供 BSC 维度分析、科室与个人排名、趋势分析、指标完成度等多维统计
|
||||
- 权限控制:基于 JWT 的用户认证与授权,区分普通员工、管理员与经理权限
|
||||
- 模板管理:支持指标模板的创建、维护与关联,支撑不同科室类型的标准化考核
|
||||
- 绩效计划:支持医院级、科室级、个人级计划的生命周期管理与审批流程
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [backend/app/services/performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L15-L342)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构,API 层负责请求处理与响应封装,服务层承载业务规则,数据模型层抽象数据库实体,核心配置层提供基础设施能力。数据库连接采用异步 SQLAlchemy,确保高并发场景下的性能表现;安全认证基于 JWT,结合权限装饰器实现细粒度的访问控制。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
CLIENT["客户端"]
|
||||
API["API 层<br/>FastAPI 路由"]
|
||||
SERVICE["服务层<br/>业务逻辑"]
|
||||
MODEL["数据模型层<br/>SQLAlchemy ORM"]
|
||||
DB["数据库<br/>PostgreSQL"]
|
||||
SEC["安全认证<br/>JWT + 权限"]
|
||||
CLIENT --> API
|
||||
API --> SEC
|
||||
API --> SERVICE
|
||||
SERVICE --> MODEL
|
||||
MODEL --> DB
|
||||
SEC --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L19-L48)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L21-L53)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 考核流程设计
|
||||
|
||||
考核流程围绕 Assessment 与 AssessmentDetail 实体展开,支持从草稿到确认的完整闭环。服务层提供创建、更新、提交、审核、确认等操作,并严格控制状态转换合法性。
|
||||
|
||||
```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-L206)
|
||||
|
||||
关键实现要点:
|
||||
- 总分与加权得分计算:遍历明细项累加得分,并乘以对应指标权重得到加权得分
|
||||
- 状态校验:仅允许在特定状态下进行状态变更,防止非法状态转换
|
||||
- 批量创建:按科室批量生成考核记录,避免重复创建
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
|
||||
|
||||
### 工资计算算法
|
||||
|
||||
工资计算基于考核结果与员工基本信息,采用固定基数与绩效系数相结合的方式计算绩效奖金,并据此生成最终工资。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> GetAssessment["获取已确认考核记录"]
|
||||
GetAssessment --> CheckExist{"是否存在?"}
|
||||
CheckExist --> |否| EndError["结束:无匹配记录"]
|
||||
CheckExist --> |是| CalcBonus["计算绩效奖金<br/>奖金 = 基数 × (加权得分/100) × 绩效系数"]
|
||||
CalcBonus --> CalcTotal["计算应发工资<br/>应发 = 基本工资 + 绩效奖金 + 补贴 - 扣款"]
|
||||
CalcTotal --> CreateRecord["创建工资记录"]
|
||||
CreateRecord --> EndSuccess["结束:生成成功"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L70-L101)
|
||||
|
||||
关键实现要点:
|
||||
- 绩效基数为可配置常量,便于统一调整
|
||||
- 单次生成时检查是否已存在对应期次的工资记录,避免重复
|
||||
- 批量生成支持按科室筛选已确认的考核记录
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L17-L26)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L192-L219)
|
||||
|
||||
### 统计分析逻辑
|
||||
|
||||
统计服务提供多维度的分析能力,包括 BSC 维度分析、科室与个人排名、趋势分析、指标完成度等。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StatsService {
|
||||
+get_bsc_dimension_stats(db, department_id, period_year, period_month) Dict
|
||||
+get_department_stats(db, period_year, period_month) List
|
||||
+get_trend_stats(db, department_id, period_year, months) List
|
||||
+get_ranking_stats(db, period_year, period_month, limit) List
|
||||
+get_completion_stats(db, indicator_id, period_year, period_month) Dict
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
|
||||
|
||||
关键实现要点:
|
||||
- BSC 维度分析:按平衡计分卡四个维度聚合得分与权重,计算平均分
|
||||
- 科室统计:按科室汇总员工数量、总分、平均分、最高/最低分
|
||||
- 趋势分析:支持跨月度的趋势统计,考虑跨年场景
|
||||
- 排名统计:支持个人与科室的加权得分排名
|
||||
- 指标完成度:计算指标平均得分与目标值的完成率
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L201-L244)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L246-L299)
|
||||
|
||||
### 权限控制机制
|
||||
|
||||
系统采用基于 JWT 的认证与授权机制,结合 FastAPI 的依赖注入实现细粒度的权限控制。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant AuthAPI as "认证接口"
|
||||
participant Security as "安全模块"
|
||||
participant DB as "数据库"
|
||||
Client->>AuthAPI : POST /api/v1/auth/login
|
||||
AuthAPI->>Security : 验证用户名与密码
|
||||
Security->>DB : 查询用户信息
|
||||
DB-->>Security : 用户记录
|
||||
Security-->>AuthAPI : 生成访问令牌
|
||||
AuthAPI-->>Client : 返回令牌
|
||||
Client->>ProtectedAPI : 请求受保护资源
|
||||
ProtectedAPI->>Security : 解析与验证令牌
|
||||
Security-->>ProtectedAPI : 当前用户信息
|
||||
ProtectedAPI-->>Client : 返回业务数据
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
|
||||
|
||||
关键实现要点:
|
||||
- 登录接口:校验用户名与密码,返回 JWT 令牌
|
||||
- 当前用户:从令牌解析用户 ID,查询数据库获取用户对象
|
||||
- 权限装饰器:提供获取激活用户、管理员与经理用户的依赖函数
|
||||
- 角色区分:普通员工、管理员、经理,不同操作需要不同权限级别
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
|
||||
### 并发处理与事务管理
|
||||
|
||||
系统采用异步 SQLAlchemy 连接池与依赖注入的会话管理,确保事务的正确提交与回滚。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["请求进入"]) --> GetSession["获取异步会话"]
|
||||
GetSession --> ExecuteOps["执行数据库操作"]
|
||||
ExecuteOps --> CommitOrRollback{"操作成功?"}
|
||||
CommitOrRollback --> |是| Commit["提交事务"]
|
||||
CommitOrRollback --> |否| Rollback["回滚事务"]
|
||||
Commit --> CloseSession["关闭会话"]
|
||||
Rollback --> CloseSession
|
||||
CloseSession --> End(["请求结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
关键实现要点:
|
||||
- 会话工厂:配置异步引擎与会话参数,开启自动提交与回滚
|
||||
- 依赖注入:在每个请求中创建独立会话,确保线程安全
|
||||
- 异常处理:捕获异常并执行回滚,防止脏数据
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
### 业务规则验证与状态转换
|
||||
|
||||
业务规则通过服务层的状态校验与数据约束共同实现,确保流程的合规性与数据一致性。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Entry(["业务操作入口"]) --> ValidateInput["校验输入参数"]
|
||||
ValidateInput --> CheckStatus["检查当前状态"]
|
||||
CheckStatus --> StatusOK{"状态允许?"}
|
||||
StatusOK --> |否| Reject["拒绝操作并返回错误"]
|
||||
StatusOK --> |是| ApplyRule["应用业务规则"]
|
||||
ApplyRule --> Persist["持久化数据"]
|
||||
Persist --> UpdateState["更新状态"]
|
||||
UpdateState --> Success["返回成功响应"]
|
||||
Reject --> End(["结束"])
|
||||
Success --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L117-L118)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L176-L177)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L198-L199)
|
||||
|
||||
关键实现要点:
|
||||
- 状态转换:仅在合法状态下允许下一步操作
|
||||
- 参数校验:对关键字段进行范围与格式校验
|
||||
- 数据一致性:通过事务保证多表写入的一致性
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L206)
|
||||
|
||||
### 扩展点与自定义配置
|
||||
|
||||
系统提供了丰富的扩展点与配置项,便于根据医院实际需求进行定制:
|
||||
|
||||
- 配置扩展:数据库连接池大小、JWT 过期时间、分页参数等
|
||||
- 工资算法扩展:通过调整绩效基数与系数实现不同的激励策略
|
||||
- 统计维度扩展:新增统计指标与分析维度
|
||||
- 权限扩展:新增角色与权限标识,配合前端菜单控制
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L12-L33)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L17-L18)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统各层之间的依赖关系清晰,API 层依赖服务层,服务层依赖数据模型层,核心配置层为底层基础设施。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
API_ASSESS["API: 考核接口"] --> SVC_ASSESS["服务: 考核服务"]
|
||||
API_SALARY["API: 工资接口"] --> SVC_SALARY["服务: 工资服务"]
|
||||
API_STATS["API: 统计接口"] --> SVC_STATS["服务: 统计服务"]
|
||||
API_AUTH["API: 认证接口"] --> SEC["安全模块"]
|
||||
SVC_ASSESS --> MODELS["数据模型"]
|
||||
SVC_SALARY --> MODELS
|
||||
SVC_STATS --> MODELS
|
||||
MODELS --> DB["数据库连接"]
|
||||
SEC --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [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/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [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)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
- 异步 I/O:采用 SQLAlchemy 2.0 异步引擎与会话,提升高并发场景下的吞吐量
|
||||
- 连接池配置:通过配置文件调整连接池大小与溢出数量,平衡内存与性能
|
||||
- 查询优化:服务层使用 selectinload 进行关联加载,减少 N+1 查询问题
|
||||
- 分页与索引:API 层支持分页,模型层为常用查询字段建立索引,提升查询效率
|
||||
- 缓存策略:建议在统计分析层引入 Redis 缓存热点数据,降低数据库压力
|
||||
|
||||
[本节为通用性能建议,不涉及具体文件分析]
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
常见问题与排查步骤:
|
||||
- 认证失败:检查用户名与密码是否正确,确认用户状态为激活
|
||||
- 权限不足:确认当前用户角色是否满足操作要求(管理员/经理)
|
||||
- 状态转换错误:检查当前记录状态是否允许进行下一步操作
|
||||
- 数据库异常:查看日志文件,确认连接池配置与事务提交/回滚是否正常
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L34)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L109)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L117-L118)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L34-L36)
|
||||
|
||||
## 结论
|
||||
|
||||
本系统通过清晰的分层架构与严格的业务规则实现了医院绩效管理的全流程自动化,涵盖考核、工资、统计与权限控制等核心功能。服务层的状态机设计与事务管理确保了业务流程的合规性与数据一致性,异步数据库连接提升了系统在高并发场景下的稳定性。未来可在统计分析与缓存策略方面进一步优化,以满足更大规模的应用需求。
|
||||
|
||||
[本节为总结性内容,不涉及具体文件分析]
|
||||
|
||||
## 附录
|
||||
|
||||
- 数据模型概览:涵盖科室、员工、指标、考核、工资、计划、模板、菜单等核心实体
|
||||
- API 接口清单:提供各模块的 REST 接口说明与权限要求
|
||||
- 配置参数说明:数据库连接、JWT、分页等系统配置项
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L242)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L12-L33)
|
||||
349
.qoder/repowiki/zh/content/业务逻辑设计/工资计算算法.md
Normal file
349
.qoder/repowiki/zh/content/业务逻辑设计/工资计算算法.md
Normal file
@@ -0,0 +1,349 @@
|
||||
# 工资计算算法
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向医院绩效系统的工资计算算法,系统性阐述绩效奖金计算公式、工资构成要素与计算逻辑,解释基础工资、绩效系数、考核得分权重的计算方法,覆盖不同岗位类型的差异、特殊津贴与扣款处理,以及批量工资生成的算法实现、并发处理与数据一致性保障。同时提供计算规则的配置方式、扩展点与性能优化策略,帮助读者在理解现有实现的基础上进行定制与演进。
|
||||
|
||||
## 项目结构
|
||||
后端采用FastAPI + SQLAlchemy异步ORM,服务层负责业务逻辑,API层提供REST接口,模型层定义数据库表结构与关系,Schema层定义请求/响应数据结构。工资计算相关的核心文件如下:
|
||||
- 服务层:salary_service.py(工资计算与生成)、assessment_service.py(考核计算)
|
||||
- API层:salary.py(工资接口)、assessments.py(考核接口)
|
||||
- 模型层:models.py(实体与关系)、finance.py(财务核算模型)
|
||||
- Schema层:schemas.py(数据模式)
|
||||
- 文档:database.md(数据库设计)、详细设计.md(系统设计)
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API层"
|
||||
A1["salary.py"]
|
||||
A2["assessments.py"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
S1["salary_service.py"]
|
||||
S2["assessment_service.py"]
|
||||
end
|
||||
subgraph "模型层"
|
||||
M1["models.py"]
|
||||
M2["finance.py"]
|
||||
end
|
||||
subgraph "Schema层"
|
||||
SC["schemas.py"]
|
||||
end
|
||||
subgraph "文档"
|
||||
D1["database.md"]
|
||||
D2["详细设计.md"]
|
||||
end
|
||||
A1 --> S1
|
||||
A2 --> S2
|
||||
S1 --> M1
|
||||
S2 --> M1
|
||||
S1 --> SC
|
||||
S2 --> SC
|
||||
M1 --> D1
|
||||
D2 --> D1
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [database.md](file://docs/database.md#L1-L216)
|
||||
- [详细设计.md](file://docs/详细设计.md#L1-L196)
|
||||
|
||||
章节来源
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [database.md](file://docs/database.md#L1-L216)
|
||||
- [详细设计.md](file://docs/详细设计.md#L1-L196)
|
||||
|
||||
## 核心组件
|
||||
- 工资服务(SalaryService):提供工资记录查询、创建、更新、生成、批量生成、确认与批量确认等能力;核心计算函数为绩效奖金计算。
|
||||
- 考核服务(AssessmentService):提供考核记录的创建、更新、提交、审核、确认与批量创建等能力;核心计算为总分与加权得分。
|
||||
- 数据模型(models.py):定义员工、考核、工资记录等实体及其字段与关系。
|
||||
- 数据模式(schemas.py):定义API请求/响应的数据结构。
|
||||
- 财务模型(finance.py):定义科室财务收支记录,用于财务核算与对账。
|
||||
|
||||
章节来源
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L231)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L272-L311)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
## 架构总览
|
||||
工资计算遵循“先考核、后工资”的流程:考核服务计算加权得分,工资服务据此生成工资记录。系统通过API层暴露查询、生成、确认等接口,服务层封装业务规则,模型层承载数据与关系。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant API as "API层(salary.py)"
|
||||
participant SVC as "服务层(SalaryService)"
|
||||
participant ASVC as "服务层(AssessmentService)"
|
||||
participant DB as "数据库(models.py)"
|
||||
U->>API : "POST /salary/generate"
|
||||
API->>SVC : "generate_from_assessment(staff_id, year, month)"
|
||||
SVC->>DB : "查询员工信息(Staff)"
|
||||
SVC->>DB : "查询已确认考核(Assessment.status=FINALIZED)"
|
||||
SVC->>SVC : "calculate_performance_bonus(weighted_score, performance_ratio)"
|
||||
SVC->>DB : "插入SalaryRecord"
|
||||
SVC-->>API : "返回工资记录ID"
|
||||
API-->>U : "生成成功"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L96-L110)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L195-L205)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L231)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 绩效奖金计算公式与工资构成
|
||||
- 绩效奖金计算
|
||||
- 公式:绩效奖金 = 绩效基数 × (绩效得分/100) × 绩效系数
|
||||
- 绩效基数:固定常量,可在服务层中配置与调整
|
||||
- 绩效得分:来自考核的加权得分
|
||||
- 绩效系数:来自员工表的performance_ratio
|
||||
- 工资构成要素
|
||||
- 基本工资:来自员工表base_salary
|
||||
- 绩效奖金:按上述公式计算
|
||||
- 补贴:允许在工资记录中单独维护
|
||||
- 扣款:允许在工资记录中单独维护
|
||||
- 应发工资:基本工资 + 绩效奖金 + 补贴 - 扣款
|
||||
- 状态流转
|
||||
- 工资记录默认状态为“待确认”,确认后进入“已确认”状态
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> LoadStaff["加载员工信息"]
|
||||
LoadStaff --> LoadAssess["加载已确认考核"]
|
||||
LoadAssess --> CheckDup{"是否存在同周期工资记录?"}
|
||||
CheckDup --> |是| Abort["终止生成"]
|
||||
CheckDup --> |否| CalcBonus["计算绩效奖金<br/>= 基数 × (得分/100) × 系数"]
|
||||
CalcBonus --> ComputeTotal["计算应发工资<br/>= 基本工资 + 奖金 + 补贴 - 扣款"]
|
||||
ComputeTotal --> CreateRec["创建工资记录(状态: 待确认)"]
|
||||
CreateRec --> End(["结束"])
|
||||
Abort --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
|
||||
章节来源
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L17-L18)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L173-L174)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
|
||||
### 考核得分权重与加权计算
|
||||
- 总分:明细得分累加
|
||||
- 加权得分:明细得分 × 指标权重累加
|
||||
- 考核状态:草稿 → 提交 → 审核 → 确认(FINALIZED)
|
||||
- 生成工资时要求考核状态为“已确认”,避免未完成流程的误算
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["创建考核"] --> B["计算总分=sum(明细.score)"]
|
||||
B --> C["计算加权得分=Σ(明细.score × 指标权重)"]
|
||||
C --> D["提交/审核/确认"]
|
||||
D --> E{"状态=FINALIZED?"}
|
||||
E --> |是| F["可用于生成工资"]
|
||||
E --> |否| G["不可生成工资"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L195-L205)
|
||||
|
||||
章节来源
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L195-L205)
|
||||
|
||||
### 不同岗位类型的工资差异
|
||||
- 基础差异体现在两个字段:
|
||||
- 基本工资(base_salary):由员工信息决定
|
||||
- 绩效系数(performance_ratio):由员工信息决定
|
||||
- 系统未内置“岗位类型”字段,因此不同岗位的差异通过上述两字段配置体现。若需引入岗位类型,可在模型层新增字段并在服务层扩展计算逻辑。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L118)
|
||||
|
||||
### 特殊津贴与扣款处理
|
||||
- 特殊津贴与扣款通过工资记录的allowance与deduction字段维护,支持在创建与更新时单独设置。
|
||||
- 应发工资为基本工资、绩效奖金、补贴与扣款的组合,计算逻辑在服务层统一处理。
|
||||
|
||||
章节来源
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L77-L124)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L274-L311)
|
||||
|
||||
### 批量工资生成与并发处理
|
||||
- 单次生成:根据员工ID与周期生成单条工资记录
|
||||
- 科室批量生成:遍历该科室已确认考核的员工,逐条生成工资记录
|
||||
- 并发与一致性:
|
||||
- 生成前检查是否存在同周期工资记录,避免重复
|
||||
- 使用数据库事务与flush/refresh确保写入一致性
|
||||
- 批量生成时逐条生成,避免跨事务的复杂锁竞争
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant API as "API层(salary.py)"
|
||||
participant SVC as "服务层(SalaryService)"
|
||||
participant DB as "数据库(models.py)"
|
||||
API->>SVC : "batch_generate_for_department(dept_id, year, month)"
|
||||
SVC->>DB : "查询该科室已确认考核的员工"
|
||||
loop 遍历每个员工
|
||||
SVC->>SVC : "generate_from_assessment(staff_id, year, month)"
|
||||
SVC->>DB : "检查同周期是否存在工资记录"
|
||||
alt 存在则跳过
|
||||
SVC-->>SVC : "跳过"
|
||||
else 不存在则生成
|
||||
SVC->>DB : "插入SalaryRecord"
|
||||
end
|
||||
end
|
||||
SVC-->>API : "返回生成的记录列表"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L113-L129)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L193-L219)
|
||||
|
||||
章节来源
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L193-L219)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L113-L129)
|
||||
|
||||
### 数据一致性与状态管理
|
||||
- 工资记录状态:pending(待确认)→ confirmed(已确认)
|
||||
- 考核记录状态:draft → submitted → reviewed → finalized
|
||||
- 生成工资时仅接受finalized状态的考核,确保数据一致性
|
||||
- 批量确认接口支持按周期与科室范围批量更新状态
|
||||
|
||||
章节来源
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L222-L259)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
|
||||
### 计算规则配置与扩展点
|
||||
- 绩效基数:可通过修改服务层常量进行配置
|
||||
- 绩效系数:通过员工信息维护
|
||||
- 加权计算方法:在考核服务中实现,可扩展为更复杂的权重聚合
|
||||
- 工资构成扩展:可在Schema与模型中增加新的字段,并在服务层扩展计算逻辑
|
||||
|
||||
章节来源
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L17-L18)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L274-L311)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
|
||||
## 依赖关系分析
|
||||
- API层依赖服务层;服务层依赖模型层;Schema层为API与服务层之间的数据契约
|
||||
- 工资服务依赖员工与考核数据;考核服务依赖指标与明细数据
|
||||
- 数据库索引覆盖查询与统计场景,有助于提升查询性能
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
API_S["salary.py"] --> SVC_S["salary_service.py"]
|
||||
API_A["assessments.py"] --> SVC_A["assessment_service.py"]
|
||||
SVC_S --> MODELS["models.py"]
|
||||
SVC_A --> MODELS
|
||||
MODELS --> DB["数据库"]
|
||||
SCHEMAS["schemas.py"] --> API_S
|
||||
SCHEMAS --> API_A
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
章节来源
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 性能考量
|
||||
- 查询与分页:服务层提供分页查询,避免一次性加载大量数据
|
||||
- 关联加载:使用selectinload按需加载关联对象,减少N+1查询
|
||||
- 索引优化:数据库表对常用查询字段建立索引,如工资记录的员工ID与周期组合索引
|
||||
- 批量操作:批量生成与批量确认接口减少多次往返,提升吞吐
|
||||
- 异步IO:基于SQLAlchemy异步会话,适合高并发场景
|
||||
|
||||
章节来源
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L21-L58)
|
||||
- [models.py](file://backend/app/models/models.py#L227-L231)
|
||||
- [database.md](file://docs/database.md#L197-L216)
|
||||
|
||||
## 故障排查指南
|
||||
- 无法生成工资
|
||||
- 检查是否存在同周期的工资记录
|
||||
- 检查考核是否已确认(FINALIZED)
|
||||
- 检查员工是否存在
|
||||
- 无法更新工资
|
||||
- 仅待确认状态可更新
|
||||
- 无法确认工资
|
||||
- 仅待确认状态可确认
|
||||
- 批量生成异常
|
||||
- 检查是否存在未确认的考核
|
||||
- 检查数据库连接与事务
|
||||
|
||||
章节来源
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L133-L164)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L104-L124)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L222-L231)
|
||||
|
||||
## 结论
|
||||
本系统以“考核得分×绩效系数×基数”的核心公式实现绩效奖金计算,通过严格的流程控制与状态管理确保数据一致性。工资构成清晰、扩展灵活,支持按科室批量生成与批量确认,满足医院绩效工资核算的实际需求。未来可在模型层引入岗位类型、扩展加权计算方法与增加更多补贴/扣款项,进一步提升系统的适应性与可配置性。
|
||||
|
||||
## 附录
|
||||
- 数据库表结构概览与索引
|
||||
- 员工表:包含基本工资与绩效系数
|
||||
- 考核表:包含总分与加权得分
|
||||
- 工资记录表:包含基本工资、绩效得分、绩效奖金、补贴、扣款与应发工资
|
||||
- 系统设计文档要点
|
||||
- 多维度考核、评分方法(区间法、扣分法等)
|
||||
- 绩效结果应用(与绩效工资挂钩)
|
||||
|
||||
章节来源
|
||||
- [database.md](file://docs/database.md#L97-L136)
|
||||
- [database.md](file://docs/database.md#L197-L216)
|
||||
- [详细设计.md](file://docs/详细设计.md#L328-L381)
|
||||
357
.qoder/repowiki/zh/content/业务逻辑设计/权限控制机制.md
Normal file
357
.qoder/repowiki/zh/content/业务逻辑设计/权限控制机制.md
Normal file
@@ -0,0 +1,357 @@
|
||||
# 权限控制机制
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件系统化阐述医院绩效系统的权限控制机制,重点覆盖基于角色的访问控制(RBAC)实现、菜单权限与数据权限设计、JWT令牌验证、用户角色分配与权限继承机制。文档同时给出不同角色(管理员、科室负责人、普通员工)的权限范围与操作限制,解释后端中间件式权限校验、动态权限检查与安全审计日志策略,并提供权限配置的扩展方式、权限矩阵与安全最佳实践。
|
||||
|
||||
## 项目结构
|
||||
后端采用 FastAPI + SQLAlchemy 异步 ORM 的分层架构,权限控制相关代码主要集中在以下模块:
|
||||
- 安全与认证:core/security.py、api/v1/auth.py、core/config.py
|
||||
- 数据模型:models/models.py(含用户、菜单等)
|
||||
- 前端路由守卫:frontend/src/router/index.js(令牌拦截)
|
||||
- 日志与审计:core/logging_config.py
|
||||
- API 路由聚合:api/v1/__init__.py
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
A["main.py<br/>应用入口与CORS"]
|
||||
B["api/v1/__init__.py<br/>路由聚合"]
|
||||
C["core/security.py<br/>JWT与权限依赖"]
|
||||
D["api/v1/auth.py<br/>登录/注册/当前用户"]
|
||||
E["models/models.py<br/>User/Menu等模型"]
|
||||
F["core/config.py<br/>JWT配置"]
|
||||
G["core/logging_config.py<br/>日志与审计"]
|
||||
end
|
||||
subgraph "前端"
|
||||
H["frontend/src/router/index.js<br/>路由守卫"]
|
||||
end
|
||||
H --> A
|
||||
A --> B
|
||||
B --> D
|
||||
D --> C
|
||||
C --> E
|
||||
C --> F
|
||||
A --> G
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [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/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
|
||||
章节来源
|
||||
- [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)
|
||||
|
||||
## 核心组件
|
||||
- JWT 与令牌管理:负责令牌签发、解码、过期控制与用户解析。
|
||||
- 权限依赖注入:提供“当前用户”、“当前有效用户”、“管理员”、“管理员或经理”的依赖函数,作为路由装饰器实现中间件式权限控制。
|
||||
- 用户模型与角色:User 模型包含 role 字段,支持 admin、manager、staff 角色。
|
||||
- 菜单模型与权限标识:Menu 模型包含 permission 字段,用于前端按钮级权限标识。
|
||||
- 员工与菜单 API:通过依赖注入实现不同角色的访问控制。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L109)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L98-L150)
|
||||
|
||||
## 架构总览
|
||||
后端通过 FastAPI 的依赖注入系统,在每个路由上声明所需的权限依赖,实现“中间件式”的权限控制。前端通过路由守卫拦截未登录访问,后端通过 OAuth2 Bearer 令牌进行鉴权。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "FastAPI路由"
|
||||
participant SEC as "security依赖"
|
||||
participant DB as "数据库"
|
||||
participant MOD as "模型(User)"
|
||||
FE->>API : "携带Authorization : Bearer token"
|
||||
API->>SEC : "依赖注入 : get_current_user()"
|
||||
SEC->>SEC : "decode_token()"
|
||||
SEC->>DB : "按ID查询用户"
|
||||
DB-->>SEC : "返回User"
|
||||
SEC->>MOD : "校验is_active"
|
||||
MOD-->>API : "返回当前用户"
|
||||
API-->>FE : "执行业务逻辑/返回数据"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L91)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### JWT 与令牌验证
|
||||
- 令牌签发:使用 HS256 算法,包含 exp 与 sub(用户ID),默认有效期 8 小时。
|
||||
- 令牌解码:验证签名与过期时间,失败则抛出凭据无效异常。
|
||||
- 用户解析:从载荷提取 sub(用户ID),查询数据库获取用户实体并校验 is_active。
|
||||
- 依赖链路:OAuth2PasswordBearer 提供 tokenUrl,get_current_user 解析用户,get_current_active_user 进一步校验状态。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入受保护路由"]) --> GetToken["从Authorization头获取Bearer token"]
|
||||
GetToken --> Decode["decode_token() 验证签名与过期"]
|
||||
Decode --> Valid{"解码成功?"}
|
||||
Valid --> |否| Raise401["抛出401未授权"]
|
||||
Valid --> |是| LoadUser["按ID查询User"]
|
||||
LoadUser --> Active{"is_active=true?"}
|
||||
Active --> |否| Raise403["抛出403禁止访问"]
|
||||
Active --> |是| ReturnUser["返回当前用户"]
|
||||
Raise401 --> End(["结束"])
|
||||
Raise403 --> End
|
||||
ReturnUser --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L91)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L91)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
|
||||
### RBAC 角色与权限继承
|
||||
- 角色定义:User.role 支持 admin(管理员)、manager(经理)、staff(普通员工)。
|
||||
- 权限依赖:
|
||||
- get_current_active_user:校验用户激活状态。
|
||||
- get_current_manager_user:要求 admin 或 manager。
|
||||
- get_current_admin_user:要求 admin。
|
||||
- 路由装饰示例:
|
||||
- 员工管理:创建/更新/删除需管理员或经理权限。
|
||||
- 菜单管理:创建/更新/删除需管理员或经理权限;初始化默认菜单需管理员权限。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class User {
|
||||
+int id
|
||||
+string username
|
||||
+string role
|
||||
+bool is_active
|
||||
}
|
||||
class SecurityDeps {
|
||||
+get_current_user(token) User
|
||||
+get_current_active_user(user) User
|
||||
+get_current_manager_user(user) User
|
||||
+get_current_admin_user(user) User
|
||||
}
|
||||
class StaffAPI {
|
||||
+create_staff() Response
|
||||
+update_staff() Response
|
||||
+delete_staff() Response
|
||||
}
|
||||
class MenuAPI {
|
||||
+create_menu() Response
|
||||
+update_menu() Response
|
||||
+delete_menu() Response
|
||||
+init_default_menus() Response
|
||||
}
|
||||
StaffAPI --> SecurityDeps : "依赖manager/admin"
|
||||
MenuAPI --> SecurityDeps : "依赖manager/admin"
|
||||
SecurityDeps --> User : "返回当前用户"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L109)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L98-L150)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L109)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L98-L150)
|
||||
|
||||
### 菜单权限与前端集成
|
||||
- 菜单模型:Menu 包含 permission 字段,用于前端按钮级权限标识。
|
||||
- 菜单服务:提供树形结构、列表查询、默认初始化等能力。
|
||||
- 前端路由守卫:未登录访问会被重定向至登录页,确保前端侧最小暴露面。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "菜单API"
|
||||
participant SVC as "MenuService"
|
||||
participant DB as "数据库"
|
||||
FE->>API : "GET /menus/tree?visible_only=true"
|
||||
API->>SVC : "get_tree(visible_only)"
|
||||
SVC->>DB : "查询可见且启用的菜单树"
|
||||
DB-->>SVC : "返回菜单树"
|
||||
SVC-->>API : "返回树形结构"
|
||||
API-->>FE : "渲染菜单树/按钮权限"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L17-L29)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L347-L373)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L17-L29)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L347-L373)
|
||||
|
||||
### 数据权限与业务边界
|
||||
- 员工管理:仅管理员或经理可增删改;查询列表对所有有效用户开放。
|
||||
- 菜单管理:对菜单树与列表查询不强制管理员权限,但对写操作(创建/更新/删除/初始化)要求管理员或经理。
|
||||
- 建议扩展:可在服务层增加“数据域过滤”,例如按用户关联的 staff_id 或 department_id 限制查询范围,避免越权访问。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L49)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L109)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L32-L65)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L98-L150)
|
||||
|
||||
### 认证流程与注册
|
||||
- 登录:用户名+密码校验,账户激活状态校验,成功后签发访问令牌。
|
||||
- 注册:校验用户名唯一性,生成密码哈希,创建用户并返回结果。
|
||||
- 当前用户:通过 /api/v1/auth/me 获取当前用户信息。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant AUTH as "Auth路由"
|
||||
participant SEC as "security"
|
||||
participant DB as "数据库"
|
||||
FE->>AUTH : "POST /auth/login"
|
||||
AUTH->>DB : "按用户名查询用户"
|
||||
DB-->>AUTH : "返回User"
|
||||
AUTH->>SEC : "verify_password()"
|
||||
SEC-->>AUTH : "校验通过"
|
||||
AUTH->>SEC : "create_access_token(user.id)"
|
||||
SEC-->>AUTH : "返回access_token"
|
||||
AUTH-->>FE : "{access_token, token_type}"
|
||||
FE->>AUTH : "GET /auth/me"
|
||||
AUTH->>SEC : "get_current_active_user"
|
||||
SEC->>DB : "查询当前用户"
|
||||
DB-->>SEC : "返回User"
|
||||
SEC-->>AUTH : "返回当前用户"
|
||||
AUTH-->>FE : "用户信息"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L73)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L43)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L91)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L73)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L43)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L91)
|
||||
|
||||
### 安全审计与日志
|
||||
- 日志配置:按天轮转 app_error 日志,区分控制台与文件输出等级。
|
||||
- 异常处理:全局 HTTP 与验证异常记录到日志,便于审计与追踪。
|
||||
- 建议:在权限决策点(如 get_current_manager_user)增加审计日志,记录用户ID、操作、IP、时间与结果。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
## 依赖关系分析
|
||||
- 路由聚合:api/v1/__init__.py 将各模块路由统一挂载到主应用。
|
||||
- 中间件:main.py 配置 CORS,确保前后端跨域通信。
|
||||
- 安全依赖:security.py 的依赖函数被各业务路由复用,形成统一的权限控制入口。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
INIT["api/v1/__init__.py"] --> AUTH["api/v1/auth.py"]
|
||||
INIT --> STAFF["api/v1/staff.py"]
|
||||
INIT --> MENUS["api/v1/menus.py"]
|
||||
MAIN["main.py"] --> INIT
|
||||
AUTH --> SEC["core/security.py"]
|
||||
STAFF --> SEC
|
||||
MENUS --> SEC
|
||||
SEC --> CFG["core/config.py"]
|
||||
SEC --> MODELS["models/models.py"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L41-L51)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L41-L51)
|
||||
|
||||
## 性能考虑
|
||||
- 令牌解码与用户查询:建议在网关或中间件层缓存近期活跃用户的轻量信息,减少数据库查询压力。
|
||||
- 分页与索引:员工与菜单查询使用分页与索引,避免大结果集扫描。
|
||||
- CORS 与异常处理:合理配置允许的源与方法,减少预检请求开销。
|
||||
|
||||
## 故障排查指南
|
||||
- 401 未授权:检查 Authorization 头是否携带 Bearer token,确认 token 未过期。
|
||||
- 403 禁止访问:确认用户角色满足 get_current_manager_user 或 get_current_admin_user 要求。
|
||||
- 登录失败:检查用户名/密码与账户激活状态。
|
||||
- 跨域问题:确认 CORS_ORIGINS 配置与前端访问地址一致。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L28-L29)
|
||||
|
||||
## 结论
|
||||
该系统采用简洁明确的 RBAC 模式:以角色驱动的依赖注入实现中间件式权限控制,结合 JWT 令牌与用户激活状态校验,满足后台管理场景下的安全需求。菜单模型的 permission 字段为前端按钮级权限提供了基础。建议后续在服务层引入数据域过滤与权限审计日志,进一步强化数据权限与合规性。
|
||||
|
||||
## 附录
|
||||
|
||||
### 角色权限矩阵(摘要)
|
||||
- 管理员(admin)
|
||||
- 员工管理:创建/更新/删除
|
||||
- 菜单管理:创建/更新/删除/初始化
|
||||
- 科室负责人(manager)
|
||||
- 员工管理:创建/更新/删除
|
||||
- 菜单管理:创建/更新/删除(不含初始化)
|
||||
- 普通员工(staff)
|
||||
- 员工管理:仅查询列表与详情
|
||||
- 菜单管理:查询菜单树/列表(写操作受限)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L109)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L98-L150)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
|
||||
|
||||
### 安全最佳实践
|
||||
- 强制使用 HTTPS 传输,避免令牌在传输中泄露。
|
||||
- 生产环境更换 SECRET_KEY,定期轮换。
|
||||
- 严格限制 CORS 源,避免跨站风险。
|
||||
- 对高敏感操作(如删除)增加二次确认与审计日志。
|
||||
- 在服务层增加数据域过滤,防止越权读取。
|
||||
408
.qoder/repowiki/zh/content/业务逻辑设计/统计分析逻辑.md
Normal file
408
.qoder/repowiki/zh/content/业务逻辑设计/统计分析逻辑.md
Normal file
@@ -0,0 +1,408 @@
|
||||
# 统计分析逻辑
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [finance.py](file://backend/app/api/v1/finance.py)
|
||||
- [stats.js](file://frontend/src/api/stats.js)
|
||||
- [Dashboard.vue](file://frontend/src/views/Dashboard.vue)
|
||||
- [Reports.vue](file://frontend/src/views/reports/Reports.vue)
|
||||
- [详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向医院绩效系统的统计分析逻辑,围绕平衡计分卡(BSC)四个维度(财务、客户、内部流程、学习与成长)展开,系统性阐述:
|
||||
- 维度统计与加权平均的实现
|
||||
- 科室绩效排名、趋势分析、同比/环比计算
|
||||
- 多维度数据聚合、图表数据生成与前端展示
|
||||
- 统计口径定义、数据准确性保障与性能优化策略
|
||||
- 统计结果的展示逻辑、导出能力现状与扩展建议、自定义报表配置思路
|
||||
|
||||
## 项目结构
|
||||
后端采用 FastAPI + SQLAlchemy 异步 ORM,统计分析位于服务层与 API 层,前端通过 ECharts 进行可视化展示。数据库模型涵盖指标、考核、员工、科室、财务等核心实体。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
API["API 路由<br/>/stats/*"]
|
||||
SVC["统计服务<br/>StatsService"]
|
||||
MODELS["数据模型<br/>Assessment/Detail/Indicator/Department/Staff"]
|
||||
FINANCE_MODEL["财务模型<br/>DepartmentFinance"]
|
||||
end
|
||||
subgraph "前端"
|
||||
FE_API["前端统计接口封装<br/>stats.js"]
|
||||
DASHBOARD["仪表盘视图<br/>Dashboard.vue"]
|
||||
REPORTS["报表视图<br/>Reports.vue"]
|
||||
end
|
||||
FE_API --> API
|
||||
API --> SVC
|
||||
SVC --> MODELS
|
||||
SVC --> FINANCE_MODEL
|
||||
DASHBOARD --> FE_API
|
||||
REPORTS --> FE_API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L203)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L819)
|
||||
- [Reports.vue](file://frontend/src/views/reports/Reports.vue#L183-L245)
|
||||
|
||||
**章节来源**
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L203)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L819)
|
||||
- [Reports.vue](file://frontend/src/views/reports/Reports.vue#L183-L245)
|
||||
|
||||
## 核心组件
|
||||
- 统计服务层(StatsService):提供 BSC 维度统计、科室统计、趋势分析、排名、指标完成度等核心统计方法。
|
||||
- API 层(/stats):暴露统计接口,负责参数解析、默认值处理、响应包装。
|
||||
- 数据模型:Assessment/AssessmentDetail/Indicator/Department/Staff/Finance 相关表,支撑统计口径与聚合。
|
||||
- 前端接口封装与可视化:stats.js 封装请求,Dashboard.vue 与 Reports.vue 使用 ECharts 渲染图表。
|
||||
|
||||
**章节来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L14-L242)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L203)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L819)
|
||||
- [Reports.vue](file://frontend/src/views/reports/Reports.vue#L183-L245)
|
||||
|
||||
## 架构总览
|
||||
统计分析的调用链路如下:
|
||||
- 前端通过 stats.js 请求 /stats/* 接口
|
||||
- API 层解析参数并调用 StatsService
|
||||
- StatsService 基于 SQLAlchemy 异步查询,按统计口径进行聚合
|
||||
- 返回标准化 JSON 结果,前端渲染图表与表格
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端(stats.js)"
|
||||
participant API as "API 路由(stats.py)"
|
||||
participant SVC as "统计服务(StatsService)"
|
||||
participant DB as "数据库(ORM)"
|
||||
FE->>API : GET /stats/department?year&month
|
||||
API->>SVC : get_department_stats(year, month)
|
||||
SVC->>DB : 查询Assessment/AssessmentDetail/Staff/Department
|
||||
DB-->>SVC : 聚合结果
|
||||
SVC-->>API : 列表(含科室均分/排名等)
|
||||
API-->>FE : JSON 响应
|
||||
FE->>FE : ECharts 渲染图表
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L36-L49)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
|
||||
**章节来源**
|
||||
- [stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L36-L49)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### BSC 四维度统计(财务、客户、内部流程、学习与成长)
|
||||
- 统计口径
|
||||
- 维度得分 = Σ(指标得分 × 指标权重) / Σ(指标权重)
|
||||
- 指标得分来自 AssessmentDetail.score,权重来自 Indicator.weight
|
||||
- 仅统计状态为“已确认”的考核记录
|
||||
- 查询条件
|
||||
- 可按年、月、科室过滤
|
||||
- 返回字段
|
||||
- 各维度的总分、权重、指标数量、平均分(总分/权重)
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入 get_bsc_dimension_stats"]) --> BuildCond["构建查询条件<br/>状态=FINALIZED<br/>可选: 年/月/科室"]
|
||||
BuildCond --> JoinTables["连接表: Indicator → AssessmentDetail → Assessment"]
|
||||
JoinTables --> GroupByDim["按 bs_dimension 分组"]
|
||||
GroupByDim --> Calc["计算: 总分=Σ(score*weight)<br/>权重=Σ(weight)<br/>指标数=count(*)"]
|
||||
Calc --> Avg["平均分=总分/权重"]
|
||||
Avg --> Return["返回维度统计+周期"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
|
||||
**章节来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
|
||||
### 科室绩效统计与排名
|
||||
- 统计口径
|
||||
- 按科室汇总:员工数、总分、平均分、最高分、最低分、员工列表
|
||||
- 平均分 = 总分 / 员工数
|
||||
- 结果按平均分降序排列
|
||||
- 排名口径
|
||||
- 员工维度:按加权得分降序取前 N
|
||||
- 科室维度:按科室平均分降序取前 N
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
S1["查询 FINALIZED 考核记录"] --> Join["连接 Staff/Assessment/Department"]
|
||||
Join --> Group["按 Department 聚合"]
|
||||
Group --> Sum["累计: 员工数/总分/最高分/最低分"]
|
||||
Sum --> Avg["平均分=总分/员工数"]
|
||||
Avg --> Sort["按平均分降序"]
|
||||
Sort --> Limit["可选: 截取前N"]
|
||||
Limit --> Out["返回科室统计列表"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
|
||||
**章节来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
|
||||
### 趋势分析(月度)
|
||||
- 统计口径
|
||||
- 以月为粒度,计算当月平均总分、平均加权分、记录数
|
||||
- 可按年份与最近 N 个月过滤
|
||||
- 跨年处理:若起始月小于 1,则跨年累加
|
||||
- 返回字段
|
||||
- 月份、平均得分、平均加权得分、记录数
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
T0["输入: 年份/月份数/科室ID"] --> T1["构造条件: FINALIZED"]
|
||||
T1 --> T2{"是否指定年份?"}
|
||||
T2 -- 是 --> T3["计算起始月=当前月-N+1"]
|
||||
T3 --> T4{"起始月<1?"}
|
||||
T4 -- 是 --> T5["拼接跨年条件"]
|
||||
T4 -- 否 --> T6["拼接同年内条件"]
|
||||
T2 -- 否 --> T7["使用当前年份"]
|
||||
T5 --> T8["连接 Staff/Assessment"]
|
||||
T6 --> T8
|
||||
T7 --> T8
|
||||
T8 --> T9["按月分组, 计算平均值与计数"]
|
||||
T9 --> T10["返回趋势数据"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
|
||||
|
||||
**章节来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
|
||||
|
||||
### 指标完成度统计
|
||||
- 统计口径
|
||||
- 计算指标平均得分、最大/最小得分、完成率 = min(平均得分/目标值×100, 100)
|
||||
- 可按年、月、指标过滤
|
||||
- 返回字段
|
||||
- 指标ID/名称/编码、目标值、最高分、平均分、完成率、样本数
|
||||
|
||||
**章节来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L246-L299)
|
||||
|
||||
### 财务相关统计(收支趋势)
|
||||
- 当前实现
|
||||
- /stats/finance-trend 为演示接口,返回模拟数据
|
||||
- 建议实现
|
||||
- 使用 DepartmentFinance 表按月统计收入/支出/结余
|
||||
- 与财务模型一致的类别枚举(收入/支出类别)
|
||||
- 与趋势分析一致的“最近 N 月”参数
|
||||
|
||||
**章节来源**
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L156-L183)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
### 统计结果展示与图表生成
|
||||
- Dashboard.vue
|
||||
- 初始化 ECharts 实例,加载趋势、饼图、科室排名、财务趋势、仪表盘等数据
|
||||
- 趋势图:双轴(得分/奖金),折线+面积
|
||||
- 仪表盘:床位使用率、药占比、材料占比、患者满意度(模拟数据)
|
||||
- Reports.vue
|
||||
- 科室柱状图(平均分)+折线(奖金总额)
|
||||
- 支持筛选与刷新
|
||||
|
||||
**章节来源**
|
||||
- [Dashboard.vue](file://frontend/src/views/Dashboard.vue#L423-L819)
|
||||
- [Reports.vue](file://frontend/src/views/reports/Reports.vue#L183-L245)
|
||||
|
||||
## 依赖关系分析
|
||||
- 统计服务依赖数据模型与枚举(Assessment/AssessmentDetail/Indicator/Department/Staff/BSCDimension/AssessmentStatus)
|
||||
- API 层依赖统计服务与安全中间件(用户鉴权)
|
||||
- 前端依赖 stats.js 封装的接口,调用 /stats/* 并渲染图表
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
STATS_API["/stats/*"] --> STATS_SVC["StatsService"]
|
||||
STATS_SVC --> MODELS_M["Assessment/Detail/Indicator/Department/Staff"]
|
||||
STATS_SVC --> MODELS_F["DepartmentFinance"]
|
||||
FE_STATS["stats.js"] --> STATS_API
|
||||
DASH["Dashboard.vue"] --> FE_STATS
|
||||
REPORTS["Reports.vue"] --> FE_STATS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L14-L242)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L10-L13)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L203)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
|
||||
**章节来源**
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L14-L242)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L10-L13)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L203)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 使用 group_by 与聚合函数一次性计算,避免多次往返
|
||||
- 为常用过滤字段(状态、年、月、科室)建立索引(模型中已有索引)
|
||||
- 异步 I/O
|
||||
- 使用 SQLAlchemy AsyncSession,降低阻塞
|
||||
- 缓存策略
|
||||
- 对热点报表(如趋势、排名)可引入 Redis 缓存,设置合理过期时间
|
||||
- 分页与限制
|
||||
- 排名接口限制返回条数(默认 10),避免大数据集传输
|
||||
- 前端渲染
|
||||
- ECharts 按需初始化,窗口 resize 时重绘,避免重复实例化
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L174-L178)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L202-L244)
|
||||
- [Dashboard.vue](file://frontend/src/views/Dashboard.vue#L441-L447)
|
||||
|
||||
## 故障排查指南
|
||||
- 接口返回空数据
|
||||
- 检查考核状态是否为 FINALIZED
|
||||
- 确认年/月/科室参数是否正确
|
||||
- 确认数据是否已归档到对应周期
|
||||
- 趋势数据异常
|
||||
- 跨年月份计算是否正确(起始月<1 的分支)
|
||||
- 是否存在缺失月份导致平均值异常
|
||||
- 图表不显示
|
||||
- 确认 ECharts 实例已初始化且容器尺寸有效
|
||||
- 检查数据结构与图表配置项是否匹配
|
||||
- 财务趋势为空
|
||||
- 当前 /stats/finance-trend 为演示接口,需对接 DepartmentFinance 表真实数据
|
||||
|
||||
**章节来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
|
||||
- [Dashboard.vue](file://frontend/src/views/Dashboard.vue#L423-L447)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L156-L183)
|
||||
|
||||
## 结论
|
||||
本系统以 BSC 四维度为核心,结合指标权重与加权平均,实现了维度得分、科室统计、趋势分析与排名等关键统计能力。通过异步查询与前端可视化,形成了从数据到洞察的完整闭环。财务趋势与关键指标仪表盘目前为演示实现,建议尽快对接 DepartmentFinance 表,以提供真实财务数据支持。
|
||||
|
||||
## 附录
|
||||
|
||||
### 统计口径与算法一览
|
||||
- BSC 维度统计
|
||||
- 维度得分 = Σ(得分×权重)/Σ(权重)
|
||||
- 仅统计 FINALIZED 考核
|
||||
- 科室统计
|
||||
- 员工数、总分、平均分、最高/最低分
|
||||
- 平均分=总分/员工数
|
||||
- 趋势分析
|
||||
- 月度平均总分、平均加权分、记录数
|
||||
- 跨年处理:起始月<1 时拼接跨年条件
|
||||
- 指标完成度
|
||||
- 完成率=min(平均得分/目标值×100, 100)
|
||||
- 排名
|
||||
- 员工:按加权得分降序取前 N
|
||||
- 科室:按平均分降序取前 N
|
||||
|
||||
**章节来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L299)
|
||||
|
||||
### 数据模型与统计关系
|
||||
```mermaid
|
||||
erDiagram
|
||||
INDICATOR {
|
||||
int id PK
|
||||
string name
|
||||
string code
|
||||
enum bs_dimension
|
||||
numeric weight
|
||||
numeric max_score
|
||||
numeric target_value
|
||||
}
|
||||
ASSESSMENT {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
numeric total_score
|
||||
numeric weighted_score
|
||||
enum status
|
||||
}
|
||||
ASSESSMENT_DETAIL {
|
||||
int id PK
|
||||
int assessment_id FK
|
||||
int indicator_id FK
|
||||
numeric actual_value
|
||||
numeric score
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
int department_id FK
|
||||
string employee_id
|
||||
string name
|
||||
}
|
||||
DEPARTMENT {
|
||||
int id PK
|
||||
string name
|
||||
string code
|
||||
enum dept_type
|
||||
}
|
||||
INDICATOR ||--o{ ASSESSMENT_DETAIL : "包含"
|
||||
ASSESSMENT_DETAIL ||--|| ASSESSMENT : "属于"
|
||||
ASSESSMENT ||--|| STAFF : "由员工产生"
|
||||
STAFF ||--|| DEPARTMENT : "属于"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L117-L203)
|
||||
|
||||
### 导出与自定义报表配置
|
||||
- 导出能力现状
|
||||
- 后端未提供报表导出接口
|
||||
- 前端未实现 Excel/PDF 导出
|
||||
- 建议
|
||||
- 新增 /stats/export 接口,支持按参数导出 CSV/Excel
|
||||
- 前端增加导出按钮,调用后端接口并下载文件
|
||||
- 自定义报表配置:允许用户保存筛选条件与图表布局,后续可扩展为“仪表盘模板”
|
||||
|
||||
**章节来源**
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L819)
|
||||
|
||||
### 与系统设计文档的对应关系
|
||||
- 设计目标与原则
|
||||
- 战略导向、分类分层、定量与定性结合、可操作性、持续改进
|
||||
- 报表与分析中心
|
||||
- 标准报表、自定义仪表盘、多维分析、趋势预测、数据导出
|
||||
- 实施路线图
|
||||
- 分阶段推进,逐步覆盖全院并深化应用
|
||||
|
||||
**章节来源**
|
||||
- [详细设计.md](file://docs/详细设计.md#L1-L196)
|
||||
384
.qoder/repowiki/zh/content/业务逻辑设计/考核流程设计.md
Normal file
384
.qoder/repowiki/zh/content/业务逻辑设计/考核流程设计.md
Normal file
@@ -0,0 +1,384 @@
|
||||
# 考核流程设计
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 引言
|
||||
本文件面向医院绩效系统的“考核流程设计”,围绕考核状态流转机制(草稿→提交→审核→确认)进行系统化说明,涵盖业务规则、权限控制、数据验证、流程实现、批量创建与并发处理、异常处理与事务管理策略,以及流程控制的扩展点与自定义配置选项。文档同时提供前后端交互与数据库结构映射,帮助开发者与运维人员快速理解与实施。
|
||||
|
||||
## 项目结构
|
||||
后端采用FastAPI + SQLAlchemy异步ORM,按领域模块划分:API路由、服务层、数据模型、Schema定义、安全认证与配置。前端采用Vue 3 + Element Plus,提供考核列表、状态操作与批量创建能力。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_List["Assessments.vue<br/>考核列表与操作"]
|
||||
FE_API["assessment.js<br/>HTTP客户端封装"]
|
||||
end
|
||||
subgraph "后端"
|
||||
API["assessments.py<br/>API路由"]
|
||||
SVC["assessment_service.py<br/>服务层"]
|
||||
SCHEMA["schemas.py<br/>数据模式"]
|
||||
SEC["security.py<br/>权限与认证"]
|
||||
MODEL["models.py<br/>数据模型"]
|
||||
DB[("数据库")]
|
||||
end
|
||||
FE_List --> FE_API
|
||||
FE_API --> API
|
||||
API --> SVC
|
||||
SVC --> MODEL
|
||||
SVC --> SCHEMA
|
||||
API --> SEC
|
||||
SVC --> DB
|
||||
MODEL --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L200)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L194-L271)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L200)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
|
||||
## 核心组件
|
||||
- 数据模型层:定义考核记录、明细、员工、科室、指标等实体及其关系与索引。
|
||||
- 服务层:封装业务逻辑,包括创建、更新、提交、审核、确认、批量创建等。
|
||||
- API层:暴露REST接口,绑定权限装饰器,返回标准化响应。
|
||||
- Schema层:定义请求/响应数据结构与枚举类型,确保前后端契约一致。
|
||||
- 安全层:基于JWT的认证与授权,区分普通员工、管理员与经理权限。
|
||||
- 前端视图与API封装:提供考核列表、状态操作按钮与批量创建弹窗。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L17-L166)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L194-L271)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
|
||||
|
||||
## 架构总览
|
||||
系统采用分层架构:前端负责交互与调用,后端API路由接收请求,服务层执行业务规则,数据模型映射到数据库,安全中间件进行权限校验。状态流转由服务层严格控制,API层仅暴露受控的端点。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "API路由"
|
||||
participant SEC as "安全中间件"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库"
|
||||
FE->>API : "提交/审核/确认请求"
|
||||
API->>SEC : "校验JWT与角色"
|
||||
SEC-->>API : "通过/拒绝"
|
||||
API->>SVC : "调用业务方法"
|
||||
SVC->>DB : "读写数据"
|
||||
DB-->>SVC : "返回结果"
|
||||
SVC-->>API : "业务结果"
|
||||
API-->>FE : "标准化响应"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 考核状态与业务规则
|
||||
- 状态枚举:草稿(draft)、已提交(submitted)、已审核(reviewed)、已确认(finalized)、已驳回(rejected)。
|
||||
- 状态流转:
|
||||
- 草稿 → 已提交:仅草稿或已驳回状态允许提交。
|
||||
- 已提交 → 已审核/已驳回:审核人根据审批结果切换状态。
|
||||
- 已审核 → 已确认:仅已审核状态允许确认。
|
||||
- 权限控制:
|
||||
- 提交:当前活跃用户即可。
|
||||
- 审核/确认:管理员或经理角色。
|
||||
- 数据验证:
|
||||
- 提交前:校验状态必须为草稿。
|
||||
- 审核:校验状态必须为已提交。
|
||||
- 确认:校验状态必须为已审核。
|
||||
- 更新:仅允许草稿或已驳回状态修改明细与备注。
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 已提交 : "提交"
|
||||
已提交 --> 已审核 : "审核通过"
|
||||
已提交 --> 已驳回 : "审核驳回"
|
||||
已审核 --> 已确认 : "确认"
|
||||
已确认 --> [*]
|
||||
已驳回 --> 草稿 : "重新编辑"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L51)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L51)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
|
||||
### 考核创建与更新流程
|
||||
- 创建:
|
||||
- 计算总分与加权得分(加权=Σ(指标得分×指标权重))。
|
||||
- 写入主表与明细表,刷新实体。
|
||||
- 更新:
|
||||
- 仅草稿或已驳回状态允许更新。
|
||||
- 删除旧明细,重建新明细并重新计算总分与加权得分。
|
||||
- 可选更新备注。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入创建/更新"]) --> CheckStatus["检查状态是否允许"]
|
||||
CheckStatus --> |不允许| Error["返回错误"]
|
||||
CheckStatus --> |允许| BuildDetails["构建明细列表"]
|
||||
BuildDetails --> CalcScore["计算总分与加权得分"]
|
||||
CalcScore --> Persist["持久化主表与明细"]
|
||||
Persist --> Refresh["刷新实体"]
|
||||
Refresh --> Done(["完成"])
|
||||
Error --> Done
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L71-L156)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L71-L156)
|
||||
|
||||
### 考核提交、审核与确认流程
|
||||
- 提交:
|
||||
- 校验状态为草稿,设置提交时间,状态变更为已提交。
|
||||
- 审核:
|
||||
- 校验状态为已提交,记录审核人与时间;通过则变更为已审核,否则变更为已驳回。
|
||||
- 确认:
|
||||
- 校验状态为已审核,状态变更为已确认。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant API as "API"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库"
|
||||
U->>API : "POST /assessments/{id}/submit"
|
||||
API->>SVC : "submit(id)"
|
||||
SVC->>DB : "读取并校验状态"
|
||||
DB-->>SVC : "返回记录"
|
||||
SVC->>DB : "更新状态=已提交, 写入提交时间"
|
||||
DB-->>SVC : "提交成功"
|
||||
SVC-->>API : "返回结果"
|
||||
API-->>U : "提交成功"
|
||||
U->>API : "POST /assessments/{id}/review?approved={bool}&remark={text}"
|
||||
API->>SVC : "review(id, reviewer_id, approved, remark)"
|
||||
SVC->>DB : "读取并校验状态"
|
||||
DB-->>SVC : "返回记录"
|
||||
SVC->>DB : "更新状态=已审核/已驳回, 写入审核人与时间"
|
||||
DB-->>SVC : "审核完成"
|
||||
SVC-->>API : "返回结果"
|
||||
API-->>U : "审核通过/已驳回"
|
||||
U->>API : "POST /assessments/{id}/finalize"
|
||||
API->>SVC : "finalize(id)"
|
||||
SVC->>DB : "读取并校验状态"
|
||||
DB-->>SVC : "返回记录"
|
||||
SVC->>DB : "更新状态=已确认"
|
||||
DB-->>SVC : "确认完成"
|
||||
SVC-->>API : "返回结果"
|
||||
API-->>U : "确认成功"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
- [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#L105-L145)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
|
||||
### 批量创建考核流程与并发处理
|
||||
- 批量创建:
|
||||
- 获取指定科室当月在职员工列表。
|
||||
- 检查是否存在同周期重复记录,避免重复创建。
|
||||
- 为每位员工创建空明细(默认得分0),并持久化。
|
||||
- 并发处理:
|
||||
- 使用数据库事务保证创建完整性。
|
||||
- 建议在高并发场景下增加唯一性约束与去重检查,避免重复创建。
|
||||
- 可引入队列或批处理策略,分批创建以降低锁竞争。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
S(["开始批量创建"]) --> FetchStaff["查询在职员工"]
|
||||
FetchStaff --> Loop{"遍历员工"}
|
||||
Loop --> |存在| Skip["跳过已存在记录"]
|
||||
Loop --> |不存在| CreateAssess["创建考核记录(0分)"]
|
||||
CreateAssess --> CreateDetails["为每个指标创建明细(0分)"]
|
||||
CreateDetails --> Next["下一个员工"]
|
||||
Skip --> Next
|
||||
Next --> |完成| Flush["批量刷新持久化"]
|
||||
Flush --> E(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
|
||||
|
||||
### 权限控制与安全策略
|
||||
- 当前用户:从JWT载荷解析用户ID,查询用户信息并校验是否激活。
|
||||
- 管理员:要求角色为admin。
|
||||
- 经理/管理员:要求角色为admin或manager。
|
||||
- API端点:
|
||||
- 提交/更新:当前活跃用户。
|
||||
- 审核/确认:管理员或经理。
|
||||
- 建议扩展:支持“谁可以审核/确认”配置化,结合用户与角色、科室层级、指标类型等策略。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
|
||||
### 数据验证与事务管理
|
||||
- 数据验证:
|
||||
- 状态前置校验:提交/审核/确认均严格校验当前状态。
|
||||
- 更新校验:仅允许草稿或已驳回状态修改明细。
|
||||
- 前端校验:列表页根据状态显示对应操作按钮。
|
||||
- 事务管理:
|
||||
- 服务层使用flush/refresh保证一致性。
|
||||
- 建议在关键流程(批量创建、跨表更新)使用显式事务包裹,失败回滚。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L111-L205)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L55-L64)
|
||||
|
||||
### 前后端交互与扩展点
|
||||
- 前端:
|
||||
- 列表页支持按科室、周期、状态筛选,分页加载。
|
||||
- 操作按钮按状态动态显示(提交、审核、确认)。
|
||||
- 批量创建弹窗支持选择科室、周期与指标集合。
|
||||
- 扩展点:
|
||||
- 自定义评分方法:在指标模板与方案中扩展评分参数。
|
||||
- 流程定制:支持按科室类型/岗位类型配置不同的审批链路。
|
||||
- 结果应用:扩展到绩效工资、晋升、评优等联动模块。
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L200)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md#L57-L121)
|
||||
|
||||
## 依赖关系分析
|
||||
- API层依赖安全中间件与服务层。
|
||||
- 服务层依赖数据模型与Schema。
|
||||
- 数据模型依赖数据库引擎与索引。
|
||||
- 前端依赖API封装与Element Plus组件库。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE["Assessments.vue"] --> APIJS["assessment.js"]
|
||||
APIJS --> API["assessments.py"]
|
||||
API --> SEC["security.py"]
|
||||
API --> SVC["assessment_service.py"]
|
||||
SVC --> MODEL["models.py"]
|
||||
SVC --> SCHEMA["schemas.py"]
|
||||
MODEL --> DB[("数据库")]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L200)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化:
|
||||
- 为常用过滤字段(员工ID、周期、状态)建立索引。
|
||||
- 使用selectinload减少N+1查询。
|
||||
- 写入优化:
|
||||
- 批量插入明细,减少往返次数。
|
||||
- flush/refresh时机合理控制,避免过度刷新。
|
||||
- 并发与锁:
|
||||
- 批量创建时注意唯一性检查与去重,避免重复写入。
|
||||
- 高并发场景建议引入队列或分批策略。
|
||||
|
||||
[本节为通用指导,无需特定文件引用]
|
||||
|
||||
## 故障排除指南
|
||||
- 常见问题:
|
||||
- 状态不允许:检查当前状态是否满足提交/审核/确认前置条件。
|
||||
- 权限不足:确认当前用户角色是否为管理员或经理。
|
||||
- 重复创建:批量创建时检查同周期是否已存在记录。
|
||||
- 排查步骤:
|
||||
- 查看API响应码与消息。
|
||||
- 核对服务层状态校验逻辑。
|
||||
- 检查数据库索引与唯一约束。
|
||||
- 建议:
|
||||
- 增加更详细的错误码与国际化提示。
|
||||
- 在服务层捕获异常并记录上下文日志。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
|
||||
## 结论
|
||||
本设计以清晰的状态机为核心,结合严格的权限控制与数据验证,实现了从创建到确认的完整考核流程。服务层承担业务规则,API层提供受控接口,前端提供直观的操作体验。通过索引优化、事务管理与并发控制,系统具备良好的可扩展性与稳定性。后续可在流程定制、评分方法与结果应用等方面进一步增强。
|
||||
|
||||
[本节为总结,无需特定文件引用]
|
||||
|
||||
## 附录
|
||||
|
||||
### 数据模型与索引映射
|
||||
- 考核记录表:staff_id、period_year+period_month、status等索引。
|
||||
- 考核明细表:assessment_id、indicator_id索引。
|
||||
- 员工表:department_id、status索引。
|
||||
- 指标表:indicator_type权重约束。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L87-L131)
|
||||
|
||||
### 数据库迁移与扩展
|
||||
- 初始版本:创建科室、员工、指标、考核、明细、工资、用户等核心表。
|
||||
- 模板扩展:新增指标模板与模板指标关联表,并向指标表补充BSC维度等字段。
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
397
.qoder/repowiki/zh/content/前端开发指南/API集成与数据处理.md
Normal file
397
.qoder/repowiki/zh/content/前端开发指南/API集成与数据处理.md
Normal file
@@ -0,0 +1,397 @@
|
||||
# API集成与数据处理
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js)
|
||||
- [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/assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南围绕前端API集成与数据处理展开,覆盖HTTP请求封装、拦截器配置与错误处理、认证token管理、请求参数与查询条件传递、响应数据处理与状态码判断、分页与筛选排序、以及开发环境代理与生产部署要点。文档同时给出常见问题排查建议,帮助开发者快速理解并扩展该系统的API层。
|
||||
|
||||
## 项目结构
|
||||
前端采用模块化API目录组织,按业务域拆分接口文件,并通过统一的请求封装与拦截器实现跨域代理、鉴权、错误提示等横切能力;Pinia用于状态管理,Vue Router负责路由与鉴权守卫;Vite提供开发服务器与代理配置。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
VUE["Vue 应用<br/>main.js"]
|
||||
ROUTER["路由<br/>router/index.js"]
|
||||
STORE_USER["用户状态<br/>stores/user.js"]
|
||||
STORE_APP["应用状态<br/>stores/app.js"]
|
||||
API_INDEX["API聚合<br/>api/index.js"]
|
||||
API_REQ["请求封装<br/>api/request.js"]
|
||||
API_AUTH["认证接口<br/>api/auth.js"]
|
||||
API_DEPT["科室接口<br/>api/department.js"]
|
||||
API_STAFF["员工接口<br/>api/staff.js"]
|
||||
API_IND["指标接口<br/>api/indicator.js"]
|
||||
API_ASSESS["考核接口<br/>api/assessment.js"]
|
||||
API_SAL["工资接口<br/>api/salary.js"]
|
||||
API_TPL["模板接口<br/>api/template.js"]
|
||||
API_STATS["统计接口<br/>api/stats.js"]
|
||||
end
|
||||
VUE --> ROUTER
|
||||
VUE --> STORE_USER
|
||||
VUE --> STORE_APP
|
||||
VUE --> API_INDEX
|
||||
API_INDEX --> API_REQ
|
||||
API_INDEX --> API_AUTH
|
||||
API_INDEX --> API_DEPT
|
||||
API_INDEX --> API_STAFF
|
||||
API_INDEX --> API_IND
|
||||
API_INDEX --> API_ASSESS
|
||||
API_INDEX --> API_SAL
|
||||
API_INDEX --> API_TPL
|
||||
API_INDEX --> API_STATS
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [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/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
|
||||
## 核心组件
|
||||
- 统一请求封装与拦截器
|
||||
- 基础配置:基础URL、超时、默认Content-Type
|
||||
- 请求拦截:自动注入Authorization头(Bearer Token)
|
||||
- 响应拦截:统一错误码判断、状态码分支处理、消息提示与路由跳转
|
||||
- 认证与会话管理
|
||||
- 登录、获取当前用户、登出
|
||||
- Token持久化与路由守卫联动
|
||||
- 状态管理
|
||||
- 用户状态:token、userInfo、登录/登出
|
||||
- 应用状态:侧边栏折叠、科室树加载
|
||||
- 路由与鉴权
|
||||
- 全局前置守卫:未登录禁止访问受保护页面
|
||||
- 开发代理与构建
|
||||
- Vite代理到后端服务
|
||||
- 构建脚本与依赖
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [frontend/package.json](file://frontend/package.json#L6-L10)
|
||||
|
||||
## 架构总览
|
||||
下图展示从前端调用到后端服务的整体链路,包括请求拦截、认证、响应处理与错误反馈。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant View as "视图组件"
|
||||
participant Store as "Pinia状态"
|
||||
participant API as "API模块"
|
||||
participant Req as "请求封装(request.js)"
|
||||
participant Axios as "Axios实例"
|
||||
participant Proxy as "Vite代理(/api)"
|
||||
participant Backend as "后端服务"
|
||||
View->>Store : 触发动作(如登录/加载数据)
|
||||
Store->>API : 调用具体接口函数
|
||||
API->>Req : 发起HTTP请求
|
||||
Req->>Axios : 配置headers/params/timeout
|
||||
Axios->>Proxy : 将/api前缀转发
|
||||
Proxy->>Backend : 代理到后端地址
|
||||
Backend-->>Proxy : 返回JSON响应
|
||||
Proxy-->>Axios : 返回响应
|
||||
Axios-->>Req : 进入响应拦截器
|
||||
Req-->>API : 统一处理code/status
|
||||
API-->>Store : 返回标准化数据
|
||||
Store-->>View : 更新UI
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L6-L12)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L26)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L28-L63)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L19)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 统一请求封装与拦截器
|
||||
- 基础配置
|
||||
- 基础URL为/api/v1,所有接口以此为前缀
|
||||
- 默认超时30秒,Content-Type为application/json
|
||||
- 请求拦截器
|
||||
- 从localStorage读取token并在请求头Authorization中附加Bearer前缀
|
||||
- 响应拦截器
|
||||
- 自定义code字段判断:当code不等于200时,弹出错误消息并reject
|
||||
- 对常见HTTP状态码进行分支处理:401清理token并跳转登录、403无权限、404资源不存在、500服务器错误
|
||||
- 其他错误:优先展示后端detail,否则提示网络错误
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入响应拦截器"]) --> CheckCode["检查自定义code字段"]
|
||||
CheckCode --> CodeOK{"code是否为200?"}
|
||||
CodeOK --> |是| ReturnRes["返回data"]
|
||||
CodeOK --> |否| ShowMsg["弹出错误消息"]
|
||||
ShowMsg --> RejectErr["Promise.reject(error)"]
|
||||
ReturnRes --> End(["结束"])
|
||||
RejectErr --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L28-L37)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L6-L12)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L26)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L28-L63)
|
||||
|
||||
### 认证与会话管理
|
||||
- 登录
|
||||
- 使用表单编码提交用户名与密码
|
||||
- 成功后保存access_token至localStorage并写入store
|
||||
- 获取当前用户
|
||||
- 通过受保护接口获取用户信息
|
||||
- 登出
|
||||
- 清空token与用户信息,删除localStorage中的token并跳转登录页
|
||||
- 路由守卫
|
||||
- 未携带token访问受保护路由时重定向至登录页
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant View as "登录页"
|
||||
participant Store as "useUserStore"
|
||||
participant API as "auth.js"
|
||||
participant Req as "request.js"
|
||||
participant Router as "router/index.js"
|
||||
View->>Store : 调用login(username,password)
|
||||
Store->>API : 调用login接口
|
||||
API->>Req : POST /auth/login(表单编码)
|
||||
Req-->>API : 返回{access_token}
|
||||
API-->>Store : 返回token
|
||||
Store->>Store : 写入localStorage与store
|
||||
Store->>Router : 登录成功后继续导航
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L4-L11)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
|
||||
### 数据格式与参数传递
|
||||
- 查询参数
|
||||
- 多数GET接口通过{ params }传入查询条件,支持分页、筛选、排序等
|
||||
- 特殊场景
|
||||
- 批量创建考核时,后端期望重复的查询参数名,前端使用URLSearchParams拼接数组值
|
||||
- 表单提交
|
||||
- 登录接口使用application/x-www-form-urlencoded,其余接口默认JSON
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L4-L5)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L40-L49)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L5-L10)
|
||||
|
||||
### 响应数据处理与状态码判断
|
||||
- 自定义code字段
|
||||
- 当响应data.code不为200时,统一视为业务错误并提示
|
||||
- HTTP状态码分支
|
||||
- 401:清除token并跳转登录
|
||||
- 403/404/500:分别提示对应错误
|
||||
- 其他:展示后端detail或网络错误
|
||||
- 返回值
|
||||
- 成功时返回data,便于上层直接消费
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L28-L63)
|
||||
|
||||
### 分页、搜索与排序
|
||||
- 分页
|
||||
- 通过查询参数传递页码与每页数量,后端返回总数与列表
|
||||
- 搜索与过滤
|
||||
- 通过查询参数传入关键词与筛选条件
|
||||
- 排序
|
||||
- 通过查询参数传入排序字段与方向
|
||||
- 示例接口
|
||||
- 科室、员工、指标、模板、统计等均支持上述模式
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L4-L5)
|
||||
- [frontend/src/api/staff.js](file://frontend/src/api/staff.js#L4-L5)
|
||||
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L4-L5)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L4-L5)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L4-L16)
|
||||
|
||||
### 文件上传与下载
|
||||
- 上传
|
||||
- 使用multipart/form-data提交文件,后端返回上传结果
|
||||
- 下载
|
||||
- 通过a链接或Blob对象触发浏览器下载
|
||||
- 进度显示
|
||||
- 可通过axios上传配置的onUploadProgress回调实现
|
||||
- 取消请求
|
||||
- 可使用AbortController在组件卸载或切换时取消未完成请求
|
||||
|
||||
说明:当前仓库未发现具体的上传/下载实现代码,以上为通用实践建议。
|
||||
|
||||
### Mock数据与开发环境
|
||||
- 开发代理
|
||||
- Vite将/api前缀代理到本地后端服务,避免跨域问题
|
||||
- Mock策略
|
||||
- 可在开发阶段引入mock库或后端模拟服务,便于联调与前端独立开发
|
||||
|
||||
章节来源
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
|
||||
### 生产环境部署
|
||||
- 构建产物
|
||||
- 使用Vite构建静态资源,输出至dist目录
|
||||
- 静态部署
|
||||
- 将dist作为静态站点部署,保持/api前缀不变
|
||||
- 后端代理
|
||||
- 生产环境需确保/api请求能正确转发至后端服务
|
||||
|
||||
章节来源
|
||||
- [frontend/package.json](file://frontend/package.json#L6-L10)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
|
||||
## 依赖关系分析
|
||||
- 组件耦合
|
||||
- API模块仅依赖统一请求封装,低耦合高内聚
|
||||
- 路由守卫与状态管理共同保障鉴权
|
||||
- 外部依赖
|
||||
- axios:HTTP客户端
|
||||
- element-plus:消息提示与UI组件
|
||||
- pinia/vue-router:状态与路由
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
API_REQ["api/request.js"] --> AXIOS["axios"]
|
||||
API_AUTH["api/auth.js"] --> API_REQ
|
||||
API_DEPT["api/department.js"] --> API_REQ
|
||||
API_STAFF["api/staff.js"] --> API_REQ
|
||||
API_IND["api/indicator.js"] --> API_REQ
|
||||
API_ASSESS["api/assessment.js"] --> API_REQ
|
||||
API_SAL["api/salary.js"] --> API_REQ
|
||||
API_TPL["api/template.js"] --> API_REQ
|
||||
API_STATS["api/stats.js"] --> API_REQ
|
||||
STORE_USER["stores/user.js"] --> API_AUTH
|
||||
STORE_APP["stores/app.js"] --> API_DEPT
|
||||
ROUTER["router/index.js"] --> STORE_USER
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [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/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
## 性能考虑
|
||||
- 请求合并与去抖
|
||||
- 对频繁触发的搜索/筛选操作,可在组件层增加防抖
|
||||
- 缓存策略
|
||||
- 对不常变动的数据(如字典、类型列表)可加入内存缓存
|
||||
- 分页与懒加载
|
||||
- 列表页使用分页,结合虚拟滚动提升渲染性能
|
||||
- 体积优化
|
||||
- 按需引入Element Plus组件,减少打包体积
|
||||
|
||||
## 故障排查指南
|
||||
- 登录后仍被重定向至登录页
|
||||
- 检查localStorage中token是否存在,确认路由守卫逻辑
|
||||
- 401错误频繁出现
|
||||
- 检查请求头Authorization是否正确附加,确认后端token有效期
|
||||
- 403/404/500错误
|
||||
- 查看后端日志与接口文档,确认权限与资源存在性
|
||||
- 网络错误提示
|
||||
- 检查Vite代理配置与后端服务连通性
|
||||
- 批量参数传递异常
|
||||
- 确认后端期望的重复参数名与数值类型
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L38-L61)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L19)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L40-L49)
|
||||
|
||||
## 结论
|
||||
该前端API层通过统一的请求封装与拦截器实现了鉴权、错误处理与跨域代理,配合Pinia与路由守卫形成清晰的认证与状态管理闭环。业务接口按模块化组织,查询参数传递规范,具备良好的扩展性。建议在后续迭代中补充文件上传/下载与Mock能力,并完善批量参数与分页的通用工具方法,以进一步提升开发效率与用户体验。
|
||||
|
||||
## 附录
|
||||
- 常用接口一览(示例)
|
||||
- 认证:登录、获取当前用户、注册
|
||||
- 基础数据:科室、员工、指标、模板
|
||||
- 考核与工资:创建、提交、审核、生成、确认
|
||||
- 统计:部门统计、周期统计、趋势、排名、仪表盘、预警
|
||||
- 开发与部署
|
||||
- 开发:npm run dev(Vite启动+代理)
|
||||
- 构建:npm run build(输出dist)
|
||||
- 预览:npm run preview
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [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/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
|
||||
- [frontend/src/api/stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
- [frontend/package.json](file://frontend/package.json#L6-L10)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
312
.qoder/repowiki/zh/content/前端开发指南/UI设计系统.md
Normal file
312
.qoder/repowiki/zh/content/前端开发指南/UI设计系统.md
Normal file
@@ -0,0 +1,312 @@
|
||||
# UI设计系统
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [package.json](file://frontend/package.json)
|
||||
- [vite.config.js](file://frontend/vite.config.js)
|
||||
- [main.js](file://frontend/src/main.js)
|
||||
- [App.vue](file://frontend/src/App.vue)
|
||||
- [main.scss](file://frontend/src/assets/main.scss)
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue)
|
||||
- [Dashboard.vue](file://frontend/src/views/Dashboard.vue)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
|
||||
- [index.js](file://frontend/src/router/index.js)
|
||||
- [app.js](file://frontend/src/stores/app.js)
|
||||
- [user.js](file://frontend/src/stores/user.js)
|
||||
- [auth.js](file://frontend/src/api/auth.js)
|
||||
- [request.js](file://frontend/src/api/request.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向Element Plus UI设计系统的使用与落地实践,结合仓库中的前端工程,系统讲解安装配置、主题定制、本地化设置、常用组件用法、布局与表单、数据展示与反馈、SCSS变量定制、主题切换与响应式设计、图标与动画、交互规范以及样式覆盖与品牌化定制等。文档以“循序渐进”的方式组织,既适合初学者快速上手,也便于资深开发者深入理解系统架构与最佳实践。
|
||||
|
||||
## 项目结构
|
||||
前端采用Vite + Vue 3 + Element Plus + Pinia + Vue Router的技术栈,Element Plus作为主要UI组件库,全局引入并配置中文本地化;通过SCSS进行主题变量与通用样式管理;路由负责页面导航与权限守卫;Pinia用于状态管理;Axios封装统一请求与错误处理。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["入口应用<br/>main.js"] --> B["Element Plus 插件<br/>main.js"]
|
||||
A --> C["路由注册<br/>index.js"]
|
||||
A --> D["状态管理<br/>app.js / user.js"]
|
||||
A --> E["全局样式<br/>main.scss"]
|
||||
B --> F["组件库样式<br/>element-plus/dist/index.css"]
|
||||
B --> G["中文本地化<br/>zh-cn.mjs"]
|
||||
A --> H["图标注册<br/>@element-plus/icons-vue"]
|
||||
A --> I["视图组件<br/>Layout.vue / Dashboard.vue 等"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
|
||||
## 核心组件
|
||||
- Element Plus插件与本地化:在应用入口集中注册Element Plus并设置中文语言包,确保全局组件文案与交互符合中文习惯。
|
||||
- 图标系统:通过批量注册Element Plus图标组件,使图标可在模板中直接使用。
|
||||
- 路由与权限:路由守卫根据Token判断是否放行,未登录自动跳转至登录页。
|
||||
- 状态管理:Pinia Store负责侧边栏折叠状态、用户登录态与Token持久化。
|
||||
- 全局样式:SCSS变量统一管理主色、语义色、文本与边框等,页面卡片、表格、搜索栏等通用样式集中维护。
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [main.scss](file://frontend/src/assets/main.scss#L14-L81)
|
||||
|
||||
## 架构总览
|
||||
下图展示了从应用启动到页面渲染的关键流程,涵盖插件初始化、路由守卫、状态管理与组件渲染。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant M as "main.js"
|
||||
participant EP as "ElementPlus 插件"
|
||||
participant R as "路由守卫"
|
||||
participant V as "视图组件"
|
||||
participant S as "Pinia Store"
|
||||
U->>M : 启动应用
|
||||
M->>EP : 注册插件并设置中文本地化
|
||||
M->>R : 安装路由
|
||||
M->>S : 初始化 Pinia Store
|
||||
U->>R : 访问受保护页面
|
||||
R->>R : 校验 Token
|
||||
alt 未登录
|
||||
R-->>U : 重定向到登录页
|
||||
else 已登录
|
||||
R-->>V : 渲染目标视图
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Element Plus安装与配置
|
||||
- 依赖安装:通过包管理器安装Element Plus与图标库,并在开发依赖中引入Sass支持。
|
||||
- 插件注册:在应用入口引入Element Plus并设置中文本地化;同时批量注册图标组件,便于在模板中直接使用。
|
||||
- 全局样式:引入Element Plus内置样式,保证组件基础样式一致。
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L11-L25)
|
||||
- [main.js](file://frontend/src/main.js#L3-L21)
|
||||
|
||||
### 本地化设置
|
||||
- 应用级本地化:在根组件通过ConfigProvider包裹并设置语言包,确保整个应用的组件文案为中文。
|
||||
- 插件级本地化:在插件注册时传入语言配置,保证组件内部国际化生效。
|
||||
|
||||
章节来源
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L9)
|
||||
- [main.js](file://frontend/src/main.js#L6)
|
||||
|
||||
### 布局组件
|
||||
- 侧边栏与头部:布局组件提供侧边菜单、面包屑、用户下拉等结构,支持侧边栏折叠与过渡动画。
|
||||
- 菜单与图标:菜单项支持动态加载与图标渲染,点击触发路由跳转。
|
||||
- 页面切换:使用过渡动画实现页面切换的淡入淡出效果。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入 Layout"]) --> LoadMenu["加载菜单树"]
|
||||
LoadMenu --> RenderHeader["渲染头部与面包屑"]
|
||||
RenderHeader --> ToggleSidebar{"点击折叠按钮?"}
|
||||
ToggleSidebar --> |是| Collapse["切换折叠状态"]
|
||||
ToggleSidebar --> |否| RenderMain["渲染主内容区"]
|
||||
Collapse --> RenderMain
|
||||
RenderMain --> Transition["页面切换过渡"]
|
||||
Transition --> End(["完成渲染"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L1-L125)
|
||||
|
||||
章节来源
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
|
||||
### 表单组件
|
||||
- 搜索与筛选:使用输入框、选择器、日期选择器、树形选择器等组合形成搜索栏,配合分页组件实现数据筛选与翻页。
|
||||
- 表单校验:通过表单规则对必填字段进行校验,提交时显示加载状态。
|
||||
- 对话框与编辑:使用对话框承载新增/编辑表单,支持树形选择器、数字输入框、文本域等控件。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant V as "Departments.vue"
|
||||
participant API as "后端接口"
|
||||
participant EP as "ElementPlus 表单组件"
|
||||
U->>V : 输入搜索条件
|
||||
V->>EP : 校验表单规则
|
||||
EP-->>V : 校验结果
|
||||
U->>V : 点击查询/重置/新增
|
||||
V->>API : 发起请求
|
||||
API-->>V : 返回数据
|
||||
V->>EP : 渲染表格/分页/对话框
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L200)
|
||||
|
||||
章节来源
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L200)
|
||||
|
||||
### 数据展示组件
|
||||
- 表格:使用带条纹的表格展示数据,列头背景与文字颜色统一,支持状态标签、操作列等。
|
||||
- 分页:通过分页组件实现页码与每页数量切换,配合请求参数更新数据。
|
||||
- 状态标签与等级:根据状态或分数映射不同类型的标签与等级样式,提升可读性。
|
||||
|
||||
章节来源
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L17-L55)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L31-L75)
|
||||
|
||||
### 反馈组件
|
||||
- 消息提示:统一通过消息提示组件展示成功/失败信息。
|
||||
- 确认对话框:使用确认对话框进行危险操作的二次确认。
|
||||
- 加载状态:表格与表单提交时使用加载状态,避免重复提交。
|
||||
|
||||
章节来源
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L105-L106)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L119-L120)
|
||||
|
||||
### 图标使用
|
||||
- 图标注册:在应用入口批量注册图标组件,随后可在模板中以组件形式使用。
|
||||
- 图标渲染:在菜单、按钮、标签等位置按需渲染图标,增强视觉表达。
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L14-L17)
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L10-L24)
|
||||
|
||||
### 动画与交互
|
||||
- 折叠过渡:侧边栏宽度变化使用CSS过渡,提供平滑的折叠/展开体验。
|
||||
- 页面切换:使用过渡动画实现页面切换的淡入淡出。
|
||||
- 下拉菜单:用户信息下拉菜单支持点击展开与收起。
|
||||
|
||||
章节来源
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L37-L38)
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L231-L239)
|
||||
|
||||
### 组件样式覆盖与品牌化定制
|
||||
- SCSS变量:通过CSS变量统一管理主色、语义色、文本与背景色,便于整体风格调整。
|
||||
- 页面卡片与表格:为页面卡片与表格提供统一的圆角、阴影与列头样式,提升一致性。
|
||||
- 状态标签与等级:为不同状态与分数区间提供统一的标签样式,便于识别与品牌化。
|
||||
|
||||
章节来源
|
||||
- [main.scss](file://frontend/src/assets/main.scss#L14-L81)
|
||||
- [main.scss](file://frontend/src/assets/main.scss#L126-L179)
|
||||
|
||||
### 主题定制与切换
|
||||
- 当前状态:项目已通过插件注册设置中文本地化,但未实现主题切换功能。
|
||||
- 实现建议:可通过Element Plus的主题变量覆盖或CSS变量切换实现主题切换;在应用入口或路由守卫中根据用户偏好或系统主题进行切换。
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L6)
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L9)
|
||||
|
||||
### 响应式设计
|
||||
- 视口与容器:页面容器高度为视口高度,确保在不同屏幕尺寸下的适配。
|
||||
- 表格与卡片:卡片与表格在小屏设备上保持良好的可读性与间距。
|
||||
- 建议:可结合媒体查询或Element Plus栅格系统进一步优化移动端体验。
|
||||
|
||||
章节来源
|
||||
- [main.scss](file://frontend/src/assets/main.scss#L29-L61)
|
||||
|
||||
## 依赖关系分析
|
||||
- Element Plus:作为UI组件库,被应用入口注册并贯穿于所有视图组件。
|
||||
- 路由与状态:路由负责页面导航与权限控制,Pinia负责状态共享与持久化。
|
||||
- 请求封装:Axios封装统一请求与错误处理,结合Element Plus的消息提示提升用户体验。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
EP["ElementPlus"] --> Views["视图组件"]
|
||||
Router["路由"] --> Views
|
||||
Store["Pinia Store"] --> Views
|
||||
Axios["Axios 封装"] --> API["后端接口"]
|
||||
Views --> API
|
||||
API --> Axios
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
## 性能考虑
|
||||
- 组件懒加载:路由采用异步组件加载,减少首屏体积。
|
||||
- 图标按需:仅注册所需图标,避免引入过多图标资源。
|
||||
- 请求拦截:统一处理错误与超时,减少无效请求造成的性能损耗。
|
||||
- 样式复用:通过SCSS变量与通用类名减少重复样式,降低CSS体积。
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L6-L10)
|
||||
- [main.js](file://frontend/src/main.js#L14-L17)
|
||||
- [request.js](file://frontend/src/api/request.js#L14-L63)
|
||||
|
||||
## 故障排查指南
|
||||
- 登录态失效:当后端返回401时,自动清除Token并跳转登录页,同时通过消息提示告知用户。
|
||||
- 权限不足:403错误提示无权限访问。
|
||||
- 资源不存在:404错误提示资源不存在。
|
||||
- 服务器异常:500错误提示服务器错误。
|
||||
- 网络异常:断网或请求超时提示网络错误。
|
||||
|
||||
章节来源
|
||||
- [request.js](file://frontend/src/api/request.js#L28-L63)
|
||||
- [index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [user.js](file://frontend/src/stores/user.js#L33-L39)
|
||||
|
||||
## 结论
|
||||
本项目以Element Plus为核心,结合Vue生态实现了完整的前端界面与交互体系。通过统一的本地化、图标与样式管理,以及完善的路由与状态管理,形成了清晰的UI设计系统。后续可在现有基础上扩展主题切换、移动端优化与更丰富的交互动效,持续提升用户体验与品牌一致性。
|
||||
|
||||
## 附录
|
||||
|
||||
### 常用组件使用清单
|
||||
- 布局:菜单、面包屑、头像、下拉菜单、折叠按钮
|
||||
- 表单:输入框、选择器、日期选择器、树形选择器、数字输入框、文本域、表单校验
|
||||
- 数据展示:表格、分页、标签、等级标签
|
||||
- 反馈:消息提示、确认对话框、加载状态
|
||||
|
||||
章节来源
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L10-L68)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L3-L100)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L114)
|
||||
|
||||
### API与状态管理
|
||||
- 登录与用户信息:通过封装的请求模块调用后端接口,结合Pinia Store管理Token与用户信息。
|
||||
- 路由守卫:根据Token决定页面访问权限,未登录自动跳转登录页。
|
||||
|
||||
章节来源
|
||||
- [auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
442
.qoder/repowiki/zh/content/前端开发指南/Vue组件开发/Element Plus组件集成.md
Normal file
442
.qoder/repowiki/zh/content/前端开发指南/Vue组件开发/Element Plus组件集成.md
Normal file
@@ -0,0 +1,442 @@
|
||||
# Element Plus组件集成
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [package.json](file://frontend/package.json)
|
||||
- [main.js](file://frontend/src/main.js)
|
||||
- [vite.config.js](file://frontend/vite.config.js)
|
||||
- [App.vue](file://frontend/src/App.vue)
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue)
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue)
|
||||
- [main.scss](file://frontend/src/assets/main.scss)
|
||||
- [menu.js](file://frontend/src/api/menu.js)
|
||||
- [request.js](file://frontend/src/api/request.js)
|
||||
- [router/index.js](file://frontend/src/router/index.js)
|
||||
- [stores/app.js](file://frontend/src/stores/app.js)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本指南专注于Element Plus组件在医院绩效系统前端中的集成与使用。项目采用Vue 3 + Element Plus + Pinia + Vue Router的技术栈,实现了完整的组件化UI解决方案。本文将详细说明Element Plus的安装配置、按需导入和全局配置,涵盖表格、表单、对话框、导航菜单等常用组件的使用方法,并提供样式定制、主题配置和响应式布局的最佳实践。
|
||||
|
||||
## 项目结构
|
||||
前端项目采用模块化组织方式,Element Plus相关配置集中在入口文件和全局样式中:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端应用结构"
|
||||
A[main.js 应用入口] --> B[ElementPlus 全局配置]
|
||||
A --> C[Pinia 状态管理]
|
||||
A --> D[Vue Router 路由]
|
||||
A --> E[全局样式]
|
||||
F[App.vue 根组件] --> G[el-config-provider 国际化]
|
||||
F --> H[router-view 视图渲染]
|
||||
I[视图组件] --> J[Element Plus 组件]
|
||||
I --> K[业务逻辑]
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
|
||||
**章节来源**
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
|
||||
## 核心组件
|
||||
项目中广泛使用了Element Plus的核心UI组件,包括表格、表单、对话框、菜单导航等:
|
||||
|
||||
### 安装与配置
|
||||
项目通过npm安装Element Plus及其图标库,配置方式如下:
|
||||
|
||||
- **依赖安装**: 在package.json中声明element-plus和@element-plus/icons-vue
|
||||
- **全局引入**: 在main.js中全局注册ElementPlus组件
|
||||
- **图标注册**: 自动注册所有Element Plus图标组件
|
||||
- **国际化**: 设置中文语言环境
|
||||
|
||||
### 组件使用模式
|
||||
项目采用统一的组件使用模式:
|
||||
- 所有页面组件都使用`<script setup>`语法
|
||||
- 通过`ElMessage`和`ElMessageBox`进行消息提示
|
||||
- 使用`v-loading`实现加载状态管理
|
||||
- 通过`ref`和`reactive`管理组件状态
|
||||
|
||||
**章节来源**
|
||||
- [package.json](file://frontend/package.json#L11-L20)
|
||||
- [main.js](file://frontend/src/main.js#L3-L21)
|
||||
- [App.vue](file://frontend/src/App.vue#L2-L4)
|
||||
|
||||
## 架构概览
|
||||
系统采用分层架构设计,Element Plus组件贯穿整个前端应用:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
A[Layout.vue 主布局]
|
||||
B[Menus.vue 菜单管理]
|
||||
C[Departments.vue 科室管理]
|
||||
D[Staff.vue 员工管理]
|
||||
end
|
||||
subgraph "组件层"
|
||||
E[el-menu 导航菜单]
|
||||
F[el-table 数据表格]
|
||||
G[el-form 表单组件]
|
||||
H[el-dialog 对话框]
|
||||
I[el-pagination 分页器]
|
||||
end
|
||||
subgraph "数据层"
|
||||
J[API 层]
|
||||
K[Pinia Store]
|
||||
L[后端服务]
|
||||
end
|
||||
A --> E
|
||||
B --> F
|
||||
B --> G
|
||||
B --> H
|
||||
C --> F
|
||||
C --> I
|
||||
D --> F
|
||||
D --> I
|
||||
E --> K
|
||||
F --> J
|
||||
G --> J
|
||||
H --> J
|
||||
I --> J
|
||||
J --> L
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L10-L24)
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue#L12-L51)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L17-L54)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 导航菜单组件 (el-menu)
|
||||
导航菜单是系统的核心组件,实现了完整的侧边栏导航功能:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as 用户
|
||||
participant M as Menu组件
|
||||
participant S as Store
|
||||
participant A as API
|
||||
U->>M : 点击菜单项
|
||||
M->>S : 更新活动状态
|
||||
M->>A : 加载菜单数据
|
||||
A-->>M : 返回菜单树
|
||||
M->>M : 渲染菜单项
|
||||
M-->>U : 显示子菜单
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L86-L124)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
|
||||
菜单组件的关键特性:
|
||||
- 支持折叠/展开功能
|
||||
- 动态加载菜单树
|
||||
- 集成路由跳转
|
||||
- 响应式布局适配
|
||||
|
||||
**章节来源**
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L10-L25)
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L86-L124)
|
||||
|
||||
### 表格组件 (el-table)
|
||||
表格组件在多个业务页面中广泛应用,提供了完整的数据展示和操作功能:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[表格初始化] --> B[加载数据]
|
||||
B --> C{数据加载状态}
|
||||
C --> |成功| D[渲染表格]
|
||||
C --> |失败| E[显示错误信息]
|
||||
D --> F[用户交互]
|
||||
F --> G[编辑操作]
|
||||
F --> H[删除操作]
|
||||
G --> I[打开编辑对话框]
|
||||
H --> J[确认删除对话框]
|
||||
I --> K[表单验证]
|
||||
K --> L[提交更新]
|
||||
J --> M[执行删除]
|
||||
L --> N[刷新表格]
|
||||
M --> N
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L168-L181)
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue#L144-L152)
|
||||
|
||||
表格组件的核心功能:
|
||||
- 支持树形表格展示
|
||||
- 集成分页功能
|
||||
- 实现行内编辑
|
||||
- 提供批量操作
|
||||
|
||||
**章节来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L17-L54)
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue#L12-L51)
|
||||
|
||||
### 表单组件 (el-form)
|
||||
表单组件提供了完整的数据输入和验证功能:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class FormComponent {
|
||||
+form : ReactiveObject
|
||||
+rules : Object
|
||||
+loading : Ref<boolean>
|
||||
+validate() : Promise<boolean>
|
||||
+handleSubmit() : Promise<void>
|
||||
+resetForm() : void
|
||||
}
|
||||
class FormItem {
|
||||
+prop : string
|
||||
+label : string
|
||||
+required : boolean
|
||||
+validator : Function
|
||||
}
|
||||
class ValidationRule {
|
||||
+required : boolean
|
||||
+message : string
|
||||
+trigger : string
|
||||
}
|
||||
FormComponent --> FormItem : "包含"
|
||||
FormItem --> ValidationRule : "使用"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L127-L141)
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue#L125-L142)
|
||||
|
||||
表单组件的关键特性:
|
||||
- 支持多种输入控件
|
||||
- 实时表单验证
|
||||
- 条件渲染
|
||||
- 动态表单字段
|
||||
|
||||
**章节来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L57-L99)
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue#L60-L102)
|
||||
|
||||
### 对话框组件 (el-dialog)
|
||||
对话框组件用于实现模态窗口的创建和编辑功能:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as 用户
|
||||
participant D as Dialog组件
|
||||
participant F as Form组件
|
||||
participant V as 验证器
|
||||
U->>D : 点击添加/编辑按钮
|
||||
D->>D : 打开对话框
|
||||
D->>F : 初始化表单数据
|
||||
U->>F : 输入表单数据
|
||||
F->>V : 触发表单验证
|
||||
V-->>F : 返回验证结果
|
||||
F-->>D : 显示验证错误
|
||||
U->>D : 点击确定按钮
|
||||
D->>D : 提交表单
|
||||
D-->>U : 关闭对话框并刷新数据
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L199-L211)
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue#L163-L179)
|
||||
|
||||
对话框组件的功能特点:
|
||||
- 支持自定义宽度
|
||||
- 阻止点击遮罩关闭
|
||||
- 集成表单验证
|
||||
- 实现数据提交
|
||||
|
||||
**章节来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L57-L99)
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue#L54-L108)
|
||||
|
||||
### 分页组件 (el-pagination)
|
||||
分页组件提供了完整的数据分页功能:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[用户操作] --> B{分页操作类型}
|
||||
B --> |改变页码| C[更新当前页]
|
||||
B --> |改变每页大小| D[更新页大小]
|
||||
C --> E[触发数据加载]
|
||||
D --> E
|
||||
E --> F[调用API获取数据]
|
||||
F --> G[更新表格数据]
|
||||
G --> H[更新分页状态]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L46-L54)
|
||||
|
||||
分页组件的核心功能:
|
||||
- 支持多种布局模式
|
||||
- 集成数据加载
|
||||
- 实现状态同步
|
||||
|
||||
**章节来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L46-L54)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 组件依赖关系
|
||||
项目中Element Plus组件的使用呈现清晰的层次结构:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用层"
|
||||
A[main.js] --> B[App.vue]
|
||||
B --> C[Layout.vue]
|
||||
end
|
||||
subgraph "业务组件层"
|
||||
C --> D[Menus.vue]
|
||||
C --> E[Departments.vue]
|
||||
C --> F[Staff.vue]
|
||||
end
|
||||
subgraph "Element Plus组件层"
|
||||
D --> G[el-table]
|
||||
D --> H[el-form]
|
||||
D --> I[el-dialog]
|
||||
E --> G
|
||||
E --> J[el-pagination]
|
||||
F --> G
|
||||
F --> J
|
||||
C --> K[el-menu]
|
||||
C --> L[el-breadcrumb]
|
||||
C --> M[el-dropdown]
|
||||
end
|
||||
subgraph "工具层"
|
||||
N[main.scss] --> O[全局样式]
|
||||
P[request.js] --> Q[API封装]
|
||||
R[router/index.js] --> S[路由配置]
|
||||
end
|
||||
G --> O
|
||||
H --> O
|
||||
I --> O
|
||||
J --> O
|
||||
K --> O
|
||||
L --> O
|
||||
M --> O
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L1-L71)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L101)
|
||||
|
||||
### 外部依赖分析
|
||||
项目对外部依赖的管理策略:
|
||||
|
||||
| 依赖类型 | 版本范围 | 用途 | 配置方式 |
|
||||
|---------|----------|------|----------|
|
||||
| element-plus | ^2.5.3 | UI组件库 | 全局引入 |
|
||||
| @element-plus/icons-vue | ^2.3.1 | 图标组件 | 自动注册 |
|
||||
| vue | ^3.4.15 | 核心框架 | 通过Vite管理 |
|
||||
| vue-router | ^4.2.5 | 路由管理 | 插件注册 |
|
||||
| pinia | ^2.1.7 | 状态管理 | 插件注册 |
|
||||
|
||||
**章节来源**
|
||||
- [package.json](file://frontend/package.json#L11-L20)
|
||||
- [main.js](file://frontend/src/main.js#L3-L21)
|
||||
|
||||
## 性能考虑
|
||||
基于项目实际实现,以下是Element Plus组件使用的性能优化建议:
|
||||
|
||||
### 按需导入配置
|
||||
虽然项目采用全局导入方式,但推荐在大型项目中使用按需导入以减少包体积:
|
||||
|
||||
```javascript
|
||||
// 推荐的按需导入配置
|
||||
import { ElTable, ElTableColumn, ElButton } from 'element-plus'
|
||||
```
|
||||
|
||||
### 虚拟滚动应用
|
||||
对于大量数据的表格,建议实现虚拟滚动:
|
||||
|
||||
```javascript
|
||||
// 虚拟滚动配置示例
|
||||
<el-table virtual-scroll="{ itemHeight: 48, container: '.table-container' }">
|
||||
```
|
||||
|
||||
### 组件懒加载
|
||||
利用Vue的动态导入实现组件懒加载:
|
||||
|
||||
```javascript
|
||||
const HeavyComponent = () => import('@/components/HeavyComponent.vue')
|
||||
```
|
||||
|
||||
### 样式优化
|
||||
项目已实现基础的样式优化,建议进一步优化:
|
||||
|
||||
- 合理使用CSS变量
|
||||
- 避免深层嵌套选择器
|
||||
- 使用scoped样式减少样式冲突
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题诊断
|
||||
基于项目实现,以下是Element Plus组件使用中可能遇到的问题及解决方案:
|
||||
|
||||
#### 国际化配置问题
|
||||
**问题症状**: 组件显示英文或乱码
|
||||
**解决方案**: 确保在应用入口正确配置语言包
|
||||
|
||||
#### 图标不显示问题
|
||||
**问题症状**: 自定义图标无法显示
|
||||
**解决方案**: 检查图标注册是否正确执行
|
||||
|
||||
#### 表单验证失效
|
||||
**问题症状**: 表单验证规则不生效
|
||||
**解决方案**: 确认表单引用和验证规则配置正确
|
||||
|
||||
#### 数据加载异常
|
||||
**问题症状**: 表格数据无法加载
|
||||
**解决方案**: 检查API接口和数据格式
|
||||
|
||||
**章节来源**
|
||||
- [main.js](file://frontend/src/main.js#L14-L17)
|
||||
- [request.js](file://frontend/src/api/request.js#L15-L26)
|
||||
|
||||
### 调试技巧
|
||||
- 使用浏览器开发者工具检查组件属性
|
||||
- 利用Vue DevTools观察组件状态变化
|
||||
- 通过console输出调试信息
|
||||
- 检查网络面板确认API请求状态
|
||||
|
||||
## 结论
|
||||
本项目成功集成了Element Plus组件库,实现了完整的医院绩效管理系统前端界面。通过全局配置和统一的组件使用模式,项目展现了良好的代码组织和用户体验。
|
||||
|
||||
### 最佳实践总结
|
||||
1. **统一配置**: 在应用入口集中配置Element Plus
|
||||
2. **组件复用**: 通过组合式API实现组件逻辑复用
|
||||
3. **状态管理**: 使用Pinia管理全局状态
|
||||
4. **样式规范**: 通过SCSS实现一致的视觉风格
|
||||
5. **错误处理**: 统一的消息提示和错误处理机制
|
||||
|
||||
### 未来改进建议
|
||||
1. 考虑实现按需导入以优化包体积
|
||||
2. 为大数据量场景添加虚拟滚动支持
|
||||
3. 增强组件的可访问性支持
|
||||
4. 实现更完善的主题定制系统
|
||||
5. 添加组件性能监控和优化
|
||||
|
||||
通过持续的优化和改进,该项目的Element Plus组件集成将为用户提供更加流畅和专业的使用体验。
|
||||
@@ -0,0 +1,302 @@
|
||||
# Vue Composition API开发
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [frontend/src/main.js](file://frontend/src/main.js)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 引言
|
||||
本指南面向使用 Vue 3 Composition API 的开发者,围绕 setup 函数、响应式数据 ref 与 reactive 的区别与场景、计算属性 computed、监听器 watch 与 watchEffect、生命周期钩子(如 onMounted、onUnmounted 等)、组合函数(composables)的设计与复用、以及从 Options API 迁移到 Composition API 的最佳实践展开。文档结合仓库中的真实组件与状态管理,提供可操作的建议与图示。
|
||||
|
||||
## 项目结构
|
||||
前端采用 Vite + Vue 3 + Pinia + Element Plus 技术栈,路由基于 vue-router。项目入口在 main.js 中创建应用实例并挂载;App.vue 作为根组件包裹路由视图;views 下按功能模块组织页面;stores 提供全局状态;router 定义导航与守卫;api 汇聚接口模块。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["main.js<br/>创建应用实例"] --> B["App.vue<br/>根组件"]
|
||||
B --> C["router/index.js<br/>路由与守卫"]
|
||||
C --> D["views/*<br/>页面组件"]
|
||||
A --> E["stores/*<br/>Pinia Store"]
|
||||
A --> F["api/*<br/>接口聚合"]
|
||||
A --> G["Element Plus<br/>UI库"]
|
||||
A --> H["Vite 配置<br/>代理/别名"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
|
||||
## 核心组件
|
||||
- 应用入口与插件注册:在 main.js 中创建应用、注册 Element Plus、Pinia、路由,并挂载到 DOM。
|
||||
- 根组件 App.vue:提供语言环境配置,承载路由视图。
|
||||
- 路由与守卫:router/index.js 定义多级菜单路由与登录守卫。
|
||||
- 全局状态:stores/app.js 与 stores/user.js 使用组合式 Store(defineStore 返回函数式 Store),内部使用 ref 管理响应式状态。
|
||||
- 页面组件:views 下包含 Dashboard、Layout、Assessments、Departments 等,广泛使用 setup 函数、ref、reactive、computed、watch/watchEffect、生命周期钩子与 API 调用。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
## 架构总览
|
||||
下图展示从入口到页面组件的数据与控制流:main.js 初始化应用与插件;App.vue 渲染路由视图;Layout.vue 作为布局容器,调用 stores 与 API;具体业务页面(如 Dashboard、Assessments、Departments)在 setup 中声明响应式数据、计算属性、监听器与生命周期钩子,并发起 API 请求。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant M as "main.js"
|
||||
participant APP as "App.vue"
|
||||
participant R as "router/index.js"
|
||||
participant L as "Layout.vue"
|
||||
participant P as "页面组件(Dashboard/Assessments/Departments)"
|
||||
participant S as "stores/*"
|
||||
participant API as "api/*"
|
||||
M->>APP : 创建并挂载应用
|
||||
APP->>R : 注入路由
|
||||
R-->>L : 渲染布局
|
||||
L->>S : 读取/写入全局状态
|
||||
L->>API : 加载菜单树
|
||||
P->>S : 访问全局状态
|
||||
P->>API : 发起业务请求
|
||||
API-->>P : 返回数据
|
||||
P-->>L : 渲染视图
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L1-L1082)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### setup 函数与响应式数据:ref vs reactive
|
||||
- 在页面组件中,setup 函数用于声明响应式数据与逻辑。常见模式:
|
||||
- 使用 ref 声明基本类型或简单对象,如字符串、数字、布尔值、DOM 引用等。
|
||||
- 使用 reactive 声明复杂对象(如表单、分页参数),便于在模板中直接访问其属性。
|
||||
- 示例组件中的使用:
|
||||
- Dashboard.vue:大量使用 ref(如图表容器引用、周期选择、统计数据对象)与 reactive(如搜索条件、分页参数)。
|
||||
- Assessments.vue:同时使用 ref(loading、对话框可见性)与 reactive(搜索表单、分页、批量创建表单)。
|
||||
- Departments.vue:同样混合使用 ref 与 reactive。
|
||||
- 设计建议:
|
||||
- 对于简单标量或需要重新赋值的对象,优先使用 ref。
|
||||
- 对于复杂对象且不需要整体替换,优先使用 reactive。
|
||||
- 在模板中频繁访问深层属性时,reactive 更直观;需要整体替换或跨函数传递引用时,ref 更合适。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L421)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L116-L293)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L103-L272)
|
||||
|
||||
### 计算属性 computed
|
||||
- computed 用于派生状态,自动追踪依赖并在依赖变化时重新计算。
|
||||
- 示例:
|
||||
- Dashboard.vue 中的 assessedRate(完成率)与 hasAlerts(是否存在预警)均通过 computed 声明,避免在模板中重复计算。
|
||||
- 最佳实践:
|
||||
- 仅依赖响应式数据;避免在 getter 内部修改状态。
|
||||
- 复杂计算尽量拆分为多个小的 computed,提升可维护性。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L306-L315)
|
||||
|
||||
### 监听器 watch 与 watchEffect
|
||||
- watch:监听特定响应式数据的变化,适合需要在变化时执行副作用(如发起请求、更新图表)。
|
||||
- 示例:Dashboard.vue 中对周期选择(chartPeriod、financePeriod、rankingPeriod)的监听,触发对应数据加载与图表更新。
|
||||
- watchEffect:自动追踪其执行期间访问到的响应式数据,无需显式声明监听目标。
|
||||
- 示例:Dashboard.vue 中在加载关键指标后使用 nextTick,再更新仪表盘图表,体现了 watchEffect 的自动依赖追踪特性。
|
||||
- 最佳实践:
|
||||
- watch 适用于明确的目标与旧值/新值对比;watchEffect 适用于“只要相关数据变化就刷新”的场景。
|
||||
- 注意清理副作用(如在组件卸载时取消订阅或清空定时器)。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L362-L421)
|
||||
|
||||
### 生命周期钩子:onMounted、onUnmounted 等
|
||||
- onMounted:在组件挂载后执行初始化逻辑,如加载菜单、初始化图表、绑定窗口 resize 事件等。
|
||||
- Layout.vue:在 onMounted 中加载菜单树。
|
||||
- Dashboard.vue:在 onMounted 中初始化多个 ECharts 实例并绑定 resize 事件。
|
||||
- onUnmounted:用于清理副作用(如移除事件监听、销毁图表实例)。
|
||||
- Dashboard.vue:在组件卸载时应移除 window.resize 监听与图表实例,避免内存泄漏。
|
||||
- 最佳实践:
|
||||
- 将副作用集中在 onMounted 中启动,在 onUnmounted 中统一清理。
|
||||
- 对于需要等待 DOM 更新后再执行的逻辑,配合 nextTick 使用。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L122-L124)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L423-L448)
|
||||
|
||||
### 组合函数(Composables)设计与复用
|
||||
- 当前项目中,全局状态通过 Pinia 的组合式 Store(函数式 Store)实现,内部使用 ref 管理状态,对外暴露方法与状态。
|
||||
- app.js:封装侧边栏折叠状态与科室树加载。
|
||||
- user.js:封装登录、登出、用户信息获取。
|
||||
- 设计模式建议:
|
||||
- 将可复用的逻辑(如图表初始化、分页加载、表单校验)抽象为独立的 Composable,返回 ref 或 reactive 数据与方法。
|
||||
- 在组件中通过 import 使用这些 Composable,保持 setup 的简洁与关注点分离。
|
||||
- 状态共享:
|
||||
- 使用 Pinia Store 在组件间共享状态;对于轻量状态,也可通过 props/$emit 或 provide/inject 实现。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
### 从 Options API 迁移到 Composition API 的最佳实践
|
||||
- 迁移步骤建议:
|
||||
- 将 data 中的每个字段改为 setup 中的 ref 或 reactive。
|
||||
- 将 methods 中的方法迁移到 setup 中的普通函数;将计算属性迁移到 computed。
|
||||
- 将生命周期钩子迁移到 onMounted/onUpdated 等。
|
||||
- 将 watch 改为 watch 或 watchEffect。
|
||||
- 将混入(mixins)替换为组合函数(Composable)。
|
||||
- 项目中的迁移体现:
|
||||
- 各页面组件(Dashboard、Assessments、Departments)已全面使用 setup 函数与组合式 API。
|
||||
- 菜单加载与图表初始化等逻辑集中在 setup 中,便于测试与复用。
|
||||
- 注意事项:
|
||||
- 避免在 setup 中进行过多同步阻塞操作;异步请求放在 onMounted 中。
|
||||
- 对于需要在模板中直接使用的函数,保持箭头函数或普通函数形式,确保 this 不丢失(在 setup 中不会出现 this)。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L421)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L116-L293)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L103-L272)
|
||||
|
||||
### 组件重构示例:Dashboard(从 Options API 到 Composition API)
|
||||
- 重构要点:
|
||||
- 将 data 中的统计、排名、趋势、图表容器等状态迁移为 ref/refs 与 reactive。
|
||||
- 将 methods 中的加载函数(如 loadStats、loadRanking、loadTrendData 等)迁移为普通函数。
|
||||
- 将 computed 中的 assessedRate、hasAlerts 迁移为 computed。
|
||||
- 将 mounted 中的图表初始化与事件绑定迁移至 onMounted,并在 onUnmounted 中清理。
|
||||
- 将 watch 中的周期切换逻辑迁移为 watch 或 watchEffect。
|
||||
- 重构收益:
|
||||
- setup 中逻辑集中,便于阅读与测试。
|
||||
- 计算属性与监听器自动追踪依赖,减少手动维护。
|
||||
- 与组合函数(Composable)结合,进一步提升复用性。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L225-L421)
|
||||
|
||||
## 依赖分析
|
||||
- 依赖关系概览:
|
||||
- main.js 依赖 Vue、Pinia、Element Plus、路由与样式。
|
||||
- App.vue 依赖 Element Plus 国际化配置。
|
||||
- router/index.js 依赖路由与守卫。
|
||||
- stores/* 依赖 Pinia 与 API。
|
||||
- views/* 依赖 Element Plus、ECharts、API 与 stores。
|
||||
- 外部依赖版本参考:
|
||||
- Vue 3、Pinia、Element Plus、vue-router、axios、echarts、dayjs 等。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
MJS["main.js"] --> V["vue"]
|
||||
MJS --> P["pinia"]
|
||||
MJS --> EP["element-plus"]
|
||||
MJS --> VR["vue-router"]
|
||||
MJS --> AX["axios"]
|
||||
MJS --> SCSS["sass"]
|
||||
MJS --> ECH["echarts"]
|
||||
APP["App.vue"] --> EP
|
||||
ROUTER["router/index.js"] --> VR
|
||||
STORE_APP["stores/app.js"] --> P
|
||||
STORE_USER["stores/user.js"] --> P
|
||||
VIEWS["views/*"] --> EP
|
||||
VIEWS --> ECH
|
||||
VIEWS --> API["api/*"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
章节来源
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
## 性能考虑
|
||||
- 图表渲染性能:
|
||||
- 在 Dashboard 中,多个 ECharts 实例在 onMounted 中初始化,应在 onUnmounted 中销毁实例并移除 resize 监听,避免内存泄漏。
|
||||
- 对于大数据量图表,建议在 watch 中按需更新选项,避免全量 setOption 导致重绘开销。
|
||||
- 状态更新与重渲染:
|
||||
- 使用 computed 缓存派生结果,减少不必要的重渲染。
|
||||
- 将复杂计算拆分为多个小的 computed,降低依赖范围。
|
||||
- API 请求节流:
|
||||
- 对于高频变更(如日期选择、筛选条件),可在 watch 中加入防抖策略,减少请求次数。
|
||||
- 路由懒加载:
|
||||
- 路由组件已使用动态导入,有助于首屏加载性能。
|
||||
|
||||
## 故障排查指南
|
||||
- 登录与路由守卫:
|
||||
- 若进入受保护页面被重定向到登录页,检查本地存储 token 是否存在;路由守卫会根据 token 决定是否放行。
|
||||
- 图表不显示或空白:
|
||||
- 确认 onMounted 中已初始化图表实例并在数据就绪后 setOption;若使用 nextTick,请确保在数据更新后再执行更新逻辑。
|
||||
- 菜单加载失败:
|
||||
- Layout.vue 中的菜单加载失败会回退到默认菜单;检查后端接口与网络请求状态。
|
||||
- 状态不同步:
|
||||
- Pinia Store 中的状态更新需通过 ref.value 修改;确保在组件中正确读取与写入。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L86-L116)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L423-L448)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L14-L22)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L34-L39)
|
||||
|
||||
## 结论
|
||||
本项目已全面采用 Vue 3 Composition API,结合 Pinia 实现状态管理,配合 Element Plus 与 ECharts 构建了功能完备的绩效管理系统前端。通过在 setup 中集中声明响应式数据、计算属性、监听器与生命周期钩子,提升了代码的可读性与可维护性。建议在后续开发中持续引入组合函数(Composable)以增强逻辑复用,并在图表与数据密集场景中优化渲染与请求策略,进一步提升用户体验与性能表现。
|
||||
|
||||
## 附录
|
||||
- 开发与构建命令:
|
||||
- dev:启动开发服务器
|
||||
- build:打包生产资源
|
||||
- preview:预览生产构建
|
||||
- 代理配置:
|
||||
- 前端开发时将 /api 代理到后端服务地址,便于联调。
|
||||
|
||||
章节来源
|
||||
- [frontend/package.json](file://frontend/package.json#L6-L10)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L19)
|
||||
455
.qoder/repowiki/zh/content/前端开发指南/Vue组件开发/Vue组件开发.md
Normal file
455
.qoder/repowiki/zh/content/前端开发指南/Vue组件开发/Vue组件开发.md
Normal file
@@ -0,0 +1,455 @@
|
||||
# Vue组件开发
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [frontend/src/main.js](file://frontend/src/main.js)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
|
||||
- [frontend/src/assets/main.scss](file://frontend/src/assets/main.scss)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [组件详解](#组件详解)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向使用 Vue 3 Composition API 的前端开发者,结合仓库中的实际代码,系统讲解组件开发的关键实践:响应式数据与生命周期、组件间通信、Element Plus 集成、自定义组件与复用策略、设计模式与代码组织、测试与调试、性能优化以及 API 调用封装与错误处理。文中所有分析均基于仓库中的真实文件与实现。
|
||||
|
||||
## 项目结构
|
||||
前端采用 Vite + Vue 3 + Pinia + Element Plus 技术栈,路由基于 vue-router,API 层统一通过 axios 封装。整体目录按功能域划分,便于组件与业务模块化组织。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["入口 main.js<br/>创建应用/注册插件"] --> B["根组件 App.vue<br/>国际化配置"]
|
||||
A --> C["路由 router/index.js<br/>动态导入视图组件"]
|
||||
A --> D["状态 stores/*<br/>Pinia Store"]
|
||||
A --> E["API 层 api/*<br/>Axios 封装与接口"]
|
||||
A --> F["视图 views/*<br/>页面级组件"]
|
||||
A --> G["样式 assets/main.scss<br/>全局样式与主题变量"]
|
||||
F --> H["布局 Layout.vue<br/>侧边栏/头部/面包屑"]
|
||||
F --> I["登录 Login.vue<br/>表单校验/登录流程"]
|
||||
F --> J["基础数据 Departments.vue<br/>表格/分页/对话框"]
|
||||
F --> K["考核管理 Assessments.vue<br/>树形筛选/状态标签/批量创建"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/assets/main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/package.json](file://frontend/package.json#L1-L27)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
|
||||
## 核心组件
|
||||
- 应用入口与插件注册:创建应用实例、注册 Element Plus、图标、Pinia、路由;全局样式引入。
|
||||
- 根组件:提供 Element Plus 国际化上下文。
|
||||
- 路由系统:定义页面级路由、懒加载视图、路由守卫(鉴权与标题设置)。
|
||||
- 状态管理:Pinia Store(应用状态与用户状态),集中管理 token、菜单树、侧边栏折叠等。
|
||||
- API 层:Axios 实例封装,统一请求/响应拦截器,错误提示与自动登出。
|
||||
- 视图组件:布局、登录、基础数据、考核管理等页面组件,展示 Composition API 与 Element Plus 的典型用法。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
## 架构总览
|
||||
下图展示了从前端入口到页面组件的数据流与交互关系,体现 Composition API、Pinia、Element Plus 与 API 层的协作。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "运行时"
|
||||
M["main.js<br/>应用初始化"] --> R["router/index.js<br/>路由守卫/导航"]
|
||||
M --> P["Pinia Stores<br/>useAppStore/useUserStore"]
|
||||
M --> EP["Element Plus<br/>组件/图标/国际化"]
|
||||
end
|
||||
subgraph "页面层"
|
||||
L["views/Layout.vue<br/>侧边栏/头部/面包屑"]
|
||||
LG["views/Login.vue<br/>登录表单/消息提示"]
|
||||
D["views/basic/Departments.vue<br/>表格/分页/对话框"]
|
||||
A["views/assessment/Assessments.vue<br/>树形筛选/批量创建"]
|
||||
end
|
||||
subgraph "数据层"
|
||||
API["api/request.js<br/>Axios 实例/拦截器"]
|
||||
DEPT["api/department.js<br/>科室接口"]
|
||||
ASSESS["api/assessment.js<br/>考核接口"]
|
||||
end
|
||||
M --> L
|
||||
M --> LG
|
||||
M --> D
|
||||
M --> A
|
||||
L --> P
|
||||
LG --> P
|
||||
D --> DEPT
|
||||
A --> ASSESS
|
||||
DEPT --> API
|
||||
ASSESS --> API
|
||||
API --> R
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
|
||||
## 组件详解
|
||||
|
||||
### 布局组件 Layout.vue
|
||||
- 功能要点
|
||||
- 侧边栏菜单:根据后端返回的菜单树渲染,支持折叠切换与图标动态绑定。
|
||||
- 头部区域:面包屑、用户下拉菜单、登出。
|
||||
- 内容区:路由视图过渡动画。
|
||||
- 数据加载:首次挂载时异步加载菜单树,失败时回退默认菜单。
|
||||
- 关键实现模式
|
||||
- Composition API:使用 ref、reactive、onMounted 管理状态与生命周期。
|
||||
- Element Plus:el-menu、el-breadcrumb、el-dropdown、el-icon、el-tree-select 等。
|
||||
- 状态与 API:Pinia 应用状态用于侧边栏折叠;菜单树通过 API 获取。
|
||||
- 设计建议
|
||||
- 菜单树转换逻辑可抽离为工具函数,提升可测试性。
|
||||
- 错误回退策略需与后端约定默认结构,避免空值处理分散。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["组件挂载"]) --> Load["加载菜单树"]
|
||||
Load --> Ok{"请求成功?"}
|
||||
Ok --> |是| Render["渲染菜单树"]
|
||||
Ok --> |否| Fallback["使用默认菜单"]
|
||||
Render --> End(["完成"])
|
||||
Fallback --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L86-L124)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
|
||||
### 登录组件 Login.vue
|
||||
- 功能要点
|
||||
- 用户名/密码输入、表单校验、Enter 键触发登录。
|
||||
- 登录流程:调用用户 Store 的登录方法,成功后跳转首页,失败提示错误。
|
||||
- 加载态:按钮 loading 控制防止重复提交。
|
||||
- 关键实现模式
|
||||
- 表单校验:Element Plus el-form + validate。
|
||||
- 消息提示:ElMessage 成功/错误提示。
|
||||
- 路由跳转:vue-router 的 push。
|
||||
- 状态管理:Pinia 用户 Store 管理 token 与登录状态。
|
||||
- 设计建议
|
||||
- 将表单规则抽取为可复用的验证器,便于多组件共享。
|
||||
- 登录成功后的回调可抽象为通用钩子,减少重复逻辑。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant C as "Login.vue"
|
||||
participant S as "useUserStore"
|
||||
participant R as "router"
|
||||
U->>C : 输入用户名/密码并点击登录
|
||||
C->>C : 表单校验 validate()
|
||||
alt 校验通过
|
||||
C->>S : login(username, password)
|
||||
S-->>C : 返回布尔结果
|
||||
alt 登录成功
|
||||
C->>R : push("/")
|
||||
C->>C : 显示成功消息
|
||||
else 登录失败
|
||||
C->>C : 显示错误消息
|
||||
end
|
||||
else 校验失败
|
||||
C->>C : 不发起请求
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
### 科室管理组件 Departments.vue
|
||||
- 功能要点
|
||||
- 查询条件:关键词、类型、分页参数。
|
||||
- 表格列:编码、名称、类型(标签)、层级、状态开关、创建时间。
|
||||
- 操作列:编辑、删除;状态变更即时更新。
|
||||
- 对话框:新增/编辑表单,树形上级选择、表单校验、提交。
|
||||
- 分页:el-pagination 支持页大小与当前页变更。
|
||||
- 关键实现模式
|
||||
- 表单与表格:Element Plus el-table、el-dialog、el-form、el-tree-select。
|
||||
- 状态与生命周期:ref/reactive 管理本地状态;onMounted 初始化加载。
|
||||
- API 调用:封装的部门接口,统一错误处理与消息提示。
|
||||
- 设计建议
|
||||
- 将“状态标签映射”与“日期格式化”抽离为纯函数,便于复用与测试。
|
||||
- 对话框表单校验失败时聚焦首个错误项,提升用户体验。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Init(["组件挂载"]) --> LoadList["加载科室列表"]
|
||||
Init --> LoadTree["加载科室树"]
|
||||
LoadList --> Done["渲染表格"]
|
||||
LoadTree --> Done
|
||||
Done --> Search["用户点击查询"]
|
||||
Search --> LoadList
|
||||
Done --> Edit["打开编辑对话框"]
|
||||
Edit --> Submit["提交表单校验"]
|
||||
Submit --> |通过| Save["调用新增/更新接口"]
|
||||
Submit --> |失败| Focus["提示并聚焦错误项"]
|
||||
Save --> Refresh["刷新列表与树"]
|
||||
Refresh --> Done
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L168-L271)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
### 考核管理组件 Assessments.vue
|
||||
- 功能要点
|
||||
- 查询条件:所属科室(树形选择)、考核周期(月份)、状态筛选。
|
||||
- 表格列:姓名、科室、周期、总分、加权得分(带等级样式)、状态标签、创建时间。
|
||||
- 操作列:详情、提交、审核(通过/驳回)、确认。
|
||||
- 批量创建:弹窗选择科室、周期、指标集合,构造 URLSearchParams 发起请求。
|
||||
- 关键实现模式
|
||||
- 状态映射:状态标签与样式映射,分数等级样式。
|
||||
- 多源数据:同时加载科室树与有效指标,保证 UI 一致性。
|
||||
- 批量创建:URLSearchParams 处理重复查询参数,满足后端要求。
|
||||
- 设计建议
|
||||
- 将“状态标签映射”与“分数等级样式”抽取为独立工具,便于统一维护。
|
||||
- 批量创建前进行必填项校验,避免无效请求。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant C as "Assessments.vue"
|
||||
participant API as "assessment.js"
|
||||
participant REQ as "request.js(Axios)"
|
||||
participant R as "router"
|
||||
U->>C : 点击“批量创建”
|
||||
C->>C : 打开弹窗并清空表单
|
||||
U->>C : 填写科室/周期/指标
|
||||
C->>C : 校验必填项
|
||||
alt 校验通过
|
||||
C->>API : batchCreateAssessments(data)
|
||||
API->>REQ : POST /assessments/batch-create<br/>构造URLSearchParams
|
||||
REQ-->>API : 返回结果
|
||||
API-->>C : 结果
|
||||
C->>C : 显示成功消息并关闭弹窗
|
||||
C->>C : 刷新列表
|
||||
else 校验失败
|
||||
C->>C : 显示提示
|
||||
end
|
||||
U->>C : 点击“详情”
|
||||
C->>R : push(/assessments/ : id)
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L257-L286)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L39-L49)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L52-L56)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
|
||||
### 状态管理与生命周期
|
||||
- 应用状态(useAppStore)
|
||||
- 管理侧边栏折叠状态与科室树数据,提供切换与加载方法。
|
||||
- 用户状态(useUserStore)
|
||||
- 管理 token、用户信息、登录/登出流程;登出后清理本地存储并跳转登录页。
|
||||
- 生命周期
|
||||
- 页面组件普遍在 onMounted 中发起初次数据加载;对话框打开时再加载必要数据(如树形选择)。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L122-L124)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L268-L271)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L288-L292)
|
||||
|
||||
### 组件间通信与路由集成
|
||||
- Props 与事件
|
||||
- Element Plus 组件通过 v-model、事件(如 size-change、current-change)实现双向绑定与回调。
|
||||
- 插槽与作用域插槽
|
||||
- 表格列使用作用域插槽渲染标签、状态与格式化字段。
|
||||
- 路由与导航
|
||||
- 路由守卫统一处理登录态与页面标题;详情页通过动态路由参数跳转。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L223-L225)
|
||||
|
||||
### Element Plus 集成与自定义组件
|
||||
- 全局注册图标与组件
|
||||
- 在入口循环注册 Element Plus 图标,按需在组件中使用。
|
||||
- 国际化与主题
|
||||
- 根组件提供语言包;全局样式定义主题变量与通用组件样式。
|
||||
- 自定义组件开发建议
|
||||
- 将常用交互(如弹窗、树形选择、状态标签)封装为可复用组件,统一 props 与事件。
|
||||
- 保持组件单一职责,通过插槽扩展内容。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L14-L17)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L9)
|
||||
- [frontend/src/assets/main.scss](file://frontend/src/assets/main.scss#L14-L26)
|
||||
|
||||
### API 调用封装与错误处理
|
||||
- Axios 实例
|
||||
- 统一 base URL、超时、请求头;自动注入 Authorization。
|
||||
- 响应拦截
|
||||
- 统一处理业务错误码、HTTP 状态码;401 自动清除 token 并跳转登录。
|
||||
- 接口封装
|
||||
- 按领域拆分接口文件(部门、考核),对特殊参数(如批量创建)进行 URLSearchParams 处理。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant C as "组件"
|
||||
participant API as "api/*"
|
||||
participant AX as "request.js(Axios)"
|
||||
participant BE as "后端"
|
||||
C->>API : 调用接口函数
|
||||
API->>AX : request.get/post/put/delete(...)
|
||||
AX->>BE : 发送请求(携带token)
|
||||
BE-->>AX : 返回响应
|
||||
AX->>AX : 响应拦截器校验
|
||||
alt 业务成功
|
||||
AX-->>API : 返回数据
|
||||
API-->>C : 返回结果
|
||||
else 业务失败/HTTP异常
|
||||
AX-->>API : 抛出错误并提示
|
||||
API-->>C : 捕获错误
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
|
||||
## 依赖关系分析
|
||||
- 运行时依赖
|
||||
- Vue 3、vue-router、pinia、axios、element-plus、@element-plus/icons-vue、echarts、dayjs。
|
||||
- 构建与开发
|
||||
- Vite、@vitejs/plugin-vue、sass。
|
||||
- 代理与别名
|
||||
- Vite 代理 /api -> 后端 8000 端口;路径别名 @ 指向 src。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
P["package.json 依赖"] --> V["Vue 3"]
|
||||
P --> R["vue-router"]
|
||||
P --> S["pinia"]
|
||||
P --> X["axios"]
|
||||
P --> EP["element-plus"]
|
||||
P --> I["@element-plus/icons-vue"]
|
||||
P --> E["echarts"]
|
||||
P --> D["dayjs"]
|
||||
VC["vite.config.js"] --> A["@ 路径别名"]
|
||||
VC --> PX["/api 代理"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L7-L20)
|
||||
|
||||
章节来源
|
||||
- [frontend/package.json](file://frontend/package.json#L1-L27)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
|
||||
## 性能考量
|
||||
- 组件渲染
|
||||
- 使用 v-loading 在长列表加载时提供占位反馈,避免白屏。
|
||||
- 表格列使用作用域插槽渲染标签与状态,减少重复计算。
|
||||
- 状态与计算
|
||||
- 将映射表(状态/类型)定义为常量,避免每次渲染重新创建。
|
||||
- 网络请求
|
||||
- 合理使用分页参数,避免一次性加载过多数据。
|
||||
- 批量创建时使用 URLSearchParams,确保后端高效处理。
|
||||
- 资源加载
|
||||
- 图标与组件按需使用,避免不必要的全局注册导致体积增大。
|
||||
|
||||
## 故障排查指南
|
||||
- 登录失败
|
||||
- 检查用户 Store 的登录接口是否正确返回 token;确认本地存储是否写入。
|
||||
- 路由守卫是否正确拦截未登录访问。
|
||||
- 菜单加载失败
|
||||
- 确认后端菜单树接口返回结构;组件中是否有默认回退逻辑。
|
||||
- 表单校验不生效
|
||||
- 确认 el-form 的 ref 与 validate 调用时机;rules 是否正确绑定。
|
||||
- 401 自动登出
|
||||
- 检查响应拦截器是否正确识别 401 并清除 token 与跳转登录。
|
||||
- 批量创建失败
|
||||
- 确认 URLSearchParams 的重复参数构造是否符合后端期望。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L101-L116)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L38-L63)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js#L40-L49)
|
||||
|
||||
## 结论
|
||||
本项目以 Vue 3 Composition API 为核心,结合 Pinia、Element Plus 与 axios 封装,形成了清晰的页面组件、状态管理与 API 层分工。通过统一的错误处理与路由守卫,提升了系统的稳定性与可用性。建议在后续迭代中进一步抽取可复用组件与工具函数,完善单元测试与端到端测试,持续优化性能与可维护性。
|
||||
|
||||
## 附录
|
||||
- 命名规范建议
|
||||
- 组件文件:PascalCase(如 Departments.vue)。
|
||||
- Store:useXxxStore(如 useUserStore)。
|
||||
- API 函数:动词+名词(如 getAssessments、createDepartment)。
|
||||
- 常量:UPPER_SNAKE_CASE(如 STATUS_MAP)。
|
||||
- 代码组织建议
|
||||
- 按功能域划分 views、stores、api,避免交叉耦合。
|
||||
- 将样式与主题变量集中在 assets/main.scss,统一风格。
|
||||
- 测试与调试
|
||||
- 使用 Vitest/Jest 编写组件与工具函数测试;利用浏览器 DevTools 与 Vue DevTools 调试响应式数据与生命周期。
|
||||
238
.qoder/repowiki/zh/content/前端开发指南/Vue组件开发/组件测试与调试.md
Normal file
238
.qoder/repowiki/zh/content/前端开发指南/Vue组件开发/组件测试与调试.md
Normal file
@@ -0,0 +1,238 @@
|
||||
# 组件测试与调试
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [package.json](file://frontend/package.json)
|
||||
- [vite.config.js](file://frontend/vite.config.js)
|
||||
- [main.js](file://frontend/src/main.js)
|
||||
- [App.vue](file://frontend/src/App.vue)
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md)
|
||||
- [frontend.md](file://docs/frontend.md)
|
||||
- [test_api.py](file://backend/test_api.py)
|
||||
- [test-api.html](file://frontend/public/test-api.html)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向Vue 3前端团队,围绕组件测试与调试提供系统化实践建议。结合当前仓库的前端工程配置与后端API,重点覆盖以下主题:
|
||||
- Vue Test Utils的安装与基础配置
|
||||
- 单元测试:渲染、交互、生命周期、异步
|
||||
- 集成测试策略:API集成、端到端联动
|
||||
- 组件Mock、依赖注入与测试数据准备
|
||||
- 调试工具:Vue DevTools、浏览器开发者工具、性能分析
|
||||
- 常见问题排查:渲染、状态更新、内存泄漏
|
||||
- 测试覆盖率与CI配置建议
|
||||
|
||||
## 项目结构
|
||||
前端采用Vite + Vue 3 + Pinia + Element Plus的现代化栈;后端提供REST API,前端通过Vite代理访问。整体结构清晰,便于进行组件级与端到端测试。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
FE["前端应用<br/>Vite + Vue 3 + Pinia + Element Plus"]
|
||||
BE["后端API<br/>FastAPI 应用"]
|
||||
Proxy["Vite 代理<br/>/api -> http://localhost:8000"]
|
||||
FE --> Proxy
|
||||
Proxy --> BE
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L21)
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L105-L107)
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L21)
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
|
||||
## 核心组件
|
||||
- 应用入口与插件注册:在入口文件中完成Pinia、路由、Element Plus等初始化,确保测试环境与生产一致。
|
||||
- 组件规范:推荐使用<script setup>组合式语法,统一命名规范,便于测试时稳定选择器与断言。
|
||||
- API层封装:基于Axios的请求实例与拦截器,统一处理鉴权与错误提示,利于在测试中注入或替换。
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend.md](file://docs/frontend.md#L50-L131)
|
||||
|
||||
## 架构总览
|
||||
下图展示前端组件与后端API的交互关系,以及测试阶段的关键接入点(代理、拦截器、Store)。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
C1["组件"]
|
||||
S1["Pinia Store"]
|
||||
R1["路由"]
|
||||
AX["Axios 实例<br/>拦截器"]
|
||||
end
|
||||
subgraph "网络"
|
||||
P["Vite 代理<br/>/api -> 后端"]
|
||||
end
|
||||
subgraph "后端"
|
||||
API["FastAPI 路由"]
|
||||
end
|
||||
C1 --> AX
|
||||
AX --> P
|
||||
P --> API
|
||||
C1 --> S1
|
||||
C1 --> R1
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [frontend.md](file://docs/frontend.md#L92-L131)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 安装与基础配置(Vue Test Utils)
|
||||
- 安装依赖:添加测试框架与适配器(如@vue/test-utils、vitest),并配置别名与代理以复用生产环境网络行为。
|
||||
- 全局插件:在测试入口注册Pinia、路由、Element Plus,保证组件挂载与渲染一致性。
|
||||
- 代理与拦截器:保留Vite代理与Axios拦截器,便于对真实网络请求进行Mock或替换。
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L21-L25)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L7-L11)
|
||||
- [main.js](file://frontend/src/main.js#L19-L21)
|
||||
|
||||
### 渲染测试
|
||||
- 目标:验证组件在不同props与状态下的渲染结果,确保DOM结构与文本内容符合预期。
|
||||
- 关键点:使用全局插件快照渲染,避免遗漏Element Plus样式与国际化配置;针对Element Plus组件使用其提供的测试工具或模拟实现。
|
||||
- 断言建议:优先基于可测试性属性(如data-testid)定位元素,减少对内部实现细节的耦合。
|
||||
|
||||
章节来源
|
||||
- [frontend.md](file://docs/frontend.md#L50-L91)
|
||||
|
||||
### 交互测试
|
||||
- 目标:验证用户交互(点击、输入、切换)触发的状态变化与副作用。
|
||||
- 关键点:使用事件触发器模拟用户操作;对于Element Plus组件,优先使用其官方提供的测试工具或模拟组件。
|
||||
- 注意:在测试中保持与生产一致的拦截器行为,必要时对Axios实例进行Mock以隔离外部依赖。
|
||||
|
||||
章节来源
|
||||
- [frontend.md](file://docs/frontend.md#L92-L131)
|
||||
|
||||
### 生命周期测试
|
||||
- 目标:验证组件在挂载、卸载、更新过程中的副作用(如订阅、定时器、网络请求)。
|
||||
- 关键点:在测试中模拟或清理副作用;对异步副作用使用微任务或定时器工具推进执行。
|
||||
- 建议:对组合式函数中的副作用进行模块化拆分,便于独立测试与替换。
|
||||
|
||||
章节来源
|
||||
- [frontend.md](file://docs/frontend.md#L50-L84)
|
||||
|
||||
### 异步测试
|
||||
- 目标:验证异步数据加载、错误处理与Loading态。
|
||||
- 关键点:使用异步断言等待DOM更新;对Axios请求进行Mock,控制响应时间与状态码。
|
||||
- 建议:在测试中统一使用同一Axios实例,便于集中Mock与断言。
|
||||
|
||||
章节来源
|
||||
- [frontend.md](file://docs/frontend.md#L92-L131)
|
||||
|
||||
### 集成测试策略
|
||||
- API集成测试:通过Vite代理将测试请求转发至后端,使用Mock数据或真实数据库,验证端到端流程。
|
||||
- 端到端联动:在集成测试中同时启动前端与后端,使用真实用户场景驱动组件与API协作。
|
||||
- 依赖注入:在测试中注入替代服务或存储,隔离外部依赖,提升测试稳定性与速度。
|
||||
|
||||
章节来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L105-L107)
|
||||
|
||||
### 组件Mock技术、依赖注入与测试数据准备
|
||||
- 组件Mock:对第三方组件(如Element Plus)或复杂子组件进行浅层渲染或模拟实现,聚焦被测组件逻辑。
|
||||
- 依赖注入:通过全局插件或工厂函数注入替代服务(如API客户端、Store模块),便于在测试中控制输入与输出。
|
||||
- 测试数据:准备典型与边界数据集,覆盖正常、异常与空数据场景;对日期、金额等格式化字段进行一致性校验。
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend.md](file://docs/frontend.md#L92-L131)
|
||||
|
||||
### 调试工具使用
|
||||
- Vue DevTools:检查组件树、Props、状态与事件流,定位渲染与状态问题。
|
||||
- 浏览器开发者工具:利用Console与Network标签排查CORS、404、500与网络错误;结合后端日志定位问题根因。
|
||||
- 性能分析:使用Performance标签观察重排、重绘与长任务,识别渲染瓶颈。
|
||||
|
||||
章节来源
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L1-L119)
|
||||
|
||||
### 常见问题排查
|
||||
- 组件渲染问题:检查全局插件是否完整注册、Element Plus样式是否生效、别名解析是否正确。
|
||||
- 状态更新问题:确认响应式数据变更触发了重新渲染,避免直接修改对象引用;检查异步回调中的状态更新时机。
|
||||
- 内存泄漏检测:排查未清理的订阅、定时器与事件监听器;在组件卸载钩子中统一清理。
|
||||
|
||||
章节来源
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L10-L39)
|
||||
|
||||
### 测试覆盖率与持续集成配置
|
||||
- 覆盖率:在测试框架中启用覆盖率统计,关注组件、路由与API层的覆盖率阈值。
|
||||
- CI:在CI流水线中执行单元测试、集成测试与覆盖率检查,确保每次提交的质量门禁。
|
||||
|
||||
[本节为通用实践建议,不直接分析具体文件]
|
||||
|
||||
## 依赖分析
|
||||
前端依赖与配置对测试的影响:
|
||||
- Vite别名与代理:影响测试中资源解析与网络请求路径。
|
||||
- 插件生态:Element Plus、Pinia、Vue Router均需在测试环境中正确注册。
|
||||
- Axios拦截器:统一处理鉴权与错误,测试中可通过替换实例或拦截器实现可控行为。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Vite["Vite 别名与代理"]
|
||||
Plugins["插件注册<br/>Pinia / Router / Element Plus"]
|
||||
Axios["Axios 拦截器"]
|
||||
Tests["测试套件"]
|
||||
Vite --> Tests
|
||||
Plugins --> Tests
|
||||
Axios --> Tests
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L7-L11)
|
||||
- [main.js](file://frontend/src/main.js#L19-L21)
|
||||
- [frontend.md](file://docs/frontend.md#L92-L131)
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L11-L25)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L21)
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
|
||||
## 性能考虑
|
||||
- 渲染性能:减少不必要的响应式依赖与深层嵌套,使用计算属性与懒加载。
|
||||
- 网络性能:合并请求、缓存策略与防抖,避免频繁重渲染。
|
||||
- 测试性能:在测试中使用Mock与轻量数据,缩短执行时间。
|
||||
|
||||
[本节为通用指导,不直接分析具体文件]
|
||||
|
||||
## 故障排查指南
|
||||
- 控制台与网络:根据错误类型定位CORS、404、500与网络异常,结合后端日志与健康检查接口快速定位。
|
||||
- 接口测试工具:使用内置测试页面或脚本验证后端可用性与鉴权流程。
|
||||
- 缓存与重启:清理浏览器缓存与本地存储,必要时重启前后端服务。
|
||||
|
||||
章节来源
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L10-L95)
|
||||
- [test_api.py](file://backend/test_api.py#L1-L33)
|
||||
- [test-api.html](file://frontend/public/test-api.html)
|
||||
|
||||
## 结论
|
||||
通过统一的测试配置、规范化的组件与API层设计,以及完善的调试与排错流程,可以显著提升组件测试的可靠性与效率。建议在现有工程基础上逐步引入单元与集成测试,并在CI中强制覆盖率门槛,保障系统长期演进的稳定性。
|
||||
|
||||
[本节为总结性内容,不直接分析具体文件]
|
||||
|
||||
## 附录
|
||||
- 快速参考
|
||||
- 前端开发服务器:http://localhost:5173
|
||||
- 后端健康检查:http://localhost:8000/health
|
||||
- API文档:http://localhost:8000/api/v1/docs
|
||||
- 默认账号:admin / admin123
|
||||
|
||||
章节来源
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L97-L119)
|
||||
412
.qoder/repowiki/zh/content/前端开发指南/Vue组件开发/组件设计模式.md
Normal file
412
.qoder/repowiki/zh/content/前端开发指南/Vue组件开发/组件设计模式.md
Normal file
@@ -0,0 +1,412 @@
|
||||
# 组件设计模式
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
|
||||
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js)
|
||||
- [frontend/src/stores/index.js](file://frontend/src/stores/index.js)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [组件详解](#组件详解)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 引言
|
||||
本指南围绕 Vue 组件设计模式,结合仓库中的前端实现,系统阐述组件拆分原则、单一职责与高内聚低耦合理念;容器组件与展示组件的分离;组件抽象与复用策略;组件通信(父子、兄弟、跨级、事件总线);状态管理(全局与局部);组件边界与接口设计;以及测试策略与 Mock 数据实践。目标是帮助读者在实际项目中构建清晰、可维护、可扩展的组件体系。
|
||||
|
||||
## 项目结构
|
||||
前端采用典型的单页应用结构:入口应用、路由、布局、业务视图、状态管理与 API 层。整体遵循“关注点分离”和“按功能域组织”的原则,便于团队协作与长期演进。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["main.js<br/>应用入口"] --> B["App.vue<br/>根组件"]
|
||||
A --> C["router/index.js<br/>路由配置"]
|
||||
A --> D["stores/*<br/>Pinia 状态"]
|
||||
A --> E["api/*<br/>API 导出聚合"]
|
||||
B --> F["router-view<br/>动态渲染视图"]
|
||||
F --> G["Layout.vue<br/>布局容器"]
|
||||
G --> H["views/*<br/>业务视图"]
|
||||
subgraph "业务视图"
|
||||
H1["Login.vue"]
|
||||
H2["Dashboard.vue"]
|
||||
H3["basic/Departments.vue"]
|
||||
H4["assessment/Assessments.vue"]
|
||||
H5["assessment/AssessmentDetail.vue"]
|
||||
end
|
||||
G --> H1
|
||||
G --> H2
|
||||
G --> H3
|
||||
G --> H4
|
||||
G --> H5
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
## 核心组件
|
||||
- 应用入口与根组件
|
||||
- 入口负责注册插件、挂载应用;根组件提供语言环境与路由出口。
|
||||
- 路由层
|
||||
- 定义页面级路由、嵌套路由与导航守卫,统一设置标题与鉴权跳转。
|
||||
- 布局容器
|
||||
- 提供侧边栏、面包屑、头部用户信息与主内容区,承载业务视图切换与动画。
|
||||
- 业务视图
|
||||
- 各功能域页面(如登录、仪表盘、基础数据、考核管理等),承担数据加载、交互与展示。
|
||||
- 状态管理
|
||||
- Pinia Store 提供用户态与应用态(如侧边栏折叠、科室树)管理。
|
||||
- API 聚合
|
||||
- 统一导出各模块 API 方法,便于视图组件按需引入。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
|
||||
## 架构总览
|
||||
系统采用“布局容器 + 页面视图 + 状态管理 + API 调用”的分层架构。路由驱动视图切换,Pinia 管理共享状态,Element Plus 提供 UI 基础能力,Vite 提供开发与代理能力。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "运行时"
|
||||
R["浏览器"]
|
||||
V["Vue 3 运行时"]
|
||||
P["Pinia 状态"]
|
||||
E["Element Plus UI"]
|
||||
AX["Axios 请求"]
|
||||
end
|
||||
R --> V
|
||||
V --> E
|
||||
V --> P
|
||||
V --> AX
|
||||
AX --> S["后端服务<br/>http://localhost:8000"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [frontend/package.json](file://frontend/package.json#L1-L27)
|
||||
|
||||
## 组件详解
|
||||
|
||||
### 布局容器组件(Layout)
|
||||
- 角色定位
|
||||
- 容器组件:负责页面骨架、菜单渲染、侧边栏折叠、面包屑与用户下拉。
|
||||
- 设计要点
|
||||
- 通过 Pinia 管理侧边栏折叠状态;从 API 加载菜单树并映射为前端菜单项。
|
||||
- 使用路由元信息设置页面标题;在登出时清理状态并跳转登录。
|
||||
- 边界与接口
|
||||
- 依赖:路由实例、用户与应用 Store、菜单 API。
|
||||
- 输出:菜单项数组、折叠状态、路由元信息标题。
|
||||
- 复用策略
|
||||
- 将菜单加载逻辑抽离为可复用的工具函数;对菜单树转换逻辑进行单元测试。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant L as "Layout.vue"
|
||||
participant S as "Store(user/app)"
|
||||
participant A as "API(menu)"
|
||||
participant R as "Router"
|
||||
U->>L : 打开页面
|
||||
L->>S : 读取折叠状态/用户信息
|
||||
L->>A : 加载菜单树
|
||||
A-->>L : 返回菜单数据
|
||||
L->>L : 转换为前端菜单项
|
||||
L->>R : 设置页面标题
|
||||
U->>L : 点击菜单/折叠按钮
|
||||
L->>S : 更新折叠状态
|
||||
L->>R : 导航到目标路由
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L73-L125)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
|
||||
### 登录组件(Login)
|
||||
- 角色定位
|
||||
- 展示组件:负责表单输入、校验与登录交互。
|
||||
- 设计要点
|
||||
- 表单校验规则;调用用户 Store 的登录方法;成功后提示与路由跳转;失败提示。
|
||||
- 边界与接口
|
||||
- 输入:表单数据(用户名/密码);输出:登录结果与路由跳转。
|
||||
- 复用策略
|
||||
- 将表单校验规则与消息提示封装为可复用的组合式函数;对登录流程进行单元测试。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant L as "Login.vue"
|
||||
participant S as "Store(user)"
|
||||
participant R as "Router"
|
||||
U->>L : 输入用户名/密码
|
||||
U->>L : 点击登录
|
||||
L->>L : 校验表单
|
||||
alt 校验通过
|
||||
L->>S : 调用 login(username,password)
|
||||
S-->>L : 返回布尔结果
|
||||
alt 成功
|
||||
L->>U : 显示成功消息
|
||||
L->>R : 跳转 /
|
||||
else 失败
|
||||
L->>U : 显示失败消息
|
||||
end
|
||||
else 校验失败
|
||||
L->>U : 显示校验提示
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
### 仪表盘组件(Dashboard)
|
||||
- 角色定位
|
||||
- 容器组件:负责多维度数据加载、图表初始化与渲染、告警提示与表格展示。
|
||||
- 设计要点
|
||||
- 多个图表(趋势、饼图、科室排名、仪表盘)的初始化与响应式适配;计算属性用于派生指标;异常数据兜底。
|
||||
- 边界与接口
|
||||
- 输入:周期参数;输出:统计卡片、图表数据、告警集合。
|
||||
- 复用策略
|
||||
- 将图表配置与更新函数抽取为可复用的工具;对数据格式化与图表选项生成进行单元测试。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入 Dashboard"]) --> LoadStats["加载统计数据"]
|
||||
LoadStats --> LoadRanking["加载员工排名"]
|
||||
LoadRanking --> LoadTrend["加载趋势数据"]
|
||||
LoadTrend --> LoadDeptRanking["加载科室排名"]
|
||||
LoadDeptRanking --> LoadFinance["加载财务趋势"]
|
||||
LoadFinance --> LoadKpi["加载关键指标仪表盘"]
|
||||
LoadKpi --> InitCharts["初始化图表实例"]
|
||||
InitCharts --> RenderCharts["渲染图表与告警"]
|
||||
RenderCharts --> End(["完成渲染"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L329-L422)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L423-L448)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L1-L1082)
|
||||
|
||||
### 基础数据组件(Departments)
|
||||
- 角色定位
|
||||
- 容器组件:负责列表查询、分页、新增/编辑弹窗、状态切换与树形选择。
|
||||
- 设计要点
|
||||
- 搜索条件与分页参数传递至 API;树形选择使用树形数据;状态变更即时同步。
|
||||
- 边界与接口
|
||||
- 输入:搜索条件、分页参数;输出:表格数据、树形数据、提交结果。
|
||||
- 复用策略
|
||||
- 将 CRUD API 调用封装为独立函数;对表单校验与提交流程进行单元测试。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
|
||||
### 考核管理组件(Assessments)
|
||||
- 角色定位
|
||||
- 容器组件:负责列表筛选、分页、批量创建、状态流转(提交/审核/确认)。
|
||||
- 设计要点
|
||||
- 多条件筛选与分页;批量创建弹窗;根据状态显示不同操作按钮。
|
||||
- 边界与接口
|
||||
- 输入:筛选条件、分页参数;输出:列表数据、批量创建结果。
|
||||
- 复用策略
|
||||
- 将状态标签映射与分数等级样式抽离为工具;对状态流转流程进行集成测试。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
|
||||
### 考核详情组件(AssessmentDetail)
|
||||
- 角色定位
|
||||
- 容器组件:负责详情展示、草稿编辑、状态流转(保存/提交/审核/确认)。
|
||||
- 设计要点
|
||||
- 根据状态决定可编辑字段与操作按钮;状态标签与类型标签映射。
|
||||
- 边界与接口
|
||||
- 输入:路由参数(id);输出:详情数据、状态更新结果。
|
||||
- 复用策略
|
||||
- 将状态与类型映射封装为纯函数;对详情加载与状态更新进行单元测试。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
|
||||
|
||||
### 状态管理(Pinia Store)
|
||||
- 用户 Store(useUserStore)
|
||||
- 负责登录、获取用户信息、登出与 Token 管理;与路由联动。
|
||||
- 应用 Store(useAppStore)
|
||||
- 负责侧边栏折叠状态与科室树加载。
|
||||
- 导出聚合
|
||||
- 在 stores/index.js 中集中导出,便于视图组件按需引入。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class UserStore {
|
||||
+string token
|
||||
+object userInfo
|
||||
+login(username,password) Promise<bool>
|
||||
+getUserInfo() Promise<object>
|
||||
+logout() void
|
||||
}
|
||||
class AppStore {
|
||||
+boolean collapsed
|
||||
+array departmentTree
|
||||
+toggleSidebar() void
|
||||
+loadDepartmentTree() Promise<void>
|
||||
}
|
||||
class StoresIndex {
|
||||
+useUserStore()
|
||||
+useAppStore()
|
||||
}
|
||||
StoresIndex --> UserStore : "导出"
|
||||
StoresIndex --> AppStore : "导出"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/index.js](file://frontend/src/stores/index.js#L1-L3)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/index.js](file://frontend/src/stores/index.js#L1-L3)
|
||||
|
||||
### API 聚合与请求
|
||||
- API 聚合
|
||||
- 在 api/index.js 中统一导出各模块 API,便于视图组件按需引入。
|
||||
- 请求配置
|
||||
- Vite 开发服务器配置了 /api 代理到后端服务地址,便于前后端联调。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L19)
|
||||
|
||||
## 依赖关系分析
|
||||
- 组件依赖
|
||||
- 视图组件依赖路由、状态与 API;布局组件依赖菜单 API 与用户/应用 Store。
|
||||
- 状态依赖
|
||||
- 用户 Store 与路由守卫配合实现鉴权;应用 Store 管理 UI 状态。
|
||||
- 外部依赖
|
||||
- Element Plus 提供图标、表单、表格、图表等 UI 能力;ECharts 用于可视化;Axios 用于网络请求。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
V_Login["Login.vue"] --> S_User["useUserStore"]
|
||||
V_Dash["Dashboard.vue"] --> API_Stats["stats API"]
|
||||
V_Dash --> ECharts["ECharts"]
|
||||
V_Dept["Departments.vue"] --> API_Dept["department API"]
|
||||
V_Asm["Assessments.vue"] --> API_Asm["assessment API"]
|
||||
V_AsmD["AssessmentDetail.vue"] --> API_Asm["assessment API"]
|
||||
Layout["Layout.vue"] --> S_App["useAppStore"]
|
||||
Layout --> API_Menu["menu API"]
|
||||
Main["main.js"] --> Router["router/index.js"]
|
||||
Main --> Stores["stores/*"]
|
||||
Main --> App["App.vue"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L55-L89)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L229-L231)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L106-L106)
|
||||
- [frontend/src/views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L120-L122)
|
||||
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L102-L102)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L77-L81)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
|
||||
## 性能考量
|
||||
- 路由懒加载
|
||||
- 路由组件使用动态导入,减少首屏体积,提升初始加载速度。
|
||||
- 图表性能
|
||||
- 仅在需要时初始化图表实例;监听窗口 resize 事件进行自适应;避免重复 setOption。
|
||||
- 状态缓存
|
||||
- 对于不频繁变化的数据(如菜单树、科室树)进行本地缓存,减少重复请求。
|
||||
- 交互反馈
|
||||
- 使用加载状态与防抖,避免频繁触发请求;对大列表使用分页与虚拟滚动(如后续扩展)。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L4-L96)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L441-L448)
|
||||
|
||||
## 故障排查指南
|
||||
- 登录失败
|
||||
- 检查用户 Store 的登录返回值与错误处理;确认路由守卫是否正确拦截未登录访问。
|
||||
- 菜单加载失败
|
||||
- 检查菜单 API 返回结构与转换逻辑;确保降级菜单可用。
|
||||
- 图表空白或不更新
|
||||
- 检查图表实例是否初始化;确认数据源是否存在;验证 resize 事件绑定。
|
||||
- 鉴权失效
|
||||
- 检查本地 Token 是否存在;确认登出时是否清除 Token 并跳转登录。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L86-L116)
|
||||
- [frontend/src/views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L441-L448)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L34-L39)
|
||||
|
||||
## 结论
|
||||
本项目在组件设计上体现了清晰的分层与职责划分:布局容器负责页面骨架与状态,业务视图承担数据与交互,Pinia 管理共享状态,API 聚合提供稳定接口。通过路由懒加载、图表性能优化与状态缓存等手段,兼顾了可维护性与用户体验。建议在后续迭代中进一步完善单元测试与集成测试,强化组件边界与接口契约,持续提升系统的稳定性与可扩展性。
|
||||
|
||||
## 附录
|
||||
- 组件拆分原则
|
||||
- 单一职责:每个组件只负责一个功能域内的展示与交互。
|
||||
- 高内聚:组件内部逻辑紧密相关,减少外部依赖。
|
||||
- 低耦合:通过明确的 props 与事件进行通信,避免直接依赖 DOM 或全局变量。
|
||||
- 容器与展示组件
|
||||
- 容器组件:负责数据加载、状态管理与流程控制;展示组件:负责具体 UI 渲染与用户交互。
|
||||
- 组件抽象与复用
|
||||
- 将通用逻辑(如表单校验、状态映射、图表配置)抽离为可复用函数或组合式工具。
|
||||
- 组件通信
|
||||
- 父子通信:通过 props 下传与 emits 上抛;兄弟通信:通过共同父组件或事件总线;跨级通信:通过事件总线或全局状态;事件总线:谨慎使用,建议优先选择 Pinia。
|
||||
- 状态管理
|
||||
- 局部状态:组件内部使用 ref/reactive;全局状态:Pinia Store;持久化:Token 存储于 localStorage。
|
||||
- 接口与边界
|
||||
- 明确输入输出类型;对异常情况进行降级处理;对外暴露稳定的 API 接口。
|
||||
- 测试策略
|
||||
- 单元测试:针对纯函数与组合式逻辑;集成测试:针对组件生命周期与交互流程;Mock 数据:使用静态 JSON 或模拟 API 返回。
|
||||
437
.qoder/repowiki/zh/content/前端开发指南/前端开发指南.md
Normal file
437
.qoder/repowiki/zh/content/前端开发指南/前端开发指南.md
Normal file
@@ -0,0 +1,437 @@
|
||||
# 前端开发指南
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [package.json](file://frontend/package.json)
|
||||
- [vite.config.js](file://frontend/vite.config.js)
|
||||
- [main.js](file://frontend/src/main.js)
|
||||
- [App.vue](file://frontend/src/App.vue)
|
||||
- [router/index.js](file://frontend/src/router/index.js)
|
||||
- [stores/index.js](file://frontend/src/stores/index.js)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [stores/app.js](file://frontend/src/stores/app.js)
|
||||
- [views/Layout.vue](file://frontend/src/views/Layout.vue)
|
||||
- [views/Login.vue](file://frontend/src/views/Login.vue)
|
||||
- [views/Dashboard.vue](file://frontend/src/views/Dashboard.vue)
|
||||
- [views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue)
|
||||
- [views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
|
||||
- [views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue)
|
||||
- [api/request.js](file://frontend/src/api/request.js)
|
||||
- [api/auth.js](file://frontend/src/api/auth.js)
|
||||
- [api/index.js](file://frontend/src/api/index.js)
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向医院绩效系统的前端开发团队,围绕 Vue 3 Composition API 的使用、组件架构设计与状态管理策略展开,同时覆盖路由配置、API 调用封装、UI 组件设计规范、Element Plus 组件库使用、样式定制与响应式布局、组件开发最佳实践、代码组织结构、构建与部署流程,以及开发环境配置、热重载与生产构建优化、常见问题与性能优化建议。
|
||||
|
||||
## 项目结构
|
||||
前端采用 Vite + Vue 3 + Pinia + Element Plus 技术栈,目录组织遵循按功能域划分的模块化思路:
|
||||
- 根级配置:package.json、vite.config.js
|
||||
- 应用入口:main.js、App.vue
|
||||
- 路由:src/router/index.js
|
||||
- 状态管理:src/stores 下的用户与应用状态
|
||||
- 视图层:src/views 下按业务域划分的页面组件
|
||||
- API 层:src/api 下按领域划分的接口模块与统一请求封装
|
||||
- 样式:src/assets/main.scss 提供全局样式与主题变量
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["main.js<br/>应用入口"] --> B["App.vue<br/>根组件"]
|
||||
A --> C["router/index.js<br/>路由配置"]
|
||||
A --> D["stores/*<br/>Pinia 状态"]
|
||||
B --> E["views/Layout.vue<br/>布局容器"]
|
||||
E --> F["views/Login.vue<br/>登录页"]
|
||||
E --> G["views/Dashboard.vue<br/>工作台"]
|
||||
E --> H["views/basic/Departments.vue<br/>基础数据-科室"]
|
||||
E --> I["views/assessment/Assessments.vue<br/>考核管理"]
|
||||
E --> J["views/reports/Reports.vue<br/>统计报表"]
|
||||
A --> K["api/request.js<br/>HTTP 封装"]
|
||||
K --> L["api/auth.js<br/>认证接口"]
|
||||
K --> M["api/index.js<br/>接口聚合导出"]
|
||||
A --> N["assets/main.scss<br/>全局样式"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L1-L800)
|
||||
- [views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
- [api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [stores/index.js](file://frontend/src/stores/index.js#L1-L3)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L1-L800)
|
||||
- [views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
- [api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
|
||||
## 核心组件
|
||||
- 应用入口与插件注册:在入口文件中完成 Element Plus 国际化、图标全局注册、Pinia、路由挂载与全局样式引入。
|
||||
- 根组件:通过 Config Provider 统一语言包,简化多组件国际化使用。
|
||||
- 路由系统:采用 History 模式,定义登录页与主框架嵌套路由,含面包屑标题与全局前置守卫。
|
||||
- 状态管理:使用 Pinia 定义用户与应用状态,支持登录态持久化、菜单树与侧边栏状态。
|
||||
- API 层:统一 Axios 实例,拦截器处理鉴权头、错误提示与路由跳转;接口模块按领域拆分并聚合导出。
|
||||
- 视图组件:采用 Composition API 编写,结合 Element Plus 组件实现表单、表格、对话框、图表等。
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
|
||||
## 架构总览
|
||||
系统采用“视图层-状态层-接口层-基础设施层”的分层架构:
|
||||
- 视图层:页面组件负责交互与展示,使用 Composition API 管理本地状态与生命周期。
|
||||
- 状态层:Pinia Store 管理跨组件共享的状态与业务逻辑。
|
||||
- 接口层:Axios 封装统一处理请求/响应拦截,接口模块按领域拆分。
|
||||
- 基础设施:Vite 构建工具、Element Plus UI 库、SCSS 全局样式。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "视图层"
|
||||
V1["views/Login.vue"]
|
||||
V2["views/Layout.vue"]
|
||||
V3["views/Dashboard.vue"]
|
||||
V4["views/basic/Departments.vue"]
|
||||
V5["views/assessment/Assessments.vue"]
|
||||
V6["views/reports/Reports.vue"]
|
||||
end
|
||||
subgraph "状态层"
|
||||
S1["stores/user.js"]
|
||||
S2["stores/app.js"]
|
||||
end
|
||||
subgraph "接口层"
|
||||
I1["api/request.js"]
|
||||
I2["api/auth.js"]
|
||||
I3["api/index.js"]
|
||||
end
|
||||
subgraph "基础设施"
|
||||
B1["main.js"]
|
||||
B2["router/index.js"]
|
||||
B3["assets/main.scss"]
|
||||
end
|
||||
V1 --> S1
|
||||
V2 --> S2
|
||||
V3 --> I1
|
||||
V4 --> I1
|
||||
V5 --> I1
|
||||
V6 --> I1
|
||||
S1 --> I2
|
||||
I1 --> I3
|
||||
B1 --> V1
|
||||
B1 --> V2
|
||||
B1 --> V3
|
||||
B1 --> V4
|
||||
B1 --> V5
|
||||
B1 --> V6
|
||||
B1 --> B2
|
||||
B1 --> B3
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
- [views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L1-L800)
|
||||
- [views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 路由与导航
|
||||
- 路由模式:History 模式,便于 SEO 与语义化 URL。
|
||||
- 导航守卫:在进入非登录页时校验本地 token,未登录自动跳转登录页。
|
||||
- 嵌套路由:Layout 作为父路由,子路由承载各业务页面,支持面包屑标题动态设置。
|
||||
- 动态导入:路由组件懒加载,提升首屏性能。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant R as "路由守卫"
|
||||
participant L as "登录页"
|
||||
participant H as "主页"
|
||||
U->>R : 访问任意受保护路径
|
||||
R->>R : 读取 localStorage 中 token
|
||||
alt 无 token
|
||||
R-->>U : 跳转到 /login
|
||||
U->>L : 渲染登录页
|
||||
else 有 token
|
||||
R-->>U : 放行
|
||||
U->>H : 进入主框架
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
|
||||
章节来源
|
||||
- [router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
### 状态管理(Pinia)
|
||||
- 用户状态:登录、获取当前用户信息、登出;token 持久化至 localStorage。
|
||||
- 应用状态:侧边栏折叠状态、科室树加载;用于菜单渲染与布局切换。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class UserStore {
|
||||
+string token
|
||||
+object userInfo
|
||||
+login(username,password) Promise~boolean~
|
||||
+getUserInfo() Promise~object|null~
|
||||
+logout() void
|
||||
}
|
||||
class AppStore {
|
||||
+boolean collapsed
|
||||
+array departmentTree
|
||||
+toggleSidebar() void
|
||||
+loadDepartmentTree() Promise~void~
|
||||
}
|
||||
class ApiAuth {
|
||||
+login(data) Promise
|
||||
+getCurrentUser() Promise
|
||||
}
|
||||
UserStore --> ApiAuth : "调用"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
|
||||
章节来源
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [stores/index.js](file://frontend/src/stores/index.js#L1-L3)
|
||||
|
||||
### API 调用封装
|
||||
- Axios 实例:baseURL 指向 /api/v1,统一超时与 Content-Type。
|
||||
- 请求拦截:自动附加 Authorization 头(Bearer token)。
|
||||
- 响应拦截:统一错误码判断、错误消息提示、401 自动清理 token 并跳转登录。
|
||||
- 接口模块:按领域拆分(auth、department、staff、indicator、assessment、salary、stats、template),并在 index.js 聚合导出。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["发起请求"]) --> AddToken["从 localStorage 读取 token 并注入 Authorization"]
|
||||
AddToken --> SendReq["发送请求"]
|
||||
SendReq --> Resp{"响应状态"}
|
||||
Resp --> |code!=200| ShowErr["提示错误消息"]
|
||||
Resp --> |401| ClearToken["清除 token 并跳转登录"]
|
||||
Resp --> |其他错误| ShowNetErr["提示网络错误"]
|
||||
Resp --> |成功| ReturnRes["返回响应数据"]
|
||||
ShowErr --> End(["结束"])
|
||||
ClearToken --> End
|
||||
ShowNetErr --> End
|
||||
ReturnRes --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [api/request.js](file://frontend/src/api/request.js#L14-L63)
|
||||
|
||||
章节来源
|
||||
- [api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [api/index.js](file://frontend/src/api/index.js#L1-L9)
|
||||
|
||||
### 登录页与布局
|
||||
- 登录页:表单校验、加载态、错误提示、默认账号演示、登录成功跳转。
|
||||
- 布局:侧边栏菜单、顶部导航、面包屑、内容区过渡动画、用户下拉菜单、退出登录。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant L as "Login.vue"
|
||||
participant S as "UserStore"
|
||||
participant R as "Router"
|
||||
participant A as "Auth API"
|
||||
U->>L : 输入用户名/密码并点击登录
|
||||
L->>L : 表单校验
|
||||
L->>S : 调用 login(username,password)
|
||||
S->>A : 调用登录接口
|
||||
A-->>S : 返回 token
|
||||
S-->>L : 返回 true
|
||||
L->>R : 跳转到 /
|
||||
R-->>U : 渲染 Layout
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L10-L20)
|
||||
- [api/auth.js](file://frontend/src/api/auth.js#L4-L11)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
|
||||
章节来源
|
||||
- [views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
### 工作台(Dashboard)
|
||||
- 统计卡片:在职员工、已考核人数、平均得分、奖金总额。
|
||||
- 关键指标仪表盘:四个 KPI 指标仪表图联动。
|
||||
- 图表区域:科室排名对比、收支趋势、绩效趋势、绩效分布饼图。
|
||||
- 预警提示:低分员工、未完成考核科室、异常数据。
|
||||
- 员工排名:TOP 10 展示与奖金格式化。
|
||||
|
||||
章节来源
|
||||
- [views/Dashboard.vue](file://frontend/src/views/Dashboard.vue#L1-L800)
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss#L95-L179)
|
||||
|
||||
### 基础数据-科室管理
|
||||
- 查询条件:关键词、科室类型、分页。
|
||||
- 表格字段:编码、名称、类型、层级、状态、创建时间。
|
||||
- 操作:编辑、删除、状态开关。
|
||||
- 新增/编辑弹窗:表单校验、树形上级选择、提交。
|
||||
- 数据加载:分页查询、科室树加载。
|
||||
|
||||
章节来源
|
||||
- [views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
|
||||
### 考核管理
|
||||
- 查询条件:科室树选择、考核周期、状态筛选。
|
||||
- 表格字段:姓名、科室、周期、总分、加权得分、状态、创建时间。
|
||||
- 操作:查看详情、提交、审核通过/驳回、确认。
|
||||
- 批量创建:选择科室、周期、指标集合进行批量生成。
|
||||
|
||||
章节来源
|
||||
- [views/assessment/Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
|
||||
### 统计报表
|
||||
- 筛选条件:统计周期(月)。
|
||||
- 统计概览:在职员工、已考核人数、平均得分、奖金总额。
|
||||
- 图表:科室绩效对比柱状图、绩效分布饼图。
|
||||
- 数据表格:科室统计与员工排名 TOP 20。
|
||||
|
||||
章节来源
|
||||
- [views/reports/Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
|
||||
## 依赖关系分析
|
||||
- 依赖安装:Vue 3、Vue Router、Pinia、Axios、Element Plus、图标库、ECharts、Day.js。
|
||||
- 开发依赖:@vitejs/plugin-vue、vite、sass。
|
||||
- 构建与运行:dev/build/preview 脚本,代理 /api 到后端 8000 端口。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
P["package.json"] --> V["vue@^3.4.15"]
|
||||
P --> VR["vue-router@^4.2.5"]
|
||||
P --> PN["pinia@^2.1.7"]
|
||||
P --> AX["axios@^1.6.5"]
|
||||
P --> EP["element-plus@^2.5.3"]
|
||||
P --> IC["@element-plus/icons-vue@^2.3.1"]
|
||||
P --> EC["echarts@^5.4.3"]
|
||||
P --> DJ["dayjs@^1.11.10"]
|
||||
P --> VP["@vitejs/plugin-vue@^5.0.3"]
|
||||
P --> VT["vite@^5.0.11"]
|
||||
P --> SA["sass@^1.70.0"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
|
||||
## 性能考虑
|
||||
- 路由懒加载:使用动态导入减少首屏体积。
|
||||
- 组件懒加载:路由组件按需加载。
|
||||
- 图表性能:ECharts 初始化与 resize 事件绑定,避免重复初始化;图表容器尺寸固定,减少重排。
|
||||
- 状态持久化:用户 token 存储于 localStorage,减少重复登录开销。
|
||||
- 请求缓存:可结合业务场景在 Store 层增加简单缓存策略(如最近一次查询结果)。
|
||||
- 构建优化:生产构建开启压缩与 Tree Shaking;按需引入 Element Plus 组件与图标以减小体积。
|
||||
|
||||
## 故障排查指南
|
||||
- 登录失败/401:检查后端认证接口是否返回 token,确认请求拦截器是否正确注入 Authorization。
|
||||
- 路由跳转异常:确认路由守卫逻辑与 token 存储位置一致。
|
||||
- 图表不显示:确认容器元素存在且具备宽高,窗口 resize 事件触发图表 resize。
|
||||
- 样式冲突:检查全局样式与组件 scoped 样式的优先级,避免覆盖 Element Plus 默认样式。
|
||||
- 代理无效:确认 vite 代理配置指向正确的后端地址与端口。
|
||||
|
||||
章节来源
|
||||
- [api/request.js](file://frontend/src/api/request.js#L14-L63)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss#L181-L186)
|
||||
|
||||
## 结论
|
||||
本指南基于现有代码梳理了前端架构与实现细节,建议在后续迭代中持续完善:
|
||||
- 在 Store 中增加更细粒度的错误状态与加载状态管理。
|
||||
- 对高频接口增加缓存策略与防抖。
|
||||
- 逐步引入 TypeScript 以提升类型安全。
|
||||
- 增加单元测试与端到端测试覆盖关键流程。
|
||||
|
||||
## 附录
|
||||
|
||||
### 开发环境配置与热重载
|
||||
- 启动命令:npm run dev
|
||||
- 端口:5173
|
||||
- 代理:/api -> http://localhost:8000
|
||||
- 热重载:Vite 默认启用,修改代码自动刷新
|
||||
|
||||
章节来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [package.json](file://frontend/package.json#L6-L10)
|
||||
|
||||
### 生产构建与部署
|
||||
- 构建命令:npm run build
|
||||
- 预览命令:npm run preview
|
||||
- 部署建议:将 dist 目录部署至 Nginx/Apache,确保静态资源路径正确;后端提供 /api/v1 接口。
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L6-L10)
|
||||
|
||||
### Element Plus 使用与样式定制
|
||||
- 全局注册:在入口文件注册 Element Plus 与图标组件。
|
||||
- 国际化:通过 Config Provider 与 zhCN 语言包统一界面语言。
|
||||
- 主题变量:在全局样式中定义颜色与间距变量,供组件样式复用。
|
||||
- 响应式布局:利用 Element Plus Grid 与 Flex 布局实现自适应。
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L3-L21)
|
||||
- [App.vue](file://frontend/src/App.vue#L2-L8)
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss#L14-L61)
|
||||
421
.qoder/repowiki/zh/content/前端开发指南/构建与部署.md
Normal file
421
.qoder/repowiki/zh/content/前端开发指南/构建与部署.md
Normal file
@@ -0,0 +1,421 @@
|
||||
# 构建与部署
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [vite.config.js](file://frontend/vite.config.js)
|
||||
- [package.json](file://frontend/package.json)
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md)
|
||||
- [frontend.md](file://docs/frontend.md)
|
||||
- [main.js](file://frontend/src/main.js)
|
||||
- [router/index.js](file://frontend/src/router/index.js)
|
||||
- [api/request.js](file://frontend/src/api/request.js)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss)
|
||||
- [test-api.html](file://frontend/public/test-api.html)
|
||||
- [test-api.html](file://frontend/dist/test-api.html)
|
||||
- [test_frontend_connection.py](file://test_frontend_connection.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向前端构建与部署,围绕 Vite 构建配置、环境变量、资源优化、静态资源与代码分割、打包分析、生产构建与 CDN 缓存策略、容器化与 Nginx 反向代理、自动化部署与 CI/CD、版本发布管理、性能监控与错误追踪、用户体验优化以及调试与性能分析方法进行系统化说明。文档同时结合仓库现有前端工程与配套文档,确保内容可落地、可验证。
|
||||
|
||||
## 项目结构
|
||||
前端工程采用 Vite + Vue 3 + Pinia + Element Plus 的现代前端技术栈,源码位于 frontend 目录,构建产物输出至 dist 目录;开发时通过 Vite Dev Server 提供本地服务与代理能力;路由、状态管理、HTTP 客户端等关键模块均在 src 目录下组织。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端工程(frontend)"
|
||||
SRC["src 源码<br/>main.js/router/api/stores/assets"]
|
||||
DIST["dist 构建产物"]
|
||||
VCFG["vite.config.js"]
|
||||
PKG["package.json"]
|
||||
PUB["public 静态资源"]
|
||||
end
|
||||
SRC --> VCFG
|
||||
SRC --> PKG
|
||||
VCFG --> DIST
|
||||
PKG --> DIST
|
||||
PUB --> DIST
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
|
||||
章节来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
- [frontend.md](file://docs/frontend.md#L1-L416)
|
||||
|
||||
## 核心组件
|
||||
- 构建与开发服务器
|
||||
- Vite 插件与别名配置、开发服务器端口与代理规则
|
||||
- 开发脚本、构建脚本与预览脚本
|
||||
- 应用入口与全局依赖
|
||||
- 应用挂载、插件注册、国际化与全局样式引入
|
||||
- 路由与导航
|
||||
- 基于 History 模式的路由配置与前置守卫
|
||||
- 状态管理
|
||||
- Pinia Store 的用户状态与登录流程
|
||||
- HTTP 客户端
|
||||
- Axios 实例、基础地址、超时、请求/响应拦截器与错误处理
|
||||
- 样式与主题
|
||||
- 全局 SCSS 变量、布局与组件样式规范
|
||||
- 调试与测试工具
|
||||
- 内置 API 测试页面与前端连通性测试脚本
|
||||
|
||||
章节来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L1-L119)
|
||||
- [frontend.md](file://docs/frontend.md#L1-L416)
|
||||
|
||||
## 架构总览
|
||||
前端应用通过 Vite 构建,开发时由 Vite Dev Server 提供本地服务与代理,生产时生成静态资源并由 Nginx 提供静态文件服务与反向代理。HTTP 请求通过 Axios 发送,统一拦截处理错误与鉴权逻辑;路由守卫保障登录态校验;Pinia 管理用户状态。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
Browser["浏览器客户端"] --> ViteDev["Vite 开发服务器<br/>端口:5173"]
|
||||
ViteDev --> Proxy["代理规则<br/>/api -> 后端"]
|
||||
Browser --> BuildOut["构建产物 dist/*"]
|
||||
BuildOut --> Nginx["Nginx 反向代理"]
|
||||
Nginx --> Backend["后端服务"]
|
||||
subgraph "前端应用"
|
||||
Axios["Axios 实例<br/>拦截器/错误处理"]
|
||||
Router["Vue Router<br/>前置守卫"]
|
||||
Stores["Pinia Store<br/>用户状态"]
|
||||
end
|
||||
Browser --> Axios
|
||||
Browser --> Router
|
||||
Browser --> Stores
|
||||
Axios --> Proxy
|
||||
Proxy --> Backend
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [api/request.js](file://frontend/src/api/request.js#L5-L12)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L6-L48)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Vite 构建与开发服务器
|
||||
- 插件与别名
|
||||
- 使用 Vue 插件与路径别名 @ 指向 src,便于导入
|
||||
- 开发服务器
|
||||
- 端口 5173,默认启用
|
||||
- 代理 /api 到后端地址,解决开发跨域问题
|
||||
- 构建与脚本
|
||||
- 提供 dev/build/preview 三个常用脚本,满足开发、构建与本地预览
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["启动 Vite"]) --> LoadCfg["加载 vite.config.js"]
|
||||
LoadCfg --> Plugins["初始化插件与别名"]
|
||||
Plugins --> DevServer["启动开发服务器<br/>端口:5173"]
|
||||
DevServer --> ProxyRule["配置 /api 代理"]
|
||||
ProxyRule --> Ready(["开发就绪"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L5-L21)
|
||||
|
||||
章节来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [package.json](file://frontend/package.json#L6-L10)
|
||||
|
||||
### 应用入口与全局依赖
|
||||
- 应用挂载与插件
|
||||
- 注册 Pinia、Vue Router、Element Plus 并设置中文语言包
|
||||
- 注册 Element Plus 图标组件
|
||||
- 全局样式
|
||||
- 引入全局 SCSS,包含主题变量、布局与组件样式
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Entry as "main.js"
|
||||
participant App as "Vue 应用"
|
||||
participant Router as "Vue Router"
|
||||
participant Pinia as "Pinia"
|
||||
participant EP as "Element Plus"
|
||||
Entry->>App : createApp(App)
|
||||
Entry->>Pinia : app.use(createPinia())
|
||||
Entry->>Router : app.use(router)
|
||||
Entry->>EP : app.use(ElementPlus, { locale })
|
||||
Entry->>App : mount("#app")
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.js](file://frontend/src/main.js#L12-L23)
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
|
||||
### 路由与导航
|
||||
- 路由配置
|
||||
- 基于 History 模式,定义多级路由与懒加载页面
|
||||
- 前置守卫
|
||||
- 未登录访问受保护路由时重定向至登录页
|
||||
- 动态设置页面标题
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Enter["进入路由"] --> Guard["前置守卫"]
|
||||
Guard --> HasToken{"是否存在 token?"}
|
||||
HasToken --> |是| Allow["放行"]
|
||||
HasToken --> |否| ToLogin["重定向 /login"]
|
||||
Allow --> Render["渲染目标页面"]
|
||||
ToLogin --> End(["结束"])
|
||||
Render --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
|
||||
章节来源
|
||||
- [router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
### 状态管理(用户)
|
||||
- 用户状态
|
||||
- 存储 token 与用户信息,提供登录、获取用户信息、登出方法
|
||||
- 登出时清除 token 并跳转登录页
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class UserStore {
|
||||
+string token
|
||||
+object userInfo
|
||||
+login(username, password) Promise~boolean~
|
||||
+getUserInfo() Promise~object|null~
|
||||
+logout() void
|
||||
}
|
||||
class AuthAPI {
|
||||
+login(data) Promise
|
||||
+getCurrentUser() Promise
|
||||
}
|
||||
UserStore --> AuthAPI : "调用"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L6-L48)
|
||||
- [api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
章节来源
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
### HTTP 客户端与错误处理
|
||||
- Axios 实例
|
||||
- 基础地址指向 /api/v1,统一超时与 Content-Type
|
||||
- 请求拦截器
|
||||
- 自动附加 Bearer Token
|
||||
- 响应拦截器
|
||||
- 统一错误提示与 401 跳转登录
|
||||
- 对不同状态码给出明确提示
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Comp as "组件"
|
||||
participant Store as "Pinia Store"
|
||||
participant API as "API 函数"
|
||||
participant Axios as "Axios 实例"
|
||||
participant Inter as "拦截器"
|
||||
participant BE as "后端"
|
||||
Comp->>Store : 触发业务动作
|
||||
Store->>API : 调用 API 函数
|
||||
API->>Axios : 发起请求
|
||||
Axios->>Inter : 请求拦截器注入 Authorization
|
||||
Inter->>BE : 发送请求
|
||||
BE-->>Inter : 返回响应
|
||||
Inter-->>Axios : 响应拦截器处理
|
||||
Axios-->>API : 返回数据/抛错
|
||||
API-->>Store : 更新状态/提示
|
||||
Store-->>Comp : 视图更新
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [api/request.js](file://frontend/src/api/request.js#L5-L66)
|
||||
|
||||
章节来源
|
||||
- [api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
### 样式与主题
|
||||
- 全局变量与主题色
|
||||
- 定义主色、状态色、文本色、边框色与背景色
|
||||
- 布局与组件样式
|
||||
- 侧边栏、头部、主区域、表格、卡片、状态标签、分数等级、图表容器等样式规范
|
||||
|
||||
章节来源
|
||||
- [assets/main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
|
||||
### 调试与测试工具
|
||||
- 内置 API 测试页面
|
||||
- 提供健康检查与登录测试,便于快速验证前后端连通性
|
||||
- 前端连通性测试脚本
|
||||
- 检查 CORS 配置、登录接口可用性与返回值
|
||||
|
||||
章节来源
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L1-L119)
|
||||
- [test-api.html](file://frontend/public/test-api.html#L39-L75)
|
||||
- [test_frontend_connection.py](file://test_frontend_connection.py#L38-L74)
|
||||
|
||||
## 依赖关系分析
|
||||
- 组件耦合
|
||||
- main.js 作为入口,集中注册插件与依赖
|
||||
- router/index.js 与 stores/user.js 彼此独立,通过业务调用交互
|
||||
- api/request.js 作为 HTTP 客户端被各 API 模块复用
|
||||
- 外部依赖
|
||||
- Vue 3、Vue Router、Pinia、Axios、Element Plus、ECharts、Day.js、Vite、Sass
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Main["main.js"] --> Router["router/index.js"]
|
||||
Main --> Pinia["stores/*"]
|
||||
Main --> EP["Element Plus"]
|
||||
Router --> Views["views/*"]
|
||||
Pinia --> API["api/*"]
|
||||
API --> Request["api/request.js"]
|
||||
Request --> Axios["axios"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
## 性能考量
|
||||
- 构建与资源优化
|
||||
- 使用 Vite 的原生按需加载与 Tree Shaking,减少初始包体
|
||||
- 将第三方 UI 组件与图表库按需引入,避免全量打包
|
||||
- 代码分割
|
||||
- 路由级懒加载与组件级拆分,配合 Vite 的动态导入实现自然分割
|
||||
- 打包分析
|
||||
- 建议使用 Vite 插件进行体积分析,定位大体积依赖与重复模块
|
||||
- 生产构建
|
||||
- 使用构建脚本生成 dist,开启压缩与哈希命名,便于缓存与回滚
|
||||
- CDN 与缓存
|
||||
- 将静态资源托管至 CDN,设置长缓存与版本化文件名;对 HTML 设置短缓存
|
||||
- 运行时性能
|
||||
- 合理使用虚拟滚动、防抖与节流;对图表与大数据表格进行分页与懒加载
|
||||
|
||||
[本节为通用指导,不直接分析具体文件]
|
||||
|
||||
## 故障排查指南
|
||||
- 常见问题与解决
|
||||
- CORS 错误:属预期行为,检查后端 CORS 配置
|
||||
- 404:检查 Vite 代理配置与后端路由
|
||||
- 500:检查后端日志与数据库状态
|
||||
- Network Error:确认后端服务已启动
|
||||
- 调试步骤
|
||||
- 打开浏览器开发者工具,查看 Console 与 Network
|
||||
- 使用内置 API 测试页面与连通性脚本快速定位问题
|
||||
- 清除浏览器缓存与 localStorage,执行硬刷新
|
||||
- 重启后端与前端开发服务器
|
||||
|
||||
章节来源
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L10-L95)
|
||||
- [test_frontend_connection.py](file://test_frontend_connection.py#L38-L74)
|
||||
|
||||
## 结论
|
||||
本指南基于仓库现有前端工程与文档,系统梳理了 Vite 构建配置、开发代理、HTTP 客户端、路由与状态管理、样式体系与调试工具,并给出了生产构建、CDN 与缓存、容器化与 Nginx 反向代理、自动化部署与版本管理、性能监控与错误追踪、用户体验优化与调试分析的实践建议。建议在实际部署中结合团队规范与基础设施,逐步完善 CI/CD 与监控体系,持续优化构建与运行时性能。
|
||||
|
||||
[本节为总结性内容,不直接分析具体文件]
|
||||
|
||||
## 附录
|
||||
|
||||
### A. Vite 构建与环境变量
|
||||
- 构建脚本
|
||||
- 开发:npm run dev
|
||||
- 构建:npm run build
|
||||
- 预览:npm run preview
|
||||
- 环境变量
|
||||
- 建议通过 .env 文件管理 API 基础地址、CDN 基础路径等,避免硬编码
|
||||
- 在 Vite 中可通过 import.meta.env 访问
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L6-L10)
|
||||
- [frontend.md](file://docs/frontend.md#L380-L394)
|
||||
|
||||
### B. 静态资源处理、代码分割与打包分析
|
||||
- 静态资源
|
||||
- public 目录用于放置无需打包的静态资源;构建后与 dist 对齐
|
||||
- 代码分割
|
||||
- 路由懒加载与组件拆分天然实现分割;可结合 Vite 插件进行可视化分析
|
||||
- 打包分析
|
||||
- 推荐使用 @rollup/plugin-visualizer 或 vite-bundle-analyzer
|
||||
|
||||
章节来源
|
||||
- [frontend.md](file://docs/frontend.md#L17-L48)
|
||||
- [router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
### C. 生产构建、CDN 与缓存策略
|
||||
- 生产构建
|
||||
- 使用 npm run build 生成 dist;确保代理与基础路径在生产环境关闭或适配
|
||||
- CDN 与缓存
|
||||
- 将 dist 下静态资源上传至 CDN;HTML 设置短缓存;JS/CSS 设置长缓存并带内容指纹
|
||||
- 反向代理
|
||||
- Nginx 将静态资源交由 Nginx 直接提供,/api 前缀转发至后端
|
||||
|
||||
[本节为通用指导,不直接分析具体文件]
|
||||
|
||||
### D. Docker 容器化与 Nginx 反向代理
|
||||
- 容器化
|
||||
- 使用 Nginx 镜像作为静态资源服务器,挂载 dist 目录
|
||||
- Nginx 配置要点
|
||||
- 静态文件根目录指向 dist
|
||||
- /api 前缀代理至后端服务
|
||||
- 设置缓存与 Gzip 压缩
|
||||
- 反向代理
|
||||
- 将前端域名解析到 Nginx,Nginx 负责静态资源与 API 转发
|
||||
|
||||
[本节为通用指导,不直接分析具体文件]
|
||||
|
||||
### E. 自动化部署、CI/CD 与版本发布
|
||||
- CI/CD
|
||||
- 在流水线中执行安装依赖、构建、测试与部署步骤
|
||||
- 构建产物上传至制品库或直接部署到 Nginx
|
||||
- 版本发布
|
||||
- 使用语义化版本管理;构建产物与版本关联,便于回滚
|
||||
|
||||
[本节为通用指导,不直接分析具体文件]
|
||||
|
||||
### F. 性能监控、错误追踪与用户体验优化
|
||||
- 性能监控
|
||||
- 关注首屏时间、交互延迟与内存占用;结合浏览器性能面板与 Lighthouse
|
||||
- 错误追踪
|
||||
- 前端错误上报与后端错误日志联动;统一错误提示与用户引导
|
||||
- 用户体验
|
||||
- 加载骨架屏、空态与错误态;合理分页与搜索;移动端适配
|
||||
|
||||
[本节为通用指导,不直接分析具体文件]
|
||||
|
||||
### G. 调试工具使用与性能分析
|
||||
- 调试工具
|
||||
- 浏览器开发者工具、Vue DevTools、网络面板、性能面板
|
||||
- 性能分析
|
||||
- 关注资源加载顺序、缓存命中率与关键渲染路径
|
||||
|
||||
章节来源
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L1-L119)
|
||||
330
.qoder/repowiki/zh/content/前端开发指南/状态管理.md
Normal file
330
.qoder/repowiki/zh/content/前端开发指南/状态管理.md
Normal file
@@ -0,0 +1,330 @@
|
||||
# 状态管理
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [frontend/src/main.js](file://frontend/src/main.js)
|
||||
- [frontend/src/stores/index.js](file://frontend/src/stores/index.js)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南围绕前端仓库中的 Pinia 状态管理进行系统化讲解,覆盖 Store 的创建、状态与动作的实现、模块化组织、跨组件共享、持久化策略、订阅与调试、异步与错误处理、以及状态重置与迁移等主题。结合项目实际的用户状态与应用配置状态实现,帮助开发者快速理解并高效扩展状态管理能力。
|
||||
|
||||
## 项目结构
|
||||
前端采用 Vue 3 + Pinia 架构,状态管理集中在 stores 目录,通过集中导出统一暴露给视图层;路由负责页面导航与鉴权守卫;API 层封装请求逻辑;入口文件完成 Pinia 的安装与挂载。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "入口与框架"
|
||||
MAIN["main.js<br/>安装 Pinia 并挂载应用"]
|
||||
ROUTER["router/index.js<br/>路由与鉴权守卫"]
|
||||
end
|
||||
subgraph "状态层"
|
||||
STORES_INDEX["stores/index.js<br/>统一导出 Store"]
|
||||
USER["stores/user.js<br/>用户状态 Store"]
|
||||
APP["stores/app.js<br/>应用配置 Store"]
|
||||
end
|
||||
subgraph "视图层"
|
||||
LOGIN["views/Login.vue<br/>登录页"]
|
||||
LAYOUT["views/Layout.vue<br/>布局页"]
|
||||
end
|
||||
subgraph "API 层"
|
||||
AUTH_API["api/auth.js<br/>认证接口"]
|
||||
DEPT_API["api/department.js<br/>科室接口"]
|
||||
end
|
||||
MAIN --> STORES_INDEX
|
||||
STORES_INDEX --> USER
|
||||
STORES_INDEX --> APP
|
||||
LOGIN --> USER
|
||||
LAYOUT --> APP
|
||||
USER --> AUTH_API
|
||||
APP --> DEPT_API
|
||||
ROUTER --> LOGIN
|
||||
ROUTER --> LAYOUT
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/stores/index.js](file://frontend/src/stores/index.js#L1-L3)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/stores/index.js](file://frontend/src/stores/index.js#L1-L3)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
## 核心组件
|
||||
- 用户状态 Store(user)
|
||||
- 状态:令牌与用户信息
|
||||
- 动作:登录、获取用户信息、登出
|
||||
- 持久化:本地存储令牌
|
||||
- 应用配置 Store(app)
|
||||
- 状态:侧边栏折叠状态、科室树
|
||||
- 动作:切换侧边栏、加载科室树
|
||||
- 统一导出(stores/index.js)
|
||||
- 集中导出各 Store,便于视图层按需引入
|
||||
- 入口与安装(main.js)
|
||||
- 安装 Pinia 插件并挂载到根实例
|
||||
- 路由与鉴权(router/index.js)
|
||||
- 登录页与受保护页面的导航控制
|
||||
- API 层(api/auth.js、api/department.js)
|
||||
- 对后端接口的封装,供 Store 动作调用
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/stores/index.js](file://frontend/src/stores/index.js#L1-L3)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
## 架构总览
|
||||
以下序列图展示登录流程中,视图层、用户 Store 与 API 层之间的交互,体现异步状态处理与错误反馈。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant V as "Login.vue"
|
||||
participant US as "useUserStore"
|
||||
participant API as "auth.js"
|
||||
participant RT as "router/index.js"
|
||||
V->>US : "login(用户名, 密码)"
|
||||
US->>API : "POST /auth/login"
|
||||
API-->>US : "返回访问令牌"
|
||||
US->>US : "写入令牌到本地存储"
|
||||
US-->>V : "返回登录结果"
|
||||
V->>RT : "跳转至首页"
|
||||
Note over V,RT : "若登录失败,显示错误提示"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L4-L11)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 用户状态 Store(user)
|
||||
- 状态定义
|
||||
- 令牌:用于鉴权,初始化从本地存储读取
|
||||
- 用户信息:当前登录用户的资料
|
||||
- 动作方法
|
||||
- 登录:调用认证接口,成功后写入令牌并持久化
|
||||
- 获取用户信息:拉取当前用户资料
|
||||
- 登出:清空令牌与用户信息,跳转登录页
|
||||
- 最佳实践
|
||||
- 在登录动作中捕获异常并返回布尔值,便于视图层判断
|
||||
- 登出时同步清理本地存储与路由跳转,保证状态一致性
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入登录动作"]) --> CallAPI["调用认证接口"]
|
||||
CallAPI --> Success{"请求成功?"}
|
||||
Success --> |是| SetToken["写入令牌到状态与本地存储"]
|
||||
Success --> |否| ReturnFalse["返回失败标记"]
|
||||
SetToken --> Done(["结束"])
|
||||
ReturnFalse --> Done
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L4-L11)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
|
||||
### 应用配置 Store(app)
|
||||
- 状态定义
|
||||
- 侧边栏折叠状态:控制菜单宽度与显示
|
||||
- 科室树:后端返回的树形结构,用于菜单生成
|
||||
- 动作方法
|
||||
- 切换侧边栏:翻转折叠状态
|
||||
- 加载科室树:调用接口获取数据并赋值
|
||||
- 最佳实践
|
||||
- 在加载动作中使用 try/catch 处理异常,避免未捕获错误导致界面卡死
|
||||
- 数据为空时提供兜底逻辑,确保 UI 正常渲染
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入加载科室树"]) --> TryCall["调用接口获取数据"]
|
||||
TryCall --> Try{"请求成功?"}
|
||||
Try --> |是| Assign["赋值到状态"]
|
||||
Try --> |否| Catch["记录错误日志"]
|
||||
Assign --> End(["结束"])
|
||||
Catch --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L15-L22)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L9-L11)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
### 视图层集成与跨组件共享
|
||||
- 登录页(Login.vue)
|
||||
- 引入用户 Store,绑定表单校验与加载态
|
||||
- 调用登录动作,根据返回结果进行消息提示与路由跳转
|
||||
- 布局页(Layout.vue)
|
||||
- 引入应用 Store,控制侧边栏折叠与菜单渲染
|
||||
- 引入用户 Store,触发登出动作
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant LV as "Login.vue"
|
||||
participant UV as "useUserStore"
|
||||
LV->>UV : "login()"
|
||||
UV-->>LV : "true/false"
|
||||
LV->>LV : "提示与路由跳转"
|
||||
participant LV2 as "Layout.vue"
|
||||
participant AV as "useAppStore"
|
||||
LV2->>AV : "toggleSidebar()"
|
||||
LV2->>AV : "loadDepartmentTree()"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L55-L89)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L76-L124)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L10-L22)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
|
||||
### 模块化组织与统一导出
|
||||
- stores/index.js 将各 Store 统一导出,便于视图层按需引入,降低导入分散带来的维护成本
|
||||
- 建议后续可扩展计算属性与插件化注册,进一步增强模块化能力
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/index.js](file://frontend/src/stores/index.js#L1-L3)
|
||||
|
||||
### 状态持久化策略
|
||||
- 令牌持久化:登录成功后写入本地存储,刷新页面后仍可保持登录态
|
||||
- 状态持久化建议:
|
||||
- 对于轻量配置(如侧边栏折叠),可仅做内存持久化并在必要时写入本地存储
|
||||
- 对于重要业务数据,优先通过后端接口拉取,前端仅做缓存与回退处理
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L7-L16)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L6-L7)
|
||||
|
||||
### 状态订阅与调试
|
||||
- 订阅:可通过 Pinia 提供的订阅机制监听状态变化,便于调试与副作用处理
|
||||
- 调试:结合浏览器开发工具查看 Store 状态与动作调用链,定位问题
|
||||
- 建议:在开发环境开启严格模式与日志输出,生产环境关闭冗余日志
|
||||
|
||||
(本节为通用指导,不直接分析具体文件)
|
||||
|
||||
### 异步状态处理、错误状态管理与加载状态控制
|
||||
- 异步处理:Store 动作统一使用 async/await,确保调用方能正确等待结果
|
||||
- 错误处理:在动作内部捕获异常并返回明确的结果标识,视图层据此给出反馈
|
||||
- 加载状态:视图层维护加载态变量,在动作执行前后切换,提升用户体验
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L77-L88)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L15-L22)
|
||||
|
||||
### 状态重置、合并与迁移策略
|
||||
- 重置:登出时清空令牌与用户信息,恢复初始状态
|
||||
- 合并:加载新数据时先清空旧数据再赋值,避免脏数据残留
|
||||
- 迁移:当后端字段变更时,Store 中提供兼容逻辑或版本化处理,保证向前兼容
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L34-L39)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L15-L22)
|
||||
|
||||
## 依赖关系分析
|
||||
- 入口依赖:main.js 依赖 Pinia 安装,确保全局可用
|
||||
- 视图依赖:Login.vue 依赖 user Store,Layout.vue 依赖 app Store
|
||||
- Store 依赖:user Store 依赖 auth API,app Store 依赖 department API
|
||||
- 路由依赖:router/index.js 依赖本地存储令牌进行鉴权守卫
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
MAIN["main.js"] --> PINIA["Pinia"]
|
||||
LOGIN["Login.vue"] --> USER["useUserStore"]
|
||||
LAYOUT["Layout.vue"] --> APP["useAppStore"]
|
||||
USER --> AUTH["auth.js"]
|
||||
APP --> DEPT["department.js"]
|
||||
ROUTER["router/index.js"] --> TOKEN["localStorage(token)"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L19-L19)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L55-L58)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L76-L81)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L3-L4)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L3-L3)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L106-L108)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L20)
|
||||
|
||||
## 性能考量
|
||||
- 状态粒度:将高频更新与低频更新拆分到不同 Store 或状态字段,减少不必要的响应式开销
|
||||
- 异步批处理:对频繁触发的动作进行防抖或节流,避免重复请求
|
||||
- 缓存策略:对只读或稳定数据(如科室树)进行本地缓存,降低网络请求频率
|
||||
- 渲染优化:在视图层避免深层嵌套的响应式对象,尽量扁平化状态结构
|
||||
|
||||
(本节为通用指导,不直接分析具体文件)
|
||||
|
||||
## 故障排查指南
|
||||
- 登录失败
|
||||
- 检查登录动作是否抛出异常并返回布尔值
|
||||
- 核对 API 返回结构与 Store 写入逻辑
|
||||
- 无法跳转
|
||||
- 确认路由守卫逻辑与本地存储令牌状态一致
|
||||
- 侧边栏不生效
|
||||
- 检查 Store 折叠状态与视图绑定是否正确
|
||||
- 科室树不显示
|
||||
- 确认接口返回结构与赋值逻辑一致,必要时添加兜底数据
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L4-L25)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L15-L22)
|
||||
|
||||
## 结论
|
||||
本项目基于 Pinia 实现了清晰的用户状态与应用配置状态管理,配合统一导出与路由守卫,形成了模块化、可扩展且易于维护的状态体系。遵循本文的最佳实践与策略,可在保证性能与可维护性的前提下,进一步完善异步处理、错误管理与调试能力。
|
||||
|
||||
## 附录
|
||||
- 关键实现位置参考
|
||||
- 用户登录与登出:[frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L39)
|
||||
- 应用配置与菜单加载:[frontend/src/stores/app.js](file://frontend/src/stores/app.js#L15-L22)
|
||||
- 视图层集成示例:[frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)、[frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L76-L124)
|
||||
- 入口与安装:[frontend/src/main.js](file://frontend/src/main.js#L19-L19)
|
||||
- 路由与鉴权:[frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- API 封装:[frontend/src/api/auth.js](file://frontend/src/api/auth.js#L4-L11)、[frontend/src/api/department.js](file://frontend/src/api/department.js#L9-L11)
|
||||
315
.qoder/repowiki/zh/content/前端开发指南/路由与导航.md
Normal file
315
.qoder/repowiki/zh/content/前端开发指南/路由与导航.md
Normal file
@@ -0,0 +1,315 @@
|
||||
# 路由与导航
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js)
|
||||
- [frontend/src/api/menu.js](file://frontend/src/api/menu.js)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js)
|
||||
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件系统化梳理了 Vue Router 在本项目中的路由管理实践,覆盖路由配置、嵌套路由、动态路由、路由守卫与权限拦截、参数传递与查询字符串处理、路由元信息、面包屑与侧边栏联动、页面标题动态更新、懒加载与代码分割、登录态保持与权限控制、以及页面缓存策略等主题。旨在帮助开发者快速理解并扩展路由体系。
|
||||
|
||||
## 项目结构
|
||||
前端采用 Vite + Vue 3 + vue-router 4 + Pinia 的现代前端栈,路由集中于 router/index.js,视图组件位于 views 下,状态管理位于 stores,HTTP 请求封装于 api/request.js 并通过 axios 实现拦截器。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["入口 main.js"] --> B["应用 App.vue"]
|
||||
A --> C["路由 router/index.js"]
|
||||
C --> D["布局 Layout.vue"]
|
||||
D --> E["侧边栏菜单<br/>动态加载"]
|
||||
D --> F["面包屑<br/>基于 meta.title"]
|
||||
D --> G["主内容区 router-view"]
|
||||
G --> H["各业务视图<br/>如 Login.vue / Dashboard.vue / AssessmentDetail.vue"]
|
||||
A --> I["状态 stores<br/>user.js / app.js"]
|
||||
A --> J["HTTP 封装 api/request.js"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
## 核心组件
|
||||
- 路由定义与守卫:集中于 router/index.js,包含基础路由、嵌套路由、动态路由、全局前置守卫。
|
||||
- 应用入口与挂载:main.js 完成插件注册、路由挂载与国际化配置。
|
||||
- 布局与导航:Layout.vue 提供侧边栏菜单、面包屑、头部用户信息与内容区过渡动画。
|
||||
- 登录与权限:Login.vue 负责登录交互;user.js 管理 token 与登录态;全局守卫进行未登录拦截。
|
||||
- 状态管理:app.js 管理侧边栏折叠与部门树;user.js 管理用户信息与登出跳转。
|
||||
- HTTP 封装:request.js 统一添加 Authorization 头、处理 401/403/404/500 等响应错误并重定向到登录。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
## 架构总览
|
||||
路由层负责页面级导航与权限控制;布局层负责 UI 结构与导航元素;状态层负责登录态与侧边栏状态;HTTP 层统一处理鉴权头与错误响应。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant R as "路由守卫<br/>router.beforeEach"
|
||||
participant L as "登录页<br/>Login.vue"
|
||||
participant S as "状态 stores<br/>user.js"
|
||||
participant M as "主布局<br/>Layout.vue"
|
||||
U->>R : 访问任意受保护路由
|
||||
R->>R : 读取 localStorage.token
|
||||
alt 未登录且非 /login
|
||||
R-->>U : 重定向至 /login
|
||||
else 已登录或访问 /login
|
||||
R-->>M : 放行并渲染布局
|
||||
end
|
||||
U->>L : 输入凭据并提交
|
||||
L->>S : 调用 userStore.login(...)
|
||||
S-->>L : 成功则写入 token 并跳转 /
|
||||
L-->>M : 渲染主布局
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 路由配置与嵌套路由
|
||||
- 基础路由:登录页与根路径重定向。
|
||||
- 嵌套路由:根路径下包含 dashboard、基础数据、考核、工资、报表、财务、计划、系统管理等模块;系统管理内部再嵌套菜单管理。
|
||||
- 路由元信息:每个路由配置了 meta.title、icon 等,用于面包屑与侧边栏展示。
|
||||
- 默认重定向:访问根路径时自动跳转到 dashboard。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L3-L96)
|
||||
|
||||
### 动态路由与菜单联动
|
||||
- 后端菜单树:通过 api/menu.js 的 getMenuTree 接口拉取菜单树,转换为前端可用的菜单项数组。
|
||||
- 侧边栏渲染:Layout.vue 中根据 menuItems 渲染 el-menu,支持折叠与图标显示。
|
||||
- 回退菜单:若拉取失败,使用默认菜单作为后备,保证可用性。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L86-L124)
|
||||
- [frontend/src/api/menu.js](file://frontend/src/api/menu.js#L4-L6)
|
||||
|
||||
### 动态路由参数与详情页
|
||||
- 动态路由:/assessments/:id 对应 AssessmentDetail 页面。
|
||||
- 参数读取:在 AssessmentDetail.vue 中通过 useRoute().params.id 获取动态参数。
|
||||
- 查询字符串:当前示例未使用查询参数,但可通过 useRoute().query 获取。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L52-L56)
|
||||
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L104-L158)
|
||||
|
||||
### 路由元信息与面包屑
|
||||
- 元信息:每个路由的 meta.title 用于页面标题与面包屑显示。
|
||||
- 面包屑:Layout.vue 中直接使用 route.meta.title 作为当前面包屑文本。
|
||||
- 页面标题:全局守卫在每次导航前设置 document.title。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L8-L20)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L106)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L39-L42)
|
||||
|
||||
### 路由守卫、权限验证与导航拦截
|
||||
- 全局前置守卫:router.beforeEach 读取 token,未登录且访问非 /login 路由时强制跳转登录。
|
||||
- 登录成功:Login.vue 调用 userStore.login,成功后写入 token 并跳转根路径。
|
||||
- 登出:user.js 中 logout 清空 token 并跳转 /login。
|
||||
- HTTP 层拦截:request.js 在 401 时清除 token 并跳转 /login,确保前后端一致。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入 beforeEach"]) --> ReadToken["读取 localStorage.token"]
|
||||
ReadToken --> IsLogin{"是否已登录?"}
|
||||
IsLogin --> |是| Next["放行 next()"]
|
||||
IsLogin --> |否| IsLoginPage{"是否访问 /login?"}
|
||||
IsLoginPage --> |是| Next
|
||||
IsLoginPage --> |否| ToLogin["next('/login')"]
|
||||
Next --> End(["结束"])
|
||||
ToLogin --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L34-L39)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L39-L44)
|
||||
|
||||
### 页面标题动态更新
|
||||
- 标题来源:全局守卫根据 to.meta.title 设置 document.title,并附加系统名。
|
||||
- 建议:可在路由 meta 中补充更完整的标题链路,便于多级标题展示。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L104-L106)
|
||||
|
||||
### 面包屑导航与侧边栏菜单
|
||||
- 面包屑:Layout.vue 使用 route.meta.title 显示当前页面标题。
|
||||
- 侧边栏:Layout.vue 通过 api/menu.js 拉取菜单树,渲染 el-menu;支持折叠与图标。
|
||||
- 菜单回退:若接口异常,使用默认菜单保障可用性。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L39-L42)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L86-L124)
|
||||
- [frontend/src/api/menu.js](file://frontend/src/api/menu.js#L4-L6)
|
||||
|
||||
### 页面缓存机制
|
||||
- 当前实现:Layout.vue 使用 <router-view> 包裹并配合过渡动画,未见显式 keep-alive 缓存策略。
|
||||
- 建议:对频繁切换但无需刷新的页面(如列表页)可引入 keep-alive 以提升体验。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L63-L67)
|
||||
|
||||
### 登录状态保持与权限控制
|
||||
- 登录态:token 存储于 localStorage,user.js 提供 login/getUserInfo/logout。
|
||||
- 权限控制:全局守卫 + HTTP 401 自动登出,确保未授权访问被拦截。
|
||||
- 用户信息:userStore.getUserInfo 用于初始化用户信息,但当前布局未消费该数据。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L7-L31)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L39-L44)
|
||||
|
||||
### 路由懒加载与代码分割
|
||||
- 路由级懒加载:各路由 component 使用函数返回动态 import,实现按需加载与代码分割。
|
||||
- 性能收益:首屏仅加载必要模块,减少初始包体积。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L7-L8)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L18)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L24)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L30)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L36)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L42)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L48)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L54)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L60)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L66)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L72)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L78)
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L89)
|
||||
|
||||
### 查询字符串处理
|
||||
- 当前路由未使用查询参数示例;如需使用,可在组件中通过 useRoute().query 获取。
|
||||
- 建议:对需要持久化的筛选条件,优先使用查询参数,利于分享与刷新恢复。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/assessment/AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L104-L158)
|
||||
|
||||
## 依赖关系分析
|
||||
- 路由依赖:router/index.js 依赖 Vue Router 与本地组件;全局守卫依赖 localStorage。
|
||||
- 视图依赖:Layout.vue 依赖 stores 与 api/menu.js;Login.vue 依赖 stores/user.js 与 router。
|
||||
- 状态依赖:user.js 依赖 api/auth 与 router;app.js 依赖 api/department。
|
||||
- HTTP 依赖:api/request.js 依赖 axios,并向 router 注入 401 自动登出逻辑。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
R["router/index.js"] --> V1["views/Login.vue"]
|
||||
R --> V2["views/Layout.vue"]
|
||||
V2 --> S1["stores/user.js"]
|
||||
V2 --> S2["stores/app.js"]
|
||||
V2 --> A1["api/menu.js"]
|
||||
V1 --> S1
|
||||
S1 --> A2["api/auth (未在仓库中)"]
|
||||
A1 --> A3["后端 /menus* 接口"]
|
||||
R --> R2["全局守卫使用 localStorage"]
|
||||
R --> A4["api/request.js"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/api/menu.js](file://frontend/src/api/menu.js#L1-L37)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [frontend/src/stores/app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [frontend/src/api/menu.js](file://frontend/src/api/menu.js#L1-L37)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
## 性能考虑
|
||||
- 路由懒加载:已通过动态 import 实现按需加载,建议结合路由级命名与路由表拆分进一步优化打包。
|
||||
- 过渡动画:Layout.vue 已启用淡入淡出过渡,避免白屏与闪烁。
|
||||
- 首屏优化:将高频但非首屏使用的路由组件继续延迟加载,减少首屏 JS 体积。
|
||||
- 缓存策略:对列表类页面引入 keep-alive,减少重复渲染与请求开销。
|
||||
- 图标与第三方库:Element Plus 图标已全局注册,避免重复导入。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L7-L8)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L63-L67)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
## 故障排查指南
|
||||
- 无法进入受保护页面
|
||||
- 检查 localStorage 是否存在 token;确认全局守卫逻辑与路由路径匹配。
|
||||
- 登录后未跳转
|
||||
- 检查 Login.vue 中调用 userStore.login 返回值与 router.push('/') 执行。
|
||||
- 401 自动登出后未回到登录页
|
||||
- 检查 request.js 响应拦截器是否正确清除 token 并跳转 /login。
|
||||
- 面包屑不显示
|
||||
- 确认目标路由 meta.title 是否配置;Layout.vue 是否使用 route.meta.title。
|
||||
- 侧边栏菜单为空
|
||||
- 检查 api/menu.js 接口返回结构与 Layout.vue 转换逻辑;关注异常回退分支。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/router/index.js](file://frontend/src/router/index.js#L103-L113)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L39-L44)
|
||||
- [frontend/src/views/Layout.vue](file://frontend/src/views/Layout.vue#L86-L124)
|
||||
|
||||
## 结论
|
||||
本项目的路由体系以简洁清晰的方式实现了基础导航、嵌套与动态路由、全局守卫与权限拦截、元信息驱动的面包屑与标题、以及基于懒加载的代码分割。后续可在菜单树结构、页面缓存策略、查询参数与面包屑链路等方面进一步增强,以满足更复杂的业务场景与用户体验需求。
|
||||
|
||||
## 附录
|
||||
- 技术栈版本参考
|
||||
- Vue 3、Vue Router 4、Pinia、Element Plus、Axios、Vite
|
||||
- 建议的后续改进方向
|
||||
- 菜单树结构标准化与权限位映射
|
||||
- 面包屑链路与路由层级联动
|
||||
- 页面级 keep-alive 缓存策略
|
||||
- 查询参数与路由参数的规范使用
|
||||
|
||||
章节来源
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
483
.qoder/repowiki/zh/content/前端开发指南/项目初始化与配置.md
Normal file
483
.qoder/repowiki/zh/content/前端开发指南/项目初始化与配置.md
Normal file
@@ -0,0 +1,483 @@
|
||||
# 项目初始化与配置
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [package.json](file://frontend/package.json)
|
||||
- [vite.config.js](file://frontend/vite.config.js)
|
||||
- [main.js](file://frontend/src/main.js)
|
||||
- [App.vue](file://frontend/src/App.vue)
|
||||
- [index.js](file://frontend/src/router/index.js)
|
||||
- [main.scss](file://frontend/src/assets/main.scss)
|
||||
- [index.js](file://frontend/src/stores/index.js)
|
||||
- [app.js](file://frontend/src/stores/app.js)
|
||||
- [user.js](file://frontend/src/stores/user.js)
|
||||
- [index.html](file://frontend/index.html)
|
||||
- [request.js](file://frontend/src/api/request.js)
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue)
|
||||
- [Login.vue](file://frontend/src/views/Login.vue)
|
||||
- [auth.js](file://frontend/src/api/auth.js)
|
||||
- [department.js](file://frontend/src/api/department.js)
|
||||
- [menu.js](file://frontend/src/api/menu.js)
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向前端开发者,系统化阐述 Vue 3 应用的创建、初始化与配置流程,涵盖项目结构、依赖管理、Vite 构建与开发服务器配置、Element Plus 主题与国际化设置、全局样式引入、应用入口配置、插件注册与全局组件挂载等。同时提供开发环境搭建步骤、依赖安装命令、启动流程、常见配置问题解决方案以及性能优化建议。
|
||||
|
||||
## 项目结构
|
||||
前端项目位于 `frontend` 目录,采用典型的 Vue 3 + Vite 单页应用结构:
|
||||
- 根目录包含构建脚本、依赖声明与 Vite 配置
|
||||
- `src` 目录包含应用源代码:入口文件、路由、状态管理、API 层、视图组件与全局样式
|
||||
- `public` 目录用于存放静态资源
|
||||
- `dist` 目录为构建产物输出目录
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["frontend/"] --> B["package.json"]
|
||||
A --> C["vite.config.js"]
|
||||
A --> D["index.html"]
|
||||
A --> E["src/"]
|
||||
E --> F["main.js"]
|
||||
E --> G["App.vue"]
|
||||
E --> H["router/index.js"]
|
||||
E --> I["stores/"]
|
||||
E --> J["api/"]
|
||||
E --> K["views/"]
|
||||
E --> L["assets/main.scss"]
|
||||
A --> M["dist/"]
|
||||
A --> N["public/"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [index.html](file://frontend/index.html#L1-L14)
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [index.html](file://frontend/index.html#L1-L14)
|
||||
|
||||
## 核心组件
|
||||
本节聚焦于项目初始化的关键配置与组件,包括依赖管理、构建配置、应用入口、路由与状态管理、API 层与样式系统。
|
||||
|
||||
- 依赖管理与脚本
|
||||
- 生产依赖:Vue 3、Vue Router、Pinia、Axios、Element Plus、图标库、ECharts、Day.js
|
||||
- 开发依赖:@vitejs/plugin-vue、Vite、Sass
|
||||
- 脚本命令:dev、build、preview
|
||||
- Vite 配置
|
||||
- 插件:Vue 插件
|
||||
- 路径别名:@ 指向 src
|
||||
- 开发服务器:端口 5173,代理 /api 到后端 8000 端口
|
||||
- 应用入口与插件注册
|
||||
- 创建应用实例,注册 Pinia、路由、Element Plus(中文本地化)
|
||||
- 动态注册 Element Plus 图标组件
|
||||
- 引入全局样式 main.scss
|
||||
- 路由与导航
|
||||
- 基于 History 模式的路由,包含登录页与多级菜单路由
|
||||
- 路由守卫:设置页面标题、校验登录状态
|
||||
- 状态管理
|
||||
- Pinia Store:用户状态(token、用户信息)、应用状态(侧边栏折叠、科室树)
|
||||
- API 层
|
||||
- Axios 实例封装:统一 base URL、超时、请求/响应拦截器、错误处理
|
||||
- 认证、菜单、科室等 API 模块
|
||||
- 全局样式
|
||||
- SCSS 变量、布局容器、表格、搜索栏、统计卡片、状态标签、分数等级、图表容器等
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L6-L25)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L5-L21)
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
|
||||
## 架构概览
|
||||
前端采用“入口文件 -> 插件注册 -> 路由与状态管理 -> 视图组件 -> API 层 -> 全局样式”的线性架构,结合 Element Plus 提供 UI 能力与国际化支持。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用入口"
|
||||
M["main.js"]
|
||||
A["App.vue"]
|
||||
end
|
||||
subgraph "核心框架"
|
||||
R["Vue Router"]
|
||||
S["Pinia"]
|
||||
EP["Element Plus"]
|
||||
end
|
||||
subgraph "业务层"
|
||||
V["Views"]
|
||||
API["API Modules"]
|
||||
ST["Stores"]
|
||||
end
|
||||
subgraph "基础设施"
|
||||
VITE["Vite Dev Server"]
|
||||
CONF["vite.config.js"]
|
||||
PKG["package.json"]
|
||||
end
|
||||
M --> A
|
||||
M --> R
|
||||
M --> S
|
||||
M --> EP
|
||||
A --> V
|
||||
V --> API
|
||||
V --> ST
|
||||
API --> |"Axios"| API
|
||||
VITE --> CONF
|
||||
PKG --> VITE
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L1-L22)
|
||||
- [package.json](file://frontend/package.json#L1-L27)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 依赖管理与脚本
|
||||
- 生产依赖
|
||||
- Vue 3:核心框架
|
||||
- Vue Router:前端路由
|
||||
- Pinia:状态管理
|
||||
- Axios:HTTP 客户端
|
||||
- Element Plus:UI 组件库
|
||||
- @element-plus/icons-vue:图标库
|
||||
- ECharts:可视化图表
|
||||
- Day.js:日期时间处理
|
||||
- 开发依赖
|
||||
- @vitejs/plugin-vue:Vite 的 Vue 支持
|
||||
- Vite:构建工具与开发服务器
|
||||
- Sass:CSS 预处理器
|
||||
- 脚本命令
|
||||
- dev:启动开发服务器
|
||||
- build:构建生产包
|
||||
- preview:预览构建产物
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
### Vite 构建工具与开发服务器配置
|
||||
- 插件:启用 Vue 插件以支持单文件组件
|
||||
- 路径别名:@ 指向 src,便于导入
|
||||
- 开发服务器:
|
||||
- 端口:5173
|
||||
- 代理:将 /api 前缀转发至后端 8000 端口,解决跨域问题
|
||||
- 该配置确保开发时前后端联调顺畅
|
||||
|
||||
章节来源
|
||||
- [vite.config.js](file://frontend/vite.config.js#L5-L21)
|
||||
|
||||
### 应用入口文件与插件注册
|
||||
- 创建应用实例并挂载根组件
|
||||
- 插件注册顺序:
|
||||
- Pinia(状态管理)
|
||||
- Vue Router(路由)
|
||||
- Element Plus(UI 组件库,使用中文本地化)
|
||||
- 动态注册 Element Plus 图标组件,避免逐个手动注册
|
||||
- 引入全局样式 main.scss
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Browser as "浏览器"
|
||||
participant HTML as "index.html"
|
||||
participant Main as "main.js"
|
||||
participant App as "App.vue"
|
||||
participant Router as "router/index.js"
|
||||
participant Store as "stores/*"
|
||||
participant EP as "Element Plus"
|
||||
Browser->>HTML : 加载页面
|
||||
HTML->>Main : 执行入口脚本
|
||||
Main->>Main : 创建应用实例
|
||||
Main->>EP : 注册 Element Plus(中文)
|
||||
Main->>Main : 动态注册图标组件
|
||||
Main->>Store : 使用 Pinia
|
||||
Main->>Router : 使用 Vue Router
|
||||
Main->>App : 挂载根组件
|
||||
App-->>Browser : 渲染界面
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [index.html](file://frontend/index.html#L10-L11)
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
- [index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
|
||||
章节来源
|
||||
- [index.html](file://frontend/index.html#L1-L14)
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [App.vue](file://frontend/src/App.vue#L1-L17)
|
||||
|
||||
### Element Plus 主题配置与国际化
|
||||
- 国际化:通过 zh-cn.mjs 设置 Element Plus 语言为中文,并在根组件中使用 el-config-provider 包裹,确保全局组件显示中文
|
||||
- 样式:引入 element-plus/dist/index.css 以加载默认样式
|
||||
- 图标:动态注册 Element Plus 图标组件,减少手动注册工作量
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L3-L6)
|
||||
- [App.vue](file://frontend/src/App.vue#L2-L4)
|
||||
|
||||
### 全局样式引入与主题变量
|
||||
- 全局样式:在入口文件引入 main.scss,实现全局重置、字体、布局容器与通用组件样式
|
||||
- 主题变量:定义主色、状态色、文本色、边框色、背景色等 CSS 变量,便于统一主题风格
|
||||
- 组件级样式:表格、搜索栏、统计卡片、状态标签、分数等级、图表容器等样式集中维护
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L10-L10)
|
||||
- [main.scss](file://frontend/src/assets/main.scss#L14-L26)
|
||||
- [main.scss](file://frontend/src/assets/main.scss#L63-L186)
|
||||
|
||||
### 路由与导航
|
||||
- 路由结构:
|
||||
- 登录页:/login
|
||||
- 主布局:/,包含工作台、科室管理、员工管理、考核指标、指标模板、考核管理、工资核算、统计报表、经济核算、绩效计划、系统管理(菜单管理)等子路由
|
||||
- 路由守卫:
|
||||
- 设置页面标题
|
||||
- 校验 token,未登录跳转至登录页
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入路由"]) --> CheckPath["判断路径是否为 /login"]
|
||||
CheckPath --> |是| NextTrue["放行"]
|
||||
CheckPath --> |否| CheckToken["读取 localStorage 中的 token"]
|
||||
CheckToken --> HasToken{"是否存在 token?"}
|
||||
HasToken --> |是| NextTrue
|
||||
HasToken --> |否| Redirect["重定向到 /login"]
|
||||
NextTrue --> SetTitle["设置页面标题"]
|
||||
Redirect --> End(["结束"])
|
||||
SetTitle --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [index.js](file://frontend/src/router/index.js#L104-L113)
|
||||
|
||||
章节来源
|
||||
- [index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
|
||||
### 状态管理(Pinia)
|
||||
- 用户 Store(user.js)
|
||||
- 状态:token、userInfo
|
||||
- 方法:登录(调用认证 API,存储 token)、获取用户信息、登出(清除 token 并跳转登录)
|
||||
- 应用 Store(app.js)
|
||||
- 状态:collapsed(侧边栏折叠状态)、departmentTree(科室树)
|
||||
- 方法:切换侧边栏、加载科室树
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class UserStore {
|
||||
+string token
|
||||
+object userInfo
|
||||
+login(username, password) Promise~boolean~
|
||||
+getUserInfo() Promise~object|null~
|
||||
+logout() void
|
||||
}
|
||||
class AppStore {
|
||||
+boolean collapsed
|
||||
+array departmentTree
|
||||
+toggleSidebar() void
|
||||
+loadDepartmentTree() Promise~void~
|
||||
}
|
||||
class API {
|
||||
+login(data) Promise
|
||||
+getCurrentUser() Promise
|
||||
+getDepartmentTree(params) Promise
|
||||
}
|
||||
UserStore --> API : "使用"
|
||||
AppStore --> API : "使用"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [user.js](file://frontend/src/stores/user.js#L6-L47)
|
||||
- [app.js](file://frontend/src/stores/app.js#L5-L30)
|
||||
- [auth.js](file://frontend/src/api/auth.js#L4-L11)
|
||||
- [department.js](file://frontend/src/api/department.js#L9-L11)
|
||||
|
||||
章节来源
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [index.js](file://frontend/src/stores/index.js#L1-L3)
|
||||
|
||||
### API 层与拦截器
|
||||
- Axios 实例:
|
||||
- baseURL:/api/v1
|
||||
- timeout:30000ms
|
||||
- Content-Type:application/json
|
||||
- 请求拦截器:自动附加 Authorization 头(Bearer token)
|
||||
- 响应拦截器:统一处理业务错误码、HTTP 状态码错误(401、403、404、500 等),并进行消息提示与路由跳转
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant View as "视图组件"
|
||||
participant Store as "Pinia Store"
|
||||
participant API as "API 模块"
|
||||
participant Axios as "Axios 实例"
|
||||
participant Interceptor as "拦截器"
|
||||
participant Backend as "后端服务"
|
||||
View->>Store : 调用 Store 方法
|
||||
Store->>API : 发起 API 请求
|
||||
API->>Axios : request.post/get(...)
|
||||
Axios->>Interceptor : 进入请求拦截器
|
||||
Interceptor->>Axios : 添加 Authorization 头
|
||||
Axios->>Backend : 发送 HTTP 请求
|
||||
Backend-->>Axios : 返回响应
|
||||
Axios->>Interceptor : 进入响应拦截器
|
||||
Interceptor->>View : 统一错误处理与业务码校验
|
||||
Interceptor-->>View : 返回数据
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [request.js](file://frontend/src/api/request.js#L6-L12)
|
||||
- [request.js](file://frontend/src/api/request.js#L14-L26)
|
||||
- [request.js](file://frontend/src/api/request.js#L28-L63)
|
||||
- [auth.js](file://frontend/src/api/auth.js#L4-L11)
|
||||
|
||||
章节来源
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
- [menu.js](file://frontend/src/api/menu.js#L1-L37)
|
||||
|
||||
### 视图组件与布局
|
||||
- 登录页(Login.vue)
|
||||
- 表单验证、加载状态、错误提示
|
||||
- 调用用户 Store 登录,成功后跳转主页面
|
||||
- 主布局(Layout.vue)
|
||||
- 侧边栏菜单:根据后端返回的菜单树渲染,支持折叠
|
||||
- 顶部导航:面包屑、用户下拉菜单、退出登录
|
||||
- 内容区域:路由视图过渡动画
|
||||
|
||||
章节来源
|
||||
- [Login.vue](file://frontend/src/views/Login.vue#L1-L155)
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue#L1-L241)
|
||||
|
||||
## 依赖关系分析
|
||||
- 入口文件依赖:main.js 依赖 App.vue、router、stores、Element Plus、全局样式
|
||||
- 路由依赖:router/index.js 依赖视图组件与菜单 API
|
||||
- 状态管理依赖:stores 依赖 API 模块
|
||||
- API 依赖:API 模块依赖 Axios 实例
|
||||
- 样式依赖:全局样式被入口文件引入
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Main["main.js"] --> App["App.vue"]
|
||||
Main --> Router["router/index.js"]
|
||||
Main --> Stores["stores/*"]
|
||||
Main --> EP["Element Plus"]
|
||||
Main --> Styles["assets/main.scss"]
|
||||
Router --> Views["views/*"]
|
||||
Router --> MenuAPI["api/menu.js"]
|
||||
Stores --> AuthAPI["api/auth.js"]
|
||||
Stores --> DeptAPI["api/department.js"]
|
||||
Views --> AuthAPI
|
||||
Views --> MenuAPI
|
||||
Views --> DeptAPI
|
||||
AuthAPI --> Request["api/request.js"]
|
||||
MenuAPI --> Request
|
||||
DeptAPI --> Request
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [auth.js](file://frontend/src/api/auth.js#L1-L22)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
- [menu.js](file://frontend/src/api/menu.js#L1-L37)
|
||||
|
||||
章节来源
|
||||
- [main.js](file://frontend/src/main.js#L1-L24)
|
||||
- [index.js](file://frontend/src/router/index.js#L1-L116)
|
||||
- [app.js](file://frontend/src/stores/app.js#L1-L31)
|
||||
- [user.js](file://frontend/src/stores/user.js#L1-L49)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
## 性能考虑
|
||||
- 代码分割与懒加载
|
||||
- 路由组件采用动态导入,按需加载,减少首屏体积
|
||||
- 图标注册
|
||||
- 通过循环注册 Element Plus 图标,避免重复注册导致的包体膨胀
|
||||
- 样式组织
|
||||
- 全局样式集中管理,避免重复定义与样式冲突
|
||||
- 构建优化
|
||||
- 使用 Vite 的原生 ES 模块与快速热更新,提升开发体验
|
||||
- 网络请求
|
||||
- Axios 统一拦截器减少重复逻辑,提高可维护性
|
||||
|
||||
章节来源
|
||||
- [index.js](file://frontend/src/router/index.js#L7-L94)
|
||||
- [main.js](file://frontend/src/main.js#L14-L17)
|
||||
- [main.scss](file://frontend/src/assets/main.scss#L1-L186)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L5-L21)
|
||||
|
||||
## 故障排除指南
|
||||
- CORS 错误
|
||||
- 现象:浏览器控制台出现跨域错误
|
||||
- 原因:开发阶段未正确配置代理或后端未允许跨域
|
||||
- 解决:确认 Vite 代理配置与后端 CORS 设置一致
|
||||
- 404 Not Found
|
||||
- 现象:请求路径返回 404
|
||||
- 原因:Vite 代理未生效或后端路由不匹配
|
||||
- 解决:重启前端开发服务器;检查后端路由与版本
|
||||
- 500 Internal Server Error
|
||||
- 现象:后端服务异常
|
||||
- 原因:后端代码错误或数据库问题
|
||||
- 解决:查看后端日志目录,定位具体错误
|
||||
- Network Error
|
||||
- 现象:无法连接后端
|
||||
- 原因:后端服务未启动
|
||||
- 解决:启动后端服务后再进行联调
|
||||
- 登录失败
|
||||
- 检查点:后端健康检查、账号密码、Content-Type
|
||||
- 清理缓存与硬刷新
|
||||
- 清空浏览器缓存、localStorage,执行硬刷新
|
||||
- 快速重启服务
|
||||
- 停止 Python 进程,重启后端与前端
|
||||
|
||||
章节来源
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L1-L119)
|
||||
- [vite.config.js](file://frontend/vite.config.js#L14-L19)
|
||||
- [request.js](file://frontend/src/api/request.js#L39-L62)
|
||||
|
||||
## 结论
|
||||
本项目通过清晰的依赖管理、合理的 Vite 配置、完善的入口与插件注册、规范的路由与状态管理、统一的 API 封装以及全局样式体系,构建了一个可扩展、易维护的 Vue 3 前端应用。配合 Element Plus 的主题与国际化配置,能够快速实现企业级界面与交互体验。建议在后续迭代中持续关注代码分割、样式复用与错误处理的细节优化。
|
||||
|
||||
## 附录
|
||||
- 开发环境搭建步骤
|
||||
- 安装依赖:使用包管理器安装项目依赖
|
||||
- 启动后端:在后端目录启动服务(参考调试指南中的命令)
|
||||
- 启动前端:在前端目录执行开发服务器命令
|
||||
- 访问应用:打开浏览器访问开发服务器地址
|
||||
- 依赖安装命令
|
||||
- 安装生产与开发依赖
|
||||
- 启动流程
|
||||
- 启动后端服务
|
||||
- 启动前端开发服务器
|
||||
- 在浏览器中打开应用并登录
|
||||
|
||||
章节来源
|
||||
- [package.json](file://frontend/package.json#L6-L10)
|
||||
- [DEBUG_GUIDE.md](file://frontend/DEBUG_GUIDE.md#L81-L95)
|
||||
534
.qoder/repowiki/zh/content/后端开发指南/API路由实现/API路由实现.md
Normal file
534
.qoder/repowiki/zh/content/后端开发指南/API路由实现/API路由实现.md
Normal file
@@ -0,0 +1,534 @@
|
||||
# API路由实现
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py)
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向医院绩效系统后端API路由实现,系统采用FastAPI框架,提供RESTful风格的接口,涵盖认证、基础数据、考核、工资、统计、计划、菜单、模板、财务等模块。文档重点说明路由装饰器使用、路径参数与查询参数处理、请求验证、响应模型定义、错误处理机制、CORS配置、中间件使用、安全控制、API版本管理、文档生成与测试方法,并给出性能优化、限流策略与监控集成建议。
|
||||
|
||||
## 项目结构
|
||||
后端采用分层与功能模块化组织:
|
||||
- 应用入口与配置:main.py负责应用实例创建、CORS配置、路由注册、异常处理与健康检查
|
||||
- API版本:api/v1目录统一管理v1版本的所有路由模块
|
||||
- 核心模块:core目录包含配置、数据库连接、安全认证等基础设施
|
||||
- 数据模型与Schema:models与schemas定义数据库实体与API输入输出模型
|
||||
- 业务服务:services目录封装各模块业务逻辑
|
||||
- 前端对接:frontend目录提供前端界面与API调用示例
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["应用入口<br/>backend/app/main.py"] --> B["API路由器<br/>backend/app/api/v1/__init__.py"]
|
||||
B --> C["认证模块<br/>backend/app/api/v1/auth.py"]
|
||||
B --> D["基础数据模块<br/>departments/staff/indicators"]
|
||||
B --> E["考核模块<br/>backend/app/api/v1/assessments.py"]
|
||||
B --> F["工资模块<br/>backend/app/api/v1/salary.py"]
|
||||
B --> G["统计模块<br/>backend/app/api/v1/stats.py"]
|
||||
B --> H["财务模块<br/>backend/app/api/v1/finance.py"]
|
||||
B --> I["计划模块<br/>backend/app/api/v1/performance_plans.py"]
|
||||
B --> J["菜单模块<br/>backend/app/api/v1/menus.py"]
|
||||
K["配置模块<br/>backend/app/core/config.py"] --> A
|
||||
L["安全模块<br/>backend/app/core/security.py"] --> A
|
||||
M["Schema定义<br/>backend/app/schemas/schemas.py"] --> C
|
||||
M --> D
|
||||
M --> E
|
||||
M --> F
|
||||
M --> G
|
||||
M --> H
|
||||
M --> I
|
||||
M --> J
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
|
||||
## 核心组件
|
||||
- 应用实例与中间件
|
||||
- 使用FastAPI构造应用,配置标题、版本、描述与OpenAPI文档路径
|
||||
- 注册CORS中间件,允许跨域请求
|
||||
- 注册API路由器,统一前缀为配置中的API_PREFIX
|
||||
- 定义健康检查端点
|
||||
- 注册全局异常处理器,记录日志并抛出异常
|
||||
- 配置管理
|
||||
- 通过Settings类集中管理应用名、版本、数据库连接、JWT密钥、CORS白名单、分页参数等
|
||||
- 使用lru_cache缓存配置实例
|
||||
- 安全认证
|
||||
- 基于JWT的OAuth2密码流,支持密码哈希、令牌签发与解析
|
||||
- 提供当前用户、激活用户、管理员、经理权限校验依赖
|
||||
- Schema定义
|
||||
- 统一响应模型ResponseBase与分页模型PaginatedResponse
|
||||
- 定义枚举类型(科室类型、员工状态、考核状态、指标类型、财务类型等)
|
||||
- 为各模块定义输入输出模型,确保请求验证与响应格式标准化
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L19-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L21-L110)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L743)
|
||||
|
||||
## 架构概览
|
||||
系统采用分层架构:路由层(FastAPI装饰器与依赖注入)、服务层(业务逻辑封装)、数据层(SQLAlchemy异步ORM)。路由层负责参数解析、权限校验与响应包装;服务层负责领域逻辑;数据层负责持久化。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "路由层"
|
||||
R1["认证路由<br/>auth.py"]
|
||||
R2["基础数据路由<br/>departments/staff/indicators.py"]
|
||||
R3["考核路由<br/>assessments.py"]
|
||||
R4["工资路由<br/>salary.py"]
|
||||
R5["统计路由<br/>stats.py"]
|
||||
R6["财务路由<br/>finance.py"]
|
||||
R7["计划路由<br/>performance_plans.py"]
|
||||
R8["菜单路由<br/>menus.py"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
S1["认证服务"]
|
||||
S2["部门服务"]
|
||||
S3["员工服务"]
|
||||
S4["指标服务"]
|
||||
S5["考核服务"]
|
||||
S6["工资服务"]
|
||||
S7["统计服务"]
|
||||
S8["财务服务"]
|
||||
S9["计划服务"]
|
||||
S10["菜单服务"]
|
||||
end
|
||||
subgraph "数据层"
|
||||
D1["数据库会话<br/>AsyncSession"]
|
||||
D2["模型定义<br/>models/*.py"]
|
||||
end
|
||||
R1 --> S1 --> D1
|
||||
R2 --> S2 --> D1
|
||||
R3 --> S5 --> D1
|
||||
R4 --> S6 --> D1
|
||||
R5 --> S7 --> D1
|
||||
R6 --> S8 --> D1
|
||||
R7 --> S9 --> D1
|
||||
R8 --> S10 --> D1
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L14-L74)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L17-L108)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L17-L124)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L17-L142)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L17-L166)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L17-L156)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L14-L242)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L18-L217)
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L18-L310)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L14-L164)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 认证模块(auth)
|
||||
- 路由装饰器使用
|
||||
- 使用APIRouter装饰器定义路由前缀与标签
|
||||
- 使用Depends注入数据库会话与安全依赖
|
||||
- 路径与查询参数
|
||||
- 登录接口使用OAuth2PasswordRequestForm自动解析表单参数
|
||||
- 注册接口接收JSON体参数UserCreate
|
||||
- 请求验证与响应模型
|
||||
- 使用Pydantic模型进行请求体验证
|
||||
- 响应模型Token与UserResponse
|
||||
- 错误处理
|
||||
- 用户名或密码错误返回401
|
||||
- 账户禁用返回403
|
||||
- 用户名重复返回400
|
||||
- 安全控制
|
||||
- 密码使用bcrypt哈希存储
|
||||
- JWT令牌包含过期时间,默认8小时
|
||||
- 当前用户依赖get_current_active_user保证用户激活状态
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant Auth as "认证路由"
|
||||
participant Security as "安全模块"
|
||||
participant DB as "数据库"
|
||||
Client->>Auth : POST /api/v1/auth/login
|
||||
Auth->>DB : 查询用户
|
||||
DB-->>Auth : 用户对象
|
||||
Auth->>Security : 验证密码
|
||||
Security-->>Auth : 验证结果
|
||||
Auth->>Security : 创建访问令牌
|
||||
Security-->>Auth : 令牌
|
||||
Auth-->>Client : {access_token, token_type}
|
||||
Note over Client,Security : 登录成功后使用Bearer令牌访问受保护资源
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L43)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L14-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L21-L110)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L315-L345)
|
||||
|
||||
### 基础数据模块(departments, staff, indicators)
|
||||
- 路由装饰器与依赖
|
||||
- 使用Depends(get_current_active_user)确保用户登录
|
||||
- 部门、员工、指标管理使用get_current_manager_user限制为管理员或经理
|
||||
- 查询参数处理
|
||||
- 列表接口统一支持dept_type/status/is_active/keyword/page/page_size等查询参数
|
||||
- 树形结构接口支持dept_type过滤
|
||||
- 响应模型
|
||||
- 使用DepartmentResponse、StaffResponse、IndicatorResponse等模型
|
||||
- 列表接口返回统一的分页响应结构
|
||||
- 错误处理
|
||||
- 资源不存在返回404
|
||||
- 编码重复返回400
|
||||
- 删除失败返回400
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["请求进入"]) --> Parse["解析查询参数<br/>dept_type/status/is_active/keyword/page/page_size"]
|
||||
Parse --> Filter["服务层查询<br/>按条件过滤"]
|
||||
Filter --> BuildResp["构建响应模型<br/>DepartmentResponse/StaffResponse/IndicatorResponse"]
|
||||
BuildResp --> PageWrap["分页包装<br/>统一响应结构"]
|
||||
PageWrap --> End(["返回响应"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L40)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L49)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L17-L108)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L17-L124)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L17-L142)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L64-L192)
|
||||
|
||||
### 考核模块(assessments)
|
||||
- 功能特性
|
||||
- 支持创建、更新、提交、审核、确认考核记录
|
||||
- 支持批量创建考核
|
||||
- 明细包含指标ID、实际值、得分、佐证材料与备注
|
||||
- 路由装饰器与权限
|
||||
- 多数操作使用get_current_active_user
|
||||
- 审核与确认使用get_current_manager_user
|
||||
- 查询参数
|
||||
- 支持按员工、科室、年度、月份、状态筛选
|
||||
- 流程控制
|
||||
- 提交、审核、确认按状态机流转,非法状态返回400
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 已提交 : "提交"
|
||||
已提交 --> 已审核 : "审核通过"
|
||||
已提交 --> 已驳回 : "审核驳回"
|
||||
已审核 --> 已确认 : "确认"
|
||||
已确认 --> [*]
|
||||
已驳回 --> [*]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L31-L37)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L17-L166)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L194-L270)
|
||||
|
||||
### 工资模块(salary)
|
||||
- 功能特性
|
||||
- 支持创建、更新、确认工资记录
|
||||
- 支持根据考核生成工资、批量生成与批量确认
|
||||
- 路由装饰器与权限
|
||||
- 生成与确认使用get_current_manager_user
|
||||
- 查询参数
|
||||
- 支持按员工、科室、年度、月份、状态筛选
|
||||
- 业务逻辑
|
||||
- 生成工资时需存在已确认的考核记录且无重复工资记录
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant Salary as "工资路由"
|
||||
participant Service as "工资服务"
|
||||
participant DB as "数据库"
|
||||
Client->>Salary : POST /api/v1/salary/generate
|
||||
Salary->>Service : generate_from_assessment(staff_id, year, month)
|
||||
Service->>DB : 查询已确认考核
|
||||
DB-->>Service : 考核记录
|
||||
Service->>DB : 创建工资记录
|
||||
DB-->>Service : 工资记录
|
||||
Service-->>Salary : 工资记录
|
||||
Salary-->>Client : {code, message, data{id}}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L110)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L17-L156)
|
||||
|
||||
### 统计模块(stats)
|
||||
- 功能特性
|
||||
- BSC维度分析、科室绩效统计、趋势分析、周期统计、仪表盘指标、预警数据、排名、指标完成度
|
||||
- 查询参数
|
||||
- 年度、月份、科室ID、返回数量等
|
||||
- 数据处理
|
||||
- 对查询结果进行聚合计算(如平均分、总数等)
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Q["接收查询参数<br/>department_id/year/month/limit"] --> Calc["调用统计服务"]
|
||||
Calc --> Agg["聚合计算<br/>平均分/总数/排名"]
|
||||
Agg --> Resp["构建响应<br/>统一结构"]
|
||||
Resp --> Done["返回数据"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L125)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L14-L242)
|
||||
|
||||
### 财务模块(finance)
|
||||
- 功能特性
|
||||
- 收入、支出、收支结余查询,按类别统计,财务汇总,类别枚举获取
|
||||
- 支持创建、更新、删除财务记录
|
||||
- 路由装饰器与权限
|
||||
- 创建、更新、删除使用get_current_manager_user
|
||||
- 类别校验
|
||||
- 根据财务类型(收入/支出)校验类别是否有效
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["创建财务记录"]) --> Type["判断财务类型"]
|
||||
Type --> Rev{"收入?"}
|
||||
Rev --> |是| CheckRev["校验收入类别"]
|
||||
Rev --> |否| CheckExp["校验支出类别"]
|
||||
CheckRev --> Valid{"类别有效?"}
|
||||
CheckExp --> Valid
|
||||
Valid --> |否| Err["返回400"]
|
||||
Valid --> |是| Create["创建记录"]
|
||||
Create --> Done["返回成功"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L157-L187)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L18-L217)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L376-L460)
|
||||
|
||||
### 计划模块(performance_plans)
|
||||
- 功能特性
|
||||
- 绩效计划的CRUD、提交、审批、激活、树形结构、统计信息、指标关联管理
|
||||
- 路由装饰器与权限
|
||||
- 多数操作使用get_current_active_user
|
||||
- 审批与激活使用get_current_manager_user
|
||||
- 数据结构
|
||||
- 计划与指标关联模型支持权重、评分方法、目标值等
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class PerformancePlan {
|
||||
+int id
|
||||
+string plan_name
|
||||
+string plan_code
|
||||
+string plan_level
|
||||
+int plan_year
|
||||
+int plan_month
|
||||
+string status
|
||||
+int department_id
|
||||
+int staff_id
|
||||
+string description
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class PlanKpiRelation {
|
||||
+int id
|
||||
+int plan_id
|
||||
+int indicator_id
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+float weight
|
||||
+string scoring_method
|
||||
+string scoring_params
|
||||
+string remark
|
||||
}
|
||||
PerformancePlan "1" o-- "0..*" PlanKpiRelation : "包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L519-L570)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L481-L570)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L18-L310)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L461-L580)
|
||||
|
||||
### 菜单模块(menus)
|
||||
- 功能特性
|
||||
- 菜单树形结构、列表、详情、创建、更新、删除、初始化默认菜单
|
||||
- 路由装饰器与权限
|
||||
- 创建、更新、删除、初始化使用get_current_manager_user
|
||||
- 树形结构
|
||||
- 支持仅返回可见菜单
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L14-L164)
|
||||
|
||||
## 依赖关系分析
|
||||
- 路由到服务
|
||||
- 各路由模块通过Depends注入数据库会话,调用对应服务层方法
|
||||
- 服务层封装业务逻辑,避免路由层直接操作数据库
|
||||
- 服务到模型
|
||||
- 服务层使用SQLAlchemy异步会话执行查询与事务
|
||||
- 模型定义在models目录,Schema在schemas目录,二者分离职责
|
||||
- 安全依赖链
|
||||
- get_current_user -> decode_token -> 数据库查询用户
|
||||
- get_current_active_user -> 检查用户激活状态
|
||||
- get_current_admin_user / get_current_manager_user -> 检查角色
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Route["路由模块"] --> Service["服务模块"]
|
||||
Service --> Model["模型定义"]
|
||||
Route --> Security["安全依赖"]
|
||||
Security --> DB["数据库会话"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L55-L82)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
|
||||
## 性能考虑
|
||||
- 连接池配置
|
||||
- 数据库连接池大小与溢出配置在配置模块中集中管理,建议根据并发与硬件资源调整
|
||||
- 异步IO
|
||||
- 使用SQLAlchemy 2.0异步会话,提升高并发下的吞吐能力
|
||||
- 分页与查询优化
|
||||
- 列表接口统一分页参数,避免一次性加载大量数据
|
||||
- 查询参数尽量使用索引字段(如部门ID、状态等)
|
||||
- 缓存策略
|
||||
- 配置模块使用LRU缓存缓存Settings实例,减少重复解析环境变量
|
||||
- 响应模型序列化
|
||||
- 使用Pydantic模型的model_validate/model_dump,减少手动转换开销
|
||||
|
||||
[本节为通用性能指导,不涉及具体文件分析]
|
||||
|
||||
## 故障排除指南
|
||||
- 认证相关
|
||||
- 401未授权:检查Bearer令牌是否正确传递与未过期
|
||||
- 403禁止访问:检查用户角色与权限依赖
|
||||
- 资源不存在
|
||||
- 404:确认ID是否存在,路径参数是否正确
|
||||
- 参数验证错误
|
||||
- 422:检查请求体字段类型与长度约束
|
||||
- 数据冲突
|
||||
- 400:如用户名重复、编码重复、删除失败等,根据提示修正
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L37)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L74-L77)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L100-L102)
|
||||
|
||||
## 结论
|
||||
本系统通过清晰的模块划分、严格的请求验证与响应模型、完善的权限控制与异常处理,实现了稳定可靠的API路由层。结合异步数据库与分页策略,具备良好的扩展性与性能表现。建议在生产环境中进一步完善限流、监控与日志策略,确保系统在高并发场景下的稳定性。
|
||||
|
||||
## 附录
|
||||
|
||||
### RESTful设计原则
|
||||
- 资源命名:使用名词复数形式(如/departments、/staff、/indicators)
|
||||
- 路径参数:唯一标识资源(如/{dept_id})
|
||||
- 查询参数:过滤与分页(如?page&page_size)
|
||||
- 状态码:遵循HTTP语义(200、201、400、401、403、404、422、500)
|
||||
- 响应格式:统一使用包含code、message、data的结构
|
||||
|
||||
### HTTP状态码使用
|
||||
- 200:成功获取或更新
|
||||
- 201:成功创建
|
||||
- 400:客户端参数错误或业务逻辑错误
|
||||
- 401:未认证
|
||||
- 403:权限不足
|
||||
- 404:资源不存在
|
||||
- 422:请求体验证失败
|
||||
- 500:服务器内部错误
|
||||
|
||||
### API版本管理
|
||||
- 版本前缀:/api/v1
|
||||
- 文档路径:/api/v1/docs、/api/v1/redoc、/api/v1/openapi.json
|
||||
- 配置集中:settings.API_PREFIX统一管理
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L19-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L16-L16)
|
||||
|
||||
### 文档生成与测试
|
||||
- 文档生成:FastAPI自动生成OpenAPI规范与交互式文档
|
||||
- 测试方法:建议使用pytest与HTTP客户端对各模块进行单元测试与集成测试
|
||||
|
||||
[本节为通用指导,不涉及具体文件分析]
|
||||
|
||||
### CORS配置与中间件
|
||||
- CORS中间件:允许跨域请求,支持凭证、通配符方法与头
|
||||
- 中间件注册:在应用创建时添加至FastAPI实例
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L28-L29)
|
||||
|
||||
### 安全控制
|
||||
- JWT令牌:使用SECRET_KEY与ALGORITHM签名,ACCESS_TOKEN_EXPIRE_MINUTES控制有效期
|
||||
- 密码哈希:bcrypt确保密码安全存储
|
||||
- 权限依赖:多级权限校验,确保敏感操作仅管理员或经理可执行
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L110)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
|
||||
### 性能优化与限流策略
|
||||
- 连接池:合理配置pool_size与max_overflow
|
||||
- 异步查询:利用异步会话减少阻塞
|
||||
- 缓存:对热点配置与查询结果进行缓存
|
||||
- 限流:建议引入速率限制中间件(如基于IP或令牌的限流)
|
||||
- 监控:集成APM工具(如Prometheus + Grafana)监控QPS、延迟与错误率
|
||||
|
||||
[本节为通用指导,不涉及具体文件分析]
|
||||
438
.qoder/repowiki/zh/content/后端开发指南/API路由实现/基础数据接口.md
Normal file
438
.qoder/repowiki/zh/content/后端开发指南/API路由实现/基础数据接口.md
Normal file
@@ -0,0 +1,438 @@
|
||||
# 基础数据接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js)
|
||||
- [frontend/src/api/staff.js](file://frontend/src/api/staff.js)
|
||||
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文件面向基础数据接口的详细文档,涵盖以下模块:
|
||||
- 科室管理:支持树形结构的增删改查、层级关系维护与权限控制
|
||||
- 员工管理:支持员工信息的CRUD、按科室检索与状态管理
|
||||
- 考核指标管理:支持指标分类、权重设置、计算公式与模板导入
|
||||
- 工资相关接口:支持工资记录的CRUD、批量生成与确认、业务规则校验
|
||||
|
||||
文档同时说明RESTful设计原则、统一响应格式、分页查询、条件筛选、排序规则、数据导入导出与批量操作的实现思路,以及错误处理策略。
|
||||
|
||||
## 项目结构
|
||||
后端采用FastAPI + SQLAlchemy 2.0 + 异步数据库访问,遵循分层架构:
|
||||
- API层:定义路由与请求参数校验
|
||||
- 服务层:封装业务逻辑与数据访问
|
||||
- 模型层:定义数据库实体与关系
|
||||
- 模式层:定义Pydantic数据结构用于序列化与校验
|
||||
- 前端层:通过Axios封装的API调用
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_Dep["department.js"]
|
||||
FE_Staff["staff.js"]
|
||||
FE_Ind["indicator.js"]
|
||||
FE_Sal["salary.js"]
|
||||
end
|
||||
subgraph "后端"
|
||||
API_Dep["departments.py"]
|
||||
API_Staff["staff.py"]
|
||||
API_Ind["indicators.py"]
|
||||
API_Sal["salary.py"]
|
||||
SVC_Dep["department_service.py"]
|
||||
SVC_Staff["staff_service.py"]
|
||||
SVC_Ind["indicator_service.py"]
|
||||
SVC_Sal["salary_service.py"]
|
||||
MODELS["models.py"]
|
||||
SCHEMAS["schemas.py"]
|
||||
MAIN["main.py"]
|
||||
end
|
||||
FE_Dep --> API_Dep
|
||||
FE_Staff --> API_Staff
|
||||
FE_Ind --> API_Ind
|
||||
FE_Sal --> API_Sal
|
||||
API_Dep --> SVC_Dep
|
||||
API_Staff --> SVC_Staff
|
||||
API_Ind --> SVC_Ind
|
||||
API_Sal --> SVC_Sal
|
||||
SVC_Dep --> MODELS
|
||||
SVC_Staff --> MODELS
|
||||
SVC_Ind --> MODELS
|
||||
SVC_Sal --> MODELS
|
||||
API_Dep --> SCHEMAS
|
||||
API_Staff --> SCHEMAS
|
||||
API_Ind --> SCHEMAS
|
||||
API_Sal --> SCHEMAS
|
||||
MAIN --> API_Dep
|
||||
MAIN --> API_Staff
|
||||
MAIN --> API_Ind
|
||||
MAIN --> API_Sal
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
|
||||
## 核心组件
|
||||
- API路由层:定义RESTful端点,负责参数解析、权限校验与统一响应包装
|
||||
- 服务层:封装业务逻辑,处理数据访问、复杂查询与事务控制
|
||||
- 模型层:定义实体关系、索引与约束,支撑树形结构与多对多关系
|
||||
- 模式层:定义输入输出结构,确保前后端数据一致性与校验
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L17-L108)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L17-L124)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L17-L142)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L17-L156)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L13-L150)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L13-L197)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L231)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L311)
|
||||
|
||||
## 架构概览
|
||||
系统采用分层架构,API层仅负责协议转换与权限控制,服务层承担业务规则,模型层承载数据结构与约束。统一响应格式包含状态码、消息、数据体、分页信息;异常通过全局处理器记录并抛出。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "API路由"
|
||||
participant Service as "服务层"
|
||||
participant DB as "数据库"
|
||||
Client->>API : "HTTP请求"
|
||||
API->>API : "参数校验/权限检查"
|
||||
API->>Service : "调用业务逻辑"
|
||||
Service->>DB : "SQLAlchemy查询/写入"
|
||||
DB-->>Service : "返回结果"
|
||||
Service-->>API : "业务结果"
|
||||
API-->>Client : "统一响应格式"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L40)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L49)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L20-L51)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L43)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L49)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L46)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L20-L58)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 科室管理接口
|
||||
- 功能范围
|
||||
- 列表查询:支持按类型、启用状态过滤,分页与排序
|
||||
- 树形结构:按层级与排序生成树形结构,便于前端渲染
|
||||
- 单条查询:按ID获取详情
|
||||
- 新增/更新/删除:新增时自动计算层级,删除前检查是否存在子节点
|
||||
- 权限控制:新增、更新、删除需管理员或经理权限
|
||||
|
||||
- 数据模型与关系
|
||||
- Department实体支持自引用父-子关系,维护level与sort_order
|
||||
- 通过索引优化dept_type与parent_id查询
|
||||
|
||||
- 统一响应与分页
|
||||
- 响应包含code、message、data、total、page、page_size
|
||||
- 列表默认按sort_order与id排序
|
||||
|
||||
- 错误处理
|
||||
- 未找到资源返回404
|
||||
- 删除失败(存在子节点)返回400
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Department {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+DeptType dept_type
|
||||
+int parent_id
|
||||
+int level
|
||||
+int sort_order
|
||||
+bool is_active
|
||||
+string description
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+Department parent
|
||||
+Staff[] staff
|
||||
}
|
||||
class DepartmentService {
|
||||
+get_list(...)
|
||||
+get_tree(...)
|
||||
+get_by_id(...)
|
||||
+get_by_code(...)
|
||||
+create(...)
|
||||
+update(...)
|
||||
+delete(...)
|
||||
}
|
||||
DepartmentService --> Department : "读写"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L13-L150)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L108)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L150)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L64-L103)
|
||||
|
||||
### 员工管理接口
|
||||
- 功能范围
|
||||
- 列表查询:支持按科室、状态、关键词(姓名/工号)过滤,分页与排序
|
||||
- 单条查询:按ID获取详情,附加科室名称
|
||||
- 新增/更新/删除:新增前检查工号唯一性
|
||||
- 科室员工查询:按科室ID获取在职员工列表
|
||||
|
||||
- 数据模型与关系
|
||||
- Staff与Department为多对一关系,支持按状态与部门ID高效查询
|
||||
- 提供索引优化department_id与status字段
|
||||
|
||||
- 统一响应与分页
|
||||
- 响应包含code、message、data、total、page、page_size
|
||||
- 列表默认按id倒序
|
||||
|
||||
- 错误处理
|
||||
- 未找到资源返回404
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Staff {
|
||||
+int id
|
||||
+string employee_id
|
||||
+string name
|
||||
+int department_id
|
||||
+string position
|
||||
+string title
|
||||
+string phone
|
||||
+string email
|
||||
+float base_salary
|
||||
+float performance_ratio
|
||||
+StaffStatus status
|
||||
+datetime hire_date
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+Department department
|
||||
+Assessment[] assessments
|
||||
+SalaryRecord[] salary_records
|
||||
}
|
||||
class StaffService {
|
||||
+get_list(...)
|
||||
+get_by_id(...)
|
||||
+get_by_employee_id(...)
|
||||
+create(...)
|
||||
+update(...)
|
||||
+delete(...)
|
||||
+get_by_department(...)
|
||||
}
|
||||
StaffService --> Staff : "读写"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
|
||||
### 考核指标管理接口
|
||||
- 功能范围
|
||||
- 列表查询:支持按指标类型、BSC维度、启用状态过滤,分页与排序
|
||||
- 启用指标查询:获取全部启用的指标
|
||||
- 单条查询:按ID获取详情
|
||||
- 新增/更新/删除:新增前检查指标编码唯一性
|
||||
- 模板管理:提供模板列表与导入能力,支持覆盖策略
|
||||
|
||||
- 数据模型与关系
|
||||
- Indicator实体包含指标类型、BSC维度、权重、最高分值、目标值与单位、计算方法、适用科室类型等
|
||||
- 提供索引优化indicator_type字段与权重约束
|
||||
|
||||
- 统一响应与分页
|
||||
- 响应包含code、message、data、total、page、page_size
|
||||
- 列表默认按indicator_type与id排序
|
||||
|
||||
- 模板导入流程
|
||||
- 按模板dept_type批量导入指标,支持覆盖已有指标
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始导入"]) --> LoadTemplate["加载模板数据"]
|
||||
LoadTemplate --> Iterate["遍历指标项"]
|
||||
Iterate --> Exists{"指标已存在?"}
|
||||
Exists --> |是且覆盖| Update["更新现有指标"]
|
||||
Exists --> |是不覆盖| Skip["跳过该指标"]
|
||||
Exists --> |否| Create["创建新指标"]
|
||||
Update --> Next["下一个指标"]
|
||||
Skip --> Next
|
||||
Create --> Next
|
||||
Next --> Done(["完成导入"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L106-L154)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L142)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L197)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L153-L192)
|
||||
|
||||
### 工资核算管理接口
|
||||
- 功能范围
|
||||
- 列表查询:支持按员工、科室、年度、月份、状态过滤,分页与排序
|
||||
- 单条查询:按ID获取详情,附加员工与科室名称
|
||||
- 新增/更新:创建时计算总工资,更新时重新计算总工资
|
||||
- 生成工资:根据已确认的考核记录生成工资记录
|
||||
- 批量生成:按科室批量生成工资记录
|
||||
- 确认工资:单条与批量确认,状态变更
|
||||
|
||||
- 业务规则
|
||||
- 工资 = 基本工资 + 绩效奖金 + 补贴 - 扣款
|
||||
- 绩效奖金 = 固定基数 × (绩效得分/100) × 员工绩效系数
|
||||
- 仅允许对“待确认”状态进行更新与确认
|
||||
|
||||
- 统一响应与分页
|
||||
- 响应包含code、message、data、total、page、page_size
|
||||
- 列表默认按年度、月份、id倒序
|
||||
|
||||
- 批量操作
|
||||
- 批量生成与批量确认均支持按科室过滤
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "salary.py"
|
||||
participant Service as "salary_service.py"
|
||||
participant DB as "数据库"
|
||||
Client->>API : "POST /salary/generate?staff_id=&period_year=&period_month="
|
||||
API->>Service : "generate_from_assessment(...)"
|
||||
Service->>DB : "查询员工与已确认考核记录"
|
||||
DB-->>Service : "返回员工与考核记录"
|
||||
Service->>Service : "计算绩效奖金与总工资"
|
||||
Service->>DB : "插入工资记录"
|
||||
DB-->>Service : "返回新记录"
|
||||
Service-->>API : "返回记录ID"
|
||||
API-->>Client : "统一响应"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L111)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L20-L260)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L274-L311)
|
||||
|
||||
## 依赖分析
|
||||
- API层依赖服务层与安全中间件,统一响应包装
|
||||
- 服务层依赖模型层进行数据持久化
|
||||
- 模式层为API与服务层提供数据契约
|
||||
- 前端通过Axios封装的API与后端交互
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE_Dep["frontend/src/api/department.js"] --> API_Dep["backend/app/api/v1/departments.py"]
|
||||
FE_Staff["frontend/src/api/staff.js"] --> API_Staff["backend/app/api/v1/staff.py"]
|
||||
FE_Ind["frontend/src/api/indicator.js"] --> API_Ind["backend/app/api/v1/indicators.py"]
|
||||
FE_Sal["frontend/src/api/salary.js"] --> API_Sal["backend/app/api/v1/salary.py"]
|
||||
API_Dep --> SVC_Dep["backend/app/services/department_service.py"]
|
||||
API_Staff --> SVC_Staff["backend/app/services/staff_service.py"]
|
||||
API_Ind --> SVC_Ind["backend/app/services/indicator_service.py"]
|
||||
API_Sal --> SVC_Sal["backend/app/services/salary_service.py"]
|
||||
SVC_Dep --> MODELS["backend/app/models/models.py"]
|
||||
SVC_Staff --> MODELS
|
||||
SVC_Ind --> MODELS
|
||||
SVC_Sal --> MODELS
|
||||
API_Dep --> SCHEMAS["backend/app/schemas/schemas.py"]
|
||||
API_Staff --> SCHEMAS
|
||||
API_Ind --> SCHEMAS
|
||||
API_Sal --> SCHEMAS
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
- [frontend/src/api/staff.js](file://frontend/src/api/staff.js#L1-L32)
|
||||
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 使用索引:科室类型、父节点ID、员工部门ID、状态、指标类型、考核记录周期、工资记录周期等
|
||||
- 分页查询:限制每页最大数量,避免一次性返回大量数据
|
||||
- 关联预加载:使用selectinload减少N+1查询
|
||||
- 事务与并发
|
||||
- 服务层方法内部保持事务一致性,避免脏读与丢失更新
|
||||
- 缓存与异步
|
||||
- 当前实现为同步处理,如需高并发场景可引入缓存与异步任务队列
|
||||
|
||||
## 故障排除指南
|
||||
- 常见错误
|
||||
- 404:资源不存在(科室、员工、指标、工资记录)
|
||||
- 400:业务规则不满足(删除存在子节点的科室、重复编码、状态不允许更新/确认)
|
||||
- 日志与异常
|
||||
- 全局异常处理器记录HTTP异常与验证异常,便于定位问题
|
||||
- 排查步骤
|
||||
- 检查请求参数与权限头
|
||||
- 查看服务层日志与数据库事务状态
|
||||
- 确认业务规则(如状态机、唯一性约束)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L62-L107)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L60-L108)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L78-L111)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L92-L142)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
|
||||
|
||||
## 结论
|
||||
本系统通过清晰的分层架构与统一的数据契约,实现了基础数据管理的核心能力。科室管理支持树形结构与层级维护,员工管理提供灵活的查询与状态管理,指标管理具备模板导入与权重配置能力,工资管理覆盖从生成到确认的完整流程。建议后续在高并发场景引入缓存与异步处理,并持续完善数据校验与审计日志。
|
||||
598
.qoder/repowiki/zh/content/后端开发指南/API路由实现/工资财务接口.md
Normal file
598
.qoder/repowiki/zh/content/后端开发指南/API路由实现/工资财务接口.md
Normal file
@@ -0,0 +1,598 @@
|
||||
# 工资财务接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [finance.py](file://backend/app/api/v1/finance.py)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [security.py](file://backend/app/core/security.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本项目是一个基于FastAPI的医院绩效管理系统,专注于工资财务接口的实现。系统提供了完整的工资核算、奖金计算和财务统计功能,包括:
|
||||
|
||||
- **工资核算管理**:支持单个和批量工资记录的生成、审核和发放
|
||||
- **奖金计算算法**:基于绩效得分和系数的科学计算模型
|
||||
- **财务统计分析**:科室收支统计、趋势分析和报表生成
|
||||
- **税务计算和社保扣款**:精确的工资计算和扣除机制
|
||||
- **数据安全和审计**:完善的权限控制和操作日志
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统采用典型的三层架构设计,主要分为以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
Frontend[前端界面]
|
||||
API[API路由层]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
SalaryService[工资服务层]
|
||||
FinanceService[财务服务层]
|
||||
StatsService[统计服务层]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
SalaryModel[工资模型]
|
||||
FinanceModel[财务模型]
|
||||
UserModel[用户模型]
|
||||
end
|
||||
subgraph "基础设施"
|
||||
Database[(PostgreSQL数据库)]
|
||||
Security[安全认证]
|
||||
Logging[日志系统]
|
||||
end
|
||||
Frontend --> API
|
||||
API --> SalaryService
|
||||
API --> FinanceService
|
||||
API --> StatsService
|
||||
SalaryService --> SalaryModel
|
||||
FinanceService --> FinanceModel
|
||||
StatsService --> UserModel
|
||||
SalaryModel --> Database
|
||||
FinanceModel --> Database
|
||||
UserModel --> Database
|
||||
API --> Security
|
||||
SalaryService --> Logging
|
||||
FinanceService --> Logging
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [finance.py](file://backend/app/api/v1/finance.py#L1-L217)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L1-L368)
|
||||
|
||||
**章节来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [finance.py](file://backend/app/api/v1/finance.py#L1-L217)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L1-L368)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 工资核算组件
|
||||
|
||||
系统实现了完整的工资核算生命周期管理:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿 : 创建工资记录
|
||||
草稿 --> 待确认 : 生成工资记录
|
||||
待确认 --> 已确认 : 确认工资
|
||||
已确认 --> 已发放 : 发放工资
|
||||
已发放 --> [*]
|
||||
待确认 --> 草稿 : 更新记录
|
||||
草稿 --> 待确认 : 重新生成
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L221-L260)
|
||||
|
||||
### 财务统计组件
|
||||
|
||||
财务统计系统提供多维度的数据分析能力:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "数据源"
|
||||
Assessments[考核数据]
|
||||
Staff[员工数据]
|
||||
Departments[科室数据]
|
||||
end
|
||||
subgraph "统计维度"
|
||||
BSC[BSC维度分析]
|
||||
Trends[趋势分析]
|
||||
Rankings[绩效排名]
|
||||
Completion[指标完成度]
|
||||
end
|
||||
subgraph "输出结果"
|
||||
Reports[统计报表]
|
||||
Dashboards[数据看板]
|
||||
end
|
||||
Assessments --> BSC
|
||||
Staff --> Trends
|
||||
Departments --> Rankings
|
||||
Assessments --> Completion
|
||||
BSC --> Reports
|
||||
Trends --> Dashboards
|
||||
Rankings --> Reports
|
||||
Completion --> Dashboards
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L300)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L17-L242)
|
||||
|
||||
**章节来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L17-L368)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用RESTful API设计,遵循HTTP协议的最佳实践:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API网关
|
||||
participant Service as 业务服务层
|
||||
participant Model as 数据模型层
|
||||
participant DB as 数据库
|
||||
Client->>API : HTTP请求
|
||||
API->>Service : 路由分发
|
||||
Service->>Model : 数据验证和转换
|
||||
Model->>DB : 数据查询/更新
|
||||
DB-->>Model : 查询结果
|
||||
Model-->>Service : 业务对象
|
||||
Service-->>API : 业务结果
|
||||
API-->>Client : JSON响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
- [finance.py](file://backend/app/api/v1/finance.py#L21-L217)
|
||||
|
||||
### 权限控制架构
|
||||
|
||||
系统实现了多层次的权限控制机制:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "用户角色"
|
||||
Guest[访客]
|
||||
Staff[普通员工]
|
||||
Manager[科室经理]
|
||||
Admin[系统管理员]
|
||||
end
|
||||
subgraph "权限级别"
|
||||
Read[读取权限]
|
||||
Write[写入权限]
|
||||
Approve[审批权限]
|
||||
AdminAccess[管理权限]
|
||||
end
|
||||
Guest --> Read
|
||||
Staff --> Read
|
||||
Manager --> Write
|
||||
Manager --> Approve
|
||||
Admin --> AdminAccess
|
||||
Read --> 薪资查询
|
||||
Write --> 薪资创建
|
||||
Approve --> 薪资确认
|
||||
AdminAccess --> 系统管理
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [security.py](file://backend/app/core/security.py#L85-L110)
|
||||
|
||||
**章节来源**
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 工资核算服务
|
||||
|
||||
#### 绩效奖金计算算法
|
||||
|
||||
系统采用科学的绩效奖金计算模型:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始计算]) --> GetScore["获取绩效得分"]
|
||||
GetScore --> GetRatio["获取绩效系数"]
|
||||
GetRatio --> CalcBonus["计算奖金 = 基数 × (得分/100) × 系数"]
|
||||
CalcBonus --> CalcTotal["计算总工资 = 基本工资 + 奖金 + 津贴 - 扣款"]
|
||||
CalcTotal --> CreateRecord["创建工资记录"]
|
||||
CreateRecord --> End([结束])
|
||||
CalcBonus --> CheckRange{"奖金范围检查"}
|
||||
CheckRange --> |超出范围| Adjust["调整奖金"]
|
||||
CheckRange --> |正常范围| Continue["继续计算"]
|
||||
Adjust --> Continue
|
||||
Continue --> CalcTotal
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L167-L170)
|
||||
|
||||
#### 工资记录生成流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant HR as 人力资源
|
||||
participant API as 工资API
|
||||
participant Service as 工资服务
|
||||
participant DB as 数据库
|
||||
participant Payroll as 工资系统
|
||||
HR->>API : 请求生成工资
|
||||
API->>Service : generate_from_assessment()
|
||||
Service->>DB : 查询员工信息
|
||||
DB-->>Service : 员工数据
|
||||
Service->>DB : 查询考核记录
|
||||
DB-->>Service : 考核数据
|
||||
Service->>Service : 计算绩效奖金
|
||||
Service->>DB : 创建工资记录
|
||||
DB-->>Service : 记录ID
|
||||
Service-->>API : 工资记录
|
||||
API-->>HR : 生成结果
|
||||
HR->>Payroll : 提交工资发放
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L96-L110)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
|
||||
**章节来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L71-L190)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L96-L110)
|
||||
|
||||
### 财务核算服务
|
||||
|
||||
#### 收支统计分析
|
||||
|
||||
系统提供全面的财务统计功能:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class FinanceService {
|
||||
+get_department_revenue() List[Dict]
|
||||
+get_department_expense() List[Dict]
|
||||
+get_department_balance() Dict
|
||||
+get_revenue_by_category() List[Dict]
|
||||
+get_expense_by_category() List[Dict]
|
||||
+get_department_summary() List[Dict]
|
||||
+create_finance_record() DepartmentFinance
|
||||
}
|
||||
class DepartmentFinance {
|
||||
+int id
|
||||
+int department_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+FinanceType finance_type
|
||||
+str category
|
||||
+float amount
|
||||
+str source
|
||||
+str remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class RevenueCategory {
|
||||
<<enumeration>>
|
||||
EXAMINATION
|
||||
LAB_TEST
|
||||
RADIOLOGY
|
||||
BED
|
||||
NURSING
|
||||
TREATMENT
|
||||
SURGERY
|
||||
INJECTION
|
||||
OXYGEN
|
||||
OTHER
|
||||
}
|
||||
class ExpenseCategory {
|
||||
<<enumeration>>
|
||||
MATERIAL
|
||||
PERSONNEL
|
||||
MAINTENANCE
|
||||
UTILITY
|
||||
OTHER
|
||||
}
|
||||
FinanceService --> DepartmentFinance : creates
|
||||
DepartmentFinance --> RevenueCategory : uses
|
||||
DepartmentFinance --> ExpenseCategory : uses
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L17-L368)
|
||||
- [finance.py](file://backend/app/models/finance.py#L16-L79)
|
||||
|
||||
#### 财务报表生成
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
GetData["获取财务数据"] --> GroupByMonth["按月分组"]
|
||||
GroupByMonth --> SumAmount["计算金额汇总"]
|
||||
SumAmount --> CalcBalance["计算收支结余"]
|
||||
CalcBalance --> GenerateReport["生成报表"]
|
||||
GenerateReport --> ExportData["导出数据"]
|
||||
GetData --> FilterByDept["按科室过滤"]
|
||||
FilterByDept --> GroupByCategory["按类别分组"]
|
||||
GroupByCategory --> SumCategory["类别金额汇总"]
|
||||
SumCategory --> GenerateChart["生成图表"]
|
||||
GenerateChart --> ExportChart["导出图表"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L143-L198)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L200-L272)
|
||||
|
||||
**章节来源**
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L43-L368)
|
||||
- [finance.py](file://backend/app/models/finance.py#L16-L79)
|
||||
|
||||
### 统计分析组件
|
||||
|
||||
#### BSC维度分析
|
||||
|
||||
系统支持平衡计分卡四个维度的综合分析:
|
||||
|
||||
| 维度 | 描述 | 关键指标 | 分析方法 |
|
||||
|------|------|----------|----------|
|
||||
| 财务维度 | 医院财务状况 | 收入增长率、成本控制率 | 趋势分析、对比分析 |
|
||||
| 客户维度 | 患者满意度 | 满意度评分、投诉率 | 排名分析、分布分析 |
|
||||
| 内部流程维度 | 医疗服务质量 | 治愈率、并发症率 | 进度跟踪、效率分析 |
|
||||
| 学习成长维度 | 员工发展能力 | 培训完成率、技能提升 | 能力评估、发展轨迹 |
|
||||
|
||||
**章节来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L17-L33)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统采用模块化设计,各组件间依赖关系清晰:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API层"
|
||||
SalaryAPI[工资API]
|
||||
FinanceAPI[财务API]
|
||||
StatsAPI[统计API]
|
||||
end
|
||||
subgraph "服务层"
|
||||
SalaryService[工资服务]
|
||||
FinanceService[财务服务]
|
||||
StatsService[统计服务]
|
||||
end
|
||||
subgraph "模型层"
|
||||
SalaryModel[工资模型]
|
||||
FinanceModel[财务模型]
|
||||
UserModel[用户模型]
|
||||
end
|
||||
subgraph "工具层"
|
||||
Security[安全模块]
|
||||
Logger[日志模块]
|
||||
Config[配置模块]
|
||||
end
|
||||
SalaryAPI --> SalaryService
|
||||
FinanceAPI --> FinanceService
|
||||
StatsAPI --> StatsService
|
||||
SalaryService --> SalaryModel
|
||||
FinanceService --> FinanceModel
|
||||
StatsService --> UserModel
|
||||
SalaryAPI --> Security
|
||||
FinanceAPI --> Security
|
||||
StatsAPI --> Security
|
||||
SalaryService --> Logger
|
||||
FinanceService --> Logger
|
||||
StatsService --> Logger
|
||||
SalaryAPI --> Config
|
||||
FinanceAPI --> Config
|
||||
StatsAPI --> Config
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [finance.py](file://backend/app/api/v1/finance.py#L1-L217)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
|
||||
### 数据模型关系
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
float base_salary
|
||||
float performance_ratio
|
||||
enum status
|
||||
date hire_date
|
||||
}
|
||||
ASSESSMENTS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
float total_score
|
||||
float weighted_score
|
||||
enum status
|
||||
date submit_time
|
||||
date review_time
|
||||
}
|
||||
SALARY_RECORDS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
float base_salary
|
||||
float performance_score
|
||||
float performance_bonus
|
||||
float deduction
|
||||
float allowance
|
||||
float total_salary
|
||||
string status
|
||||
text remark
|
||||
}
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
boolean is_active
|
||||
}
|
||||
STAFF ||--o{ ASSESSMENTS : has
|
||||
DEPARTMENTS ||--o{ STAFF : contains
|
||||
STAFF ||--o{ SALARY_RECORDS : generates
|
||||
ASSESSMENTS ||--o{ SALARY_RECORDS : influences
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L231)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L231)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L272-L311)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化策略
|
||||
|
||||
1. **索引优化**
|
||||
- 工资记录表:按员工ID和年月组合索引
|
||||
- 财务记录表:按科室、年月、类型、类别的复合索引
|
||||
- 考核记录表:按状态、年月的快速查询索引
|
||||
|
||||
2. **查询优化**
|
||||
- 使用selectinload进行关联查询优化
|
||||
- 分页查询避免大数据集一次性加载
|
||||
- 缓存常用配置和枚举数据
|
||||
|
||||
3. **连接池管理**
|
||||
- 数据库连接池大小:20个连接
|
||||
- 最大溢出连接:10个连接
|
||||
- 连接超时时间:30秒
|
||||
|
||||
### 缓存策略
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "缓存层次"
|
||||
Redis[Redis缓存]
|
||||
Memory[内存缓存]
|
||||
Database[数据库缓存]
|
||||
end
|
||||
subgraph "缓存策略"
|
||||
ConfigCache[配置缓存]
|
||||
EnumCache[枚举缓存]
|
||||
UserCache[用户信息缓存]
|
||||
ReportCache[报表缓存]
|
||||
end
|
||||
ConfigCache --> Redis
|
||||
EnumCache --> Redis
|
||||
UserCache --> Memory
|
||||
ReportCache --> Database
|
||||
```
|
||||
|
||||
### 异步处理
|
||||
|
||||
系统采用异步编程模式提高并发处理能力:
|
||||
|
||||
- **异步数据库操作**:使用SQLAlchemy异步引擎
|
||||
- **异步文件处理**:报表导出采用流式处理
|
||||
- **异步任务队列**:支持批量工资处理和报表生成
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见错误类型
|
||||
|
||||
| 错误类型 | 状态码 | 描述 | 解决方案 |
|
||||
|----------|--------|------|----------|
|
||||
| 权限不足 | 403 | 用户权限不够 | 检查用户角色和权限配置 |
|
||||
| 数据不存在 | 404 | 请求资源不存在 | 验证ID和数据完整性 |
|
||||
| 参数错误 | 422 | 请求参数格式错误 | 检查请求体和查询参数 |
|
||||
| 服务器错误 | 500 | 服务器内部错误 | 查看日志文件和数据库连接 |
|
||||
|
||||
### 日志分析
|
||||
|
||||
系统提供多级别的日志记录:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "日志级别"
|
||||
Debug[调试日志]
|
||||
Info[信息日志]
|
||||
Warning[警告日志]
|
||||
Error[错误日志]
|
||||
Critical[严重错误]
|
||||
end
|
||||
subgraph "日志文件"
|
||||
AppLog[应用日志]
|
||||
ErrorLog[错误日志]
|
||||
AccessLog[访问日志]
|
||||
end
|
||||
Debug --> AppLog
|
||||
Info --> AppLog
|
||||
Warning --> ErrorLog
|
||||
Error --> ErrorLog
|
||||
Critical --> ErrorLog
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
|
||||
### 性能监控
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Monitor[监控系统] --> Metrics[性能指标]
|
||||
Metrics --> ResponseTime[响应时间]
|
||||
Metrics --> Throughput[吞吐量]
|
||||
Metrics --> ErrorRate[错误率]
|
||||
Metrics --> ResourceUsage[资源使用]
|
||||
ResponseTime --> Alert[告警通知]
|
||||
Throughput --> Alert
|
||||
ErrorRate --> Alert
|
||||
ResourceUsage --> Alert
|
||||
Alert --> Action[自动处理]
|
||||
Action --> Recovery[系统恢复]
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
|
||||
## 结论
|
||||
|
||||
本工资财务接口系统提供了完整的医院绩效管理解决方案,具有以下特点:
|
||||
|
||||
1. **功能完整**:涵盖工资核算、奖金计算、财务统计的全流程管理
|
||||
2. **算法科学**:基于绩效得分和系数的精确计算模型
|
||||
3. **扩展性强**:模块化设计支持功能扩展和定制
|
||||
4. **安全可靠**:完善的权限控制和审计机制
|
||||
5. **性能优异**:异步处理和数据库优化确保高并发性能
|
||||
|
||||
系统通过标准化的API接口和清晰的业务逻辑,为医院的绩效管理和财务核算提供了强有力的技术支撑。未来可以进一步集成税务计算、社保扣款等高级功能,满足更复杂的业务需求。
|
||||
411
.qoder/repowiki/zh/content/后端开发指南/API路由实现/系统管理接口.md
Normal file
411
.qoder/repowiki/zh/content/后端开发指南/API路由实现/系统管理接口.md
Normal file
@@ -0,0 +1,411 @@
|
||||
# 系统管理接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py)
|
||||
- [template_service.py](file://backend/app/services/template_service.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [security.py](file://backend/app/core/security.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [main.py](file://backend/app/main.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py)
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向系统管理接口,围绕绩效计划管理、菜单权限和模板管理三大核心领域,系统化梳理后端API实现、数据模型、服务层逻辑与安全控制机制。文档同时覆盖系统配置的动态管理、角色权限控制、菜单树结构、模板版本与继承、系统初始化与数据迁移、配置备份、日志审计与安全监控,以及性能监控、资源管理与故障恢复策略。
|
||||
|
||||
## 项目结构
|
||||
后端采用FastAPI + SQLAlchemy 2.0 + 异步数据库的现代架构,按功能域划分API路由、服务层与数据模型,配合Alembic进行数据库版本管理,支持系统初始化脚本与模板数据注入。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用入口"
|
||||
MAIN["app/main.py"]
|
||||
CONFIG["app/core/config.py"]
|
||||
LOGCFG["app/core/logging_config.py"]
|
||||
end
|
||||
subgraph "API层"
|
||||
PERF_API["app/api/v1/performance_plans.py"]
|
||||
MENU_API["app/api/v1/menus.py"]
|
||||
TPL_API["app/api/v1/templates.py"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
PERF_SRV["app/services/performance_plan_service.py"]
|
||||
MENU_SRV["app/services/menu_service.py"]
|
||||
TPL_SRV["app/services/template_service.py"]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
SEC["app/core/security.py"]
|
||||
DB["app/core/database.py"]
|
||||
end
|
||||
subgraph "数据模型与迁移"
|
||||
MODELS["app/models/models.py"]
|
||||
ALEMBIC1["backend/alembic/versions/001_initial.py"]
|
||||
ALEMBIC2["backend/alembic/versions/002_template.py"]
|
||||
end
|
||||
MAIN --> PERF_API
|
||||
MAIN --> MENU_API
|
||||
MAIN --> TPL_API
|
||||
PERF_API --> PERF_SRV
|
||||
MENU_API --> MENU_SRV
|
||||
TPL_API --> TPL_SRV
|
||||
PERF_SRV --> MODELS
|
||||
MENU_SRV --> MODELS
|
||||
TPL_SRV --> MODELS
|
||||
PERF_API --> SEC
|
||||
MENU_API --> SEC
|
||||
TPL_API --> SEC
|
||||
PERF_API --> DB
|
||||
MENU_API --> DB
|
||||
TPL_API --> DB
|
||||
CONFIG --> MAIN
|
||||
LOGCFG --> MAIN
|
||||
ALEMBIC1 --> MODELS
|
||||
ALEMBIC2 --> MODELS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [main.py](file://backend/app/main.py#L15-L77)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
|
||||
**章节来源**
|
||||
- [main.py](file://backend/app/main.py#L15-L77)
|
||||
- [config.py](file://backend/app/core/config.py#L9-L47)
|
||||
|
||||
## 核心组件
|
||||
- 绩效计划管理API:提供计划的CRUD、状态流转、指标关联、树形结构与统计查询。
|
||||
- 菜单管理API:提供菜单树、列表、详情、创建/更新/删除与默认菜单初始化。
|
||||
- 指标模板管理API:提供模板与模板指标的CRUD、批量导入、维度与类型枚举。
|
||||
- 服务层:封装业务逻辑,统一处理状态机、关联关系与查询优化。
|
||||
- 数据模型:定义实体、枚举与索引,支撑多维考核与组织结构。
|
||||
- 安全与配置:JWT认证、权限校验、数据库连接与日志配置。
|
||||
|
||||
**章节来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L18-L310)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L14-L164)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L19-L272)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L15-L342)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L12-L137)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 架构概览
|
||||
系统采用分层架构:API层负责请求解析与响应封装;服务层承载业务规则与状态机;模型层定义数据结构与约束;核心模块提供安全、数据库与配置能力。API层通过依赖注入获取数据库会话与当前用户,确保权限控制与事务一致性。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "API控制器"
|
||||
participant Service as "服务层"
|
||||
participant Model as "数据模型"
|
||||
participant DB as "数据库"
|
||||
Client->>API : 发起请求(携带JWT)
|
||||
API->>API : 依赖注入(get_db, get_current_active_user)
|
||||
API->>Service : 调用业务方法(带参数)
|
||||
Service->>DB : 查询/更新(ORM操作)
|
||||
DB-->>Service : 返回结果
|
||||
Service-->>API : 业务结果
|
||||
API-->>Client : 统一响应格式
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L31)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L17-L22)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L22-L29)
|
||||
- [security.py](file://backend/app/core/security.py#L55-L82)
|
||||
- [database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 绩效计划管理
|
||||
- 功能范围:计划列表、树形结构、统计、详情、创建、更新、提交、审批、激活、删除、指标关联增删改。
|
||||
- 状态机:草稿 → 待审批 → 已批准 → 执行中 → 已完成/已取消;拒绝后可重新提交。
|
||||
- 关键点:指标关联支持目标值、权重、评分方法与参数;支持父子计划形成树形层级。
|
||||
- 权限控制:提交、审批、激活、删除等操作需管理员或经理权限。
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 待审批 : "提交"
|
||||
待审批 --> 已批准 : "审批通过"
|
||||
待审批 --> 已驳回 : "审批驳回"
|
||||
已批准 --> 执行中 : "激活"
|
||||
执行中 --> 已完成 : "完成"
|
||||
执行中 --> 已取消 : "取消"
|
||||
已驳回 --> 草稿 : "重新提交"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L233-L242)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
|
||||
|
||||
**章节来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L18-L342)
|
||||
- [models.py](file://backend/app/models/models.py#L270-L339)
|
||||
|
||||
### 菜单权限管理
|
||||
- 功能范围:菜单树、列表、详情、创建、更新、删除、默认菜单初始化。
|
||||
- 树形结构:支持父子关系与可见性过滤;支持按钮级权限标识。
|
||||
- 权限控制:创建/更新/删除/初始化默认菜单需管理员或经理权限。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["获取菜单树"]) --> Query["查询根节点(父ID为空)"]
|
||||
Query --> Filter["按可见性/启用过滤"]
|
||||
Filter --> Order["按排序与ID排序"]
|
||||
Order --> Build["递归构建树结构(children)"]
|
||||
Build --> End(["返回树形结构"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L101-L109)
|
||||
|
||||
**章节来源**
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L17-L164)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L16-L137)
|
||||
- [models.py](file://backend/app/models/models.py#L347-L372)
|
||||
|
||||
### 指标模板管理
|
||||
- 功能范围:模板列表、详情、类型与维度枚举、创建、更新、删除;模板指标的增删改与批量导入。
|
||||
- 版本与继承:模板具备版本号与激活状态;模板指标支持分类、权重、排序与评分参数。
|
||||
- 初始化:提供脚本批量注入标准模板与指标数据,支持维度权重与评估周期配置。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class IndicatorTemplate {
|
||||
+template_code
|
||||
+template_name
|
||||
+template_type
|
||||
+dimension_weights
|
||||
+assessment_cycle
|
||||
+is_active
|
||||
+created_at
|
||||
+updated_at
|
||||
}
|
||||
class TemplateIndicator {
|
||||
+template_id
|
||||
+indicator_id
|
||||
+category
|
||||
+weight
|
||||
+sort_order
|
||||
+scoring_method
|
||||
+scoring_params
|
||||
+remark
|
||||
}
|
||||
class Indicator {
|
||||
+code
|
||||
+name
|
||||
+indicator_type
|
||||
+bs_dimension
|
||||
+weight
|
||||
+max_score
|
||||
+calculation_method
|
||||
+assessment_method
|
||||
+is_veto
|
||||
}
|
||||
IndicatorTemplate "1" o-- "*" TemplateIndicator : "包含"
|
||||
Indicator "1" o-- "*" TemplateIndicator : "被引用"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L437)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L22-L272)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L23-L293)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L81-L186)
|
||||
|
||||
### 数据模型与枚举
|
||||
- 组织与人员:Department、Staff、User,支持层级与状态管理。
|
||||
- 考核与工资:Assessment、AssessmentDetail、SalaryRecord,支持周期与状态。
|
||||
- 计划与指标:PerformancePlan、PlanKpiRelation,支持层级与父子关系。
|
||||
- 菜单与模板:Menu、IndicatorTemplate、TemplateIndicator,支持树形与关联。
|
||||
- 枚举:科室类型、指标类型、状态、计划层级与菜单类型等。
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L10-L743)
|
||||
|
||||
### 安全与权限控制
|
||||
- JWT认证:OAuth2密码模式,支持令牌签发、解码与用户解析。
|
||||
- 权限校验:当前用户、激活用户、管理员、管理员或经理。
|
||||
- 依赖注入:API层通过Depends获取数据库会话与当前用户,确保每个请求的安全上下文。
|
||||
|
||||
**章节来源**
|
||||
- [security.py](file://backend/app/core/security.py#L18-L110)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L8-L16)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L8-L12)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L8-L17)
|
||||
|
||||
### 系统配置与数据库
|
||||
- 配置中心:应用名、版本、API前缀、数据库URL、JWT密钥与过期时间、跨域白名单、分页参数。
|
||||
- 数据库:异步引擎与会话工厂,自动事务提交/回滚与关闭。
|
||||
- 迁移:初始版本创建核心表,模板版本增加指标模板与关联表,并扩展指标字段。
|
||||
|
||||
**章节来源**
|
||||
- [config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
## 依赖分析
|
||||
- API层依赖服务层与安全模块,通过依赖注入获取数据库会话与当前用户。
|
||||
- 服务层依赖数据模型与SQLAlchemy ORM,封装查询、状态机与事务。
|
||||
- 数据模型定义实体关系与索引,支撑高效查询与数据完整性。
|
||||
- 迁移脚本定义数据库演进路径,确保版本一致与数据安全。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
PERF_API["performance_plans.py"] --> PERF_SRV["performance_plan_service.py"]
|
||||
MENU_API["menus.py"] --> MENU_SRV["menu_service.py"]
|
||||
TPL_API["templates.py"] --> TPL_SRV["template_service.py"]
|
||||
PERF_SRV --> MODELS["models.py"]
|
||||
MENU_SRV --> MODELS
|
||||
TPL_SRV --> MODELS
|
||||
PERF_API --> SEC["security.py"]
|
||||
MENU_API --> SEC
|
||||
TPL_API --> SEC
|
||||
PERF_API --> DB["database.py"]
|
||||
MENU_API --> DB
|
||||
TPL_API --> DB
|
||||
ALEMBIC1["001_initial.py"] --> MODELS
|
||||
ALEMBIC2["002_template.py"] --> MODELS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L10-L16)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L9-L12)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L9-L17)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L7-L12)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L5-L9)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L6-L13)
|
||||
- [models.py](file://backend/app/models/models.py#L6-L13)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
**章节来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L10-L16)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L9-L12)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L9-L17)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L7-L12)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L5-L9)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L6-L13)
|
||||
|
||||
## 性能考虑
|
||||
- 异步数据库:使用异步引擎与会话,提升高并发下的IO吞吐。
|
||||
- 查询优化:服务层使用selectinload预加载关联,减少N+1查询;索引覆盖常用查询字段。
|
||||
- 分页与限制:API层对分页参数进行范围校验,避免过大页大小影响性能。
|
||||
- 缓存策略:建议在热点读取场景引入Redis缓存(如菜单树、模板列表),降低数据库压力。
|
||||
- 连接池:合理配置数据库连接池大小与溢出,避免连接争用。
|
||||
|
||||
[本节为通用指导,无需特定文件引用]
|
||||
|
||||
## 故障排查指南
|
||||
- 日志系统:应用日志与错误日志分离,按日期轮转,便于定位问题。
|
||||
- 异常处理:全局异常捕获与记录,HTTP异常与参数校验异常分别处理。
|
||||
- 数据一致性:服务层事务提交/回滚,确保状态变更原子性。
|
||||
- 权限问题:确认JWT令牌有效、用户状态正常、角色满足要求。
|
||||
- 数据迁移:检查Alembic版本与数据库一致,必要时执行升级/降级。
|
||||
|
||||
**章节来源**
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py#L17-L64)
|
||||
- [main.py](file://backend/app/main.py#L58-L75)
|
||||
- [database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 结论
|
||||
本系统管理接口围绕绩效计划、菜单权限与模板管理构建了完整的API体系,配合严谨的数据模型、服务层状态机与安全控制,实现了可配置、可扩展、可审计的医院绩效管理体系。通过完善的初始化与迁移机制、日志与异常处理、以及性能与故障恢复策略,系统具备良好的稳定性与可维护性。
|
||||
|
||||
[本节为总结,无需特定文件引用]
|
||||
|
||||
## 附录
|
||||
|
||||
### API端点速览
|
||||
- 绩效计划
|
||||
- GET /plans:获取计划列表
|
||||
- GET /plans/tree:获取计划树
|
||||
- GET /plans/stats:获取计划统计
|
||||
- GET /plans/{plan_id}:获取计划详情
|
||||
- POST /plans:创建计划
|
||||
- PUT /plans/{plan_id}:更新计划
|
||||
- POST /plans/{plan_id}/submit:提交计划
|
||||
- POST /plans/{plan_id}/approve:审批计划
|
||||
- POST /plans/{plan_id}/activate:激活计划
|
||||
- DELETE /plans/{plan_id}:删除计划
|
||||
- POST /plans/{plan_id}/kpi-relations:添加指标关联
|
||||
- PUT /plans/kpi-relations/{relation_id}:更新指标关联
|
||||
- DELETE /plans/kpi-relations/{relation_id}:删除指标关联
|
||||
|
||||
- 菜单管理
|
||||
- GET /menus/tree:获取菜单树
|
||||
- GET /menus:获取菜单列表
|
||||
- GET /menus/{menu_id}:获取菜单详情
|
||||
- POST /menus:创建菜单
|
||||
- PUT /menus/{menu_id}:更新菜单
|
||||
- DELETE /menus/{menu_id}:删除菜单
|
||||
- POST /menus/init:初始化默认菜单
|
||||
|
||||
- 指标模板
|
||||
- GET /templates:获取模板列表
|
||||
- GET /templates/types:获取模板类型列表
|
||||
- GET /templates/dimensions:获取BSC维度列表
|
||||
- GET /templates/{template_id}:获取模板详情
|
||||
- POST /templates:创建模板
|
||||
- PUT /templates/{template_id}:更新模板
|
||||
- DELETE /templates/{template_id}:删除模板
|
||||
- GET /templates/{template_id}/indicators:获取模板指标列表
|
||||
- POST /templates/{template_id}/indicators:添加模板指标
|
||||
- PUT /templates/{template_id}/indicators/{indicator_id}:更新模板指标
|
||||
- DELETE /templates/{template_id}/indicators/{indicator_id}:移除模板指标
|
||||
- POST /templates/{template_id}/indicators/batch:批量添加模板指标
|
||||
|
||||
**章节来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L310)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L17-L164)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L22-L272)
|
||||
|
||||
### 系统初始化与数据迁移
|
||||
- 初始版本:创建科室、员工、指标、考核、工资、用户等核心表。
|
||||
- 模板版本:新增指标模板与模板指标关联表,并扩展指标字段。
|
||||
- 初始化脚本:批量创建标准模板与指标,支持维度权重与评估周期配置。
|
||||
|
||||
**章节来源**
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L189-L272)
|
||||
388
.qoder/repowiki/zh/content/后端开发指南/API路由实现/统计报表接口.md
Normal file
388
.qoder/repowiki/zh/content/后端开发指南/API路由实现/统计报表接口.md
Normal file
@@ -0,0 +1,388 @@
|
||||
# 统计报表接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/api/__init__.py](file://backend/app/api/__init__.py)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件详细说明医院绩效管理系统的统计报表接口,涵盖BSC维度分析、绩效统计、趋势分析、预警数据、周期统计、关键指标仪表盘、收支趋势、科室绩效排名、个人绩效统计与对比分析等功能。文档重点阐述多维度数据聚合、图表数据生成、报表格式化、实时数据更新、缓存策略、性能优化、统计数据准确性保证、数据源管理与ETL流程、自定义报表、数据导出与可视化集成、统计口径说明、数据质量控制与异常检测机制。
|
||||
|
||||
## 项目结构
|
||||
后端采用FastAPI + SQLAlchemy 2.0 + PostgreSQL + 异步IO架构,统计报表接口位于API路由层,业务逻辑封装在服务层,数据模型定义在ORM层,配置与数据库连接在核心模块中。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
Frontend[前端应用]
|
||||
end
|
||||
subgraph "应用层"
|
||||
API_Router[API路由层<br/>stats.py]
|
||||
Main_App[主应用入口<br/>main.py]
|
||||
end
|
||||
subgraph "服务层"
|
||||
Stats_Service[统计服务层<br/>stats_service.py]
|
||||
end
|
||||
subgraph "数据层"
|
||||
Models[数据模型<br/>models.py]
|
||||
Schemas[数据模式<br/>schemas.py]
|
||||
Database[数据库连接<br/>database.py]
|
||||
Config[系统配置<br/>config.py]
|
||||
end
|
||||
Frontend --> API_Router
|
||||
API_Router --> Stats_Service
|
||||
Stats_Service --> Models
|
||||
Stats_Service --> Database
|
||||
API_Router --> Main_App
|
||||
Main_App --> Config
|
||||
Database --> Config
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 核心组件
|
||||
- API路由层:提供REST接口,负责请求参数解析、鉴权与响应包装。
|
||||
- 服务层:实现统计逻辑,包括BSC维度分析、科室/个人绩效统计、趋势分析、指标完成度等。
|
||||
- 数据模型层:定义科室、员工、指标、考核、明细、工资等实体及其关系。
|
||||
- 数据模式层:定义Pydantic模型用于序列化/反序列化与API响应。
|
||||
- 核心模块:配置系统参数、数据库连接与中间件。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L14-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L231)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L347-L375)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
|
||||
## 架构概览
|
||||
统计报表接口遵循分层架构,API路由层仅负责输入输出与鉴权,服务层封装复杂查询与聚合逻辑,数据模型层提供ORM映射,核心模块提供配置与数据库连接。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "统计API路由<br/>stats.py"
|
||||
participant Service as "统计服务<br/>stats_service.py"
|
||||
participant DB as "数据库引擎<br/>database.py"
|
||||
participant Model as "数据模型<br/>models.py"
|
||||
Client->>API : GET /api/v1/stats/bsc-dimension
|
||||
API->>Service : get_bsc_dimension_stats(...)
|
||||
Service->>DB : 异步SQL查询
|
||||
DB->>Model : ORM映射
|
||||
Model-->>DB : 查询结果
|
||||
DB-->>Service : 结果集
|
||||
Service-->>API : 聚合后的统计结果
|
||||
API-->>Client : JSON响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L33)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L197)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### BSC维度分析
|
||||
- 功能:按财务、客户、内部流程、学习与成长四个维度统计得分、权重与指标数量,并计算平均分。
|
||||
- 查询条件:支持按年度、月份、科室过滤,仅统计已确认的考核记录。
|
||||
- 聚合逻辑:按维度分组,计算加权总分、总权重、指标数量与平均分。
|
||||
- 输出格式:包含维度详情与统计周期。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> BuildConditions["构建查询条件<br/>状态=FINALIZED<br/>可选: 年度/月份/科室"]
|
||||
BuildConditions --> QueryGroup["按维度分组查询<br/>SUM(得分*权重)/SUM(权重)"]
|
||||
QueryGroup --> Aggregate["聚合维度统计<br/>得分/权重/指标数/平均分"]
|
||||
Aggregate --> FormatOutput["格式化输出<br/>包含周期信息"]
|
||||
FormatOutput --> End(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L33)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
|
||||
### 科室绩效统计
|
||||
- 功能:获取各科室的绩效统计,包括员工人数、总分、平均分、最高/最低分、员工列表。
|
||||
- 聚合逻辑:按科室汇总,计算平均分并按平均分降序排列。
|
||||
- 输出格式:包含科室基本信息与员工明细。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> FilterFinalized["过滤已确认考核记录"]
|
||||
FilterFinalized --> JoinTables["连接科室/员工/考核表"]
|
||||
JoinTables --> GroupByDept["按科室分组聚合"]
|
||||
GroupByDept --> CalcStats["计算员工数/总分/最高/最低分"]
|
||||
CalcStats --> AvgScore["计算平均分"]
|
||||
AvgScore --> Sort["按平均分降序排序"]
|
||||
Sort --> Format["格式化输出"]
|
||||
Format --> End(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L36-L49)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
|
||||
|
||||
### 趋势分析
|
||||
- 功能:按月度统计平均分与加权平均分,支持指定最近N个月或按年份范围查询。
|
||||
- 时间处理:跨年处理,确保月份范围正确。
|
||||
- 输出格式:包含月份与对应的平均分。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> SetPeriod["设置统计周期<br/>默认当前年份"]
|
||||
SetPeriod --> MonthRange["计算最近N个月范围"]
|
||||
MonthRange --> CrossYear{"是否跨年?"}
|
||||
CrossYear --> |是| YearConditions["年份条件: 上一年>=起始月<br/>当年<=当前月"]
|
||||
CrossYear --> |否| SameYear["年份条件: 当年且起止范围内"]
|
||||
YearConditions --> QueryAvg["按月分组查询平均分"]
|
||||
SameYear --> QueryAvg
|
||||
QueryAvg --> Format["格式化输出"]
|
||||
Format --> End(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L52-L70)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
|
||||
|
||||
### 预警数据
|
||||
- 功能:预留接口,用于返回低分员工、未完成考核科室、异常数据等预警信息。
|
||||
- 当前实现:返回模拟数据,后续可扩展为从数据库查询实际预警数据。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L73-L90)
|
||||
|
||||
### 周期统计
|
||||
- 功能:按年月统计全院的科室数量、员工总数、平均分等汇总信息。
|
||||
- 计算逻辑:对科室统计结果进行汇总计算。
|
||||
- 输出格式:包含周期、总数、平均分与明细列表。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L93-L125)
|
||||
|
||||
### 关键指标仪表盘
|
||||
- 功能:返回关键指标的仪表盘数据,如床位使用率、药占比、材料占比、患者满意度等。
|
||||
- 当前实现:返回模拟数据,后续可扩展为从数据库查询实际指标。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L128-L153)
|
||||
|
||||
### 收支趋势
|
||||
- 功能:按月统计收入、支出、利润趋势。
|
||||
- 当前实现:返回模拟数据,后续可扩展为从财务系统查询实际数据。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L156-L183)
|
||||
|
||||
### 科室绩效排名
|
||||
- 功能:按平均分对科室进行排名,支持限制返回数量。
|
||||
- 实现:基于科室统计结果进行排序与截取。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L186-L207)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
|
||||
|
||||
### 个人绩效统计与对比分析
|
||||
- 功能:获取个人绩效排名,支持限制返回数量。
|
||||
- 实现:连接员工、科室、考核表,按加权平均分排序并标注排名。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant API as "统计API"
|
||||
participant Service as "统计服务"
|
||||
participant DB as "数据库"
|
||||
participant Model as "模型"
|
||||
API->>Service : get_ranking_stats(year, month, limit)
|
||||
Service->>DB : 查询已确认考核记录
|
||||
DB->>Model : 连接员工/科室/考核表
|
||||
Model-->>DB : 查询结果
|
||||
DB-->>Service : 排序后的结果集
|
||||
Service-->>API : 格式化排名数据
|
||||
API-->>API : 标注排名序号
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L201-L244)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L210-L224)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L201-L244)
|
||||
|
||||
### 指标完成度
|
||||
- 功能:按指标统计平均分、最大/最小分、完成率等。
|
||||
- 计算逻辑:完成率=平均分/目标值×100%,上限100%。
|
||||
- 输出格式:包含指标基本信息与统计指标。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L227-L241)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L246-L299)
|
||||
|
||||
## 依赖关系分析
|
||||
统计报表接口的依赖关系清晰,API路由层依赖服务层,服务层依赖数据模型与数据库连接,整体耦合度低、内聚性强。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
StatsAPI["统计API路由<br/>stats.py"] --> StatsService["统计服务<br/>stats_service.py"]
|
||||
StatsService --> Models["数据模型<br/>models.py"]
|
||||
StatsService --> Database["数据库连接<br/>database.py"]
|
||||
StatsAPI --> MainApp["主应用<br/>main.py"]
|
||||
MainApp --> Config["配置<br/>config.py"]
|
||||
Database --> Config
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 性能考虑
|
||||
- 异步数据库连接:使用SQLAlchemy异步引擎与会话工厂,减少阻塞,提升并发能力。
|
||||
- 查询优化:合理使用索引(如考核记录的状态、年月、员工ID等),避免N+1查询。
|
||||
- 分页与限制:接口支持分页与返回数量限制,防止大数据量查询导致性能问题。
|
||||
- 缓存策略:当前接口未实现缓存,建议对高频查询(如趋势分析、排名)引入Redis缓存,设置合理的TTL。
|
||||
- 数据库连接池:配置合适的连接池大小与溢出数量,避免连接争用。
|
||||
- 前端渲染:图表数据建议采用分页或分批加载,避免一次性传输大量数据。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L21)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L75-L90)
|
||||
|
||||
## 故障排除指南
|
||||
- 数据库连接失败:检查DATABASE_URL配置与数据库服务状态。
|
||||
- 查询超时:优化查询条件,增加索引,减少不必要的JOIN。
|
||||
- 权限错误:确认用户角色与接口权限,确保鉴权中间件正常工作。
|
||||
- 响应格式异常:检查服务层返回的数据结构与API路由的响应包装。
|
||||
- 预警与仪表盘:当前返回模拟数据,需实现真实数据查询逻辑。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L73-L90)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
|
||||
|
||||
## 结论
|
||||
统计报表接口实现了BSC维度分析、绩效统计、趋势分析、排名与指标完成度等核心功能,具备良好的扩展性与可维护性。建议后续完善预警与仪表盘的真实数据查询、引入缓存策略、优化查询性能,并补充数据质量控制与异常检测机制,以满足生产环境的稳定性与准确性要求。
|
||||
|
||||
## 附录
|
||||
|
||||
### API接口定义
|
||||
- BSC维度分析:GET /api/v1/stats/bsc-dimension
|
||||
- 参数:department_id(可选)、period_year、period_month
|
||||
- 返回:维度得分、权重、指标数量与平均分
|
||||
- 科室绩效统计:GET /api/v1/stats/department
|
||||
- 参数:period_year、period_month
|
||||
- 返回:各科室统计与员工明细
|
||||
- 趋势分析:GET /api/v1/stats/trend
|
||||
- 参数:department_id(可选)、period_year(可选)、months(1-24,默认6)
|
||||
- 返回:月度平均分趋势
|
||||
- 预警数据:GET /api/v1/stats/alerts
|
||||
- 参数:limit(1-100,默认10)
|
||||
- 返回:低分员工、未完成考核科室、异常数据
|
||||
- 周期统计:GET /api/v1/stats/period
|
||||
- 参数:period_year(可选)、period_month(可选)
|
||||
- 返回:周期汇总与明细
|
||||
- 关键指标仪表盘:GET /api/v1/stats/kpi-gauges
|
||||
- 参数:period_year(可选)、period_month(可选)
|
||||
- 返回:床位使用率、药占比、材料占比、患者满意度
|
||||
- 收支趋势:GET /api/v1/stats/finance-trend
|
||||
- 参数:months(1-24,默认6)
|
||||
- 返回:月度收入、支出、利润
|
||||
- 科室绩效排名:GET /api/v1/stats/department-ranking
|
||||
- 参数:period_year(可选)、period_month(可选)、limit(1-100,默认10)
|
||||
- 返回:前N名科室
|
||||
- 个人绩效统计:GET /api/v1/stats/ranking
|
||||
- 参数:period_year、period_month、limit
|
||||
- 返回:个人绩效排名
|
||||
- 指标完成度:GET /api/v1/stats/completion
|
||||
- 参数:indicator_id(可选)、period_year、period_month
|
||||
- 返回:指标平均分、完成率等
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L241)
|
||||
|
||||
### 数据模型关系
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS ||--o{ STAFF : "拥有"
|
||||
STAFF ||--o{ ASSESSMENTS : "参与"
|
||||
INDICATORS ||--o{ ASSESSMENT_DETAILS : "被评估"
|
||||
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "包含"
|
||||
SALARY_RECORDS ||--|| STAFF : "关联"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L231)
|
||||
|
||||
### 统计口径说明
|
||||
- 加权平均分:按指标权重计算的平均分,体现权重影响。
|
||||
- 完成率:平均分与目标值的比值,上限100%。
|
||||
- 排名:按加权平均分降序排列,相同分数按规则处理并列。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L62-L67)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L284-L296)
|
||||
|
||||
### 数据质量控制与异常检测
|
||||
- 数据完整性:仅统计状态为已确认的考核记录,确保数据有效性。
|
||||
- 异常值处理:在服务层对空值与边界值进行处理,避免异常影响统计结果。
|
||||
- ETL流程:建议在系统外部实现ETL,从HIS、财务、院感等系统抽取数据,清洗后入库,统计接口从数据库读取。
|
||||
|
||||
**章节来源**
|
||||
- [docs/详细设计.md](file://docs/详细设计.md#L96-L109)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L36-L43)
|
||||
626
.qoder/repowiki/zh/content/后端开发指南/API路由实现/考核管理接口.md
Normal file
626
.qoder/repowiki/zh/content/后端开发指南/API路由实现/考核管理接口.md
Normal file
@@ -0,0 +1,626 @@
|
||||
# 考核管理接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [frontend/src/api/assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [docs/api.md](file://docs/api.md)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件详细说明医院绩效管理系统的考核管理接口,涵盖考核流程管理、考核记录和考核明细的API实现。文档重点解释考核状态流转机制、审批流程和权限控制,同时文档化考核模板的使用、指标计算和得分汇总。系统支持批量考核操作、历史记录查询和统计分析接口,详细介绍考核详情的数据结构、评分规则和权重计算。此外,文档还包含考核进度跟踪、提醒机制和报表生成功能,提供完整的考核生命周期管理、数据一致性保证和并发控制策略。
|
||||
|
||||
## 项目结构
|
||||
|
||||
后端采用FastAPI + SQLAlchemy 2.0架构,采用分层设计模式:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
Frontend[前端Vue.js应用]
|
||||
end
|
||||
subgraph "应用层"
|
||||
API[API路由层]
|
||||
Services[业务服务层]
|
||||
end
|
||||
subgraph "数据层"
|
||||
Models[ORM模型层]
|
||||
Database[(PostgreSQL数据库)]
|
||||
end
|
||||
Frontend --> API
|
||||
API --> Services
|
||||
Services --> Models
|
||||
Models --> Database
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
|
||||
系统采用模块化设计,主要模块包括:
|
||||
- **认证模块**:JWT令牌管理和权限控制
|
||||
- **考核管理模块**:考核流程、状态管理和审批
|
||||
- **指标模板模块**:模板管理和指标配置
|
||||
- **统计分析模块**:报表和数据分析
|
||||
- **数据模型模块**:核心业务实体和关系
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md#L27-L47)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 考核状态管理
|
||||
|
||||
系统实现了完整的考核状态流转机制,支持四种状态:
|
||||
- **草稿 (draft)**:初始状态,允许修改
|
||||
- **已提交 (submitted)**:等待审核
|
||||
- **已审核 (reviewed)**:审核通过,等待确认
|
||||
- **已确认 (finalized)**:最终状态,不可修改
|
||||
- **已驳回 (rejected)**:审核不通过
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 已提交 : "提交考核"
|
||||
已提交 --> 已审核 : "审核通过"
|
||||
已提交 --> 已驳回 : "审核驳回"
|
||||
已审核 --> 已确认 : "确认考核"
|
||||
已确认 --> [*]
|
||||
已驳回 --> 草稿 : "重新修改"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L52)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
|
||||
### 权限控制系统
|
||||
|
||||
系统采用基于角色的权限控制(RBAC):
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "用户角色"
|
||||
Staff[普通员工]
|
||||
Manager[科室经理]
|
||||
Admin[系统管理员]
|
||||
end
|
||||
subgraph "权限级别"
|
||||
Read[只读权限]
|
||||
Write[写入权限]
|
||||
Approve[审批权限]
|
||||
Manage[管理权限]
|
||||
end
|
||||
Staff --> Read
|
||||
Manager --> Write
|
||||
Manager --> Approve
|
||||
Admin --> Manage
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L109)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L45-L52)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L109)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用经典的三层架构模式,确保关注点分离和代码可维护性:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API层"
|
||||
AssessmentsAPI[考核API]
|
||||
TemplatesAPI[模板API]
|
||||
StatsAPI[统计API]
|
||||
end
|
||||
subgraph "服务层"
|
||||
AssessmentService[考核服务]
|
||||
TemplateService[模板服务]
|
||||
StatsService[统计服务]
|
||||
end
|
||||
subgraph "数据层"
|
||||
AssessmentModel[考核模型]
|
||||
DetailModel[明细模型]
|
||||
IndicatorModel[指标模型]
|
||||
DepartmentModel[科室模型]
|
||||
end
|
||||
AssessmentsAPI --> AssessmentService
|
||||
TemplatesAPI --> TemplateService
|
||||
StatsAPI --> StatsService
|
||||
AssessmentService --> AssessmentModel
|
||||
AssessmentService --> DetailModel
|
||||
AssessmentService --> IndicatorModel
|
||||
TemplateService --> AssessmentModel
|
||||
TemplateService --> DetailModel
|
||||
TemplateService --> IndicatorModel
|
||||
StatsService --> AssessmentModel
|
||||
StatsService --> DetailModel
|
||||
StatsService --> IndicatorModel
|
||||
StatsService --> DepartmentModel
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 考核管理API
|
||||
|
||||
#### 考核列表查询
|
||||
|
||||
支持多条件过滤和分页查询:
|
||||
|
||||
| 查询参数 | 类型 | 描述 | 示例 |
|
||||
|---------|------|------|------|
|
||||
| staff_id | int | 员工ID | 1001 |
|
||||
| department_id | int | 科室ID | 501 |
|
||||
| period_year | int | 年度 | 2024 |
|
||||
| period_month | int | 月份 | 1 |
|
||||
| status | string | 状态 | "submitted" |
|
||||
| page | int | 页码 | 1 |
|
||||
| page_size | int | 每页数量 | 20 |
|
||||
|
||||
#### 考核详情查询
|
||||
|
||||
返回完整的考核信息,包括员工和科室名称以及指标名称:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "考核API"
|
||||
participant Service as "考核服务"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /assessments/{id}
|
||||
API->>Service : get_by_id(assessment_id)
|
||||
Service->>DB : 查询考核记录
|
||||
DB-->>Service : 考核详情
|
||||
Service->>DB : 查询明细和指标
|
||||
DB-->>Service : 明细数据
|
||||
Service-->>API : 完整考核信息
|
||||
API-->>Client : 考核详情响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L58-L68)
|
||||
|
||||
#### 考核状态流转
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> Draft[草稿状态]
|
||||
Draft --> Submit{提交考核?}
|
||||
Submit --> |是| Submitted[已提交]
|
||||
Submit --> |否| Draft
|
||||
Submitted --> Review{审核结果}
|
||||
Review --> |通过| Reviewed[已审核]
|
||||
Review --> |驳回| Rejected[已驳回]
|
||||
Reviewed --> Finalize{确认考核?}
|
||||
Finalize --> |是| Finalized[已确认]
|
||||
Finalize --> |否| Reviewed
|
||||
Rejected --> Edit[修改后重新提交]
|
||||
Edit --> Draft
|
||||
Finalized --> End([结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L52)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
|
||||
### 指标模板管理
|
||||
|
||||
#### 模板类型体系
|
||||
|
||||
系统支持多种科室类型的指标模板:
|
||||
|
||||
| 模板类型 | 适用科室 | 描述 |
|
||||
|---------|---------|------|
|
||||
| general | 通用模板 | 适用于所有科室的基础指标 |
|
||||
| surgical | 手术临床科室 | 适用于手术科室的特殊指标 |
|
||||
| nonsurgical_ward | 非手术有病房科室 | 适用于内科、儿科等有病房科室 |
|
||||
| nonsurgical_noward | 非手术无病房科室 | 适用于门诊科室 |
|
||||
| medical_tech | 医技科室 | 适用于检验、影像等医技科室 |
|
||||
| nursing | 护理单元 | 适用于护理部门 |
|
||||
| admin | 行政科室 | 适用于行政部门 |
|
||||
| logistics | 后勤科室 | 适用于后勤保障部门 |
|
||||
|
||||
#### 模板指标关联
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
INDICATOR_TEMPLATE ||--o{ TEMPLATE_INDICATOR : "包含"
|
||||
TEMPLATE_INDICATOR }o--|| INDICATOR : "关联"
|
||||
INDICATOR_TEMPLATE {
|
||||
int id PK
|
||||
string template_name
|
||||
string template_code
|
||||
string template_type
|
||||
text dimension_weights
|
||||
string assessment_cycle
|
||||
boolean is_active
|
||||
}
|
||||
TEMPLATE_INDICATOR {
|
||||
int id PK
|
||||
int template_id FK
|
||||
int indicator_id FK
|
||||
string category
|
||||
float target_value
|
||||
string target_unit
|
||||
float weight
|
||||
string scoring_method
|
||||
text scoring_params
|
||||
int sort_order
|
||||
text remark
|
||||
}
|
||||
INDICATOR {
|
||||
int id PK
|
||||
string name
|
||||
string code
|
||||
string indicator_type
|
||||
string bs_dimension
|
||||
float weight
|
||||
float max_score
|
||||
float target_value
|
||||
string target_unit
|
||||
text calculation_method
|
||||
text assessment_method
|
||||
text deduction_standard
|
||||
string data_source
|
||||
text applicable_dept_types
|
||||
boolean is_veto
|
||||
boolean is_active
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L437)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L42)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L77-L126)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L23-L71)
|
||||
|
||||
### 统计分析接口
|
||||
|
||||
#### BSC维度分析
|
||||
|
||||
系统支持平衡计分卡四个维度的统计分析:
|
||||
|
||||
| 维度 | 描述 | 权重范围 |
|
||||
|------|------|----------|
|
||||
| financial | 财务管理 | 30%-40% |
|
||||
| customer | 顾客服务 | 25%-35% |
|
||||
| internal_process | 内部流程 | 20%-30% |
|
||||
| learning_growth | 学习与成长 | 5%-15% |
|
||||
|
||||
#### 绩效排名统计
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant StatsAPI as "统计API"
|
||||
participant StatsService as "统计服务"
|
||||
participant DB as "数据库"
|
||||
Client->>StatsAPI : GET /stats/ranking
|
||||
StatsAPI->>StatsService : get_ranking_stats(year, month, limit)
|
||||
StatsService->>DB : 查询最终状态的考核记录
|
||||
DB-->>StatsService : 排名数据
|
||||
StatsService->>DB : 关联员工和科室信息
|
||||
DB-->>StatsService : 员工详情
|
||||
StatsService-->>StatsAPI : 排名结果
|
||||
StatsAPI-->>Client : 排名列表
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L210-L224)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L202-L244)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L33)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L210-L224)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
|
||||
### 数据模型设计
|
||||
|
||||
#### 核心实体关系
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
ASSESSMENT {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
string period_type
|
||||
float total_score
|
||||
float weighted_score
|
||||
string status
|
||||
int assessor_id FK
|
||||
int reviewer_id FK
|
||||
datetime submit_time
|
||||
datetime review_time
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
ASSESSMENT_DETAIL {
|
||||
int id PK
|
||||
int assessment_id FK
|
||||
int indicator_id FK
|
||||
float actual_value
|
||||
float score
|
||||
text evidence
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATOR {
|
||||
int id PK
|
||||
string name
|
||||
string code
|
||||
string indicator_type
|
||||
string bs_dimension
|
||||
float weight
|
||||
float max_score
|
||||
float target_value
|
||||
string target_unit
|
||||
text calculation_method
|
||||
text assessment_method
|
||||
text deduction_standard
|
||||
string data_source
|
||||
text applicable_dept_types
|
||||
boolean is_veto
|
||||
boolean is_active
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
float base_salary
|
||||
float performance_ratio
|
||||
string status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENT {
|
||||
int id PK
|
||||
string name
|
||||
string code
|
||||
string dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
boolean is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
ASSESSMENT ||--o{ ASSESSMENT_DETAIL : "包含"
|
||||
ASSESSMENT }o--|| STAFF : "属于"
|
||||
STAFF }o--|| DEPARTMENT : "隶属于"
|
||||
ASSESSMENT_DETAIL }o--|| INDICATOR : "对应"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 模块依赖图
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "外部依赖"
|
||||
FastAPI[FastAPI框架]
|
||||
SQLAlchemy[SQLAlchemy ORM]
|
||||
Postgres[PostgreSQL数据库]
|
||||
JWT[jwt库]
|
||||
Bcrypt[bcrypt加密]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
Security[安全模块]
|
||||
Database[数据库模块]
|
||||
Logging[日志模块]
|
||||
end
|
||||
subgraph "业务模块"
|
||||
AssessmentAPI[考核API]
|
||||
AssessmentService[考核服务]
|
||||
TemplateAPI[模板API]
|
||||
TemplateService[模板服务]
|
||||
StatsAPI[统计API]
|
||||
StatsService[统计服务]
|
||||
end
|
||||
FastAPI --> AssessmentAPI
|
||||
FastAPI --> TemplateAPI
|
||||
FastAPI --> StatsAPI
|
||||
AssessmentAPI --> AssessmentService
|
||||
TemplateAPI --> TemplateService
|
||||
StatsAPI --> StatsService
|
||||
AssessmentService --> Database
|
||||
TemplateService --> Database
|
||||
StatsService --> Database
|
||||
AssessmentAPI --> Security
|
||||
TemplateAPI --> Security
|
||||
StatsAPI --> Security
|
||||
Security --> JWT
|
||||
Security --> Bcrypt
|
||||
Database --> Postgres
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
|
||||
### 数据一致性保证
|
||||
|
||||
系统通过以下机制确保数据一致性:
|
||||
|
||||
1. **事务管理**:所有数据库操作都在事务中执行
|
||||
2. **外键约束**:使用SQLAlchemy外键约束保证引用完整性
|
||||
3. **状态验证**:在状态转换前验证当前状态
|
||||
4. **并发控制**:使用数据库锁防止并发修改冲突
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
1. **索引优化**:为常用查询字段建立索引
|
||||
- 考核记录:staff_id, period_year, period_month, status
|
||||
- 明细记录:assessment_id, indicator_id
|
||||
- 员工信息:department_id, status
|
||||
|
||||
2. **分页查询**:默认每页20条记录,最大100条
|
||||
3. **批量操作**:支持批量创建和查询
|
||||
4. **缓存策略**:对于静态数据使用缓存
|
||||
|
||||
### 并发控制
|
||||
|
||||
系统采用以下并发控制策略:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Request[请求到达] --> CheckLock{检查锁}
|
||||
CheckLock --> |无锁| AcquireLock[获取锁]
|
||||
CheckLock --> |有锁| Wait[等待锁释放]
|
||||
AcquireLock --> Process[处理业务逻辑]
|
||||
Process --> ReleaseLock[释放锁]
|
||||
Wait --> CheckLock
|
||||
ReleaseLock --> Response[返回响应]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见错误处理
|
||||
|
||||
| 错误类型 | HTTP状态码 | 描述 | 处理建议 |
|
||||
|---------|-----------|------|----------|
|
||||
| 未授权 | 401 | JWT令牌无效或过期 | 重新登录获取新令牌 |
|
||||
| 权限不足 | 403 | 用户权限不够 | 检查用户角色和权限 |
|
||||
| 资源不存在 | 404 | 请求的资源不存在 | 确认ID是否正确 |
|
||||
| 参数错误 | 400 | 请求参数不合法 | 检查请求格式和参数类型 |
|
||||
| 数据验证失败 | 422 | 数据不符合验证规则 | 修正数据格式和范围 |
|
||||
|
||||
### 日志记录
|
||||
|
||||
系统提供完整的日志记录机制:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "日志级别"
|
||||
Info[信息日志]
|
||||
Warning[警告日志]
|
||||
Error[错误日志]
|
||||
Debug[调试日志]
|
||||
end
|
||||
subgraph "日志内容"
|
||||
Request[请求信息]
|
||||
Response[响应信息]
|
||||
ErrorDetail[错误详情]
|
||||
Performance[性能数据]
|
||||
end
|
||||
Info --> Request
|
||||
Warning --> ErrorDetail
|
||||
Error --> ErrorDetail
|
||||
Debug --> Performance
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L109)
|
||||
|
||||
## 结论
|
||||
|
||||
本考核管理接口提供了完整的医院绩效管理系统解决方案,具有以下特点:
|
||||
|
||||
1. **完整的生命周期管理**:从草稿到最终确认的全流程管理
|
||||
2. **灵活的权限控制**:基于角色的精细化权限管理
|
||||
3. **强大的统计分析**:多维度的报表和分析功能
|
||||
4. **可靠的并发控制**:确保数据一致性和系统稳定性
|
||||
5. **良好的扩展性**:模块化设计便于功能扩展和维护
|
||||
|
||||
系统采用现代化的技术栈和设计模式,能够满足医院绩效管理的复杂需求,为提升医疗质量和效率提供有力支撑。
|
||||
|
||||
## 附录
|
||||
|
||||
### API接口规范
|
||||
|
||||
#### 考核管理接口
|
||||
|
||||
| 方法 | 路径 | 权限要求 | 功能描述 |
|
||||
|------|------|----------|----------|
|
||||
| GET | /assessments | 普通员工 | 获取考核列表 |
|
||||
| GET | /assessments/{id} | 普通员工 | 获取考核详情 |
|
||||
| POST | /assessments | 普通员工 | 创建考核记录 |
|
||||
| PUT | /assessments/{id} | 普通员工 | 更新考核记录 |
|
||||
| POST | /assessments/{id}/submit | 普通员工 | 提交考核 |
|
||||
| POST | /assessments/{id}/review | 科室经理 | 审核考核 |
|
||||
| POST | /assessments/{id}/finalize | 科室经理 | 确认考核 |
|
||||
| POST | /assessments/batch-create | 科室经理 | 批量创建考核 |
|
||||
|
||||
#### 统计分析接口
|
||||
|
||||
| 方法 | 路径 | 权限要求 | 功能描述 |
|
||||
|------|------|----------|----------|
|
||||
| GET | /stats/bsc-dimension | 普通员工 | BSC维度分析 |
|
||||
| GET | /stats/department | 普通员工 | 科室绩效统计 |
|
||||
| GET | /stats/trend | 普通员工 | 趋势分析 |
|
||||
| GET | /stats/ranking | 普通员工 | 绩效排名 |
|
||||
| GET | /stats/completion | 普通员工 | 指标完成度 |
|
||||
|
||||
**章节来源**
|
||||
- [docs/api.md](file://docs/api.md#L298-L468)
|
||||
- [docs/api.md](file://docs/api.md#L471-L537)
|
||||
480
.qoder/repowiki/zh/content/后端开发指南/API路由实现/认证接口.md
Normal file
480
.qoder/repowiki/zh/content/后端开发指南/API路由实现/认证接口.md
Normal file
@@ -0,0 +1,480 @@
|
||||
# 认证接口
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [security.py](file://backend/app/core/security.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [main.py](file://backend/app/main.py)
|
||||
- [auth.js](file://frontend/src/api/auth.js)
|
||||
- [user.js](file://frontend/src/stores/user.js)
|
||||
- [api.md](file://docs/api.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件详细说明了医院绩效管理系统的认证接口实现,包括用户登录、注册和当前用户信息获取的API。系统采用OAuth2密码模式配合JWT令牌进行身份验证,实现了完整的用户认证和授权机制。
|
||||
|
||||
该认证系统支持三种用户角色:普通员工(staff)、科室经理(manager)和系统管理员(admin),并提供了相应的权限控制机制。所有密码均使用bcrypt进行安全哈希存储,JWT令牌具有8小时有效期。
|
||||
|
||||
## 项目结构
|
||||
|
||||
认证相关的核心文件组织如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端认证模块"
|
||||
A[auth.py<br/>认证路由]
|
||||
B[security.py<br/>安全工具]
|
||||
C[models.py<br/>用户模型]
|
||||
D[schemas.py<br/>数据模式]
|
||||
E[config.py<br/>配置]
|
||||
F[database.py<br/>数据库]
|
||||
end
|
||||
subgraph "前端认证模块"
|
||||
G[auth.js<br/>认证API]
|
||||
H[user.js<br/>用户状态]
|
||||
end
|
||||
subgraph "系统配置"
|
||||
I[main.py<br/>应用入口]
|
||||
J[api.md<br/>API文档]
|
||||
end
|
||||
A --> B
|
||||
A --> C
|
||||
A --> D
|
||||
B --> E
|
||||
B --> F
|
||||
G --> I
|
||||
H --> G
|
||||
I --> A
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L313-L345)
|
||||
|
||||
**章节来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L313-L345)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 认证路由模块
|
||||
|
||||
认证路由模块定义了三个主要接口:
|
||||
- `/auth/login` - 用户登录接口
|
||||
- `/auth/register` - 用户注册接口
|
||||
- `/auth/me` - 获取当前用户信息接口
|
||||
|
||||
每个接口都经过严格的参数验证和权限检查,确保系统的安全性。
|
||||
|
||||
### 安全工具模块
|
||||
|
||||
安全工具模块提供了JWT令牌的生成、验证和用户权限检查功能:
|
||||
- 密码哈希和验证
|
||||
- JWT令牌创建和解析
|
||||
- 用户权限验证
|
||||
- OAuth2密码模式支持
|
||||
|
||||
### 数据模型
|
||||
|
||||
用户模型包含以下关键字段:
|
||||
- 用户名(username) - 唯一标识
|
||||
- 密码哈希(password_hash) - 安全存储
|
||||
- 角色(role) - 权限级别
|
||||
- 激活状态(is_active) - 账户状态
|
||||
- 关联员工(staff_id) - 与员工信息关联
|
||||
|
||||
**章节来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L14-L74)
|
||||
- [security.py](file://backend/app/core/security.py#L18-L110)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
## 架构概览
|
||||
|
||||
认证系统的整体架构采用分层设计,确保了良好的可维护性和扩展性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as 认证API
|
||||
participant Security as 安全模块
|
||||
participant DB as 数据库
|
||||
participant JWT as JWT服务
|
||||
Client->>API : POST /auth/login
|
||||
API->>Security : 验证密码
|
||||
Security->>DB : 查询用户信息
|
||||
DB-->>Security : 用户数据
|
||||
Security->>Security : bcrypt校验密码
|
||||
Security->>JWT : 创建访问令牌
|
||||
JWT-->>Security : JWT令牌
|
||||
Security-->>API : 验证结果
|
||||
API-->>Client : {access_token, token_type}
|
||||
Note over Client,JWT : 用户登录成功
|
||||
Client->>API : GET /auth/me
|
||||
API->>Security : 解析JWT令牌
|
||||
Security->>JWT : 验证令牌有效性
|
||||
JWT-->>Security : 令牌载荷
|
||||
Security->>DB : 获取用户信息
|
||||
DB-->>Security : 用户详情
|
||||
Security-->>API : 当前用户
|
||||
API-->>Client : 用户信息
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [security.py](file://backend/app/core/security.py#L55-L91)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 登录接口 (POST /auth/login)
|
||||
|
||||
登录接口实现了OAuth2密码模式的标准流程:
|
||||
|
||||
#### 接口规范
|
||||
- **URL**: `/auth/login`
|
||||
- **方法**: POST
|
||||
- **认证**: 无需认证
|
||||
- **内容类型**: application/x-www-form-urlencoded
|
||||
|
||||
#### 请求参数
|
||||
| 参数名 | 类型 | 必填 | 描述 | 长度限制 |
|
||||
|--------|------|------|------|----------|
|
||||
| username | string | 是 | 用户名 | 3-50字符 |
|
||||
| password | string | 是 | 密码 | 6-100字符 |
|
||||
|
||||
#### 响应格式
|
||||
```json
|
||||
{
|
||||
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||||
"token_type": "bearer"
|
||||
}
|
||||
```
|
||||
|
||||
#### 处理流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始登录]) --> ValidateInput["验证输入参数"]
|
||||
ValidateInput --> CheckUsername{"用户名存在?"}
|
||||
CheckUsername --> |否| Return401["返回401错误"]
|
||||
CheckUsername --> |是| VerifyPassword["验证密码"]
|
||||
VerifyPassword --> PasswordCorrect{"密码正确?"}
|
||||
PasswordCorrect --> |否| Return401["返回401错误"]
|
||||
PasswordCorrect --> CheckActive{"账户已激活?"}
|
||||
CheckActive --> |否| Return403["返回403错误"]
|
||||
CheckActive --> CreateToken["创建JWT访问令牌"]
|
||||
CreateToken --> ReturnToken["返回访问令牌"]
|
||||
Return401 --> End([结束])
|
||||
Return403 --> End
|
||||
ReturnToken --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L18-L37)
|
||||
|
||||
#### 错误处理
|
||||
- **401 Unauthorized**: 用户名或密码错误
|
||||
- **403 Forbidden**: 账户已禁用
|
||||
- **422 Unprocessable Entity**: 参数验证失败
|
||||
|
||||
**章节来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L315-L318)
|
||||
|
||||
### 注册接口 (POST /auth/register)
|
||||
|
||||
注册接口负责创建新用户账户:
|
||||
|
||||
#### 接口规范
|
||||
- **URL**: `/auth/register`
|
||||
- **方法**: POST
|
||||
- **认证**: 无需认证
|
||||
- **内容类型**: application/json
|
||||
|
||||
#### 请求参数
|
||||
| 参数名 | 类型 | 必填 | 描述 | 长度限制 |
|
||||
|--------|------|------|------|----------|
|
||||
| username | string | 是 | 用户名 | 3-50字符 |
|
||||
| password | string | 是 | 密码 | 6-100字符 |
|
||||
| staff_id | integer | 否 | 关联员工ID | 无限制 |
|
||||
| role | string | 否 | 用户角色 | admin/manager/staff |
|
||||
|
||||
#### 响应格式
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "注册成功",
|
||||
"data": {
|
||||
"id": 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 处理流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始注册]) --> ValidateInput["验证输入参数"]
|
||||
ValidateInput --> CheckDuplicate{"用户名已存在?"}
|
||||
CheckDuplicate --> |是| Return400["返回400错误"]
|
||||
CheckDuplicate --> |否| HashPassword["生成密码哈希"]
|
||||
HashPassword --> CreateUserData["创建用户数据"]
|
||||
CreateUserData --> SaveToDB["保存到数据库"]
|
||||
SaveToDB --> ReturnSuccess["返回成功响应"]
|
||||
Return400 --> End([结束])
|
||||
ReturnSuccess --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L40-L65)
|
||||
|
||||
#### 错误处理
|
||||
- **400 Bad Request**: 用户名已存在
|
||||
- **422 Unprocessable Entity**: 参数验证失败
|
||||
|
||||
**章节来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L40-L65)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L321-L327)
|
||||
|
||||
### 当前用户接口 (GET /auth/me)
|
||||
|
||||
当前用户接口用于获取已认证用户的详细信息:
|
||||
|
||||
#### 接口规范
|
||||
- **URL**: `/auth/me`
|
||||
- **方法**: GET
|
||||
- **认证**: 需要Bearer Token
|
||||
- **内容类型**: 无要求
|
||||
|
||||
#### 请求头
|
||||
- **Authorization**: Bearer {JWT令牌}
|
||||
|
||||
#### 响应格式
|
||||
```json
|
||||
{
|
||||
"id": 1,
|
||||
"username": "admin",
|
||||
"role": "admin",
|
||||
"is_active": true,
|
||||
"last_login": "2024-01-01T00:00:00",
|
||||
"created_at": "2024-01-01T00:00:00"
|
||||
}
|
||||
```
|
||||
|
||||
#### 权限验证流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API层
|
||||
participant Security as 安全层
|
||||
participant JWT as JWT验证
|
||||
participant DB as 数据库
|
||||
Client->>API : GET /auth/me
|
||||
API->>Security : 从Authorization头提取令牌
|
||||
Security->>JWT : 验证JWT令牌
|
||||
JWT-->>Security : 验证结果
|
||||
Security->>DB : 查询用户信息
|
||||
DB-->>Security : 用户详情
|
||||
Security->>Security : 检查账户激活状态
|
||||
Security-->>API : 当前用户对象
|
||||
API-->>Client : 用户信息
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L68-L73)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L91)
|
||||
|
||||
#### 权限级别
|
||||
- **普通用户**: 可访问自己的信息
|
||||
- **管理员**: 可访问所有用户信息
|
||||
- **禁用用户**: 无法获取用户信息
|
||||
|
||||
**章节来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L68-L73)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L335-L345)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
认证系统的依赖关系体现了清晰的分层架构:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "外部依赖"
|
||||
A[FastAPI框架]
|
||||
B[SQLAlchemy ORM]
|
||||
C[bcrypt库]
|
||||
D[jose(JWT库)]
|
||||
E[PostgreSQL数据库]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
F[auth.py - 路由层]
|
||||
G[security.py - 安全层]
|
||||
H[models.py - 数据层]
|
||||
I[schemas.py - 模式层]
|
||||
J[database.py - 连接层]
|
||||
K[config.py - 配置层]
|
||||
end
|
||||
F --> G
|
||||
F --> H
|
||||
F --> I
|
||||
G --> J
|
||||
G --> K
|
||||
H --> B
|
||||
G --> C
|
||||
G --> D
|
||||
J --> E
|
||||
subgraph "前端依赖"
|
||||
L[Pinia状态管理]
|
||||
M[Axios HTTP客户端]
|
||||
end
|
||||
N[auth.js] --> M
|
||||
O[user.js] --> L
|
||||
O --> N
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L4-L12)
|
||||
- [security.py](file://backend/app/core/security.py#L6-L15)
|
||||
- [models.py](file://backend/app/models/models.py#L10-L13)
|
||||
|
||||
### 核心依赖关系
|
||||
|
||||
1. **OAuth2密码模式**: 使用FastAPI内置的OAuth2PasswordBearer
|
||||
2. **JWT令牌**: 使用jose库进行JWT的编码和解码
|
||||
3. **密码哈希**: 使用bcrypt库进行安全的密码哈希
|
||||
4. **数据库访问**: 使用SQLAlchemy ORM进行异步数据库操作
|
||||
|
||||
**章节来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L4-L12)
|
||||
- [security.py](file://backend/app/core/security.py#L6-L15)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### JWT令牌性能优化
|
||||
|
||||
- **令牌有效期**: 默认8小时,可根据业务需求调整
|
||||
- **内存缓存**: 可考虑添加令牌黑名单缓存
|
||||
- **并发处理**: 异步数据库操作支持高并发场景
|
||||
|
||||
### 数据库性能优化
|
||||
|
||||
- **索引优化**: 用户名字段建立唯一索引
|
||||
- **查询优化**: 使用select语句精确查询用户信息
|
||||
- **连接池**: 配置合适的数据库连接池大小
|
||||
|
||||
### 缓存策略
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph "缓存层"
|
||||
A[Redis缓存]
|
||||
B[内存缓存]
|
||||
end
|
||||
subgraph "认证流程"
|
||||
C[用户登录]
|
||||
D[令牌验证]
|
||||
E[用户信息获取]
|
||||
end
|
||||
C --> A
|
||||
D --> B
|
||||
E --> B
|
||||
```
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 登录失败 (401错误)
|
||||
**症状**: 返回"用户名或密码错误"
|
||||
**可能原因**:
|
||||
- 用户名不存在
|
||||
- 密码不正确
|
||||
- 账户被禁用
|
||||
|
||||
**解决步骤**:
|
||||
1. 验证用户名和密码格式
|
||||
2. 检查用户账户状态
|
||||
3. 确认密码哈希匹配
|
||||
|
||||
#### 权限不足 (403错误)
|
||||
**症状**: 返回"需要管理员权限"
|
||||
**可能原因**:
|
||||
- 当前用户角色权限不足
|
||||
- 用户账户被禁用
|
||||
|
||||
**解决步骤**:
|
||||
1. 检查用户角色配置
|
||||
2. 验证用户权限级别
|
||||
3. 确认操作所需的最小权限
|
||||
|
||||
#### 数据库连接问题
|
||||
**症状**: 数据库操作失败
|
||||
**可能原因**:
|
||||
- 数据库连接字符串错误
|
||||
- 数据库服务不可用
|
||||
- 连接池耗尽
|
||||
|
||||
**解决步骤**:
|
||||
1. 检查DATABASE_URL配置
|
||||
2. 验证数据库服务状态
|
||||
3. 调整连接池参数
|
||||
|
||||
#### JWT令牌问题
|
||||
**症状**: 令牌验证失败
|
||||
**可能原因**:
|
||||
- 令牌过期
|
||||
- 密钥不匹配
|
||||
- 令牌格式错误
|
||||
|
||||
**解决步骤**:
|
||||
1. 检查SECRET_KEY配置
|
||||
2. 验证令牌有效期
|
||||
3. 确认令牌格式正确
|
||||
|
||||
**章节来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L30-L34)
|
||||
- [security.py](file://backend/app/core/security.py#L60-L82)
|
||||
|
||||
## 结论
|
||||
|
||||
本认证系统实现了完整的用户身份验证和授权机制,具有以下特点:
|
||||
|
||||
### 安全特性
|
||||
- **密码安全**: 使用bcrypt进行密码哈希存储
|
||||
- **令牌安全**: JWT令牌包含过期时间和用户标识
|
||||
- **权限控制**: 支持多角色权限管理和细粒度访问控制
|
||||
- **传输安全**: 建议在生产环境中使用HTTPS
|
||||
|
||||
### 功能完整性
|
||||
- **OAuth2密码模式**: 符合标准的OAuth2实现
|
||||
- **用户管理**: 完整的用户生命周期管理
|
||||
- **权限验证**: 多层次的权限检查机制
|
||||
- **错误处理**: 完善的错误处理和状态码返回
|
||||
|
||||
### 扩展性
|
||||
- **模块化设计**: 清晰的分层架构便于扩展
|
||||
- **配置管理**: 集中的配置管理支持环境切换
|
||||
- **数据库抽象**: SQLAlchemy ORM支持多种数据库
|
||||
|
||||
该认证系统为医院绩效管理系统的其他功能模块提供了可靠的身份验证基础,确保了系统的整体安全性和可用性。
|
||||
396
.qoder/repowiki/zh/content/后端开发指南/后端开发指南.md
Normal file
396
.qoder/repowiki/zh/content/后端开发指南/后端开发指南.md
Normal file
@@ -0,0 +1,396 @@
|
||||
# 后端开发指南
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [main.py](file://backend/app/main.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [security.py](file://backend/app/core/security.py)
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py)
|
||||
- [__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [init_db.py](file://backend/init_db.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向后端开发者,系统讲解医院绩效管理系统的FastAPI后端开发实践,涵盖:
|
||||
- FastAPI框架使用与路由组织
|
||||
- 数据模型设计与业务实体映射
|
||||
- 服务层架构、依赖注入与异步编程
|
||||
- API路由配置、错误处理与日志规范
|
||||
- 业务服务开发、数据验证与安全控制
|
||||
- 数据库连接管理、事务处理与性能优化
|
||||
- 单元测试与集成测试设计、代码质量保证
|
||||
|
||||
## 项目结构
|
||||
后端采用分层架构:入口应用层、核心配置与基础设施层、数据模型与Schema层、服务层、API路由层。整体结构清晰,职责分离明确。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用入口"
|
||||
MAIN["main.py"]
|
||||
end
|
||||
subgraph "核心配置与基础设施"
|
||||
CFG["config.py"]
|
||||
DB["database.py"]
|
||||
SEC["security.py"]
|
||||
LOG["logging_config.py"]
|
||||
end
|
||||
subgraph "数据与接口定义"
|
||||
MODELS["models.py"]
|
||||
SCHEMAS["schemas.py"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
SVC_ASSESS["assessment_service.py"]
|
||||
SVC_STAFF["staff_service.py"]
|
||||
end
|
||||
subgraph "API路由"
|
||||
API_V1["api/v1/__init__.py"]
|
||||
AUTH["api/v1/auth.py"]
|
||||
STAFF["api/v1/staff.py"]
|
||||
end
|
||||
MAIN --> API_V1
|
||||
API_V1 --> AUTH
|
||||
API_V1 --> STAFF
|
||||
AUTH --> SEC
|
||||
STAFF --> SVC_STAFF
|
||||
SVC_STAFF --> MODELS
|
||||
SVC_ASSESS --> MODELS
|
||||
SEC --> DB
|
||||
DB --> MODELS
|
||||
MODELS --> SCHEMAS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [main.py](file://backend/app/main.py#L15-L77)
|
||||
- [config.py](file://backend/app/core/config.py#L9-L46)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L38)
|
||||
- [security.py](file://backend/app/core/security.py#L18-L110)
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L49-L743)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [__init__.py](file://backend/app/api/v1/__init__.py#L4-L16)
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
|
||||
**章节来源**
|
||||
- [main.py](file://backend/app/main.py#L15-L77)
|
||||
- [__init__.py](file://backend/app/api/v1/__init__.py#L4-L16)
|
||||
|
||||
## 核心组件
|
||||
- 应用实例与中间件:创建FastAPI实例、CORS跨域、健康检查端点、全局异常处理器。
|
||||
- 配置中心:应用名、版本、API前缀、数据库连接池、JWT密钥与过期时间、CORS白名单、分页参数等。
|
||||
- 数据库层:异步SQLAlchemy引擎、会话工厂、模型基类、依赖注入式会话获取与自动事务提交/回滚。
|
||||
- 安全模块:OAuth2密码流、密码哈希与校验、JWT签发与解析、当前用户解析与权限校验(管理员/经理/激活用户)。
|
||||
- 日志模块:控制台与文件(按日滚动)双通道,错误级别单独文件,统一格式化输出。
|
||||
- 数据模型与Schema:涵盖科室、员工、指标、考核、明细、工资、用户、计划、菜单、模板等实体与枚举。
|
||||
- 服务层:封装业务逻辑,如员工管理、考核流程(草稿/提交/审核/确认)、批量创建等。
|
||||
- API路由:认证、员工管理等模块化路由,统一返回结构与权限控制。
|
||||
|
||||
**章节来源**
|
||||
- [main.py](file://backend/app/main.py#L19-L76)
|
||||
- [config.py](file://backend/app/core/config.py#L9-L46)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L38)
|
||||
- [security.py](file://backend/app/core/security.py#L20-L110)
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L49-L743)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
|
||||
## 架构总览
|
||||
系统采用“路由层-服务层-数据层”的三层架构,配合依赖注入与异步IO,确保高并发下的稳定与性能。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
CLIENT["客户端"] --> ROUTER["API路由层<br/>auth.py / staff.py"]
|
||||
ROUTER --> DEP_DB["依赖注入: get_db()"]
|
||||
ROUTER --> DEP_SEC["依赖注入: 当前用户/权限"]
|
||||
ROUTER --> SVC["服务层<br/>staff_service.py / assessment_service.py"]
|
||||
SVC --> MODEL["数据模型层<br/>models.py"]
|
||||
MODEL --> DB["数据库引擎<br/>database.py"]
|
||||
ROUTER --> LOG["日志记录<br/>logging_config.py"]
|
||||
ROUTER --> CFG["配置中心<br/>config.py"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [database.py](file://backend/app/core/database.py#L28-L38)
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
|
||||
- [config.py](file://backend/app/core/config.py#L9-L46)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### FastAPI应用与路由组织
|
||||
- 应用创建:设置标题、版本、OpenAPI文档路径、CORS策略、健康检查端点。
|
||||
- 异常处理:HTTP异常、请求验证异常、全局异常,均记录日志并抛出。
|
||||
- 路由注册:v1路由聚合器统一include各模块路由。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant App as "FastAPI应用"
|
||||
participant Router as "API路由"
|
||||
participant Service as "服务层"
|
||||
participant DB as "数据库"
|
||||
Client->>App : 请求 /api/v1/staff
|
||||
App->>Router : 分发到 staff.py
|
||||
Router->>Service : 调用 StaffService
|
||||
Service->>DB : 查询/写入
|
||||
DB-->>Service : 返回结果
|
||||
Service-->>Router : 业务结果
|
||||
Router-->>Client : 统一响应结构
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [main.py](file://backend/app/main.py#L50-L56)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L16-L49)
|
||||
|
||||
**章节来源**
|
||||
- [main.py](file://backend/app/main.py#L19-L76)
|
||||
- [__init__.py](file://backend/app/api/v1/__init__.py#L4-L16)
|
||||
|
||||
### 数据模型设计与业务实体
|
||||
- 实体覆盖:科室、员工、指标、考核、明细、工资、用户、计划、菜单、模板等。
|
||||
- 枚举类型:科室类型、平衡计分卡维度、员工状态、考核状态、指标类型、计划层级/状态、菜单类型、模板类型等。
|
||||
- 约束与索引:权重正数约束、多字段索引、唯一组合索引等,提升查询效率与数据一致性。
|
||||
- 关系映射:一对多/多对多、外键约束、级联删除等,确保业务完整性。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS ||--o{ STAFF : "拥有"
|
||||
STAFF ||--o{ ASSESSMENTS : "被考核"
|
||||
STAFF ||--o{ SALARY_RECORDS : "薪资记录"
|
||||
INDICATORS ||--o{ ASSESSMENT_DETAILS : "被用于"
|
||||
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "包含"
|
||||
PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : "关联指标"
|
||||
INDICATORS ||--o{ PLAN_KPI_RELATIONS : "被关联"
|
||||
USERS ||--o{ ASSESSMENTS : "审核/复核"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
|
||||
### Schema与数据验证
|
||||
- Pydantic模型:统一定义请求/响应结构,内置字段长度、范围、枚举校验。
|
||||
- 通用响应:统一code/message结构;分页响应包含总数、页码、页大小。
|
||||
- 类型安全:枚举类型与数据库枚举保持一致,避免非法值进入数据库。
|
||||
|
||||
**章节来源**
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L49-L743)
|
||||
|
||||
### 服务层架构与依赖注入
|
||||
- 服务类:以静态方法封装业务逻辑,便于测试与复用。
|
||||
- 依赖注入:通过AsyncSession注入数据库会话;通过Depends注入当前用户与权限。
|
||||
- 异步编程:所有数据库操作使用异步IO,提高并发吞吐。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StaffService {
|
||||
+get_list(db, department_id, status, keyword, page, page_size)
|
||||
+get_by_id(db, staff_id)
|
||||
+get_by_employee_id(db, employee_id)
|
||||
+create(db, staff_data)
|
||||
+update(db, staff_id, staff_data)
|
||||
+delete(db, staff_id)
|
||||
+get_by_department(db, department_id)
|
||||
}
|
||||
class AssessmentService {
|
||||
+get_list(db, staff_id, department_id, period_year, period_month, status, page, page_size)
|
||||
+get_by_id(db, assessment_id)
|
||||
+create(db, assessment_data, assessor_id)
|
||||
+update(db, assessment_id, assessment_data)
|
||||
+submit(db, assessment_id)
|
||||
+review(db, assessment_id, reviewer_id, approved, remark)
|
||||
+finalize(db, assessment_id)
|
||||
+batch_create_for_department(db, department_id, period_year, period_month, indicators)
|
||||
}
|
||||
class Assessment {
|
||||
+total_score
|
||||
+weighted_score
|
||||
+status
|
||||
}
|
||||
StaffService --> Assessment : "关联"
|
||||
AssessmentService --> Assessment : "管理"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
|
||||
**章节来源**
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
|
||||
### 安全与认证
|
||||
- OAuth2密码模式:tokenUrl指向登录接口。
|
||||
- 密码处理:bcrypt哈希与校验。
|
||||
- JWT:签发含过期时间,解析校验失败则拒绝。
|
||||
- 权限控制:当前用户、激活用户、管理员、经理权限装饰器。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant Auth as "认证路由"
|
||||
participant DB as "数据库"
|
||||
participant Sec as "安全模块"
|
||||
Client->>Auth : POST /api/v1/auth/login
|
||||
Auth->>DB : 查询用户
|
||||
DB-->>Auth : 用户对象
|
||||
Auth->>Sec : 校验密码
|
||||
Sec-->>Auth : 校验结果
|
||||
Auth->>Sec : 生成JWT
|
||||
Sec-->>Auth : access_token
|
||||
Auth-->>Client : Token
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [security.py](file://backend/app/core/security.py#L24-L52)
|
||||
|
||||
**章节来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [security.py](file://backend/app/core/security.py#L20-L110)
|
||||
|
||||
### 数据库连接管理与事务
|
||||
- 异步引擎:基于asyncpg驱动,支持连接池配置。
|
||||
- 会话工厂:AsyncSession,expire_on_commit=False减少刷新开销。
|
||||
- 依赖注入:get_db提供上下文生命周期的会话,自动commit/rollback/关闭。
|
||||
- 事务语义:异常时回滚,finally确保关闭,避免资源泄漏。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["获取会话"]) --> Exec["执行数据库操作"]
|
||||
Exec --> Success{"是否异常?"}
|
||||
Success --> |否| Commit["提交事务"]
|
||||
Success --> |是| Rollback["回滚事务"]
|
||||
Commit --> Close["关闭会话"]
|
||||
Rollback --> Close
|
||||
Close --> End(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [database.py](file://backend/app/core/database.py#L28-L38)
|
||||
|
||||
**章节来源**
|
||||
- [database.py](file://backend/app/core/database.py#L9-L38)
|
||||
|
||||
### API路由配置与统一响应
|
||||
- 路由前缀:/api/v1,统一文档路径。
|
||||
- 权限装饰器:仅管理员/经理可创建/更新/删除敏感资源。
|
||||
- 统一响应:code/message/data/分页字段,便于前端处理。
|
||||
|
||||
**章节来源**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
|
||||
|
||||
### 错误处理与日志记录
|
||||
- 异常处理:HTTP异常、请求验证异常、全局异常,均记录日志并向上抛出。
|
||||
- 日志策略:控制台INFO级别、文件DEBUG级别、错误单独ERROR文件,按日滚动。
|
||||
- 日志获取:统一logger与子logger getChild,便于模块化追踪。
|
||||
|
||||
**章节来源**
|
||||
- [main.py](file://backend/app/main.py#L58-L74)
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
|
||||
|
||||
## 依赖关系分析
|
||||
- 路由层依赖服务层与安全模块;服务层依赖数据模型与数据库会话;安全模块依赖配置与数据库;日志模块独立但被路由层使用。
|
||||
- 低耦合高内聚:每个模块职责单一,通过依赖注入解耦。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
AUTH["auth.py"] --> SEC["security.py"]
|
||||
AUTH --> SVC_STAFF["staff_service.py"]
|
||||
STAFF["staff.py"] --> SVC_STAFF
|
||||
SVC_STAFF --> MODELS["models.py"]
|
||||
SVC_ASSESS["assessment_service.py"] --> MODELS
|
||||
SEC --> DB["database.py"]
|
||||
DB --> MODELS
|
||||
MAIN["main.py"] --> API_V1["api/v1/__init__.py"]
|
||||
API_V1 --> AUTH
|
||||
API_V1 --> STAFF
|
||||
MAIN --> LOG["logging_config.py"]
|
||||
MAIN --> CFG["config.py"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [security.py](file://backend/app/core/security.py#L18-L110)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L38)
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [main.py](file://backend/app/main.py#L19-L76)
|
||||
- [__init__.py](file://backend/app/api/v1/__init__.py#L4-L16)
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
|
||||
- [config.py](file://backend/app/core/config.py#L9-L46)
|
||||
|
||||
**章节来源**
|
||||
- [main.py](file://backend/app/main.py#L19-L76)
|
||||
- [__init__.py](file://backend/app/api/v1/__init__.py#L4-L16)
|
||||
|
||||
## 性能考虑
|
||||
- 异步IO:使用SQLAlchemy 2.0异步引擎与AsyncSession,提升并发能力。
|
||||
- 连接池:通过配置项设置池大小与溢出,平衡内存与并发。
|
||||
- 查询优化:合理使用selectinload预加载关联,避免N+1问题;为高频查询字段添加索引。
|
||||
- 缓存策略:可结合Redis缓存热点数据(如字典、模板),降低数据库压力。
|
||||
- 分页与限制:默认分页大小与最大分页限制,防止大查询导致阻塞。
|
||||
- 日志级别:生产环境建议调整日志级别,减少磁盘IO与CPU消耗。
|
||||
|
||||
[本节为通用指导,无需列出具体文件来源]
|
||||
|
||||
## 故障排除指南
|
||||
- 登录失败:检查用户名是否存在、密码是否正确、账户是否激活。
|
||||
- 权限不足:确认当前用户角色(admin/manager/staff),以及是否处于激活状态。
|
||||
- 数据库连接异常:检查DATABASE_URL、连接池配置、PostgreSQL服务状态。
|
||||
- 事务未提交:确认服务层调用await db.flush()/commit(),异常时自动回滚。
|
||||
- 日志排查:查看应用日志与错误日志,定位异常堆栈与请求上下文。
|
||||
|
||||
**章节来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L22-L37)
|
||||
- [security.py](file://backend/app/core/security.py#L55-L109)
|
||||
- [database.py](file://backend/app/core/database.py#L28-L38)
|
||||
- [logging_config.py](file://backend/app/core/logging_config.py#L26-L64)
|
||||
|
||||
## 结论
|
||||
本指南梳理了医院绩效系统后端的架构与实现要点,强调了FastAPI的异步特性、依赖注入、安全认证与日志体系。通过清晰的分层与严格的Schema验证,系统具备良好的扩展性与可维护性。建议在后续迭代中完善单元测试与集成测试,持续优化查询与缓存策略,确保系统在高并发场景下的稳定性与性能。
|
||||
|
||||
[本节为总结性内容,无需列出具体文件来源]
|
||||
|
||||
## 附录
|
||||
|
||||
### 开发与运行指引
|
||||
- 初始化数据库:运行数据库初始化脚本,创建表并插入测试数据。
|
||||
- 启动应用:使用uvicorn启动FastAPI应用,默认监听0.0.0.0:8000。
|
||||
- 访问文档:/api/v1/docs 或 /api/v1/redoc。
|
||||
|
||||
**章节来源**
|
||||
- [init_db.py](file://backend/init_db.py#L11-L79)
|
||||
- [main.py](file://backend/app/main.py#L83-L91)
|
||||
404
.qoder/repowiki/zh/content/后端开发指南/安全认证.md
Normal file
404
.qoder/repowiki/zh/content/后端开发指南/安全认证.md
Normal file
@@ -0,0 +1,404 @@
|
||||
# 安全认证
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/.env](file://backend/.env)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [test_frontend_connection.py](file://test_frontend_connection.py)
|
||||
- [frontend/public/test-api.html](file://frontend/public/test-api.html)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向“医院绩效系统”的后端安全认证开发,聚焦以下主题:
|
||||
- JWT 令牌生成、验证与过期处理
|
||||
- 密码加密、盐值与安全存储
|
||||
- 用户认证流程、权限验证与角色控制
|
||||
- CORS 配置、跨域请求处理与安全头策略
|
||||
- CSRF、XSS、SQL 注入等常见攻击的缓解思路
|
||||
- 会话管理、令牌过期与安全审计
|
||||
- OAuth2 集成、第三方认证与 SSO 支持建议
|
||||
- 安全测试方法、漏洞扫描与安全加固建议
|
||||
|
||||
本指南在不泄露具体代码的前提下,结合仓库现有实现进行系统化梳理,并提供可视化图示与实操建议。
|
||||
|
||||
## 项目结构
|
||||
后端采用 FastAPI + SQLAlchemy 2.x 异步 ORM 的分层架构,安全相关能力集中在核心模块与认证路由中:
|
||||
- 应用入口与中间件:FastAPI 应用实例、CORS 中间件、全局异常处理
|
||||
- 配置中心:环境变量与运行参数(含 JWT、CORS、数据库)
|
||||
- 安全模块:JWT 编解码、密码哈希、当前用户解析与权限依赖
|
||||
- 认证路由:登录、注册、个人信息查询
|
||||
- 数据模型与模式:用户表、角色字段、令牌载荷
|
||||
- 数据库会话:异步连接与依赖注入
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用层"
|
||||
A["FastAPI 应用<br/>main.py"]
|
||||
B["CORS 中间件<br/>main.py"]
|
||||
end
|
||||
subgraph "配置层"
|
||||
C["系统配置<br/>core/config.py"]
|
||||
D[".env 环境变量<br/>.env"]
|
||||
end
|
||||
subgraph "安全层"
|
||||
E["JWT/密码/权限<br/>core/security.py"]
|
||||
end
|
||||
subgraph "认证路由"
|
||||
F["认证路由<br/>api/v1/auth.py"]
|
||||
end
|
||||
subgraph "数据层"
|
||||
G["数据库引擎/会话<br/>core/database.py"]
|
||||
H["用户模型<br/>models/models.py"]
|
||||
I["数据模式<br/>schemas/schemas.py"]
|
||||
end
|
||||
A --> B
|
||||
A --> F
|
||||
F --> E
|
||||
E --> G
|
||||
G --> H
|
||||
C --> A
|
||||
D --> C
|
||||
E --> I
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/.env](file://backend/.env#L1-L11)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L313-L346)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/.env](file://backend/.env#L1-L11)
|
||||
|
||||
## 核心组件
|
||||
- JWT 与密码安全
|
||||
- 使用 HS256 算法与对称密钥生成访问令牌;令牌包含过期时间与主体标识
|
||||
- 使用 bcrypt 进行密码哈希与校验,自动处理盐值
|
||||
- 提供从令牌解析当前用户的依赖函数,配合数据库查询与用户状态校验
|
||||
- 认证路由
|
||||
- 登录接口:用户名密码校验通过后签发访问令牌
|
||||
- 注册接口:检查用户名唯一性,生成密码哈希并持久化
|
||||
- 当前用户信息:基于依赖链完成身份与权限校验
|
||||
- 配置与中间件
|
||||
- CORS 允许指定前端源,支持凭证传递
|
||||
- 全局异常处理记录日志并向上抛出
|
||||
- 数据模型与模式
|
||||
- 用户模型包含角色与激活状态字段,支撑角色与权限控制
|
||||
- Pydantic 模式定义 Token 与用户响应结构
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L110)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L30)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L313-L346)
|
||||
|
||||
## 架构总览
|
||||
下图展示从浏览器到后端的关键交互路径,涵盖 CORS、认证、权限与数据库访问:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端应用"
|
||||
participant API as "FastAPI 应用"
|
||||
participant CORS as "CORS 中间件"
|
||||
participant AUTH as "认证路由"
|
||||
participant SEC as "安全模块"
|
||||
participant DB as "数据库"
|
||||
FE->>API : "OPTIONS /api/v1/auth/login"
|
||||
API->>CORS : "CORS 预检检查"
|
||||
CORS-->>FE : "允许的来源/方法/头"
|
||||
FE->>AUTH : "POST /api/v1/auth/login"
|
||||
AUTH->>SEC : "校验用户名/密码"
|
||||
SEC->>DB : "查询用户并比对哈希"
|
||||
DB-->>SEC : "返回用户记录"
|
||||
SEC-->>AUTH : "生成访问令牌"
|
||||
AUTH-->>FE : "返回 {access_token, token_type}"
|
||||
FE->>API : "携带 Authorization : Bearer ..."
|
||||
API->>SEC : "解析 JWT 并加载当前用户"
|
||||
SEC->>DB : "按 ID 查询用户"
|
||||
DB-->>SEC : "返回用户"
|
||||
SEC-->>API : "返回当前用户对象"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### JWT 令牌生成与验证
|
||||
- 令牌生成
|
||||
- 载荷包含过期时间与主体(用户 ID),使用对称密钥与指定算法签名
|
||||
- 默认有效期可在配置中调整
|
||||
- 令牌验证
|
||||
- 解析阶段校验签名与过期时间
|
||||
- 通过依赖注入从令牌提取主体并查询数据库获取用户对象
|
||||
- 若令牌无效或用户不存在,抛出未授权异常
|
||||
- 刷新机制
|
||||
- 当前实现未提供刷新令牌的专用端点与逻辑
|
||||
- 建议引入短期访问令牌与长期刷新令牌,配合黑名单/白名单与安全存储
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> Build["构建载荷<br/>设置过期时间/主体"]
|
||||
Build --> Sign["使用 SECRET_KEY + ALGORITHM 签名"]
|
||||
Sign --> Token["生成 access_token"]
|
||||
Token --> Verify["接收 access_token"]
|
||||
Verify --> Decode["解码并校验签名"]
|
||||
Decode --> Expired{"是否过期?"}
|
||||
Expired --> |是| Err["返回错误"]
|
||||
Expired --> |否| LoadUser["按主体查询用户"]
|
||||
LoadUser --> Found{"用户是否存在?"}
|
||||
Found --> |否| Err
|
||||
Found --> |是| Done(["返回当前用户"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L53)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L53)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
|
||||
### 密码加密、盐值与安全存储
|
||||
- 加密算法:bcrypt
|
||||
- 盐值处理:由 bcrypt 自动生成并嵌入哈希结果
|
||||
- 存储:用户模型保存完整哈希字符串
|
||||
- 校验:登录时将明文密码与存储哈希进行比对
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
In(["输入明文密码"]) --> Hash["bcrypt 生成哈希<br/>自动包含盐值"]
|
||||
Hash --> Store["存储哈希字符串"]
|
||||
Store --> VerifyIn(["登录输入明文密码"])
|
||||
VerifyIn --> Compare["bcrypt 校验明文与存储哈希"]
|
||||
Compare --> Result{"匹配?"}
|
||||
Result --> |是| Allow["允许登录"]
|
||||
Result --> |否| Deny["拒绝登录"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L31)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L31)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L31)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L31)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
### 用户认证流程与权限验证
|
||||
- 认证流程
|
||||
- 登录:提交用户名/密码,校验后签发访问令牌
|
||||
- 注册:校验用户名唯一性,生成哈希并创建用户
|
||||
- 获取当前用户:依赖链解析令牌、校验用户状态、返回用户信息
|
||||
- 权限验证
|
||||
- 当前活跃用户:校验用户是否启用
|
||||
- 管理员:校验角色为 admin
|
||||
- 管理者:校验角色为 admin 或 manager
|
||||
- 角色控制
|
||||
- 用户模型包含角色字段,路由层通过依赖强制权限
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant R as "认证路由"
|
||||
participant S as "安全模块"
|
||||
participant M as "模型/数据库"
|
||||
U->>R : "POST /api/v1/auth/login"
|
||||
R->>S : "verify_password()"
|
||||
S->>M : "select user by username"
|
||||
M-->>S : "返回用户(含哈希)"
|
||||
S-->>R : "校验通过"
|
||||
R->>S : "create_access_token(user.id)"
|
||||
S-->>R : "返回 access_token"
|
||||
R-->>U : "Token 响应"
|
||||
U->>R : "GET /api/v1/auth/me"
|
||||
R->>S : "get_current_active_user()"
|
||||
S->>S : "decode_token() + 校验过期"
|
||||
S->>M : "select user by id"
|
||||
M-->>S : "返回用户"
|
||||
S-->>R : "返回当前用户"
|
||||
R-->>U : "用户信息响应"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L68-L73)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L68-L73)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
### CORS 配置与跨域请求处理
|
||||
- CORS 中间件已在应用启动时注册,允许指定来源、凭证、方法与头
|
||||
- 前端测试脚本通过 OPTIONS 预检与 POST 登录接口验证跨域行为
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Req["浏览器发起请求"] --> Preflight{"是否预检?"}
|
||||
Preflight --> |是| Options["OPTIONS 预检"]
|
||||
Options --> Check["CORS 中间件校验 Origin/Method/Headers"]
|
||||
Check --> Allowed{"允许?"}
|
||||
Allowed --> |是| Proceed["继续后续请求"]
|
||||
Allowed --> |否| Block["拒绝请求"]
|
||||
Preflight --> |否| Proceed
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
|
||||
- [test_frontend_connection.py](file://test_frontend_connection.py#L38-L54)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L41-L48)
|
||||
- [test_frontend_connection.py](file://test_frontend_connection.py#L38-L54)
|
||||
- [frontend/public/test-api.html](file://frontend/public/test-api.html#L53-L74)
|
||||
|
||||
### CSRF、XSS 与 SQL 注入防护
|
||||
- CSRF
|
||||
- 当前未见专门的 CSRF 令牌或 SameSite Cookie 设置
|
||||
- 建议:对无状态 API,优先通过严格的 CORS 与来源校验;若使用 Cookie,启用 SameSite=Lax|Strict 并配合 CSRF 令牌
|
||||
- XSS
|
||||
- 建议:前端渲染严格转义、使用 CSP 头限制脚本来源、避免内联脚本
|
||||
- SQL 注入
|
||||
- 使用 SQLAlchemy 异步 ORM,参数化查询默认生效
|
||||
- 建议:避免原生 SQL 拼接,统一通过 ORM 或带参查询执行器
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
|
||||
|
||||
### 会话管理、令牌过期与安全审计
|
||||
- 会话管理
|
||||
- 采用无状态 JWT,无需服务端会话存储
|
||||
- 令牌过期
|
||||
- 令牌包含 exp 字段,默认有效期可配置
|
||||
- 建议:在客户端妥善存储 access_token,并在 401 时触发重新登录
|
||||
- 安全审计
|
||||
- 建议:记录登录尝试、令牌签发/失效、敏感操作审计日志
|
||||
- 当前全局异常处理器已记录 HTTP 与验证异常
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
|
||||
|
||||
### OAuth2 集成、第三方认证与 SSO 支持
|
||||
- 当前实现基于 OAuth2 密码模式,令牌由后端签发
|
||||
- 如需第三方认证(如 OIDC/SAML/SSO),建议:
|
||||
- 引入第三方 SDK 或反向代理(如 Nginx + Keycloak)
|
||||
- 将外部用户信息映射为内部用户角色与权限
|
||||
- 保持对称密钥与算法的安全配置
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L21)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
|
||||
## 依赖关系分析
|
||||
- 组件耦合
|
||||
- 认证路由依赖安全模块与数据库会话
|
||||
- 安全模块依赖配置与数据库,提供多级权限依赖
|
||||
- 应用入口集中注册 CORS 与路由,异常处理统一
|
||||
- 外部依赖
|
||||
- JWT 编解码、密码哈希、异步数据库驱动
|
||||
- 潜在问题
|
||||
- 未发现循环依赖
|
||||
- CORS 与安全头策略需与前端部署域名一致
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Auth["api/v1/auth.py"] --> Sec["core/security.py"]
|
||||
Sec --> DB["core/database.py"]
|
||||
Sec --> Model["models/models.py"]
|
||||
Sec --> Conf["core/config.py"]
|
||||
Main["app/main.py"] --> CORS["CORS 中间件"]
|
||||
Main --> Auth
|
||||
Conf --> Main
|
||||
Env[".env"] --> Conf
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/.env](file://backend/.env#L1-L11)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
|
||||
## 性能考量
|
||||
- JWT 解析与数据库查询
|
||||
- 令牌解析为内存操作;用户查询需一次数据库往返
|
||||
- 建议:为用户表与索引字段建立合适索引,减少查询开销
|
||||
- CORS 预检缓存
|
||||
- 合理设置预检缓存时间,减少重复 OPTIONS 请求
|
||||
- 会话与令牌
|
||||
- 无状态 JWT 降低服务端压力;注意令牌大小与负载字段精简
|
||||
|
||||
## 故障排查指南
|
||||
- 登录失败
|
||||
- 检查用户名/密码是否正确,确认用户处于启用状态
|
||||
- 查看后端日志定位异常
|
||||
- 跨域问题
|
||||
- 确认前端 Origin 是否在允许列表,预检请求是否返回允许头
|
||||
- 令牌无效
|
||||
- 检查令牌是否过期、算法与密钥是否匹配、主体是否正确
|
||||
- 权限不足
|
||||
- 确认用户角色满足所需权限依赖
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L31)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
|
||||
- [test_frontend_connection.py](file://test_frontend_connection.py#L38-L74)
|
||||
|
||||
## 结论
|
||||
本项目在安全认证方面具备清晰的分层与职责划分:JWT 与 bcrypt 的组合提供了可靠的令牌与密码安全;权限依赖链实现了基于角色的访问控制;CORS 中间件与异常处理提升了可用性与可观测性。建议在生产环境中进一步完善令牌刷新、CSRF 防护、安全头策略、审计日志与第三方认证集成,以满足更严格的安全要求。
|
||||
|
||||
## 附录
|
||||
- 安全测试清单
|
||||
- CORS 配置验证(预检与实际请求)
|
||||
- 登录与鉴权端点的 401/403 场景
|
||||
- 令牌过期与权限变更后的行为
|
||||
- SQL 注入与 XSS 基线扫描
|
||||
- 安全加固建议
|
||||
- 生产环境替换默认密钥与最小长度要求
|
||||
- 引入短期访问令牌与刷新令牌机制
|
||||
- 启用 HTTPS、安全响应头、CSP
|
||||
- 对高危操作增加二次确认与审计
|
||||
330
.qoder/repowiki/zh/content/后端开发指南/开发环境搭建.md
Normal file
330
.qoder/repowiki/zh/content/后端开发指南/开发环境搭建.md
Normal file
@@ -0,0 +1,330 @@
|
||||
# 开发环境搭建
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/.env.example](file://backend/.env.example)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/init_db.py](file://backend/init_db.py)
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py)
|
||||
- [backend/create_menu_tables.py](file://backend/create_menu_tables.py)
|
||||
- [backend/create_plan_tables.py](file://backend/create_plan_tables.py)
|
||||
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py)
|
||||
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py)
|
||||
- [backend/test_api.py](file://backend/test_api.py)
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向医院绩效系统后端开发团队,提供从零搭建开发环境的完整流程。内容涵盖Python环境要求、虚拟环境创建与依赖安装、环境变量与数据库配置、API配置参数、本地开发服务器启动与热重载、数据库初始化与迁移脚本执行、测试数据准备、IDE配置建议以及常见问题排查。
|
||||
|
||||
## 项目结构
|
||||
后端采用FastAPI + SQLAlchemy 2.0 + 异步数据库连接的现代Python架构,主要目录与职责如下:
|
||||
- app:核心业务逻辑,包含API路由、核心配置、数据库连接、服务层、模型与工具
|
||||
- alembic:数据库迁移脚本与配置
|
||||
- tests:测试用例(当前为空或未启用)
|
||||
- scripts:初始化脚本与工具脚本
|
||||
- 根目录:环境变量、依赖清单、迁移配置与数据库文件
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端根目录"
|
||||
ENV[".env 环境变量"]
|
||||
REQ["requirements.txt 依赖"]
|
||||
ALEMBICINI["alembic.ini 迁移配置"]
|
||||
DBFILE["hospital_performance.db SQLite 文件"]
|
||||
end
|
||||
subgraph "应用核心(app)"
|
||||
MAIN["app/main.py 应用入口"]
|
||||
CONFIG["app/core/config.py 配置"]
|
||||
DB["app/core/database.py 数据库连接"]
|
||||
MODELS["app/models/* 模型定义"]
|
||||
SERVICES["app/services/* 服务层"]
|
||||
APIS["app/api/v1/* API路由"]
|
||||
SCRIPTS["app/scripts/* 初始化脚本"]
|
||||
end
|
||||
subgraph "迁移(alembic)"
|
||||
ALEMBICENV["alembic/env.py 环境配置"]
|
||||
VERSIONS["alembic/versions/* 迁移版本"]
|
||||
end
|
||||
ENV --> CONFIG
|
||||
REQ --> MAIN
|
||||
ALEMBICINI --> ALEMBICENV
|
||||
CONFIG --> DB
|
||||
DB --> MODELS
|
||||
MAIN --> APIS
|
||||
SCRIPTS --> MODELS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
|
||||
## 核心组件
|
||||
- 应用入口与路由注册:负责创建FastAPI实例、配置CORS、注册路由前缀、健康检查与全局异常处理
|
||||
- 配置模块:集中管理应用名称、版本、调试模式、API前缀、数据库连接、JWT密钥与算法、跨域来源、分页参数等
|
||||
- 数据库连接:基于SQLAlchemy 2.0异步引擎与会话工厂,支持调试模式下的SQL回显
|
||||
- 迁移配置:Alembic配置文件,指定迁移脚本位置、路径前缀与SQLAlchemy URL
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L3-L7)
|
||||
|
||||
## 架构概览
|
||||
后端采用分层架构,核心交互流程如下:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Dev as "开发者"
|
||||
participant Uvicorn as "Uvicorn 服务器"
|
||||
participant FastAPI as "FastAPI 应用"
|
||||
participant Router as "API 路由"
|
||||
participant Service as "业务服务"
|
||||
participant DB as "数据库"
|
||||
Dev->>Uvicorn : 启动开发服务器(热重载)
|
||||
Uvicorn->>FastAPI : 加载应用实例
|
||||
FastAPI->>Router : 注册路由前缀 /api/v1
|
||||
Dev->>FastAPI : 请求 /api/v1/health
|
||||
FastAPI->>Router : 转发健康检查
|
||||
Router->>FastAPI : 返回健康状态
|
||||
FastAPI-->>Dev : 200 OK
|
||||
Dev->>FastAPI : 认证请求
|
||||
FastAPI->>Service : 调用认证服务
|
||||
Service->>DB : 查询用户信息
|
||||
DB-->>Service : 用户数据
|
||||
Service-->>FastAPI : 认证结果
|
||||
FastAPI-->>Dev : 返回访问令牌
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L54-L56)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L83-L91)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L19-L51)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Python环境与依赖安装
|
||||
- Python版本:推荐使用Python 3.10及以上版本
|
||||
- 虚拟环境:建议使用venv创建隔离环境
|
||||
- 依赖安装:通过requirements.txt安装所有后端依赖
|
||||
- 开发服务器:使用uvicorn标准变体运行FastAPI应用
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> CreateEnv["创建虚拟环境"]
|
||||
CreateEnv --> ActivateEnv["激活虚拟环境"]
|
||||
ActivateEnv --> InstallDeps["安装依赖 requirements.txt"]
|
||||
InstallDeps --> VerifyDeps{"依赖安装完成?"}
|
||||
VerifyDeps --> |是| SetupEnv["配置环境变量 .env"]
|
||||
VerifyDeps --> |否| FixDeps["检查并修复依赖问题"]
|
||||
FixDeps --> InstallDeps
|
||||
SetupEnv --> Ready["开发环境就绪"]
|
||||
Ready --> End(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
**章节来源**
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
### 环境变量与数据库配置
|
||||
- 环境变量文件:.env.example提供了数据库URL、JWT密钥与调试开关的示例
|
||||
- 数据库连接:默认使用PostgreSQL异步驱动,可通过DATABASE_URL覆盖
|
||||
- Alembic配置:迁移脚本默认指向SQLite文件,便于本地开发与测试
|
||||
- 配置优先级:应用配置从.env读取,同时支持运行时覆盖
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
EnvFile[".env.example 示例"] --> LoadEnv["加载环境变量"]
|
||||
LoadEnv --> ConfigClass["Settings 类解析"]
|
||||
ConfigClass --> DBURL["DATABASE_URL"]
|
||||
ConfigClass --> JWT["JWT 密钥/算法"]
|
||||
ConfigClass --> Debug["DEBUG 调试模式"]
|
||||
DBURL --> Engine["异步引擎创建"]
|
||||
Engine --> Session["会话工厂"]
|
||||
Session --> App["应用使用"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/.env.example](file://backend/.env.example#L3-L10)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
|
||||
|
||||
**章节来源**
|
||||
- [backend/.env.example](file://backend/.env.example#L1-L11)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
|
||||
### API配置参数
|
||||
- 应用名称与版本:用于OpenAPI文档展示
|
||||
- API前缀:统一为/api/v1,便于版本管理
|
||||
- CORS来源:允许前端开发服务器跨域访问
|
||||
- 分页参数:默认每页条数与最大限制
|
||||
- 异常处理:HTTP异常、请求验证异常与全局异常的统一处理
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L12-L33)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L19-L77)
|
||||
|
||||
### 本地开发服务器启动与热重载
|
||||
- 启动命令:直接运行app/main.py,使用uvicorn标准变体
|
||||
- 热重载:reload=True启用自动重启
|
||||
- 主机与端口:默认监听0.0.0.0:8000
|
||||
- 日志级别:info级别输出运行日志
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Dev as "开发者"
|
||||
participant Python as "Python 解释器"
|
||||
participant Uvicorn as "Uvicorn"
|
||||
participant App as "FastAPI 应用"
|
||||
Dev->>Python : python app/main.py
|
||||
Python->>Uvicorn : 启动服务器(主机=0.0.0.0, 端口=8000, 热重载)
|
||||
Uvicorn->>App : 加载应用实例
|
||||
App-->>Uvicorn : 应用就绪
|
||||
Uvicorn-->>Dev : 服务器启动完成
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L83-L91)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L83-L91)
|
||||
|
||||
### 数据库初始化与迁移脚本
|
||||
- 初始表创建:init_db.py与app/core/init_db.py分别提供不同初始化策略
|
||||
- 菜单与计划表:create_menu_tables.py与create_plan_tables.py按需创建专用表
|
||||
- 指标模板:init_indicator_templates.py批量导入平衡计分卡指标模板
|
||||
- 迁移字段:migrate_indicators.py为现有指标表添加BS维度等新字段
|
||||
- Alembic迁移:alembic.ini配置迁移脚本位置与SQLAlchemy URL
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
InitStart["开始初始化"] --> CheckTables["检查表是否存在"]
|
||||
CheckTables --> |不存在| CreateTable["创建基础表"]
|
||||
CheckTables --> |存在| SkipInit["跳过初始化"]
|
||||
CreateTable --> InsertData["插入测试/示例数据"]
|
||||
InsertData --> InitComplete["初始化完成"]
|
||||
SkipInit --> InitComplete
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L25)
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L103-L110)
|
||||
|
||||
**章节来源**
|
||||
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L1-L115)
|
||||
- [backend/create_menu_tables.py](file://backend/create_menu_tables.py#L1-L27)
|
||||
- [backend/create_plan_tables.py](file://backend/create_plan_tables.py#L1-L20)
|
||||
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py#L1-L375)
|
||||
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py#L1-L46)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
|
||||
### 测试数据准备与API验证
|
||||
- 登录测试:使用test_api.py模拟登录与获取模板数据
|
||||
- 默认账户:admin/admin123用于快速验证接口
|
||||
- 接口验证:通过健康检查与模板查询确认服务可用性
|
||||
|
||||
**章节来源**
|
||||
- [backend/test_api.py](file://backend/test_api.py#L1-L33)
|
||||
|
||||
### IDE配置与代码规范
|
||||
- Python版本:建议使用Python 3.10+
|
||||
- 虚拟环境:使用venv创建独立环境
|
||||
- 依赖管理:通过requirements.txt安装
|
||||
- 代码格式化:建议使用Black或autopep8
|
||||
- Linting:使用flake8或ruff
|
||||
- IDE插件:启用Python语言服务器与格式化工具
|
||||
|
||||
## 依赖关系分析
|
||||
后端依赖关系清晰,核心模块间耦合度低,便于维护与扩展:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FastAPI["FastAPI 应用"] --> Config["配置模块"]
|
||||
FastAPI --> Router["API 路由"]
|
||||
Config --> DB["数据库连接"]
|
||||
DB --> Models["ORM 模型"]
|
||||
Router --> Services["业务服务"]
|
||||
Services --> DB
|
||||
Scripts["初始化脚本"] --> DB
|
||||
Alembic["Alembic 迁移"] --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L10-L12)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 性能考虑
|
||||
- 异步数据库:使用SQLAlchemy异步引擎提升并发性能
|
||||
- 连接池:通过配置数据库连接池大小与溢出数量控制资源使用
|
||||
- 调试模式:仅在开发环境开启DEBUG,生产环境关闭以减少日志开销
|
||||
- CORS范围:限制允许的来源与方法,避免不必要的跨域请求
|
||||
|
||||
## 故障排除指南
|
||||
- 数据库连接失败
|
||||
- 检查DATABASE_URL格式与凭据
|
||||
- 确认PostgreSQL服务运行状态
|
||||
- 如需SQLite,请调整Alembic配置与应用配置
|
||||
- 端口被占用
|
||||
- 修改app/main.py中的端口或停止占用进程
|
||||
- 热重载无效
|
||||
- 确认reload=True且文件保存
|
||||
- 检查虚拟环境中uvicorn安装
|
||||
- 权限错误
|
||||
- 使用虚拟环境并确保pip安装权限
|
||||
- Alembic迁移问题
|
||||
- 检查alembic.ini中的SQLAlchemy URL
|
||||
- 清理历史迁移并重新生成版本
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L83-L91)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
|
||||
|
||||
## 结论
|
||||
通过本指南,您可以快速搭建医院绩效系统后端开发环境。建议严格遵循环境变量配置、数据库初始化与迁移脚本执行流程,并在开发过程中充分利用热重载与日志功能。遇到问题时,可依据故障排除指南逐项排查。
|
||||
|
||||
## 附录
|
||||
- 快速检查清单
|
||||
- Python 3.10+ 已安装
|
||||
- 虚拟环境已创建并激活
|
||||
- requirements.txt 依赖安装完成
|
||||
- .env 环境变量配置正确
|
||||
- 数据库服务运行正常
|
||||
- 应用健康检查返回200
|
||||
- 初始化脚本执行成功
|
||||
411
.qoder/repowiki/zh/content/后端开发指南/数据库集成.md
Normal file
411
.qoder/repowiki/zh/content/后端开发指南/数据库集成.md
Normal file
@@ -0,0 +1,411 @@
|
||||
# 数据库集成
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/init_db.py](file://backend/init_db.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt)
|
||||
- [backend/.env.example](file://backend/.env.example)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向“医院绩效系统”的数据库集成开发,围绕 SQLAlchemy ORM 配置、数据库连接与会话管理、初始化流程、表结构与关系映射、Alembic 迁移与版本管理、事务与并发控制、连接池配置、数据模型设计原则与索引优化、性能与查询优化、缓存策略、备份恢复与迁移测试、以及生产部署注意事项进行系统化说明。内容基于后端仓库的实际实现,确保可操作与可落地。
|
||||
|
||||
## 项目结构
|
||||
后端采用 FastAPI + SQLAlchemy 2.x 异步 ORM 的架构,数据库层位于 app/core,模型定义于 app/models,迁移脚本位于 alembic/versions,应用入口在 app/main.py。核心文件组织如下:
|
||||
- 配置与连接:app/core/config.py、app/core/database.py
|
||||
- 初始化:app/core/init_db.py、init_db.py
|
||||
- 模型:app/models/models.py、app/models/finance.py
|
||||
- 迁移:alembic/env.py、alembic/versions/*.py
|
||||
- API 与服务:app/api/v1/*、app/services/*
|
||||
- 依赖与环境:requirements.txt、.env.example
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用层"
|
||||
MAIN["app/main.py"]
|
||||
API["API 路由<br/>app/api/v1/*"]
|
||||
SERVICES["服务层<br/>app/services/*"]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
CORE_DB["连接与会话<br/>app/core/database.py"]
|
||||
MODELS["模型定义<br/>app/models/models.py<br/>app/models/finance.py"]
|
||||
INIT_DB["初始化脚本<br/>app/core/init_db.py<br/>init_db.py"]
|
||||
end
|
||||
subgraph "迁移与版本"
|
||||
ALEMBIC_ENV["Alembic 环境<br/>alembic/env.py"]
|
||||
ALEMBIC_V1["初始迁移<br/>alembic/versions/001_initial.py"]
|
||||
ALEMBIC_V2["模板迁移<br/>alembic/versions/002_template.py"]
|
||||
end
|
||||
MAIN --> API
|
||||
API --> SERVICES
|
||||
SERVICES --> CORE_DB
|
||||
CORE_DB --> MODELS
|
||||
INIT_DB --> MODELS
|
||||
ALEMBIC_ENV --> ALEMBIC_V1
|
||||
ALEMBIC_ENV --> ALEMBIC_V2
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L25)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L18-L18)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L25)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L18-L18)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
## 核心组件
|
||||
- 异步数据库引擎与会话工厂:通过 asyncpg 驱动创建异步引擎,使用 async_sessionmaker 构建会话工厂;提供 get_db 依赖以在请求生命周期内自动提交/回滚/关闭会话。
|
||||
- 配置中心:Settings 提供 DATABASE_URL、连接池大小等配置项,支持从 .env 加载。
|
||||
- 模型基类与实体:Base 作为 DeclarativeBase 子类,统一模型元数据;各业务实体(如 Department、Staff、Assessment 等)定义字段、索引与关系。
|
||||
- 迁移环境:Alembic env.py 使用 async_engine_from_config,支持异步迁移执行。
|
||||
- 初始化脚本:app/core/init_db.py 与 init_db.py 提供示例数据与表初始化能力。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L42-L53)
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L103-L115)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
|
||||
|
||||
## 架构总览
|
||||
系统采用“异步 ORM + 迁移驱动”的数据库集成架构,API 层通过依赖注入获取 AsyncSession,服务层执行查询与写入,模型层定义表结构与关系,Alembic 管理数据库版本演进。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "API 路由<br/>app/api/v1/staff.py"
|
||||
participant Service as "服务层<br/>app/services/staff_service.py"
|
||||
participant DB as "数据库引擎/会话<br/>app/core/database.py"
|
||||
participant Models as "模型定义<br/>app/models/models.py"
|
||||
Client->>API : GET /api/v1/staff
|
||||
API->>DB : 依赖注入 get_db()
|
||||
DB-->>API : AsyncSession
|
||||
API->>Service : 调用 get_list(db, filters...)
|
||||
Service->>DB : 执行 select 查询含索引
|
||||
DB->>Models : 映射到 ORM 实体
|
||||
Models-->>DB : 返回结果
|
||||
DB-->>Service : 结果集
|
||||
Service-->>API : 列表与总数
|
||||
API-->>Client : JSON 响应
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L49)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L49)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### SQLAlchemy ORM 配置与连接管理
|
||||
- 使用 asyncpg 驱动与 create_async_engine 构建异步引擎,echo 由配置开关控制。
|
||||
- async_sessionmaker(class_=AsyncSession, expire_on_commit=False) 提供会话工厂,避免过早失效导致的懒加载问题。
|
||||
- get_db 依赖在 try/finally 中自动 commit/rollback/close,保证异常安全与资源释放。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入请求"]) --> GetSession["依赖注入 AsyncSession"]
|
||||
GetSession --> TryExec["执行业务逻辑"]
|
||||
TryExec --> Commit{"是否异常?"}
|
||||
Commit --> |否| DoCommit["commit()"]
|
||||
Commit --> |是| DoRollback["rollback()"]
|
||||
DoCommit --> Close["close()"]
|
||||
DoRollback --> Close
|
||||
Close --> End(["结束请求"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
|
||||
### 数据库初始化流程
|
||||
- app/core/init_db.py:按顺序创建管理员、科室、指标、员工等初始数据,避免重复插入。
|
||||
- init_db.py:直接创建所有表并填充测试数据,适合快速启动。
|
||||
- 两者均使用异步会话,确保与 ORM 协同一致。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant CLI as "命令行"
|
||||
participant Init as "初始化脚本<br/>app/core/init_db.py"
|
||||
participant DB as "AsyncSession"
|
||||
participant Models as "模型"
|
||||
CLI->>Init : 运行 main()
|
||||
Init->>DB : 异步会话创建
|
||||
Init->>DB : 检查是否存在数据
|
||||
alt 不存在
|
||||
Init->>DB : 写入默认数据管理员/科室/指标/员工
|
||||
DB->>Models : flush/commit
|
||||
else 已存在
|
||||
Init-->>CLI : 跳过初始化
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L103-L115)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L12-L115)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
|
||||
|
||||
### 表结构定义与关系映射
|
||||
- Department 与 Staff:一对多(部门-员工),Staff 外键关联 Department。
|
||||
- Assessment 与 Staff:一对多(员工-考核记录),Assessment 与 Staff 建立双向关系。
|
||||
- Assessment 与 Indicator:多对多通过 AssessmentDetail 关联,AssessmentDetail 双向映射。
|
||||
- PerformancePlan 与 Department/Staff/User:多层级计划,支持父子计划与审批流。
|
||||
- Indicator 与 IndicatorTemplate:模板与指标的多对多通过 TemplateIndicator 关联。
|
||||
- Finance 模块:DepartmentFinance 记录科室收支,外键关联 Department。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Department {
|
||||
+id : int
|
||||
+name : str
|
||||
+code : str
|
||||
+dept_type : Enum
|
||||
+parent_id : int?
|
||||
+level : int
|
||||
+sort_order : int
|
||||
+is_active : bool
|
||||
}
|
||||
class Staff {
|
||||
+id : int
|
||||
+employee_id : str
|
||||
+name : str
|
||||
+department_id : int
|
||||
+position : str
|
||||
+title : str?
|
||||
+base_salary : float
|
||||
+performance_ratio : float
|
||||
+status : Enum
|
||||
}
|
||||
class Assessment {
|
||||
+id : int
|
||||
+staff_id : int
|
||||
+period_year : int
|
||||
+period_month : int
|
||||
+status : Enum
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+id : int
|
||||
+assessment_id : int
|
||||
+indicator_id : int
|
||||
+score : float
|
||||
}
|
||||
class Indicator {
|
||||
+id : int
|
||||
+name : str
|
||||
+code : str
|
||||
+indicator_type : Enum
|
||||
}
|
||||
class PerformancePlan {
|
||||
+id : int
|
||||
+plan_level : Enum
|
||||
+plan_year : int
|
||||
+status : Enum
|
||||
}
|
||||
class IndicatorTemplate {
|
||||
+id : int
|
||||
+template_type : Enum
|
||||
}
|
||||
class TemplateIndicator {
|
||||
+id : int
|
||||
+template_id : int
|
||||
+indicator_id : int
|
||||
}
|
||||
class DepartmentFinance {
|
||||
+id : int
|
||||
+department_id : int
|
||||
+finance_type : Enum
|
||||
+amount : float
|
||||
}
|
||||
Department "1" <-- "many" Staff : "department_id"
|
||||
Staff "1" <-- "many" Assessment : "staff_id"
|
||||
Assessment "1" <-- "many" AssessmentDetail : "assessment_id"
|
||||
Indicator "1" <-- "many" AssessmentDetail : "indicator_id"
|
||||
PerformancePlan "1" <-- "many" TemplateIndicator : "plan_id"
|
||||
Indicator "1" <-- "many" TemplateIndicator : "indicator_id"
|
||||
Department "1" <-- "many" DepartmentFinance : "department_id"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L270-L339)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L270-L339)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
### Alembic 迁移脚本与版本管理
|
||||
- env.py:配置 target_metadata 为 Base.metadata,使用 async_engine_from_config 执行异步迁移。
|
||||
- 001_initial.py:创建 departments、staff、indicators、assessments、assessment_details、salary_records、users 等核心表及索引。
|
||||
- 002_template.py:新增 indicator_templates 与 template_indicators 表,并为 indicators 表动态添加若干列(带存在性检查)。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["执行 alembic revision/upgrade"] --> B["env.py 异步引擎连接"]
|
||||
B --> C["读取 target_metadata(Base.metadata)"]
|
||||
C --> D["生成 SQL 并执行"]
|
||||
D --> E["001_initial.py: 创建核心表与索引"]
|
||||
D --> F["002_template.py: 新增模板表与列"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L42-L53)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
章节来源
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L18-L66)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
### 事务处理与并发控制
|
||||
- get_db 依赖在 try/finally 中确保异常时回滚、最终关闭会话,避免长事务与连接泄漏。
|
||||
- 会话工厂 expire_on_commit=False,减少后续查询中的额外 SELECT。
|
||||
- 建议在高并发场景下结合数据库层面的锁与重试策略(例如在服务层对关键更新加排他锁或幂等写入)。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
### 连接池配置
|
||||
- 配置项 DATABASE_POOL_SIZE 与 DATABASE_MAX_OVERFLOW 由 Settings 提供,可在 .env 中覆盖。
|
||||
- 生产环境建议根据并发与数据库资源合理设置池大小,避免连接耗尽或过度占用。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/.env.example](file://backend/.env.example#L3-L4)
|
||||
|
||||
### 数据模型设计原则、字段约束与索引优化
|
||||
- 字段约束:使用 CheckConstraint 对数值范围进行约束(如指标权重、财务金额非负)。
|
||||
- 索引优化:为高频过滤与连接字段建立复合索引(如部门类型、员工状态、考核期、工资期等)。
|
||||
- 枚举映射:通过 Enum 与 values_callable 将 Python 枚举映射为字符串存储,保持一致性与可读性。
|
||||
- 关系设计:明确主外键、级联策略(如评估明细的级联删除),避免孤儿数据。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L143-L146)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L73-L74)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L174-L178)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L227-L230)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L334-L338)
|
||||
|
||||
### 查询优化与缓存策略
|
||||
- 查询优化:优先使用索引字段过滤与排序;对关联查询使用 selectinload 或 join,减少 N+1 查询。
|
||||
- 缓存策略:对静态配置与只读数据(如枚举、字典表)使用进程内缓存;对热点统计结果使用 Redis 缓存短期聚合数据。
|
||||
- 分页与总数:使用子查询统计总数,避免 count(*) 的全表扫描。
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L24-L49)
|
||||
|
||||
### 数据备份与恢复
|
||||
- 备份:使用数据库自带工具(如 PostgreSQL 的 pg_dump)定期备份;生产环境建议增量与全量结合。
|
||||
- 恢复:在隔离环境中验证备份可用性;迁移前先在预生产环境演练。
|
||||
|
||||
(本节为通用实践说明)
|
||||
|
||||
### 迁移测试与生产部署注意事项
|
||||
- 迁移测试:在本地与预生产环境执行升级/降级,验证索引、约束与数据完整性。
|
||||
- 生产部署:使用只读迁移(避免破坏性变更);变更前冻结写入或切换到只读模式;回滚预案准备充分。
|
||||
|
||||
(本节为通用实践说明)
|
||||
|
||||
## 依赖分析
|
||||
- FastAPI 应用通过依赖注入获取 AsyncSession,服务层负责业务逻辑与查询组合。
|
||||
- 模型层定义表结构与关系,Alembic 通过 env.py 与版本脚本同步数据库结构。
|
||||
- 配置层集中管理数据库连接与池参数,.env 提供环境变量覆盖。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Config["配置<br/>app/core/config.py"] --> Engine["引擎<br/>app/core/database.py"]
|
||||
Engine --> Session["会话<br/>app/core/database.py"]
|
||||
Session --> Services["服务层<br/>app/services/*"]
|
||||
Services --> Models["模型<br/>app/models/*"]
|
||||
AlembicEnv["Alembic 环境<br/>alembic/env.py"] --> Versions["版本脚本<br/>alembic/versions/*"]
|
||||
Versions --> Models
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L25)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L18-L18)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L25)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L18-L18)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
|
||||
## 性能考虑
|
||||
- 连接池:根据并发与数据库承载能力调整池大小与溢出限制。
|
||||
- 查询:为高频过滤字段建立索引;避免 SELECT *,仅选择必要列。
|
||||
- 事务:缩短事务时间,批量写入使用 flush/commit 合理拆分。
|
||||
- 缓存:对稳定数据与统计结果进行缓存,降低数据库压力。
|
||||
|
||||
(本节提供通用指导)
|
||||
|
||||
## 故障排查指南
|
||||
- 连接失败:检查 DATABASE_URL 与 .env 是否正确;确认数据库服务可达与账号权限。
|
||||
- 迁移异常:查看 Alembic 输出与数据库日志;确认版本脚本无破坏性变更。
|
||||
- 会话异常:确认 get_db 依赖注入是否生效;避免跨请求复用会话对象。
|
||||
- 数据不一致:检查事务边界与异常处理;必要时引入幂等写入与重试。
|
||||
|
||||
章节来源
|
||||
- [backend/.env.example](file://backend/.env.example#L3-L4)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L42-L53)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 结论
|
||||
本指南基于现有代码实现了“异步 ORM + 迁移驱动”的数据库集成方案,覆盖连接管理、初始化、模型设计、迁移与版本控制、事务与并发、性能与运维等关键环节。建议在生产环境中进一步完善监控、备份与回滚策略,并持续优化查询与索引以满足业务增长需求。
|
||||
|
||||
## 附录
|
||||
- 依赖清单:见 requirements.txt。
|
||||
- 环境变量示例:见 .env.example。
|
||||
- API 示例:参考 app/api/v1/staff.py 的依赖注入与服务调用。
|
||||
|
||||
章节来源
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [backend/.env.example](file://backend/.env.example#L1-L11)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L49)
|
||||
350
.qoder/repowiki/zh/content/后端开发指南/服务层开发/工资服务.md
Normal file
350
.qoder/repowiki/zh/content/后端开发指南/服务层开发/工资服务.md
Normal file
@@ -0,0 +1,350 @@
|
||||
# 工资服务
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/init_db.py](file://backend/init_db.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [组件详解](#组件详解)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“工资服务”的开发与维护,围绕 SalaryService 类的实现架构展开,系统性阐述以下内容:
|
||||
- 绩效奖金计算算法:基础工资、绩效系数、考核等级对应的奖金计算逻辑
|
||||
- 工资记录的数据结构、字段含义与业务规则
|
||||
- 批量生成工资记录的机制:按月度、季度或年度的计算流程
|
||||
- 与考核服务、员工服务的集成关系与数据一致性保障
|
||||
- 异常处理、事务管理与性能优化策略
|
||||
- 实际计算示例与边界条件处理
|
||||
|
||||
## 项目结构
|
||||
后端采用分层架构:API 层负责路由与鉴权,Service 层封装业务逻辑,Model 层定义数据模型,Schema 层定义输入输出结构。工资服务位于 Service 层,与考核服务、员工服务协作,最终落库到 SalaryRecord。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
API["API 路由<br/>salary.py"] --> SVC["服务层<br/>salary_service.py"]
|
||||
SVC --> MODEL["模型层<br/>models.py 中的 SalaryRecord/Assessment/Staff"]
|
||||
SVC --> SCHEMA["Schema 定义<br/>schemas.py"]
|
||||
SVC --> ASSESS_SVC["考核服务<br/>assessment_service.py"]
|
||||
SVC --> STAFF_SVC["员工服务<br/>staff_service.py"]
|
||||
SVC --> DB["数据库连接<br/>database.py"]
|
||||
DB --> CONF["配置<br/>config.py"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L272-L313)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L272-L313)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 核心组件
|
||||
- 工资服务(SalaryService):提供查询、创建、更新、生成、确认、批量生成与批量确认等能力;核心算法集中在绩效奖金计算与总工资汇总。
|
||||
- 工资记录模型(SalaryRecord):持久化存储工资条目,包含基础工资、绩效得分、绩效奖金、扣款、补贴、应发工资、状态等字段。
|
||||
- 考核服务(AssessmentService):提供考核的创建、提交、审核、确认等流程,为工资生成提供“已确认”的考核数据。
|
||||
- 员工服务(StaffService):提供员工信息查询与维护,为工资生成提供基础工资与绩效系数。
|
||||
- API 路由(salary.py):对外暴露查询、生成、确认、批量生成与批量确认等接口,并进行权限校验。
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
|
||||
## 架构总览
|
||||
工资服务的调用链路如下:前端请求经 API 路由进入,由 SalaryService 执行业务逻辑;若需要从考核生成,则联动 AssessmentService 与 StaffService;最终写入数据库并返回结果。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "API 路由<br/>salary.py"
|
||||
participant SVC as "服务层<br/>salary_service.py"
|
||||
participant ASSESS as "考核服务<br/>assessment_service.py"
|
||||
participant STAFF as "员工服务<br/>staff_service.py"
|
||||
participant DB as "数据库"
|
||||
FE->>API : "POST /salary/generate"
|
||||
API->>SVC : "generate_from_assessment(staff_id, year, month)"
|
||||
SVC->>DB : "查询员工信息"
|
||||
DB-->>SVC : "Staff"
|
||||
SVC->>DB : "查询已确认考核"
|
||||
DB-->>SVC : "Assessment(finalized)"
|
||||
SVC->>SVC : "calculate_performance_bonus()"
|
||||
SVC->>DB : "插入 SalaryRecord"
|
||||
DB-->>SVC : "返回新记录"
|
||||
SVC-->>API : "返回记录ID"
|
||||
API-->>FE : "生成成功"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L110)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L195-L205)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L52-L59)
|
||||
|
||||
## 组件详解
|
||||
|
||||
### 工资记录数据模型与字段语义
|
||||
- 表名:salary_records
|
||||
- 字段与含义(节选):
|
||||
- staff_id:员工ID
|
||||
- period_year / period_month:所属周期(年/月)
|
||||
- base_salary:基本工资
|
||||
- performance_score:绩效得分
|
||||
- performance_bonus:绩效奖金
|
||||
- allowance:补贴
|
||||
- deduction:扣款
|
||||
- total_salary:应发工资(base_salary + performance_bonus + allowance - deduction)
|
||||
- status:状态(默认 pending,支持 confirmed)
|
||||
- remark:备注
|
||||
- created_at / updated_at:创建与更新时间
|
||||
|
||||
业务规则:
|
||||
- 总工资由服务层在创建/更新时计算并入库
|
||||
- 状态仅允许在“pending”状态下进行更新与确认
|
||||
- 生成工资记录前需确保同一员工当月无重复记录
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L272-L313)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L77-L124)
|
||||
|
||||
### 绩效奖金计算算法
|
||||
- 奖金基数:PERFORMANCE_BASE(静态常量)
|
||||
- 计算公式:奖金 = 奖金基数 × (绩效得分/100) × 员工绩效系数
|
||||
- 输入来源:
|
||||
- 绩效得分:来自已确认的 Assessment.weighted_score
|
||||
- 绩效系数:来自 Staff.performance_ratio
|
||||
- 输出:performance_bonus,用于后续总工资计算
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> LoadAssess["加载已确认考核<br/>Assessment.finalized"]
|
||||
LoadAssess --> LoadStaff["加载员工信息<br/>Staff.performance_ratio"]
|
||||
LoadStaff --> CalcBonus["计算奖金<br/>奖金 = 奖金基数 × 得分/100 × 系数"]
|
||||
CalcBonus --> SumTotal["汇总总工资<br/>总工资 = 基本工资 + 奖金 + 补贴 - 扣款"]
|
||||
SumTotal --> Persist["持久化 SalaryRecord"]
|
||||
Persist --> End(["结束"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L167-L170)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L173-L186)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L17-L18)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L167-L170)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L173-L186)
|
||||
|
||||
### 工资记录生成与批量处理机制
|
||||
- 单条生成:generate_from_assessment
|
||||
- 校验员工存在
|
||||
- 查询当期“已确认”的 Assessment
|
||||
- 检查是否存在重复工资记录
|
||||
- 计算奖金与总工资
|
||||
- 插入 SalaryRecord(状态 pending)
|
||||
- 批量生成:batch_generate_for_department
|
||||
- 基于部门与周期,查询所有“已确认”的 Assessment
|
||||
- 对每个评估逐条调用单条生成
|
||||
- 批量确认:batch_confirm
|
||||
- 按年/月筛选 pending 状态的记录
|
||||
- 可选按部门过滤
|
||||
- 将状态置为 confirmed 并返回确认数量
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant API as "API 路由"
|
||||
participant SVC as "SalaryService"
|
||||
participant DB as "数据库"
|
||||
API->>SVC : "batch_generate_for_department(dept_id, year, month)"
|
||||
SVC->>DB : "查询已确认考核(按部门+周期)"
|
||||
DB-->>SVC : "Assessments 列表"
|
||||
loop 遍历每个 Assessment
|
||||
SVC->>SVC : "generate_from_assessment()"
|
||||
SVC->>DB : "插入 SalaryRecord"
|
||||
end
|
||||
SVC-->>API : "返回生成的记录列表"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L113-L129)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L193-L219)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L129)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L193-L219)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L234-L259)
|
||||
|
||||
### 与考核服务、员工服务的集成关系
|
||||
- 与考核服务(AssessmentService):
|
||||
- 生成工资记录的前提是存在“已确认”的 Assessment
|
||||
- 通过 Assessment.status == "finalized" 进行筛选
|
||||
- 与员工服务(StaffService):
|
||||
- 读取员工的基础工资与绩效系数
|
||||
- 作为奖金计算的输入参数
|
||||
- 数据一致性:
|
||||
- 生成前检查重复记录,避免重复发薪
|
||||
- 仅对 pending 状态的记录允许更新与确认
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L134-L153)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L195-L205)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L52-L59)
|
||||
|
||||
### API 接口与权限控制
|
||||
- 查询列表与详情:普通用户可访问
|
||||
- 创建、更新、单条生成、确认:需要管理员或经理权限
|
||||
- 批量生成、批量确认:需要管理员或经理权限
|
||||
- 返回格式遵循统一响应结构(code/message/data)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
|
||||
## 依赖关系分析
|
||||
- SalaryService 依赖:
|
||||
- SQLAlchemy 异步会话(AsyncSession)
|
||||
- 模型:SalaryRecord、Staff、Assessment
|
||||
- Schema:SalaryRecordCreate、SalaryRecordUpdate
|
||||
- 服务:AssessmentService、StaffService
|
||||
- 外部依赖:
|
||||
- 数据库连接与事务管理(database.py)
|
||||
- 应用配置(config.py)
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SalaryService {
|
||||
+get_list(...)
|
||||
+get_by_id(...)
|
||||
+create(...)
|
||||
+update(...)
|
||||
+calculate_performance_bonus(...)
|
||||
+generate_from_assessment(...)
|
||||
+batch_generate_for_department(...)
|
||||
+confirm(...)
|
||||
+batch_confirm(...)
|
||||
}
|
||||
class AssessmentService {
|
||||
+get_by_id(...)
|
||||
+finalize(...)
|
||||
}
|
||||
class StaffService {
|
||||
+get_by_id(...)
|
||||
}
|
||||
class SalaryRecord
|
||||
class Staff
|
||||
class Assessment
|
||||
SalaryService --> AssessmentService : "查询已确认考核"
|
||||
SalaryService --> StaffService : "读取员工信息"
|
||||
SalaryService --> SalaryRecord : "创建/更新"
|
||||
SalaryService --> Staff : "读取基础工资/系数"
|
||||
SalaryService --> Assessment : "读取加权得分"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
|
||||
|
||||
## 性能考量
|
||||
- 数据库连接池与并发:
|
||||
- 配置文件提供数据库连接池大小与溢出参数,建议结合业务峰值合理设置
|
||||
- 查询优化:
|
||||
- SalaryRecord 与 Assessment 均具备按 staff_id、period、status 的索引,有利于分页与筛选
|
||||
- 批量生成时建议按部门分批处理,避免一次性加载过多记录
|
||||
- 事务与回滚:
|
||||
- 数据库会话在异常时自动回滚,确保数据一致性
|
||||
- I/O 与序列化:
|
||||
- API 层对响应进行统一包装,注意避免在高频接口中进行大量对象转换
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L26)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L227-L230)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L193-L219)
|
||||
|
||||
## 故障排查指南
|
||||
- 无法生成工资记录
|
||||
- 检查是否存在“已确认”的 Assessment
|
||||
- 检查是否已存在同员工/同周期的工资记录
|
||||
- 检查员工是否存在且基础工资/绩效系数有效
|
||||
- 更新失败
|
||||
- 仅允许对状态为“pending”的记录进行更新
|
||||
- 确认失败
|
||||
- 仅允许对状态为“pending”的记录进行确认
|
||||
- 批量生成/确认
|
||||
- 确认年/月参数正确
|
||||
- 如指定部门,确认部门ID有效
|
||||
- 数据库异常
|
||||
- 查看会话依赖的回滚逻辑是否触发
|
||||
- 检查连接池配置与数据库可用性
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L104-L124)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L222-L231)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L234-L259)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L156)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 结论
|
||||
SalaryService 提供了完整的工资核算闭环:从“已确认”的考核数据出发,结合员工基础信息,计算绩效奖金并生成工资记录;支持单条与批量生成、单条与批量确认,并通过严格的权限控制与状态约束保障业务正确性。配合合理的数据库索引与连接池配置,可在高并发场景下保持稳定与高效。
|
||||
|
||||
## 附录
|
||||
|
||||
### 实际计算示例与边界条件
|
||||
- 示例场景
|
||||
- 员工基础工资:10000,绩效系数:1.2
|
||||
- 考核加权得分:90
|
||||
- 奖金基数:3000
|
||||
- 计算过程:奖金 = 3000 × (90/100) × 1.2;总工资 = 基础工资 + 奖金 + 补贴 - 扣款
|
||||
- 边界条件
|
||||
- 绩效得分/系数为 0:奖金为 0
|
||||
- 补贴/扣款为负:不合法,应在输入层约束
|
||||
- 已存在同周期记录:拒绝重复生成
|
||||
- 非“已确认”考核:拒绝生成
|
||||
- 非“pending”状态:拒绝更新/确认
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L17-L18)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L272-L313)
|
||||
546
.qoder/repowiki/zh/content/后端开发指南/服务层开发/指标模板服务.md
Normal file
546
.qoder/repowiki/zh/content/后端开发指南/服务层开发/指标模板服务.md
Normal file
@@ -0,0 +1,546 @@
|
||||
# 指标模板服务
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档详细阐述了医院绩效管理系统中的指标模板服务,重点分析了IndicatorService和TemplateService两个核心服务的实现细节。系统基于平衡计分卡理论,实现了完整的考核指标管理和模板管理功能,包括指标类型定义、权重设置、评分标准配置、BSC维度关联等。
|
||||
|
||||
系统采用FastAPI + SQLAlchemy 2.0 + PostgreSQL的技术栈,支持异步IO操作,具备良好的扩展性和性能表现。通过标准化的API接口和数据模型设计,为医院绩效管理提供了完整的技术解决方案。
|
||||
|
||||
## 项目结构
|
||||
|
||||
后端项目采用典型的分层架构设计:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
Frontend[前端应用]
|
||||
end
|
||||
subgraph "应用层"
|
||||
API[API路由层]
|
||||
Services[服务层]
|
||||
end
|
||||
subgraph "数据层"
|
||||
Models[数据模型]
|
||||
Schemas[数据模式]
|
||||
Database[(PostgreSQL数据库)]
|
||||
end
|
||||
Frontend --> API
|
||||
API --> Services
|
||||
Services --> Models
|
||||
Models --> Database
|
||||
Schemas --> API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 指标服务 (IndicatorService)
|
||||
|
||||
IndicatorService负责考核指标的全生命周期管理,包括查询、创建、更新、删除和模板导入等功能。
|
||||
|
||||
**主要功能特性:**
|
||||
- 多条件查询和分页支持
|
||||
- 指标模板导入和覆盖机制
|
||||
- 激活指标的快速获取
|
||||
- 完整的CRUD操作支持
|
||||
|
||||
### 模板服务 (TemplateService)
|
||||
|
||||
TemplateService专注于指标模板的管理,支持模板的创建、关联、更新和删除操作。
|
||||
|
||||
**核心能力:**
|
||||
- 模板列表查询和类型过滤
|
||||
- 模板指标的增删改查
|
||||
- 模板类型和维度标签映射
|
||||
- 批量指标添加功能
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L13-L197)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构,清晰分离了表现层、应用层、服务层和数据层:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
UI[Web界面]
|
||||
Mobile[移动端应用]
|
||||
end
|
||||
subgraph "应用层"
|
||||
Auth[认证中间件]
|
||||
Validation[数据验证]
|
||||
Logging[日志记录]
|
||||
end
|
||||
subgraph "服务层"
|
||||
IndicatorSvc[指标服务]
|
||||
TemplateSvc[模板服务]
|
||||
AssessmentSvc[考核服务]
|
||||
FinanceSvc[财务服务]
|
||||
end
|
||||
subgraph "数据层"
|
||||
IndicatorModel[指标模型]
|
||||
TemplateModel[模板模型]
|
||||
AssessmentModel[考核模型]
|
||||
UserModel[用户模型]
|
||||
end
|
||||
UI --> Auth
|
||||
Mobile --> Auth
|
||||
Auth --> Validation
|
||||
Validation --> IndicatorSvc
|
||||
Validation --> TemplateSvc
|
||||
IndicatorSvc --> IndicatorModel
|
||||
TemplateSvc --> TemplateModel
|
||||
AssessmentSvc --> AssessmentModel
|
||||
IndicatorModel --> UserModel
|
||||
TemplateModel --> UserModel
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L13-L197)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 数据模型设计
|
||||
|
||||
系统采用SQLAlchemy ORM进行数据建模,建立了完整的指标和模板数据结构:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Indicator {
|
||||
+int id
|
||||
+string code
|
||||
+string name
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class IndicatorTemplate {
|
||||
+int id
|
||||
+string template_code
|
||||
+string template_name
|
||||
+TemplateType template_type
|
||||
+string description
|
||||
+string dimension_weights
|
||||
+string assessment_cycle
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class TemplateIndicator {
|
||||
+int id
|
||||
+int template_id
|
||||
+int indicator_id
|
||||
+string category
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+float weight
|
||||
+string scoring_method
|
||||
+string scoring_params
|
||||
+int sort_order
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
IndicatorTemplate "1" -- "many" TemplateIndicator : "包含"
|
||||
Indicator "many" -- "one" TemplateIndicator : "被关联"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L404)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L411-L432)
|
||||
|
||||
#### 指标类型枚举
|
||||
|
||||
系统定义了完整的指标类型体系,支持多种考核维度:
|
||||
|
||||
| 指标类型 | 描述 | 示例 |
|
||||
|---------|------|------|
|
||||
| quality | 质量指标 | 病历甲级率、院感发生率 |
|
||||
| quantity | 数量指标 | 手术台次、门诊量 |
|
||||
| efficiency | 效率指标 | 平均住院日、床位使用率 |
|
||||
| service | 服务指标 | 满意度得分、投诉次数 |
|
||||
| cost | 成本指标 | 药品比例、材料消耗 |
|
||||
|
||||
#### BSC维度配置
|
||||
|
||||
平衡计分卡四个维度的权重分配策略:
|
||||
|
||||
| 维度 | 编码 | 中文名称 | 典型权重范围 |
|
||||
|------|------|----------|-------------|
|
||||
| financial | financial | 财务管理 | 20%-40% |
|
||||
| customer | customer | 顾客服务 | 25%-35% |
|
||||
| internal_process | internal_process | 内部流程 | 20%-30% |
|
||||
| learning_growth | learning_growth | 学习与成长 | 5%-15% |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L35)
|
||||
|
||||
### API接口设计
|
||||
|
||||
系统提供RESTful API接口,支持完整的指标和模板管理操作:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API接口
|
||||
participant Service as 服务层
|
||||
participant Model as 数据模型
|
||||
participant DB as 数据库
|
||||
Client->>API : GET /api/v1/indicators
|
||||
API->>Service : get_list()
|
||||
Service->>Model : 查询指标
|
||||
Model->>DB : 执行SQL查询
|
||||
DB-->>Model : 返回结果集
|
||||
Model-->>Service : 映射实体
|
||||
Service-->>API : 返回数据
|
||||
API-->>Client : JSON响应
|
||||
Note over Client,DB : 异步查询流程
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L46)
|
||||
|
||||
#### 指标管理API
|
||||
|
||||
| 接口 | 方法 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| /api/v1/indicators | GET | 获取指标列表 | 任意用户 |
|
||||
| /api/v1/indicators/active | GET | 获取激活指标 | 任意用户 |
|
||||
| /api/v1/indicators/{id} | GET/PUT/DELETE | 指标详情管理 | 管理员/经理 |
|
||||
| /api/v1/indicators/templates/list | GET | 获取模板列表 | 任意用户 |
|
||||
| /api/v1/indicators/templates/import | POST | 导入指标模板 | 管理员/经理 |
|
||||
|
||||
#### 模板管理API
|
||||
|
||||
| 接口 | 方法 | 功能描述 | 权限要求 |
|
||||
|------|------|----------|----------|
|
||||
| /api/v1/templates | GET/POST | 模板列表管理 | 任意用户/管理员 |
|
||||
| /api/v1/templates/types | GET | 获取模板类型 | 任意用户 |
|
||||
| /api/v1/templates/dimensions | GET | 获取BSC维度 | 任意用户 |
|
||||
| /api/v1/templates/{id} | GET/PUT/DELETE | 模板详情管理 | 管理员/经理 |
|
||||
| /api/v1/templates/{id}/indicators | GET/POST | 模板指标管理 | 管理员/经理 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
### 业务流程实现
|
||||
|
||||
#### 指标模板导入流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始导入]) --> Validate[验证模板数据]
|
||||
Validate --> CheckExisting{检查指标是否存在}
|
||||
CheckExisting --> |存在且允许覆盖| UpdateExisting[更新现有指标]
|
||||
CheckExisting --> |不存在| CreateNew[创建新指标]
|
||||
CheckExisting --> |存在且不允许覆盖| Skip[跳过该指标]
|
||||
UpdateExisting --> Next[处理下一个指标]
|
||||
CreateNew --> Next
|
||||
Skip --> Next
|
||||
Next --> MoreIndicators{还有指标吗}
|
||||
MoreIndicators --> |是| Validate
|
||||
MoreIndicators --> |否| Commit[提交事务]
|
||||
Commit --> End([导入完成])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L106-L154)
|
||||
|
||||
#### 模板指标管理流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as 模板API
|
||||
participant Service as 模板服务
|
||||
participant DB as 数据库
|
||||
Client->>API : POST /templates/{id}/indicators
|
||||
API->>Service : add_indicator()
|
||||
Service->>DB : 检查模板存在性
|
||||
DB-->>Service : 模板存在
|
||||
Service->>DB : 检查指标是否已关联
|
||||
DB-->>Service : 未关联
|
||||
Service->>DB : 获取最大排序号
|
||||
DB-->>Service : 返回排序号
|
||||
Service->>DB : 添加模板指标关联
|
||||
DB-->>Service : 操作成功
|
||||
Service-->>API : 返回关联ID
|
||||
API-->>Client : 成功响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L160-L206)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L209-L221)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L106-L154)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L160-L206)
|
||||
|
||||
### 配置示例
|
||||
|
||||
#### 数据库连接配置
|
||||
|
||||
```python
|
||||
# 数据库URL格式
|
||||
DATABASE_URL = "postgresql+asyncpg://username:password@host:port/database"
|
||||
|
||||
# 示例配置
|
||||
DATABASE_URL = "postgresql+asyncpg://postgres:postgres@localhost:5432/hospital_performance"
|
||||
```
|
||||
|
||||
#### 分页配置
|
||||
|
||||
| 配置项 | 默认值 | 说明 |
|
||||
|--------|--------|------|
|
||||
| DEFAULT_PAGE_SIZE | 20 | 默认每页显示条数 |
|
||||
| MAX_PAGE_SIZE | 100 | 最大每页显示条数 |
|
||||
| API_PREFIX | /api/v1 | API前缀 |
|
||||
|
||||
#### 权限配置
|
||||
|
||||
| 角色 | 权限范围 | 可执行操作 |
|
||||
|------|----------|------------|
|
||||
| staff | 普通员工 | 查看自己的考核结果 |
|
||||
| manager | 科室负责人 | 管理本科室指标和模板 |
|
||||
| admin | 系统管理员 | 完全权限,包括用户管理 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L33)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统采用模块化设计,各组件之间保持松耦合:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "核心模块"
|
||||
CoreConfig[配置模块]
|
||||
Database[数据库模块]
|
||||
Security[安全模块]
|
||||
end
|
||||
subgraph "业务模块"
|
||||
IndicatorService[指标服务]
|
||||
TemplateService[模板服务]
|
||||
AssessmentService[考核服务]
|
||||
StaffService[员工服务]
|
||||
end
|
||||
subgraph "数据模块"
|
||||
Models[数据模型]
|
||||
Schemas[数据模式]
|
||||
end
|
||||
subgraph "API模块"
|
||||
IndicatorsAPI[指标API]
|
||||
TemplatesAPI[模板API]
|
||||
AssessmentAPI[考核API]
|
||||
end
|
||||
CoreConfig --> Database
|
||||
CoreConfig --> Security
|
||||
Database --> Models
|
||||
Security --> Schemas
|
||||
IndicatorService --> Models
|
||||
TemplateService --> Models
|
||||
AssessmentService --> Models
|
||||
StaffService --> Models
|
||||
IndicatorsAPI --> IndicatorService
|
||||
TemplatesAPI --> TemplateService
|
||||
AssessmentAPI --> AssessmentService
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L10-L12)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L9-L10)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L10-L17)
|
||||
|
||||
### 外部依赖
|
||||
|
||||
系统依赖的主要外部库:
|
||||
|
||||
| 依赖库 | 版本 | 用途 |
|
||||
|--------|------|------|
|
||||
| fastapi | 最新稳定版 | Web框架 |
|
||||
| sqlalchemy | 2.x | ORM框架 |
|
||||
| asyncpg | 最新稳定版 | PostgreSQL异步驱动 |
|
||||
| alembic | 最新稳定版 | 数据库迁移 |
|
||||
| pydantic | 最新稳定版 | 数据验证和序列化 |
|
||||
| uvicorn | 最新稳定版 | ASGI服务器 |
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L1-L11)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L17)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化
|
||||
|
||||
系统采用了多项数据库优化策略:
|
||||
|
||||
1. **索引优化**
|
||||
- 为常用查询字段建立索引
|
||||
- 使用复合索引提高查询性能
|
||||
- 合理使用唯一约束避免重复数据
|
||||
|
||||
2. **查询优化**
|
||||
- 使用分页查询避免大数据量加载
|
||||
- 实现延迟加载减少不必要的数据传输
|
||||
- 优化复杂查询的执行计划
|
||||
|
||||
3. **连接池管理**
|
||||
- 配置合适的连接池大小
|
||||
- 启用连接复用机制
|
||||
- 实现连接超时和重连机制
|
||||
|
||||
### 缓存策略
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
Request[请求到达] --> CheckCache{检查缓存}
|
||||
CheckCache --> |命中| ReturnCache[返回缓存数据]
|
||||
CheckCache --> |未命中| QueryDB[查询数据库]
|
||||
QueryDB --> ProcessData[处理数据]
|
||||
ProcessData --> CacheData[缓存数据]
|
||||
CacheData --> ReturnData[返回响应]
|
||||
ReturnCache --> End[结束]
|
||||
ReturnData --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L56-L64)
|
||||
|
||||
### 异步处理
|
||||
|
||||
系统充分利用异步IO特性:
|
||||
|
||||
- **异步数据库操作**:使用SQLAlchemy 2.0异步特性
|
||||
- **异步文件处理**:支持大文件的异步导入导出
|
||||
- **异步API调用**:减少等待时间,提高吞吐量
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 数据库连接问题
|
||||
|
||||
**问题症状:**
|
||||
- 应用启动时报数据库连接错误
|
||||
- API调用时出现连接超时
|
||||
|
||||
**解决步骤:**
|
||||
1. 检查DATABASE_URL配置是否正确
|
||||
2. 验证数据库服务是否正常运行
|
||||
3. 确认网络连接和防火墙设置
|
||||
4. 检查连接池配置参数
|
||||
|
||||
#### 权限不足问题
|
||||
|
||||
**问题症状:**
|
||||
- API调用返回403权限错误
|
||||
- 模板创建/更新操作失败
|
||||
|
||||
**解决步骤:**
|
||||
1. 验证用户身份认证状态
|
||||
2. 检查用户角色权限
|
||||
3. 确认操作所需的最小权限级别
|
||||
4. 重新登录获取新的访问令牌
|
||||
|
||||
#### 数据验证错误
|
||||
|
||||
**问题症状:**
|
||||
- API返回422数据验证错误
|
||||
- 指标创建/更新失败
|
||||
|
||||
**解决步骤:**
|
||||
1. 检查请求数据格式是否正确
|
||||
2. 验证必填字段是否完整
|
||||
3. 确认数据类型和范围限制
|
||||
4. 查看详细的错误信息提示
|
||||
|
||||
### 日志分析
|
||||
|
||||
系统提供了完善的日志记录机制:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
Request[请求处理] --> InfoLog[信息日志]
|
||||
Request --> WarnLog[警告日志]
|
||||
Request --> ErrorLog[错误日志]
|
||||
Request --> DebugLog[调试日志]
|
||||
InfoLog --> NormalOps[正常操作记录]
|
||||
WarnLog --> PotentialIssues[潜在问题预警]
|
||||
ErrorLog --> Failures[失败事件记录]
|
||||
DebugLog --> Development[开发调试信息]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
## 结论
|
||||
|
||||
本指标模板服务系统基于平衡计分卡理论,实现了完整的医院绩效管理功能。通过标准化的数据模型设计、清晰的分层架构和完善的API接口,为医院提供了灵活、可扩展的绩效管理解决方案。
|
||||
|
||||
系统的主要优势包括:
|
||||
|
||||
1. **完整的功能覆盖**:从指标定义到模板管理,涵盖绩效管理的全流程
|
||||
2. **灵活的配置机制**:支持多种评分方法和权重设置
|
||||
3. **良好的扩展性**:模块化设计便于功能扩展和定制
|
||||
4. **高性能的实现**:异步IO和数据库优化确保系统性能
|
||||
5. **完善的错误处理**:全面的日志记录和异常处理机制
|
||||
|
||||
通过持续的优化和迭代,该系统能够满足不同规模医院的绩效管理需求,为提升医疗质量和效率提供有力支撑。
|
||||
503
.qoder/repowiki/zh/content/后端开发指南/服务层开发/服务层开发.md
Normal file
503
.qoder/repowiki/zh/content/后端开发指南/服务层开发/服务层开发.md
Normal file
@@ -0,0 +1,503 @@
|
||||
# 服务层开发
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [department_service.py](file://backend/app/services/department_service.py)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
|
||||
- [template_service.py](file://backend/app/services/template_service.py)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向医院绩效系统服务层开发,系统化阐述服务层架构设计、依赖注入模式、业务逻辑封装与协作机制。文档覆盖考核服务、工资服务、统计服务、部门服务、员工服务、指标服务、财务服务、绩效计划服务、模板服务与菜单服务等核心模块,提供方法实现模式、参数校验、返回值处理、事务管理、异常处理与日志记录规范,并给出单元测试编写方法与Mock对象使用建议,以及性能优化与并发处理策略。
|
||||
|
||||
## 项目结构
|
||||
后端采用分层架构,服务层位于API层与数据访问层之间,负责业务规则封装与跨实体协调。核心目录与文件关系如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API 层"
|
||||
A1["/api/v1/assessments.py"]
|
||||
A2["/api/v1/salary.py"]
|
||||
A3["/api/v1/stats.py"]
|
||||
A4["/api/v1/departments.py"]
|
||||
A5["/api/v1/staff.py"]
|
||||
A6["/api/v1/indicators.py"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
S1["assessment_service.py"]
|
||||
S2["salary_service.py"]
|
||||
S3["stats_service.py"]
|
||||
S4["department_service.py"]
|
||||
S5["staff_service.py"]
|
||||
S6["indicator_service.py"]
|
||||
S7["finance_service.py"]
|
||||
S8["performance_plan_service.py"]
|
||||
S9["template_service.py"]
|
||||
S10["menu_service.py"]
|
||||
end
|
||||
subgraph "核心配置"
|
||||
C1["core/config.py"]
|
||||
C2["core/database.py"]
|
||||
C3["models/models.py"]
|
||||
end
|
||||
A1 --> S1
|
||||
A2 --> S2
|
||||
A3 --> S3
|
||||
A4 --> S4
|
||||
A5 --> S5
|
||||
A6 --> S6
|
||||
S1 --> C2
|
||||
S2 --> C2
|
||||
S3 --> C2
|
||||
S4 --> C2
|
||||
S5 --> C2
|
||||
S6 --> C2
|
||||
S7 --> C2
|
||||
S8 --> C2
|
||||
S9 --> C2
|
||||
S10 --> C2
|
||||
S1 --> C3
|
||||
S2 --> C3
|
||||
S3 --> C3
|
||||
S4 --> C3
|
||||
S5 --> C3
|
||||
S6 --> C3
|
||||
S7 --> C3
|
||||
S8 --> C3
|
||||
S9 --> C3
|
||||
S10 --> C3
|
||||
C1 --> C2
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L1-L368)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
**章节来源**
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 核心组件
|
||||
服务层由10个核心服务组成,分别对应业务领域:
|
||||
- 考核服务:AssessmentService(创建、更新、提交、审核、确认、批量创建)
|
||||
- 工资服务:SalaryService(计算绩效奖金、生成工资、批量生成、确认、批量确认)
|
||||
- 统计服务:StatsService(BSC维度分析、科室统计、趋势分析、排名、完成度)
|
||||
- 部门服务:DepartmentService(列表、树形结构、增删改查)
|
||||
- 员工服务:StaffService(列表、详情、增删改查、按科室查询)
|
||||
- 指标服务:IndicatorService(列表、模板导入、模板列表)
|
||||
- 财务服务:FinanceService(收支明细、收支汇总、分类统计、增删改查)
|
||||
- 绩效计划服务:PerformancePlanService(计划生命周期管理、树形结构、统计)
|
||||
- 模板服务:TemplateService(模板增删改查、指标关联、标签映射)
|
||||
- 菜单服务:MenuService(菜单树、列表、增删改查、默认菜单初始化)
|
||||
|
||||
每个服务均采用静态方法设计,便于在FastAPI依赖注入中直接调用,保持无状态与线程安全。
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L1-L368)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
|
||||
## 架构概览
|
||||
服务层通过依赖注入从API层接收AsyncSession与当前用户上下文,执行业务逻辑并返回标准化响应。事务管理由数据库会话自动处理,异常通过HTTP异常抛出,日志通过应用日志框架记录。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "API路由"
|
||||
participant Service as "服务层"
|
||||
participant DB as "数据库会话"
|
||||
participant Model as "ORM模型"
|
||||
Client->>API : "HTTP请求"
|
||||
API->>Service : "调用服务方法(AsyncSession, 参数)"
|
||||
Service->>DB : "执行SQL查询/更新"
|
||||
DB->>Model : "映射到ORM模型"
|
||||
Model-->>DB : "返回结果"
|
||||
DB-->>Service : "提交/回滚事务"
|
||||
Service-->>API : "业务结果"
|
||||
API-->>Client : "标准化响应"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L17-L242)
|
||||
- [database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 考核服务 AssessmentService
|
||||
- 功能职责
|
||||
- 列表查询:支持多条件过滤、分页、总数统计
|
||||
- 详情查询:加载员工、部门、明细与指标
|
||||
- 创建:计算总分与加权得分,批量写入明细
|
||||
- 更新:仅草稿或被拒状态下允许修改;重建明细并重算分数
|
||||
- 提交/审核/确认:状态机流转,记录操作人与时间戳
|
||||
- 批量创建:按科室与指标集合批量生成考核记录
|
||||
- 实现模式
|
||||
- 使用selectinload预加载关联,减少N+1查询
|
||||
- flush/refresh确保持久化与读取一致性
|
||||
- 状态前置校验,防止非法状态变更
|
||||
- 参数验证与返回值
|
||||
- API层进行输入参数校验与权限控制
|
||||
- 服务层返回实体或None,由API层抛出HTTP异常
|
||||
- 事务管理
|
||||
- 单次调用内统一commit/rollback,保证原子性
|
||||
- 并发处理
|
||||
- 批量创建时先查询是否存在,避免重复创建
|
||||
- 建议在API层增加幂等键与锁机制
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> CheckState["检查状态是否允许更新"]
|
||||
CheckState --> |不允许| ReturnNone["返回None"]
|
||||
CheckState --> |允许| DeleteOld["删除旧明细"]
|
||||
DeleteOld --> Recalc["遍历新明细计算总分与加权分"]
|
||||
Recalc --> Save["保存更新后的实体"]
|
||||
Save --> Refresh["刷新实体"]
|
||||
Refresh --> End(["结束"])
|
||||
ReturnNone --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L18-L263)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
|
||||
### 工资服务 SalaryService
|
||||
- 功能职责
|
||||
- 列表查询:支持按员工、科室、周期、状态过滤
|
||||
- 详情查询:加载员工与部门信息
|
||||
- 绩效奖金计算:奖金 = 基数 × (得分/100) × 绩效系数
|
||||
- 创建/更新:计算总工资,仅待确认状态下允许更新
|
||||
- 生成:从已确认考核生成工资记录
|
||||
- 批量生成:按科室批量生成
|
||||
- 确认/批量确认:变更状态并持久化
|
||||
- 实现模式
|
||||
- 通过员工信息读取基础工资与绩效系数
|
||||
- 生成时检查重复,避免重复发薪
|
||||
- 使用flush/refresh确保状态一致
|
||||
- 参数验证与返回值
|
||||
- API层校验周期与权限
|
||||
- 服务层返回实体或None,API层处理错误
|
||||
- 事务管理
|
||||
- 单次操作内commit/rollback
|
||||
- 性能优化
|
||||
- 批量生成时一次查询所有已确认考核,减少往返
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant API as "API"
|
||||
participant SS as "SalaryService"
|
||||
participant DB as "数据库"
|
||||
API->>SS : "generate_from_assessment(staff_id, year, month)"
|
||||
SS->>DB : "查询员工信息"
|
||||
DB-->>SS : "员工信息"
|
||||
SS->>DB : "查询已确认考核"
|
||||
DB-->>SS : "考核记录"
|
||||
SS->>SS : "计算绩效奖金"
|
||||
SS->>DB : "创建工资记录"
|
||||
DB-->>SS : "返回记录"
|
||||
SS-->>API : "工资记录"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L96-L129)
|
||||
|
||||
**章节来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L21-L260)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
|
||||
### 统计服务 StatsService
|
||||
- 功能职责
|
||||
- BSC维度统计:按维度汇总得分、权重与指标数量
|
||||
- 科室统计:按科室汇总人数、总分、平均分、最高/最低分
|
||||
- 趋势分析:月度趋势(支持跨年)
|
||||
- 排名:员工与科室排名
|
||||
- 完成度:指标平均分、目标完成率
|
||||
- 实现模式
|
||||
- 使用SQL聚合函数与分组,避免Python侧聚合
|
||||
- 条件动态拼接,支持多维过滤
|
||||
- 性能优化
|
||||
- 合理使用索引与分页
|
||||
- 趋势分析中对跨年场景进行区间合并
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> BuildCond["构建查询条件"]
|
||||
BuildCond --> ExecQuery["执行聚合查询"]
|
||||
ExecQuery --> GroupBy["按维度/科室/月份分组"]
|
||||
GroupBy --> CalcAvg["计算平均分与完成率"]
|
||||
CalcAvg --> Format["格式化输出"]
|
||||
Format --> End(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L300)
|
||||
|
||||
**章节来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L19-L300)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L17-L242)
|
||||
|
||||
### 部门服务 DepartmentService
|
||||
- 功能职责
|
||||
- 列表查询:按类型与启用状态过滤
|
||||
- 树形结构:手动构建父子关系,避免懒加载问题
|
||||
- 增删改查:层级计算、唯一性校验
|
||||
- 实现模式
|
||||
- 手动构建树形结构,确保序列化稳定
|
||||
- 删除前检查子节点,防止破坏层级
|
||||
- 错误处理
|
||||
- 不存在或有子节点时返回False/None,由API层抛错
|
||||
|
||||
**章节来源**
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L16-L150)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L20-L108)
|
||||
|
||||
### 员工服务 StaffService
|
||||
- 功能职责
|
||||
- 列表查询:支持关键字搜索(姓名/工号)
|
||||
- 详情查询:加载部门信息
|
||||
- 增删改查:唯一性校验(工号)
|
||||
- 按科室查询:返回在职员工
|
||||
- 实现模式
|
||||
- 使用ilike进行模糊匹配
|
||||
- selectinload预加载部门
|
||||
|
||||
**章节来源**
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L16-L112)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
|
||||
### 指标服务 IndicatorService
|
||||
- 功能职责
|
||||
- 列表查询:按类型、维度、启用状态过滤
|
||||
- 模板导入:支持覆盖策略
|
||||
- 模板列表:内置模板集合
|
||||
- 实现模式
|
||||
- JSON字段存储适用科室类型数组
|
||||
- 导入时检查编码唯一性
|
||||
|
||||
**章节来源**
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L16-L197)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L20-L142)
|
||||
|
||||
### 财务服务 FinanceService
|
||||
- 功能职责
|
||||
- 收入/支出明细查询与汇总
|
||||
- 收支结余计算
|
||||
- 按类别统计收入/支出
|
||||
- 增删改查财务记录
|
||||
- 科室汇总:全院科室财务汇总
|
||||
- 实现模式
|
||||
- 类别标签映射,增强可读性
|
||||
- 使用coalesce处理空值
|
||||
|
||||
**章节来源**
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L43-L368)
|
||||
|
||||
### 绩效计划服务 PerformancePlanService
|
||||
- 功能职责
|
||||
- 计划生命周期:草稿→待审批→批准→执行中→完成/取消
|
||||
- 树形结构:支持层级关系
|
||||
- 统计:按状态统计数量
|
||||
- 指标关联:增删改查
|
||||
- 实现模式
|
||||
- 状态机严格控制流转
|
||||
- 树形构建使用字典映射
|
||||
|
||||
**章节来源**
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L18-L342)
|
||||
|
||||
### 模板服务 TemplateService
|
||||
- 功能职责
|
||||
- 模板增删改查与指标关联
|
||||
- 指标排序与去重
|
||||
- 标签映射:类型与维度标签
|
||||
- 实现模式
|
||||
- 排序字段自动生成
|
||||
- 关联唯一约束避免重复
|
||||
|
||||
**章节来源**
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L23-L293)
|
||||
|
||||
### 菜单服务 MenuService
|
||||
- 功能职责
|
||||
- 菜单树形结构与列表查询
|
||||
- 增删改查与默认菜单初始化
|
||||
- 实现模式
|
||||
- 递归转字典,支持前端渲染
|
||||
- 初始化时检查是否已有数据
|
||||
|
||||
**章节来源**
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L15-L137)
|
||||
|
||||
## 依赖分析
|
||||
服务层依赖关系清晰,API层通过依赖注入获取AsyncSession与当前用户,服务层仅依赖数据库会话与模型定义,耦合度低、内聚性强。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
API_A["/api/v1/assessments.py"] --> SVC_A["AssessmentService"]
|
||||
API_S["/api/v1/salary.py"] --> SVC_S["SalaryService"]
|
||||
API_T["/api/v1/stats.py"] --> SVC_T["StatsService"]
|
||||
API_D["/api/v1/departments.py"] --> SVC_D["DepartmentService"]
|
||||
API_ST["/api/v1/staff.py"] --> SVC_ST["StaffService"]
|
||||
API_I["/api/v1/indicators.py"] --> SVC_I["IndicatorService"]
|
||||
SVC_A --> DB["get_db() AsyncSession"]
|
||||
SVC_S --> DB
|
||||
SVC_T --> DB
|
||||
SVC_D --> DB
|
||||
SVC_ST --> DB
|
||||
SVC_I --> DB
|
||||
SVC_A --> MODELS["models.py ORM"]
|
||||
SVC_S --> MODELS
|
||||
SVC_T --> MODELS
|
||||
SVC_D --> MODELS
|
||||
SVC_ST --> MODELS
|
||||
SVC_I --> MODELS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
- [database.py](file://backend/app/core/database.py#L28-L39)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
**章节来源**
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 使用selectinload预加载关联,避免N+1查询
|
||||
- 合理使用索引(如staff、assessment、salary等表的复合索引)
|
||||
- 分页参数限制,避免超大结果集
|
||||
- 事务与并发
|
||||
- 服务层单次调用内commit/rollback,保证一致性
|
||||
- 批量操作使用flush减少往返
|
||||
- 对重复创建场景增加存在性检查
|
||||
- 缓存与降级
|
||||
- 对只读统计结果可引入Redis缓存
|
||||
- 对高频查询结果进行分页与限流
|
||||
- 日志与监控
|
||||
- 记录慢查询与异常堆栈
|
||||
- 结合数据库慢查询日志定位瓶颈
|
||||
|
||||
## 故障排除指南
|
||||
- 常见异常
|
||||
- 未找到实体:返回None,API层抛出404
|
||||
- 状态不允许:返回None,API层抛出400
|
||||
- 唯一性冲突:编码重复导致创建失败,API层抛出400
|
||||
- 事务回滚
|
||||
- 数据库会话在异常时自动回滚,确保数据一致性
|
||||
- 日志记录
|
||||
- 应用日志与错误日志分离,便于排查
|
||||
- 记录关键业务事件(创建、更新、状态变更)
|
||||
|
||||
**章节来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L60-L115)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L61-L142)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L76-L111)
|
||||
- [database.py](file://backend/app/core/database.py#L31-L36)
|
||||
|
||||
## 结论
|
||||
服务层通过清晰的职责划分、严格的参数校验与状态机控制、完善的事务与异常处理,有效支撑了医院绩效系统的业务闭环。建议在后续迭代中进一步完善单元测试覆盖率、引入缓存与监控告警,并持续优化查询性能与并发处理能力。
|
||||
|
||||
## 附录
|
||||
|
||||
### 服务方法实现模式清单
|
||||
- 列表查询:支持多条件过滤、分页、总数统计
|
||||
- 详情查询:加载关联实体,返回完整信息
|
||||
- 创建/更新:参数校验、业务计算、flush/refresh
|
||||
- 删除:前置检查(如子节点、状态)
|
||||
- 批量操作:批量查询、循环处理、一次性commit
|
||||
|
||||
### 参数验证与返回值处理
|
||||
- API层负责输入参数校验与权限控制
|
||||
- 服务层返回实体或None,由API层统一抛出HTTP异常
|
||||
- 响应体遵循统一结构(code/message/data/total/page/page_size)
|
||||
|
||||
### 事务管理与异常处理
|
||||
- 服务层单次调用内commit/rollback
|
||||
- 数据库异常自动回滚并抛出
|
||||
- 建议在API层捕获并记录异常日志
|
||||
|
||||
### 日志记录规范
|
||||
- 记录关键业务事件与异常堆栈
|
||||
- 区分应用日志与错误日志
|
||||
- 包含请求ID、用户ID、操作时间
|
||||
|
||||
### 单元测试编写方法与Mock对象使用
|
||||
- Mock数据库会话:使用unittest.mock.patch替换get_db依赖
|
||||
- Mock服务方法:对复杂业务逻辑进行隔离测试
|
||||
- 测试用例覆盖正常路径、边界条件与异常分支
|
||||
- 使用pytest与factory_boy生成测试数据
|
||||
|
||||
### 性能优化与并发处理
|
||||
- 查询优化:预加载、索引、分页
|
||||
- 事务优化:批量flush、减少往返
|
||||
- 并发控制:幂等键、锁机制、重试策略
|
||||
- 监控与告警:慢查询、错误率、吞吐量
|
||||
568
.qoder/repowiki/zh/content/后端开发指南/服务层开发/系统管理服务.md
Normal file
568
.qoder/repowiki/zh/content/后端开发指南/服务层开发/系统管理服务.md
Normal file
@@ -0,0 +1,568 @@
|
||||
# 系统管理服务
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py)
|
||||
- [finance.py](file://backend/app/api/v1/finance.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [security.py](file://backend/app/core/security.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [main.py](file://backend/app/main.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档详细阐述了医院绩效系统的三大核心管理服务:绩效计划服务、菜单服务和财务服务。这些服务构成了整个系统的管理中枢,负责组织架构管理、权限控制和财务核算等关键业务功能。
|
||||
|
||||
系统采用现代化的FastAPI + SQLAlchemy架构,支持异步IO操作,具备良好的扩展性和维护性。通过清晰的分层设计,实现了业务逻辑与数据访问的分离,确保了系统的稳定性和可测试性。
|
||||
|
||||
## 项目结构
|
||||
|
||||
后端项目采用典型的三层架构设计:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层 (API Layer)"
|
||||
API[API路由]
|
||||
Schemas[数据模式]
|
||||
end
|
||||
subgraph "服务层 (Service Layer)"
|
||||
PerfService[绩效计划服务]
|
||||
MenuService[菜单服务]
|
||||
FinanceService[财务服务]
|
||||
end
|
||||
subgraph "数据访问层 (Data Access Layer)"
|
||||
Models[数据模型]
|
||||
DB[数据库]
|
||||
end
|
||||
subgraph "基础设施层"
|
||||
Security[安全认证]
|
||||
Config[系统配置]
|
||||
Database[数据库连接]
|
||||
end
|
||||
API --> PerfService
|
||||
API --> MenuService
|
||||
API --> FinanceService
|
||||
PerfService --> Models
|
||||
MenuService --> Models
|
||||
FinanceService --> Models
|
||||
Models --> DB
|
||||
Security --> API
|
||||
Config --> API
|
||||
Database --> Models
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [main.py](file://backend/app/main.py#L15-L77)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [finance.py](file://backend/app/api/v1/finance.py#L1-L217)
|
||||
|
||||
**章节来源**
|
||||
- [main.py](file://backend/app/main.py#L15-L77)
|
||||
- [config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L39)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 绩效计划服务 (PerformancePlanService)
|
||||
|
||||
绩效计划服务是系统的核心业务组件,负责完整的绩效计划生命周期管理:
|
||||
|
||||
- **计划创建与管理**:支持多层级、多类型的绩效计划创建
|
||||
- **状态流转控制**:严格的审批流程和状态管理
|
||||
- **指标关联管理**:灵活的KPI指标配置和权重设置
|
||||
- **统计分析功能**:提供全面的计划执行统计和分析
|
||||
|
||||
### 菜单服务 (MenuService)
|
||||
|
||||
菜单服务提供完整的前端导航管理能力:
|
||||
|
||||
- **树形结构管理**:支持多级菜单的层次化管理
|
||||
- **权限控制集成**:与用户权限系统深度集成
|
||||
- **动态菜单生成**:根据用户角色动态生成菜单树
|
||||
- **默认菜单初始化**:系统启动时自动初始化基础菜单结构
|
||||
|
||||
### 财务服务 (FinanceService)
|
||||
|
||||
财务服务专注于医院经济核算管理:
|
||||
|
||||
- **收支管理**:完整的收入和支出记录管理
|
||||
- **科室核算**:按科室维度的财务数据分析
|
||||
- **预算控制**:支持预算执行情况跟踪
|
||||
- **报表统计**:多维度的财务统计和分析报表
|
||||
|
||||
**章节来源**
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L15-L342)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L12-L137)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L17-L368)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构设计,确保关注点分离和职责明确:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用入口"
|
||||
Main[主应用]
|
||||
Router[API路由器]
|
||||
end
|
||||
subgraph "认证与授权"
|
||||
Security[安全模块]
|
||||
Auth[认证中间件]
|
||||
end
|
||||
subgraph "业务服务层"
|
||||
PerfSvc[绩效计划服务]
|
||||
MenuSvc[菜单服务]
|
||||
FinanceSvc[财务服务]
|
||||
end
|
||||
subgraph "数据模型层"
|
||||
PerfModel[绩效模型]
|
||||
MenuModel[菜单模型]
|
||||
FinanceModel[财务模型]
|
||||
end
|
||||
subgraph "数据存储层"
|
||||
DB[(PostgreSQL)]
|
||||
Cache[(Redis)]
|
||||
end
|
||||
Main --> Router
|
||||
Router --> Security
|
||||
Security --> PerfSvc
|
||||
Security --> MenuSvc
|
||||
Security --> FinanceSvc
|
||||
PerfSvc --> PerfModel
|
||||
MenuSvc --> MenuModel
|
||||
FinanceSvc --> FinanceModel
|
||||
PerfModel --> DB
|
||||
MenuModel --> DB
|
||||
FinanceModel --> DB
|
||||
DB --> Cache
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [main.py](file://backend/app/main.py#L19-L51)
|
||||
- [security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L15-L342)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L12-L137)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L17-L368)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 绩效计划管理功能
|
||||
|
||||
#### 计划生命周期管理
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 待审批 : 提交申请
|
||||
待审批 --> 已批准 : 审批通过
|
||||
待审批 --> 已驳回 : 审批驳回
|
||||
已批准 --> 执行中 : 激活计划
|
||||
执行中 --> 已完成 : 计划结束
|
||||
执行中 --> 已取消 : 主动取消
|
||||
已批准 --> 已取消 : 主动取消
|
||||
已驳回 --> 草稿 : 修改后重新提交
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L233-L242)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
|
||||
|
||||
#### KPI指标关联管理
|
||||
|
||||
绩效计划与KPI指标的关联管理提供了灵活的指标配置能力:
|
||||
|
||||
- **权重分配**:支持不同指标的权重设置
|
||||
- **目标值设定**:为每个指标设置目标值和单位
|
||||
- **评分方法**:支持自定义评分方法和参数
|
||||
- **动态调整**:运行期可调整指标配置
|
||||
|
||||
**章节来源**
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L196-L249)
|
||||
- [models.py](file://backend/app/models/models.py#L314-L338)
|
||||
|
||||
### 菜单权限管理功能
|
||||
|
||||
#### 菜单树形结构管理
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Menu {
|
||||
+int id
|
||||
+int parent_id
|
||||
+MenuType menu_type
|
||||
+string menu_name
|
||||
+string menu_icon
|
||||
+string path
|
||||
+string component
|
||||
+string permission
|
||||
+int sort_order
|
||||
+bool is_visible
|
||||
+bool is_active
|
||||
+DateTime created_at
|
||||
+DateTime updated_at
|
||||
}
|
||||
class MenuService {
|
||||
+get_tree(visible_only) Dict[]
|
||||
+get_list(menu_type, is_visible) Menu[]
|
||||
+get_by_id(menu_id) Menu
|
||||
+create(menu_data) Menu
|
||||
+update(menu_id, menu_data) Menu
|
||||
+delete(menu_id) bool
|
||||
+init_default_menus() void
|
||||
}
|
||||
MenuService --> Menu : manages
|
||||
Menu --> Menu : children
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L347-L372)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L12-L137)
|
||||
|
||||
#### 权限控制机制
|
||||
|
||||
系统实现了基于角色的权限控制(RBAC):
|
||||
|
||||
- **用户角色**:admin(管理员)、manager(经理)、staff(员工)
|
||||
- **权限验证**:@get_current_active_user(普通用户)、@get_current_manager_user(管理员/经理)
|
||||
- **菜单权限**:通过permission字段控制菜单显示和访问
|
||||
- **操作权限**:针对不同操作设置不同的权限要求
|
||||
|
||||
**章节来源**
|
||||
- [security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L98-L163)
|
||||
|
||||
### 财务相关功能
|
||||
|
||||
#### 科室财务核算
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class DepartmentFinance {
|
||||
+int id
|
||||
+int department_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+FinanceType finance_type
|
||||
+string category
|
||||
+float amount
|
||||
+string source
|
||||
+string remark
|
||||
+DateTime created_at
|
||||
+DateTime updated_at
|
||||
}
|
||||
class FinanceService {
|
||||
+get_department_revenue(department_id, year, month) Dict[]
|
||||
+get_department_expense(department_id, year, month) Dict[]
|
||||
+get_department_balance(department_id, year, month) Dict
|
||||
+get_revenue_by_category(department_id, year, month) Dict[]
|
||||
+get_expense_by_category(department_id, year, month) Dict[]
|
||||
+create_finance_record(params) DepartmentFinance
|
||||
+update_finance_record(id, params) DepartmentFinance
|
||||
+delete_finance_record(id) bool
|
||||
+get_department_summary(year, month) Dict[]
|
||||
}
|
||||
FinanceService --> DepartmentFinance : manages
|
||||
DepartmentFinance --> Department : belongs_to
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L17-L368)
|
||||
|
||||
#### 财务类别管理
|
||||
|
||||
系统支持标准化的财务类别管理:
|
||||
|
||||
- **收入类别**:检查费、检验费、放射费、床位费、护理费、治疗费、手术费、注射费、吸氧费、其他
|
||||
- **支出类别**:材料费、人员支出、维修费、水电费、其他
|
||||
- **类别验证**:严格的类别有效性检查
|
||||
- **标签本地化**:支持中文标签显示
|
||||
|
||||
**章节来源**
|
||||
- [finance_service.py](file://backend/app/services/finance_service.py#L20-L41)
|
||||
- [finance.py](file://backend/app/models/finance.py#L16-L43)
|
||||
|
||||
### 系统配置管理
|
||||
|
||||
#### 环境配置管理
|
||||
|
||||
系统采用集中式配置管理:
|
||||
|
||||
- **数据库配置**:支持PostgreSQL异步连接池
|
||||
- **JWT配置**:Token过期时间和算法设置
|
||||
- **CORS配置**:跨域资源共享设置
|
||||
- **分页配置**:默认和最大分页大小设置
|
||||
|
||||
#### 数据库连接管理
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API服务
|
||||
participant Session as 数据库会话
|
||||
participant Pool as 连接池
|
||||
participant DB as PostgreSQL
|
||||
Client->>API : 请求数据
|
||||
API->>Session : 获取数据库会话
|
||||
Session->>Pool : 从连接池获取连接
|
||||
Pool->>DB : 建立数据库连接
|
||||
DB-->>Pool : 返回连接
|
||||
Pool-->>Session : 返回连接
|
||||
Session-->>API : 返回数据
|
||||
API-->>Client : 响应数据
|
||||
API->>Session : 提交事务
|
||||
Session->>DB : 提交数据
|
||||
DB-->>Session : 确认提交
|
||||
Session->>Pool : 归还连接
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [database.py](file://backend/app/core/database.py#L28-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L18-L26)
|
||||
|
||||
**章节来源**
|
||||
- [config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L39)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 服务间依赖关系
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "API层"
|
||||
PerfAPI[绩效计划API]
|
||||
MenuAPI[菜单API]
|
||||
FinanceAPI[财务API]
|
||||
end
|
||||
subgraph "服务层"
|
||||
PerfService[绩效计划服务]
|
||||
MenuService[菜单服务]
|
||||
FinanceService[财务服务]
|
||||
end
|
||||
subgraph "模型层"
|
||||
PerfModel[绩效模型]
|
||||
MenuModel[菜单模型]
|
||||
FinanceModel[财务模型]
|
||||
UserModel[用户模型]
|
||||
end
|
||||
subgraph "基础设施"
|
||||
Security[安全模块]
|
||||
DB[数据库]
|
||||
Config[配置模块]
|
||||
end
|
||||
PerfAPI --> PerfService
|
||||
MenuAPI --> MenuService
|
||||
FinanceAPI --> FinanceService
|
||||
PerfService --> PerfModel
|
||||
MenuService --> MenuModel
|
||||
FinanceService --> FinanceModel
|
||||
PerfService --> UserModel
|
||||
Security --> PerfService
|
||||
Security --> MenuService
|
||||
Security --> FinanceService
|
||||
PerfModel --> DB
|
||||
MenuModel --> DB
|
||||
FinanceModel --> DB
|
||||
UserModel --> DB
|
||||
Config --> PerfAPI
|
||||
Config --> MenuAPI
|
||||
Config --> FinanceAPI
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L15-L16)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L11-L12)
|
||||
- [finance.py](file://backend/app/api/v1/finance.py#L14-L16)
|
||||
|
||||
### 数据模型依赖关系
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
PERFORMANCE_PLANS {
|
||||
int id PK
|
||||
string plan_name
|
||||
string plan_code UK
|
||||
enum plan_level
|
||||
int plan_year
|
||||
int plan_month
|
||||
enum status
|
||||
int department_id FK
|
||||
int staff_id FK
|
||||
int parent_plan_id FK
|
||||
bool is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
PLAN_KPI_RELATIONS {
|
||||
int id PK
|
||||
int plan_id FK
|
||||
int indicator_id FK
|
||||
float target_value
|
||||
string target_unit
|
||||
float weight
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
MENUS {
|
||||
int id PK
|
||||
int parent_id FK
|
||||
enum menu_type
|
||||
string menu_name
|
||||
string menu_icon
|
||||
string path
|
||||
string component
|
||||
string permission
|
||||
int sort_order
|
||||
bool is_visible
|
||||
bool is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENT_FINANCES {
|
||||
int id PK
|
||||
int department_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
enum finance_type
|
||||
string category
|
||||
float amount
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
USERS {
|
||||
int id PK
|
||||
string username UK
|
||||
string password_hash
|
||||
int staff_id FK
|
||||
string role
|
||||
bool is_active
|
||||
datetime last_login
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : contains
|
||||
MENUS ||--o{ MENUS : children
|
||||
DEPARTMENT_FINANCES }o--|| DEPARTMENTS : belongs_to
|
||||
PLAN_KPI_RELATIONS }o--|| INDICATORS : links_to
|
||||
PERFORMANCE_PLANS }o--|| DEPARTMENTS : belongs_to
|
||||
PERFORMANCE_PLANS }o--|| STAFF : responsible_for
|
||||
PERFORMANCE_PLANS }o--|| USERS : submitted_by
|
||||
DEPARTMENT_FINANCES }o--|| DEPARTMENTS : belongs_to
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L270-L338)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L16-L79)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库性能优化
|
||||
|
||||
系统采用了多项数据库性能优化策略:
|
||||
|
||||
- **索引优化**:为常用查询字段建立复合索引
|
||||
- **连接池管理**:配置合理的连接池大小和溢出限制
|
||||
- **异步操作**:使用SQLAlchemy异步引擎提升并发性能
|
||||
- **查询优化**:采用selectinload进行N+1查询优化
|
||||
|
||||
### 缓存策略
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Request[请求到达] --> CheckCache{检查缓存}
|
||||
CheckCache --> |命中| ReturnCache[返回缓存数据]
|
||||
CheckCache --> |未命中| QueryDB[查询数据库]
|
||||
QueryDB --> ProcessData[处理数据]
|
||||
ProcessData --> UpdateCache[更新缓存]
|
||||
UpdateCache --> ReturnData[返回数据]
|
||||
ReturnCache --> End[请求结束]
|
||||
ReturnData --> End
|
||||
```
|
||||
|
||||
### 异步处理
|
||||
|
||||
系统充分利用异步特性:
|
||||
|
||||
- **异步数据库操作**:避免阻塞主线程
|
||||
- **异步文件处理**:支持大文件上传和下载
|
||||
- **异步任务队列**:后台任务处理(如报表生成)
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题诊断
|
||||
|
||||
#### 认证失败问题
|
||||
|
||||
当遇到认证失败时,检查以下方面:
|
||||
|
||||
1. **Token有效性**:确认Token未过期且格式正确
|
||||
2. **用户状态**:验证用户账户是否被激活
|
||||
3. **权限级别**:确认用户具有执行操作的权限
|
||||
4. **JWT配置**:检查密钥和算法配置
|
||||
|
||||
#### 数据库连接问题
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
ConnectFail[连接失败] --> CheckURL{检查数据库URL}
|
||||
CheckURL --> URLCorrect{URL格式正确?}
|
||||
URLCorrect --> |否| FixURL[修复数据库URL]
|
||||
URLCorrect --> |是| CheckPool{检查连接池配置}
|
||||
CheckPool --> PoolOK{连接池正常?}
|
||||
PoolOK --> |否| AdjustPool[调整连接池参数]
|
||||
PoolOK --> |是| CheckAuth{检查认证信息}
|
||||
CheckAuth --> AuthOK{认证成功?}
|
||||
AuthOK --> |否| FixAuth[修复认证信息]
|
||||
AuthOK --> |是| Success[连接成功]
|
||||
```
|
||||
|
||||
#### 权限控制问题
|
||||
|
||||
当权限控制出现问题时:
|
||||
|
||||
1. **检查用户角色**:确认用户角色设置正确
|
||||
2. **验证菜单权限**:检查菜单的permission字段
|
||||
3. **审查API装饰器**:确认使用了正确的权限装饰器
|
||||
4. **查看日志信息**:分析认证和授权日志
|
||||
|
||||
**章节来源**
|
||||
- [security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 结论
|
||||
|
||||
本系统通过精心设计的三层架构,成功实现了医院绩效管理的核心功能。三大管理服务各司其职,既保持了高度的内聚性,又确保了适当的耦合度。
|
||||
|
||||
系统的主要优势包括:
|
||||
|
||||
- **模块化设计**:清晰的职责分离便于维护和扩展
|
||||
- **安全性保障**:完善的认证授权机制确保系统安全
|
||||
- **性能优化**:异步架构和数据库优化提升系统性能
|
||||
- **可扩展性**:灵活的数据模型支持业务发展需求
|
||||
|
||||
通过持续的优化和完善,该系统能够有效支撑医院的绩效管理工作,为提升医疗服务质量提供有力的技术保障。
|
||||
448
.qoder/repowiki/zh/content/后端开发指南/服务层开发/统计分析服务.md
Normal file
448
.qoder/repowiki/zh/content/后端开发指南/服务层开发/统计分析服务.md
Normal file
@@ -0,0 +1,448 @@
|
||||
# 统计分析服务
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“统计分析服务”的开发与使用,围绕 StatsService 类的实现原理展开,系统阐述多维度统计分析、数据聚合与报表生成能力,重点覆盖以下主题:
|
||||
- BSC(平衡计分卡)维度分析:财务、客户、内部流程、学习与成长四个维度的指标计算与聚合
|
||||
- 科室绩效统计:按科室汇总、平均分、最高/最低分、人员列表与排序
|
||||
- 趋势分析:按月度的时间序列趋势(平均分、加权分)
|
||||
- 排名统计:按加权分的绩效排名
|
||||
- 指标完成度:指标平均分、最大/最小分、完成率
|
||||
- 数据库交互模式、查询优化与潜在缓存策略
|
||||
- 统计结果的数据格式化、图表数据准备与 API 接口设计
|
||||
- 具体统计场景示例与性能考虑
|
||||
|
||||
## 项目结构
|
||||
后端采用 FastAPI + SQLAlchemy 2.x 异步 ORM 的架构,统计分析服务位于服务层,API 层负责请求参数解析与响应封装,模型层定义数据结构与枚举,数据库层提供异步连接与会话管理。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用层"
|
||||
API["API 路由<br/>stats.py"]
|
||||
SVC["服务层<br/>stats_service.py"]
|
||||
end
|
||||
subgraph "模型层"
|
||||
MODELS["数据模型与枚举<br/>models.py"]
|
||||
end
|
||||
subgraph "基础设施"
|
||||
CFG["配置<br/>config.py"]
|
||||
DB["数据库连接<br/>database.py"]
|
||||
MAIN["应用入口<br/>main.py"]
|
||||
end
|
||||
API --> SVC
|
||||
SVC --> MODELS
|
||||
API --> DB
|
||||
SVC --> DB
|
||||
DB --> CFG
|
||||
MAIN --> API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
|
||||
## 核心组件
|
||||
- StatsService:提供 BSC 维度统计、科室统计、趋势分析、排名、指标完成度等统计方法
|
||||
- API 路由 stats.py:定义 /stats 前缀下的统计接口,负责参数校验、默认值处理与统一响应包装
|
||||
- 数据模型与枚举:包含 BSC 维度、评估状态、科室类型、指标类型等,支撑统计逻辑
|
||||
- 数据库与配置:异步连接、会话工厂、数据库 URL 与池参数
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L52)
|
||||
|
||||
## 架构总览
|
||||
统计分析服务遵循“API → 服务 → 模型/数据库”的分层架构。API 层负责输入参数与响应格式标准化;服务层执行复杂聚合与计算;模型层提供数据结构与枚举;数据库层提供异步连接与事务管理。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "API(stats.py)"
|
||||
participant Svc as "StatsService"
|
||||
participant DB as "AsyncSession"
|
||||
participant Model as "ORM模型"
|
||||
Client->>API : GET /api/v1/stats/bsc-dimension
|
||||
API->>API : 参数校验与默认值处理
|
||||
API->>Svc : 调用 get_bsc_dimension_stats(...)
|
||||
Svc->>DB : 异步查询SQLAlchemy select + func
|
||||
DB->>Model : 映射到 Assessment/AssessmentDetail/Indicator/Department/Staff
|
||||
Svc-->>API : 返回聚合结果
|
||||
API-->>Client : 统一响应 {code,message,data}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L33)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L181)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### StatsService 类与方法族
|
||||
- get_bsc_dimension_stats:按 BSC 四维度聚合得分、权重与指标数量,计算平均分
|
||||
- get_department_stats:按科室汇总人员、总分、平均分、最高/最低分与人员列表,并整体排序
|
||||
- get_trend_stats:按月度聚合平均分与加权分,支持跨年范围与科室过滤
|
||||
- get_ranking_stats:按加权分排名前 N 的员工
|
||||
- get_completion_stats:按指标统计平均分、最大/最小分、完成率与样本数
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StatsService {
|
||||
+get_bsc_dimension_stats(db, department_id, period_year, period_month) Dict
|
||||
+get_department_stats(db, period_year, period_month) List
|
||||
+get_trend_stats(db, department_id, period_year, months) List
|
||||
+get_ranking_stats(db, period_year, period_month, limit) List
|
||||
+get_completion_stats(db, indicator_id, period_year, period_month) Dict
|
||||
}
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentStatus status
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
}
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
}
|
||||
class Department {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+DeptType dept_type
|
||||
}
|
||||
class Staff {
|
||||
+int id
|
||||
+string employee_id
|
||||
+string name
|
||||
+int department_id
|
||||
}
|
||||
StatsService --> Assessment : "查询"
|
||||
StatsService --> AssessmentDetail : "连接"
|
||||
StatsService --> Indicator : "按维度聚合"
|
||||
StatsService --> Department : "科室汇总"
|
||||
StatsService --> Staff : "关联人员"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L181)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L299)
|
||||
|
||||
#### BSC 维度分析(get_bsc_dimension_stats)
|
||||
- 输入:可选科室 ID、年、月
|
||||
- 过滤:仅统计已确认的考核记录
|
||||
- 聚合:按 BSC 维度分组,计算总分(加权)、总权重、指标数量与平均分
|
||||
- 输出:包含各维度的得分、权重、指标数与平均分,以及统计周期
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入 get_bsc_dimension_stats"]) --> BuildCond["构建查询条件<br/>状态=FINALIZED(+年+月+科室)"]
|
||||
BuildCond --> ExecSel["执行聚合查询<br/>按维度分组(sum(score*weight), sum(weight), count)"]
|
||||
ExecSel --> Iterate["遍历结果<br/>填充维度字典"]
|
||||
Iterate --> CalcAvg["计算平均分=总分/总权重"]
|
||||
CalcAvg --> Ret["返回 {dimensions, period}"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
|
||||
#### 科室绩效统计(get_department_stats)
|
||||
- 输入:年、月
|
||||
- 过滤:仅统计已确认的考核记录
|
||||
- 聚合:按科室汇总人员数、总分、平均分、最高/最低分,并收集人员得分列表
|
||||
- 排序:按平均分降序
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
S(["进入 get_department_stats"]) --> Q["查询关联数据<br/>Staff→Assessment→Department"]
|
||||
Q --> Group["按科室分组聚合<br/>计数/求和/记录人员列表"]
|
||||
Group --> Compute["计算平均分=总分/人数"]
|
||||
Compute --> Sort["按平均分降序排序"]
|
||||
Sort --> R(["返回科室统计列表"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L74-L146)
|
||||
|
||||
#### 趋势分析(get_trend_stats)
|
||||
- 输入:可选科室 ID、年(为空则使用当前年)、月份数(默认 6)
|
||||
- 范围:若未指定年份,按当前年份与最近 N 个月推导起止月份,支持跨年
|
||||
- 聚合:按月度 group by,计算平均分与加权分、样本数
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Enter(["进入 get_trend_stats"]) --> YearCheck{"是否指定年份?"}
|
||||
YearCheck -- 否 --> SetCur["设置为当前年份"]
|
||||
YearCheck -- 是 --> KeepYear["使用传入年份"]
|
||||
SetCur --> Range["计算起始月=当前月-N+1<br/>处理跨年"]
|
||||
KeepYear --> Range
|
||||
Range --> Cond["构造月份范围条件"]
|
||||
Cond --> Join["连接 Staff 并过滤 FINALIZED"]
|
||||
Join --> GroupBy["按月分组聚合"]
|
||||
GroupBy --> Out(["返回月度趋势列表"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L148-L199)
|
||||
|
||||
#### 排名统计(get_ranking_stats)
|
||||
- 输入:年、月、限制条数
|
||||
- 过滤:仅统计已确认的考核记录
|
||||
- 排序:按加权分降序,返回前 N 条并标注排名
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant API as "API"
|
||||
participant Svc as "StatsService"
|
||||
participant DB as "AsyncSession"
|
||||
API->>Svc : get_ranking_stats(year, month, limit)
|
||||
Svc->>DB : select Staff/Assessment/Department
|
||||
DB-->>Svc : 结果集
|
||||
Svc-->>API : 按加权分降序,标注 rank
|
||||
API-->>API : 统一响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L201-L244)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L210-L224)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L201-L244)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L210-L224)
|
||||
|
||||
#### 指标完成度(get_completion_stats)
|
||||
- 输入:可选指标 ID、年、月
|
||||
- 过滤:仅统计已确认的考核记录
|
||||
- 聚合:按指标 group by,计算平均分、最大/最小分、样本数与完成率(平均分/目标值)
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
In(["进入 get_completion_stats"]) --> Cond["构造条件<br/>FINALIZED(+年+月+指标ID?)"]
|
||||
Cond --> Sel["select 指标字段 + avg/max/min/count"]
|
||||
Sel --> Group["group by 指标"]
|
||||
Group --> Rate["完成率=avg/max(target_value)"]
|
||||
Rate --> Ret(["返回指标完成度列表"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L246-L299)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L246-L299)
|
||||
|
||||
### API 接口设计与数据格式
|
||||
- 统一响应结构:包含 code、message、data 字段
|
||||
- 参数校验与默认值:
|
||||
- 年/月未传时,趋势与周期统计接口会使用当前年/月
|
||||
- 排名与周期统计支持 limit 控制返回数量
|
||||
- 接口一览:
|
||||
- GET /stats/bsc-dimension:BSC 维度分析
|
||||
- GET /stats/department:科室绩效统计
|
||||
- GET /stats/trend:趋势分析(月度)
|
||||
- GET /stats/department-ranking:科室绩效排名(前 N)
|
||||
- GET /stats/ranking:个人绩效排名(前 N)
|
||||
- GET /stats/completion:指标完成度
|
||||
- GET /stats/period:周期统计(含汇总)
|
||||
- GET /stats/alerts、/stats/kpi-gauges、/stats/finance-trend:预留接口(当前返回模拟数据)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant Router as "FastAPI 路由"
|
||||
participant Handler as "stats.py 处理函数"
|
||||
participant Svc as "StatsService"
|
||||
participant DB as "AsyncSession"
|
||||
Client->>Router : GET /api/v1/stats/bsc-dimension?year&month&dept_id
|
||||
Router->>Handler : 参数解析与默认值
|
||||
Handler->>Svc : 调用对应统计方法
|
||||
Svc->>DB : 异步查询
|
||||
DB-->>Svc : 结果
|
||||
Svc-->>Handler : 聚合结果
|
||||
Handler-->>Client : {code,message,data}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L242)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L17-L242)
|
||||
|
||||
### 数据模型与枚举(支撑统计)
|
||||
- BSCDimension:financial、customer、internal_process、learning_growth
|
||||
- AssessmentStatus:FINALIZED 等
|
||||
- DeptType、IndicatorType 等枚举用于过滤与分类
|
||||
- 关键实体:Assessment、AssessmentDetail、Indicator、Department、Staff
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class BSCDimension {
|
||||
<<enum>>
|
||||
+FINANCIAL
|
||||
+CUSTOMER
|
||||
+INTERNAL_PROCESS
|
||||
+LEARNING_GROWTH
|
||||
}
|
||||
class AssessmentStatus {
|
||||
<<enum>>
|
||||
+FINALIZED
|
||||
}
|
||||
class DeptType {
|
||||
<<enum>>
|
||||
+CLINICAL_SURGICAL
|
||||
+...
|
||||
}
|
||||
class IndicatorType {
|
||||
<<enum>>
|
||||
+QUALITY
|
||||
+QUANTITY
|
||||
+EFFICIENCY
|
||||
+SERVICE
|
||||
+COST
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L61)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L61)
|
||||
|
||||
## 依赖分析
|
||||
- 统计服务依赖 SQLAlchemy 异步会话与 ORM 模型,通过 select + func 实现聚合
|
||||
- API 层依赖服务层与数据库会话注入
|
||||
- 配置层提供数据库连接参数与池大小,影响并发与吞吐
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
API["api/v1/stats.py"] --> SVC["services/stats_service.py"]
|
||||
SVC --> MODELS["models/models.py"]
|
||||
API --> DB["core/database.py"]
|
||||
SVC --> DB
|
||||
DB --> CFG["core/config.py"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [backend/app/services/stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 性能考量
|
||||
- 查询优化
|
||||
- 使用 group by 与聚合函数(sum、avg、count)减少应用侧循环计算
|
||||
- 通过索引字段过滤(Assessment.status、Assessment.period_year/month、Assessment.staff_id)降低扫描范围
|
||||
- 趋势分析中按月分组,避免大结果集内存占用
|
||||
- 数据库连接与并发
|
||||
- 异步连接与会话工厂支持高并发;数据库池参数可在配置中调优
|
||||
- 缓存策略(建议)
|
||||
- 对高频但不频繁变化的统计结果(如 BSC 维度、指标完成度)引入短期缓存(如 Redis)
|
||||
- 按参数组合生成缓存键(年、月、科室、指标等)
|
||||
- 响应格式化
|
||||
- 将数值统一为浮点并限制精度,便于前端图表渲染
|
||||
- 提供图表友好的数组结构(时间序列、排名列表)
|
||||
|
||||
[本节为通用性能指导,不直接分析具体文件]
|
||||
|
||||
## 故障排查指南
|
||||
- 常见问题
|
||||
- 参数缺失:年/月未传导致默认值逻辑异常,检查 API 层默认值处理
|
||||
- 权限与认证:确保请求携带有效 Token
|
||||
- 数据缺失:仅统计已确认的考核记录,若无数据请检查 Assessment.status
|
||||
- 日志与异常
|
||||
- 应用层已注册全局异常处理器,便于定位错误
|
||||
- 建议在服务层增加关键步骤的日志输出(如查询条件、聚合结果规模)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L75)
|
||||
- [backend/app/api/v1/stats.py](file://backend/app/api/v1/stats.py#L52-L70)
|
||||
|
||||
## 结论
|
||||
统计分析服务以 StatsService 为核心,围绕 BSC 四维度、科室统计、趋势分析、排名与指标完成度构建了完整的多维统计能力。通过 SQLAlchemy 异步 ORM 与合理的查询策略,实现了高效的数据聚合与报表生成。建议在生产环境中引入缓存与更细粒度的索引优化,并持续完善财务、预警与仪表盘等预留接口的实际数据来源。
|
||||
|
||||
[本节为总结性内容,不直接分析具体文件]
|
||||
|
||||
## 附录
|
||||
|
||||
### 统计场景示例
|
||||
- BSC 维度分析:按月查看财务、客户、内部流程、学习与成长四个维度的加权得分与平均分
|
||||
- 科室绩效:按月汇总各科室平均分、最高/最低分与人员列表,用于科室排名与改进
|
||||
- 趋势分析:查看近 6 个月的平均分与加权分变化,识别波动与改善趋势
|
||||
- 排名统计:查看个人绩效排名前 10 的员工及其所在科室
|
||||
- 指标完成度:查看各指标的平均分、完成率与样本数,辅助指标优化
|
||||
|
||||
[本节为概念性场景说明,不直接分析具体文件]
|
||||
|
||||
### 与系统设计文档的对应关系
|
||||
- 系统设计强调“多维度考核”“科学量化”“流程自动化”“报表与分析中心”,统计分析服务正对应“报表与分析中心”的实现。
|
||||
|
||||
**章节来源**
|
||||
- [docs/详细设计.md](file://docs/详细设计.md#L155-L164)
|
||||
473
.qoder/repowiki/zh/content/后端开发指南/服务层开发/考核服务.md
Normal file
473
.qoder/repowiki/zh/content/后端开发指南/服务层开发/考核服务.md
Normal file
@@ -0,0 +1,473 @@
|
||||
# 考核服务
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [security.py](file://backend/app/core/security.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [main.py](file://backend/app/main.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
考核服务是医院绩效管理系统的核心模块,负责管理员工的绩效考核流程。该服务实现了完整的考核生命周期管理,包括考核记录的CRUD操作、状态管理和流程控制。系统采用基于平衡计分卡(BSC)的多维度考核体系,支持多种科室类型的差异化考核需求。
|
||||
|
||||
## 项目结构
|
||||
|
||||
考核服务位于后端应用的服务层,采用清晰的分层架构设计:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API层"
|
||||
A[API路由]
|
||||
B[认证中间件]
|
||||
end
|
||||
subgraph "服务层"
|
||||
C[AssessmentService]
|
||||
D[其他服务]
|
||||
end
|
||||
subgraph "数据层"
|
||||
E[模型定义]
|
||||
F[数据库]
|
||||
end
|
||||
subgraph "配置层"
|
||||
G[数据库配置]
|
||||
H[安全配置]
|
||||
I[应用配置]
|
||||
end
|
||||
A --> C
|
||||
B --> A
|
||||
C --> E
|
||||
E --> F
|
||||
G --> F
|
||||
H --> A
|
||||
I --> A
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L39)
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### AssessmentService 类
|
||||
|
||||
AssessmentService 是考核服务的核心类,提供了完整的考核管理功能:
|
||||
|
||||
#### 主要职责
|
||||
- 考核记录的创建、读取、更新、删除
|
||||
- 考核状态的流转管理
|
||||
- 考核分数的自动计算
|
||||
- 批量考核创建功能
|
||||
|
||||
#### 关键特性
|
||||
- 异步数据库操作支持
|
||||
- 完整的状态机管理
|
||||
- 自动化的分数计算
|
||||
- 权限控制集成
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
|
||||
## 架构概览
|
||||
|
||||
考核服务采用经典的三层架构模式,确保了良好的关注点分离:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API路由
|
||||
participant Service as AssessmentService
|
||||
participant DB as 数据库
|
||||
participant Model as 数据模型
|
||||
Client->>API : HTTP请求
|
||||
API->>Service : 调用服务方法
|
||||
Service->>DB : 执行数据库操作
|
||||
DB->>Model : 映射数据模型
|
||||
Model-->>DB : 返回实体对象
|
||||
DB-->>Service : 返回查询结果
|
||||
Service-->>API : 返回业务结果
|
||||
API-->>Client : HTTP响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L17-L263)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 数据模型设计
|
||||
|
||||
#### Assessment 模型
|
||||
Assessment 模型代表一条完整的考核记录,包含以下关键字段:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+string period_type
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentStatus status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
+datetime submit_time
|
||||
+datetime review_time
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+string evidence
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class Staff {
|
||||
+int id
|
||||
+string employee_id
|
||||
+string name
|
||||
+int department_id
|
||||
+string position
|
||||
+string title
|
||||
+string phone
|
||||
+string email
|
||||
+float base_salary
|
||||
+float performance_ratio
|
||||
+StaffStatus status
|
||||
+datetime hire_date
|
||||
}
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
}
|
||||
Assessment "1" -- "many" AssessmentDetail : "包含"
|
||||
Assessment "1" -- "1" Staff : "关联"
|
||||
AssessmentDetail "1" -- "1" Indicator : "关联"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [models.py](file://backend/app/models/models.py#L181-L203)
|
||||
|
||||
#### AssessmentStatus 状态枚举
|
||||
考核状态采用严格的有限状态机设计:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> DRAFT : 创建
|
||||
DRAFT --> SUBMITTED : 提交
|
||||
SUBMITTED --> REVIEWED : 审核通过
|
||||
SUBMITTED --> REJECTED : 审核驳回
|
||||
REVIEWED --> FINALIZED : 确认
|
||||
REJECTED --> DRAFT : 修改后重新提交
|
||||
FINALIZED --> [*] : 结束
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L45-L52)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [models.py](file://backend/app/models/models.py#L45-L52)
|
||||
|
||||
### 核心业务方法详解
|
||||
|
||||
#### 1. 列表查询方法
|
||||
|
||||
`get_list()` 方法提供了灵活的考核记录查询功能:
|
||||
|
||||
**功能特点:**
|
||||
- 多条件过滤支持(员工ID、科室ID、年度、月份、状态)
|
||||
- 分页查询支持
|
||||
- 性能优化的子查询统计
|
||||
- 关联数据预加载
|
||||
|
||||
**查询逻辑:**
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始查询]) --> BuildQuery["构建基础查询"]
|
||||
BuildQuery --> CheckFilters{"是否有过滤条件?"}
|
||||
CheckFilters --> |是| ApplyFilters["应用过滤条件"]
|
||||
CheckFilters --> |否| CountQuery["构建统计查询"]
|
||||
ApplyFilters --> CountQuery
|
||||
CountQuery --> Pagination["应用分页"]
|
||||
Pagination --> ExecuteQuery["执行查询"]
|
||||
ExecuteQuery --> ReturnResults["返回结果"]
|
||||
ReturnResults --> End([结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L18-L56)
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L18-L56)
|
||||
|
||||
#### 2. 详情获取方法
|
||||
|
||||
`get_by_id()` 方法提供了完整的考核详情查询:
|
||||
|
||||
**功能特点:**
|
||||
- 关联员工信息查询
|
||||
- 考核明细及指标信息加载
|
||||
- 预加载优化减少N+1查询
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L58-L68)
|
||||
|
||||
#### 3. 创建考核方法
|
||||
|
||||
`create()` 方法实现了完整的考核创建流程:
|
||||
|
||||
**核心算法:**
|
||||
1. 计算总分:所有明细得分的简单求和
|
||||
2. 计算加权得分:每个指标得分乘以其权重后的总和
|
||||
3. 创建主记录和明细记录
|
||||
4. 自动设置初始状态为草稿
|
||||
|
||||
**分数计算公式:**
|
||||
- 总分 = Σ(明细得分)
|
||||
- 加权得分 = Σ(明细得分 × 指标权重)
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
|
||||
#### 4. 更新考核方法
|
||||
|
||||
`update()` 方法提供了受控的考核更新功能:
|
||||
|
||||
**状态限制:**
|
||||
- 仅允许草稿和被驳回状态的记录进行更新
|
||||
- 更新时会删除旧的考核明细并重新创建
|
||||
|
||||
**更新流程:**
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始更新]) --> LoadAssessment["加载考核记录"]
|
||||
LoadAssessment --> CheckStatus{"状态是否允许更新?"}
|
||||
CheckStatus --> |否| ReturnNull["返回None"]
|
||||
CheckStatus --> |是| DeleteOldDetails["删除旧明细"]
|
||||
DeleteOldDetails --> RecalculateScores["重新计算分数"]
|
||||
RecalculateScores --> UpdateFields["更新其他字段"]
|
||||
UpdateFields --> SaveChanges["保存更改"]
|
||||
SaveChanges --> ReturnAssessment["返回更新后的记录"]
|
||||
ReturnNull --> End([结束])
|
||||
ReturnAssessment --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L111-L156)
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L111-L156)
|
||||
|
||||
#### 5. 流程控制方法
|
||||
|
||||
##### 提交方法 (`submit`)
|
||||
将草稿状态的考核记录提交到审核流程。
|
||||
|
||||
##### 审核方法 (`review`)
|
||||
管理员或经理对提交的考核进行审核:
|
||||
- 通过:状态转为已审核
|
||||
- 驳回:状态转为被驳回并可添加审核意见
|
||||
|
||||
##### 确认方法 (`finalize`)
|
||||
最终确认已审核的考核记录,状态转为已确认。
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L159-L205)
|
||||
|
||||
#### 6. 批量创建方法
|
||||
|
||||
`batch_create_for_department()` 实现了高效的批量考核创建:
|
||||
|
||||
**功能特点:**
|
||||
- 为指定科室的所有在职员工批量创建考核
|
||||
- 自动检查重复创建
|
||||
- 为每个员工创建相同的考核指标模板
|
||||
|
||||
**使用场景:**
|
||||
- 月末批量创建员工考核
|
||||
- 新指标模板上线时的批量创建
|
||||
- 年度考核周期开始时的批量初始化
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
|
||||
|
||||
### API 接口设计
|
||||
|
||||
#### RESTful API 规范
|
||||
|
||||
| 接口 | 方法 | 权限 | 功能描述 |
|
||||
|------|------|------|----------|
|
||||
| `/assessments` | GET | 任意用户 | 获取考核列表 |
|
||||
| `/assessments` | POST | 普通用户 | 创建考核记录 |
|
||||
| `/assessments/{id}` | GET | 任意用户 | 获取考核详情 |
|
||||
| `/assessments/{id}` | PUT | 普通用户 | 更新考核记录 |
|
||||
| `/assessments/{id}/submit` | POST | 普通用户 | 提交考核 |
|
||||
| `/assessments/{id}/review` | POST | 管理员/经理 | 审核考核 |
|
||||
| `/assessments/{id}/finalize` | POST | 管理员/经理 | 确认考核 |
|
||||
| `/assessments/batch-create` | POST | 管理员/经理 | 批量创建考核 |
|
||||
|
||||
**章节来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 外部依赖
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "核心依赖"
|
||||
A[SQLAlchemy 2.0]
|
||||
B[FastAPI]
|
||||
C[Pydantic]
|
||||
D[PostgreSQL]
|
||||
end
|
||||
subgraph "服务层"
|
||||
E[AssessmentService]
|
||||
F[其他业务服务]
|
||||
end
|
||||
subgraph "数据层"
|
||||
G[模型定义]
|
||||
H[数据库连接]
|
||||
end
|
||||
E --> A
|
||||
E --> G
|
||||
F --> A
|
||||
G --> H
|
||||
H --> D
|
||||
B --> C
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L12)
|
||||
- [database.py](file://backend/app/core/database.py#L4-L20)
|
||||
|
||||
### 内部依赖关系
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[AssessmentService] --> B[Assessment 模型]
|
||||
A --> C[AssessmentDetail 模型]
|
||||
A --> D[Staff 模型]
|
||||
A --> E[Indicator 模型]
|
||||
A --> F[AssessmentStatus 枚举]
|
||||
A --> G[数据库会话]
|
||||
H[API路由] --> A
|
||||
I[安全模块] --> H
|
||||
J[配置模块] --> H
|
||||
K[数据库配置] --> G
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L10-L11)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L14-L15)
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L12)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L17)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库优化策略
|
||||
|
||||
1. **索引优化**
|
||||
- 考核记录按员工ID、年度月份、状态建立复合索引
|
||||
- 考核明细按考核记录ID、指标ID建立索引
|
||||
|
||||
2. **查询优化**
|
||||
- 使用 selectinload 进行关联数据预加载
|
||||
- 子查询统计避免全表扫描
|
||||
|
||||
3. **连接池管理**
|
||||
- 异步连接池配置
|
||||
- 连接超时和重试机制
|
||||
|
||||
### 缓存策略
|
||||
|
||||
- 使用 LRU 缓存存储常用配置
|
||||
- 数据库查询结果缓存(可选)
|
||||
|
||||
### 异步处理
|
||||
|
||||
- 全面采用异步数据库操作
|
||||
- 避免阻塞式I/O操作
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 1. 考核状态错误
|
||||
**问题:** 尝试在不允许的状态下更新或操作考核
|
||||
**解决方案:** 检查当前状态是否符合操作要求
|
||||
|
||||
#### 2. 权限不足
|
||||
**问题:** 审核或确认操作返回403错误
|
||||
**解决方案:** 确认当前用户具有管理员或经理权限
|
||||
|
||||
#### 3. 数据库连接问题
|
||||
**问题:** 数据库操作失败
|
||||
**解决方案:** 检查数据库连接配置和网络连通性
|
||||
|
||||
#### 4. 分页查询异常
|
||||
**问题:** 分页参数无效导致查询错误
|
||||
**解决方案:** 验证页码和每页数量参数范围
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L117-L118)
|
||||
- [security.py](file://backend/app/core/security.py#L94-L109)
|
||||
|
||||
## 结论
|
||||
|
||||
考核服务通过精心设计的架构和完善的业务逻辑,为医院绩效管理提供了强大的技术支持。系统的主要优势包括:
|
||||
|
||||
1. **完整的生命周期管理**:从创建到确认的完整流程覆盖
|
||||
2. **灵活的查询能力**:支持多维度、多条件的复杂查询
|
||||
3. **严格的状态控制**:确保业务流程的合规性
|
||||
4. **高效的批量处理**:支持大规模数据的批量操作
|
||||
5. **完善的权限控制**:基于角色的精细化权限管理
|
||||
|
||||
该服务为后续的薪资计算、统计分析等功能奠定了坚实的基础,是整个绩效管理系统的核心支柱。
|
||||
423
.qoder/repowiki/zh/content/后端开发指南/服务层开发/部门员工服务.md
Normal file
423
.qoder/repowiki/zh/content/后端开发指南/服务层开发/部门员工服务.md
Normal file
@@ -0,0 +1,423 @@
|
||||
# 部门员工服务
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“部门与员工服务”的开发与运维,围绕 DepartmentService 与 StaffService 的实现架构进行系统化说明。内容涵盖:
|
||||
- 部门管理:树形结构管理、层级关系维护、增删改查与有效性校验
|
||||
- 员工管理:信息维护、职位与职称字段、基本工资与绩效系数、状态管理
|
||||
- 数据模型关系映射:部门与员工的外键约束、索引与级联策略
|
||||
- 高级能力:树形查询、分页与统计、权限控制、事务处理
|
||||
- 实际业务场景示例与最佳实践
|
||||
|
||||
## 项目结构
|
||||
后端采用 FastAPI + SQLAlchemy Async 异步 ORM 架构,服务层位于 app/services,API 路由位于 app/api/v1,数据模型位于 app/models,配置与安全位于 app/core。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API 层"
|
||||
A1["/api/v1/departments.py"]
|
||||
A2["/api/v1/staff.py"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
S1["services/department_service.py"]
|
||||
S2["services/staff_service.py"]
|
||||
end
|
||||
subgraph "模型层"
|
||||
M1["models/models.py"]
|
||||
M2["models/finance.py"]
|
||||
end
|
||||
subgraph "基础设施"
|
||||
C1["core/config.py"]
|
||||
C2["core/database.py"]
|
||||
C3["core/security.py"]
|
||||
end
|
||||
A1 --> S1
|
||||
A2 --> S2
|
||||
S1 --> M1
|
||||
S2 --> M1
|
||||
M1 --> C2
|
||||
M2 --> C2
|
||||
C1 --> C2
|
||||
C1 --> C3
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
|
||||
## 核心组件
|
||||
- DepartmentService:提供科室列表、树形结构、按编码/ID 查询、创建、更新、删除等能力;自动计算层级并校验删除前置条件(无子部门)
|
||||
- StaffService:提供员工列表、按工号/ID 查询、创建、更新、删除、按科室查询在职员工等能力
|
||||
- 数据模型 Department/Staff:定义字段、枚举、索引与关系;Department 与 Staff 通过外键建立一对多关系
|
||||
- API 路由:提供 REST 接口,绑定权限装饰器,调用服务层并返回统一响应格式
|
||||
- 安全与配置:JWT 认证、权限校验、数据库连接池与事务管理
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L13-L150)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L19-L107)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L123)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 架构总览
|
||||
部门与员工服务遵循“API → 服务 → 模型 → 数据库”的分层架构,配合统一响应体与权限控制,确保数据一致性与安全性。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "FastAPI 路由"
|
||||
participant Service as "服务层"
|
||||
participant DB as "数据库"
|
||||
Client->>API : "HTTP 请求"
|
||||
API->>API : "权限校验(Active/Manager)"
|
||||
API->>Service : "调用服务方法(参数校验)"
|
||||
Service->>DB : "SQL 查询/写入(异步)"
|
||||
DB-->>Service : "结果集/受影响行"
|
||||
Service-->>API : "领域对象/聚合"
|
||||
API-->>Client : "统一响应体(code,message,data,total/page/page_size)"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L19-L107)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L123)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L111)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L101)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 部门服务 DepartmentService
|
||||
- 列表查询:支持按类型与启用状态过滤、分页与总数统计
|
||||
- 树形结构:手动构建树,避免懒加载导致的 N+1 问题
|
||||
- 创建逻辑:根据父级计算层级 level,插入后刷新实体
|
||||
- 删除逻辑:先检查是否存在子部门,避免破坏树形结构
|
||||
- 更新与查询:按 ID/编码查询,支持部分字段更新
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class DepartmentService {
|
||||
+get_list(db, dept_type, is_active, page, page_size) tuple
|
||||
+get_by_id(db, dept_id) Department?
|
||||
+get_by_code(db, code) Department?
|
||||
+create(db, dept_data) Department
|
||||
+update(db, dept_id, dept_data) Department?
|
||||
+delete(db, dept_id) bool
|
||||
+get_tree(db, dept_type) DepartmentTree[]
|
||||
}
|
||||
class Department {
|
||||
+id : int
|
||||
+name : string
|
||||
+code : string
|
||||
+dept_type : DeptType
|
||||
+parent_id : int?
|
||||
+level : int
|
||||
+sort_order : int
|
||||
+is_active : bool
|
||||
+description : string?
|
||||
+children : Department[]
|
||||
+staff : Staff[]
|
||||
}
|
||||
DepartmentService --> Department : "读写/树构建"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L13-L150)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L16-L149)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
|
||||
### 员工服务 StaffService
|
||||
- 列表查询:支持按科室、状态、关键词搜索;预加载部门关系
|
||||
- 详情查询:按 ID 查询并注入部门名称
|
||||
- 创建/更新/删除:基础 CRUD;删除不涉及子记录级联
|
||||
- 按科室查询:筛选在职员工
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StaffService {
|
||||
+get_list(db, department_id, status, keyword, page, page_size) tuple
|
||||
+get_by_id(db, staff_id) Staff?
|
||||
+get_by_employee_id(db, employee_id) Staff?
|
||||
+create(db, staff_data) Staff
|
||||
+update(db, staff_id, staff_data) Staff?
|
||||
+delete(db, staff_id) bool
|
||||
+get_by_department(db, department_id) Staff[]
|
||||
}
|
||||
class Staff {
|
||||
+id : int
|
||||
+employee_id : string
|
||||
+name : string
|
||||
+department_id : int
|
||||
+position : string
|
||||
+title : string?
|
||||
+phone : string?
|
||||
+email : string?
|
||||
+base_salary : float
|
||||
+performance_ratio : float
|
||||
+status : StaffStatus
|
||||
+hire_date : datetime?
|
||||
+department : Department
|
||||
+assessments : Assessment[]
|
||||
+salary_records : SalaryRecord[]
|
||||
}
|
||||
StaffService --> Staff : "读写/关联查询"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L16-L111)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
|
||||
|
||||
### 数据模型与关系映射
|
||||
- Department 与 Staff:一对多外键关联,Department 作为父表,Staff 通过 department_id 关联
|
||||
- 索引:部门表对类型与父级建立索引;员工表对部门与状态建立索引
|
||||
- 枚举:科室类型、员工状态、考核状态、指标类型等
|
||||
- 财务模型:DepartmentFinance 与 Department 建立一对多关系,用于科室财务核算
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
bool is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
numeric base_salary
|
||||
numeric performance_ratio
|
||||
enum status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS ||--o{ STAFF : "拥有"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
|
||||
### API 路由与权限控制
|
||||
- 部门路由:列表、树形、详情、创建、更新、删除;创建/更新/删除需管理员或经理权限
|
||||
- 员工路由:列表、详情、创建、更新、删除、按科室查询;创建/更新/删除需管理员或经理权限
|
||||
- 统一响应:code/message/data/total/page/page_size
|
||||
- 权限装饰器:get_current_active_user 与 get_current_manager_user
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant DeptAPI as "部门路由"
|
||||
participant StaffAPI as "员工路由"
|
||||
participant Sec as "安全模块"
|
||||
participant Svc as "服务层"
|
||||
Client->>DeptAPI : "POST /api/v1/departments"
|
||||
DeptAPI->>Sec : "get_current_manager_user()"
|
||||
Sec-->>DeptAPI : "用户(管理员/经理)"
|
||||
DeptAPI->>Svc : "DepartmentService.create()"
|
||||
Svc-->>DeptAPI : "Department"
|
||||
DeptAPI-->>Client : "统一响应"
|
||||
Client->>StaffAPI : "POST /api/v1/staff"
|
||||
StaffAPI->>Sec : "get_current_manager_user()"
|
||||
Sec-->>StaffAPI : "用户(管理员/经理)"
|
||||
StaffAPI->>Svc : "StaffService.create()"
|
||||
Svc-->>StaffAPI : "Staff"
|
||||
StaffAPI-->>Client : "统一响应"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L67-L80)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L81)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L19-L107)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L123)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L85-L110)
|
||||
|
||||
### 处理流程与算法
|
||||
|
||||
#### 部门树形构建流程
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入 get_tree"]) --> Query["查询所有部门并排序"]
|
||||
Query --> BuildMap["构建 id->DepartmentTree 映射"]
|
||||
BuildMap --> Iterate["遍历部门构造树节点"]
|
||||
Iterate --> HasParent{"存在父节点?"}
|
||||
HasParent --> |是| AppendChild["加入父节点 children"]
|
||||
HasParent --> |否| AddRoot["加入根节点列表"]
|
||||
AppendChild --> Next["下一个部门"]
|
||||
AddRoot --> Next
|
||||
Next --> Done(["返回根节点树"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
#### 删除部门前置校验流程
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["进入 delete"]) --> Load["按 ID 加载部门"]
|
||||
Load --> Exists{"是否存在?"}
|
||||
Exists --> |否| Fail["返回 False"]
|
||||
Exists --> |是| CountChildren["统计子部门数量"]
|
||||
CountChildren --> HasChild{"是否有子部门?"}
|
||||
HasChild --> |是| Block["返回 False(不可删除)"]
|
||||
HasChild --> |否| Remove["删除部门并返回 True"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L96-L110)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L96-L110)
|
||||
|
||||
## 依赖分析
|
||||
- 服务层依赖模型层(ORM 映射)与数据库会话(异步)
|
||||
- API 层依赖服务层与安全模块(权限校验)
|
||||
- 配置模块提供数据库 URL、JWT 参数与分页默认值
|
||||
- 数据库模块提供异步引擎与会话生命周期(commit/rollback/close)
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
API_D["/api/v1/departments.py"] --> SVC_D["services/department_service.py"]
|
||||
API_S["/api/v1/staff.py"] --> SVC_S["services/staff_service.py"]
|
||||
SVC_D --> MODELS["models/models.py"]
|
||||
SVC_S --> MODELS
|
||||
MODELS --> DB["core/database.py"]
|
||||
API_D --> SEC["core/security.py"]
|
||||
API_S --> SEC
|
||||
CFG["core/config.py"] --> DB
|
||||
CFG --> SEC
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
|
||||
## 性能考虑
|
||||
- 异步数据库:使用 AsyncSession 提升并发吞吐
|
||||
- 分页与统计:列表查询先统计总数再分页,避免全量扫描
|
||||
- 关系预加载:员工列表预加载部门关系,减少 N+1 查询
|
||||
- 索引优化:部门类型与父级、员工部门与状态建立索引
|
||||
- 事务边界:每个请求会话在依赖中 commit/rollback,异常自动回滚
|
||||
- 连接池:配置池大小与溢出,避免高并发下的连接争用
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L26-L49)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L112-L114)
|
||||
|
||||
## 故障排查指南
|
||||
- 404 未找到:查询员工或部门不存在时返回 404
|
||||
- 400 编码冲突:创建部门/员工时编码或工号重复
|
||||
- 400 无法删除:删除部门时存在子部门
|
||||
- 403 权限不足:非管理员/经理用户尝试创建/更新/删除
|
||||
- 500 服务器错误:数据库异常触发回滚并抛出
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L62-L107)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L75-L108)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L110)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L34-L36)
|
||||
|
||||
## 结论
|
||||
DepartmentService 与 StaffService 通过清晰的分层与严格的权限控制,实现了部门与员工的基础管理能力,并以树形结构与分页查询满足了常见的组织管理需求。结合模型层的索引与关系设计,以及异步数据库与事务管理,系统具备良好的扩展性与稳定性。建议后续在批量导入导出、数据同步与审计日志方面继续完善。
|
||||
|
||||
## 附录
|
||||
|
||||
### 统一响应体与分页
|
||||
- 响应体包含 code、message、data、total、page、page_size
|
||||
- 分页参数默认值与最大值由配置提供
|
||||
|
||||
章节来源
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L31-L33)
|
||||
|
||||
### 数据模型枚举参考
|
||||
- 科室类型:临床、医技、护理、行政、财务、后勤等
|
||||
- 员工状态:在职、休假、离职、退休
|
||||
- 考核状态:草稿、已提交、已审核、已确认、已驳回
|
||||
- 指标类型:质量、数量、效率、服务、成本
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L16-L52)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L12-L45)
|
||||
333
.qoder/repowiki/zh/content/后端开发指南/错误处理与日志.md
Normal file
333
.qoder/repowiki/zh/content/后端开发指南/错误处理与日志.md
Normal file
@@ -0,0 +1,333 @@
|
||||
# 错误处理与日志
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py)
|
||||
- [backend/FIX_SUMMARY.md](file://backend/FIX_SUMMARY.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向“医院绩效系统”的后端工程团队,聚焦于错误处理与日志体系的设计与落地实践。内容涵盖:
|
||||
- 全局异常处理机制与自定义异常类的使用
|
||||
- 错误响应格式与统一返回结构
|
||||
- 日志配置、日志级别、输出格式与轮转策略
|
||||
- 结构化日志记录、上下文信息捕获与性能监控集成
|
||||
- 错误追踪、堆栈信息收集与调试信息输出
|
||||
- 日志轮转、文件管理与日志分析工具使用
|
||||
- 生产环境日志监控、告警配置与故障诊断方法
|
||||
- 安全日志记录、审计跟踪与合规性要求
|
||||
|
||||
## 项目结构
|
||||
后端采用 FastAPI + SQLAlchemy 异步 ORM 的分层架构,错误处理与日志主要分布在应用入口、核心配置与日志模块中,并在各 API 路由中体现统一的异常抛出与响应格式。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用入口"
|
||||
MAIN["backend/app/main.py<br/>应用创建与全局异常处理器"]
|
||||
CONFIG["backend/app/core/config.py<br/>应用配置"]
|
||||
end
|
||||
subgraph "日志与安全"
|
||||
LOGCONF["backend/app/core/logging_config.py<br/>日志配置与轮转"]
|
||||
SECURITY["backend/app/core/security.py<br/>认证与权限校验"]
|
||||
end
|
||||
subgraph "API 层"
|
||||
API_INIT["backend/app/api/v1/__init__.py<br/>路由聚合"]
|
||||
AUTH["backend/app/api/v1/auth.py<br/>认证接口"]
|
||||
STAFF["backend/app/api/v1/staff.py<br/>员工接口"]
|
||||
DEPT["backend/app/api/v1/departments.py<br/>科室接口"]
|
||||
ASSESS["backend/app/api/v1/assessments.py<br/>考核接口"]
|
||||
end
|
||||
subgraph "领域模型与服务"
|
||||
MODELS["backend/app/models/models.py<br/>数据模型"]
|
||||
SCHEMAS["backend/app/schemas/schemas.py<br/>Pydantic 模式"]
|
||||
SVC_STAFF["backend/app/services/staff_service.py"]
|
||||
SVC_DEPT["backend/app/services/department_service.py"]
|
||||
end
|
||||
MAIN --> LOGCONF
|
||||
MAIN --> CONFIG
|
||||
MAIN --> API_INIT
|
||||
API_INIT --> AUTH
|
||||
API_INIT --> STAFF
|
||||
API_INIT --> DEPT
|
||||
API_INIT --> ASSESS
|
||||
AUTH --> SECURITY
|
||||
STAFF --> SVC_STAFF
|
||||
DEPT --> SVC_DEPT
|
||||
ASSESS --> SVC_STAFF
|
||||
ASSESS --> SVC_DEPT
|
||||
SVC_STAFF --> MODELS
|
||||
SVC_DEPT --> MODELS
|
||||
AUTH --> MODELS
|
||||
STAFF --> MODELS
|
||||
DEPT --> MODELS
|
||||
ASSESS --> MODELS
|
||||
SCHEMAS --> MODELS
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 核心组件
|
||||
- 全局异常处理:在应用入口集中注册 HTTP 异常、请求验证异常与全局异常处理器,统一记录日志并向上抛出。
|
||||
- 日志系统:集中配置控制台与文件输出,按级别分离,支持日志轮转与日期命名。
|
||||
- 统一响应结构:在各 API 路由中返回统一的响应体结构,便于前端与监控系统解析。
|
||||
- 安全与权限:在认证与权限校验中抛出标准化 HTTP 异常,确保错误语义清晰。
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L26-L59)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
|
||||
|
||||
## 架构总览
|
||||
下图展示从请求进入应用到异常处理与日志记录的关键交互路径。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant FastAPI as "FastAPI 应用"
|
||||
participant Router as "API 路由"
|
||||
participant Service as "业务服务"
|
||||
participant DB as "数据库"
|
||||
participant Logger as "日志系统"
|
||||
Client->>FastAPI : "HTTP 请求"
|
||||
FastAPI->>Router : "路由匹配与依赖注入"
|
||||
Router->>Service : "调用业务逻辑"
|
||||
Service->>DB : "SQLAlchemy 异步查询/写入"
|
||||
DB-->>Service : "结果或异常"
|
||||
alt "正常响应"
|
||||
Service-->>Router : "业务结果"
|
||||
Router-->>Client : "统一响应体"
|
||||
else "异常场景"
|
||||
Service-->>Router : "抛出 HTTP 异常"
|
||||
Router-->>FastAPI : "异常冒泡"
|
||||
FastAPI->>Logger : "记录异常日志(含堆栈)"
|
||||
FastAPI-->>Client : "异常响应"
|
||||
end
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L81)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L67-L80)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L80-L88)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L26-L59)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 全局异常处理机制
|
||||
- HTTP 异常处理器:记录请求方法、URL、状态码与详情,便于快速定位资源访问问题。
|
||||
- 请求验证异常处理器:记录请求与验证错误,便于前端与接口调试。
|
||||
- 全局异常处理器:记录未知异常并打印堆栈信息,确保问题可追溯。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["请求进入"]) --> Route["路由匹配与依赖注入"]
|
||||
Route --> CallSvc["调用业务服务"]
|
||||
CallSvc --> SvcOK{"业务执行成功?"}
|
||||
SvcOK --> |是| BuildResp["构造统一响应"]
|
||||
SvcOK --> |否| ThrowHTTP["抛出 HTTP 异常"]
|
||||
ThrowHTTP --> GlobalLog["全局异常处理器记录日志(含堆栈)"]
|
||||
GlobalLog --> RaiseExc["向上抛出异常"]
|
||||
BuildResp --> End(["返回响应"])
|
||||
RaiseExc --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
### 自定义异常类与错误响应格式
|
||||
- 统一响应基类:包含状态码与消息字段,便于前端统一处理。
|
||||
- 分页响应:扩展统一基类,增加总数、页码与页大小字段。
|
||||
- API 路由中的错误响应:在业务逻辑中抛出 HTTP 异常,由全局异常处理器统一记录与返回。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class ResponseBase {
|
||||
+int code
|
||||
+string message
|
||||
}
|
||||
class PaginatedResponse {
|
||||
+int total
|
||||
+int page
|
||||
+int page_size
|
||||
}
|
||||
ResponseBase <|-- PaginatedResponse
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
|
||||
|
||||
章节来源
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L30-L37)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L76-L81)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L74-L80)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L86-L88)
|
||||
|
||||
### 日志配置与输出格式
|
||||
- 日志目录:自动创建 logs 目录,按日期生成日志文件。
|
||||
- 输出目标:控制台 INFO 级别输出;应用日志文件 DEBUG 级别滚动保存;错误日志文件 ERROR 级别单独滚动保存。
|
||||
- 格式:包含时间戳、记录器名称、级别与消息;日期格式统一。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Init["初始化日志系统"] --> MakeDir["创建 logs 目录"]
|
||||
MakeDir --> Paths["生成日期文件路径"]
|
||||
Paths --> SetupConsole["配置控制台处理器(INFO)"]
|
||||
Paths --> SetupAppFile["配置应用文件处理器(DEBUG)<br/>10MB 大小限制,保留7份"]
|
||||
Paths --> SetupErrorFile["配置错误文件处理器(ERROR)<br/>10MB 大小限制,保留7份"]
|
||||
SetupConsole --> GetLogger["提供子记录器"]
|
||||
SetupAppFile --> GetLogger
|
||||
SetupErrorFile --> GetLogger
|
||||
GetLogger --> Ready["日志系统就绪"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L10-L64)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L10-L64)
|
||||
|
||||
### 上下文信息捕获与性能监控集成
|
||||
- 请求上下文:全局异常处理器记录请求方法与 URL,便于定位具体接口与参数。
|
||||
- 堆栈信息:全局异常处理器开启堆栈打印,便于定位异常根因。
|
||||
- 性能监控:建议在业务服务层埋点耗时指标,结合日志进行性能分析。
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L60-L73)
|
||||
|
||||
### 安全日志与审计跟踪
|
||||
- 认证与权限:在安全模块中对无效凭据、禁用用户、权限不足等情况抛出标准化异常,便于统一记录与审计。
|
||||
- 审计建议:对关键操作(如创建、更新、删除)记录操作人、对象、变更前后摘要等信息,结合日志系统进行持久化与检索。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L109)
|
||||
|
||||
### 日志轮转、文件管理与分析
|
||||
- 轮转策略:单文件最大 10MB,保留最近 7 份备份,按日期命名,便于按天检索。
|
||||
- 文件位置:应用日志与错误日志分别存放,便于区分与分析。
|
||||
- 分析工具:建议配合系统日志采集工具(如 Filebeat/Fluent Bit)与可视化平台(如 ELK/Graylog)进行集中分析。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L40-L59)
|
||||
- [backend/FIX_SUMMARY.md](file://backend/FIX_SUMMARY.md#L121-L124)
|
||||
|
||||
## 依赖关系分析
|
||||
- 应用入口依赖日志配置模块以初始化日志系统。
|
||||
- API 路由依赖安全模块进行权限校验,异常统一由全局处理器处理。
|
||||
- 业务服务层依赖数据库会话与模型,异常通过路由抛出。
|
||||
- 统一响应结构由 Pydantic 模式定义,保证前后端契约一致。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
MAIN["main.py"] --> LOGCONF["logging_config.py"]
|
||||
MAIN --> API_INIT["api/v1/__init__.py"]
|
||||
API_INIT --> AUTH["auth.py"]
|
||||
API_INIT --> STAFF["staff.py"]
|
||||
API_INIT --> DEPT["departments.py"]
|
||||
API_INIT --> ASSESS["assessments.py"]
|
||||
AUTH --> SECURITY["security.py"]
|
||||
STAFF --> SVC_STAFF["staff_service.py"]
|
||||
DEPT --> SVC_DEPT["department_service.py"]
|
||||
ASSESS --> SVC_STAFF
|
||||
ASSESS --> SVC_DEPT
|
||||
SVC_STAFF --> MODELS["models.py"]
|
||||
SVC_DEPT --> MODELS
|
||||
AUTH --> MODELS
|
||||
STAFF --> MODELS
|
||||
DEPT --> MODELS
|
||||
ASSESS --> MODELS
|
||||
SCHEMAS["schemas.py"] --> MODELS
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
|
||||
## 性能考量
|
||||
- 日志级别与频率:生产环境建议降低 DEBUG 级别日志量,仅在问题定位阶段临时提升。
|
||||
- 文件轮转:合理设置单文件大小与备份数量,避免磁盘占用过高。
|
||||
- 异常处理链路:尽量在业务层尽早捕获并抛出语义明确的 HTTP 异常,减少全局异常处理的开销。
|
||||
- 监控指标:在关键业务路径埋点耗时与错误率,结合日志进行聚合分析。
|
||||
|
||||
## 故障排查指南
|
||||
- 快速定位:查看全局异常处理器记录的请求方法与 URL,结合错误日志文件定位问题。
|
||||
- 堆栈分析:全局异常处理器开启堆栈打印,便于定位异常根因。
|
||||
- 常见错误:参考测试与修复文档中的常见错误与处理建议,定位前端与后端问题。
|
||||
- 日志位置:应用日志与错误日志按日期命名,便于按天检索与分析。
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L60-L73)
|
||||
- [backend/FIX_SUMMARY.md](file://backend/FIX_SUMMARY.md#L116-L124)
|
||||
|
||||
## 结论
|
||||
通过在应用入口集中配置全局异常处理器与日志系统,结合统一的响应结构与安全模块的标准化异常抛出,本项目实现了清晰、可追踪且可维护的错误处理与日志体系。建议在生产环境中进一步完善性能监控埋点、日志采集与可视化分析,并强化安全审计与合规性检查,以满足医院绩效系统的高可靠运行需求。
|
||||
|
||||
## 附录
|
||||
- 配置项参考:应用名称、版本、API 前缀、数据库连接、JWT 参数、跨域配置等。
|
||||
- 模块职责:日志配置负责日志输出与轮转;安全模块负责认证与权限校验;API 路由负责业务编排与异常抛出;服务层负责业务逻辑与数据访问;模型与模式定义数据结构与约束。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
673
.qoder/repowiki/zh/content/后端开发指南/项目结构说明.md
Normal file
673
.qoder/repowiki/zh/content/后端开发指南/项目结构说明.md
Normal file
@@ -0,0 +1,673 @@
|
||||
# 项目结构说明
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py)
|
||||
- [backend/.env.example](file://backend/.env.example)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
这是一个基于FastAPI的医院绩效管理系统后端项目。系统采用现代化的Python异步Web框架,使用SQLAlchemy 2.0进行数据库操作,PostgreSQL作为数据存储,实现了完整的绩效考核管理功能。
|
||||
|
||||
## 项目结构
|
||||
|
||||
项目采用清晰的分层架构设计,主要目录组织如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端应用 (backend)"
|
||||
subgraph "应用主体 (app)"
|
||||
MAIN[app/main.py<br/>应用入口]
|
||||
CORE[app/core/<br/>核心配置]
|
||||
API[app/api/v1/<br/>API路由]
|
||||
MODELS[app/models/<br/>数据模型]
|
||||
SCHEMAS[app/schemas/<br/>数据模式]
|
||||
SERVICES[app/services/<br/>业务服务]
|
||||
UTILS[app/utils/<br/>工具函数]
|
||||
SCRIPTS[app/scripts/<br/>初始化脚本]
|
||||
LOGS[app/logs/<br/>日志文件]
|
||||
end
|
||||
subgraph "数据库迁移 (alembic)"
|
||||
ALEMBIC[alembic/versions/<br/>版本化迁移]
|
||||
ENV[alembic/env.py<br/>迁移环境]
|
||||
end
|
||||
subgraph "配置文件"
|
||||
ENV_EXAMPLE[.env.example<br/>环境配置示例]
|
||||
REQUIREMENTS[requirements.txt<br/>依赖包]
|
||||
end
|
||||
subgraph "测试文件"
|
||||
TESTS[tests/<br/>测试用例]
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
|
||||
### 目录组织说明
|
||||
|
||||
**app目录** - 应用主体
|
||||
- `main.py`: 应用程序入口点,创建FastAPI实例并配置中间件
|
||||
- `core/`: 核心配置模块,包含配置管理、数据库连接、安全认证、日志配置
|
||||
- `api/v1/`: API路由模块,按功能模块划分的RESTful接口
|
||||
- `models/`: 数据模型定义,使用SQLAlchemy ORM映射数据库表
|
||||
- `schemas/`: Pydantic数据模式,用于请求响应的数据验证和序列化
|
||||
- `services/`: 业务逻辑服务层,实现具体的业务规则和数据处理
|
||||
- `scripts/`: 初始化脚本,用于数据预填充和系统初始化
|
||||
- `logs/`: 日志文件存储目录
|
||||
|
||||
**alembic目录** - 数据库迁移管理
|
||||
- `versions/`: 版本化的数据库迁移文件
|
||||
- `env.py`: Alembic迁移环境配置
|
||||
|
||||
**配置文件**
|
||||
- `.env.example`: 环境变量配置示例文件
|
||||
- `requirements.txt`: Python依赖包清单
|
||||
|
||||
**Section sources**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 应用配置系统
|
||||
|
||||
系统采用集中式配置管理,通过Pydantic Settings实现类型安全的配置读取:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Settings {
|
||||
+str APP_NAME
|
||||
+str APP_VERSION
|
||||
+bool DEBUG
|
||||
+str API_PREFIX
|
||||
+str DATABASE_URL
|
||||
+int DATABASE_POOL_SIZE
|
||||
+int DATABASE_MAX_OVERFLOW
|
||||
+str SECRET_KEY
|
||||
+str ALGORITHM
|
||||
+int ACCESS_TOKEN_EXPIRE_MINUTES
|
||||
+str[] CORS_ORIGINS
|
||||
+int DEFAULT_PAGE_SIZE
|
||||
+int MAX_PAGE_SIZE
|
||||
}
|
||||
class Config {
|
||||
+str env_file
|
||||
+bool case_sensitive
|
||||
}
|
||||
Settings --> Config : "继承"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
|
||||
### 数据库连接层
|
||||
|
||||
使用SQLAlchemy 2.0的异步ORM特性,提供高效的数据库操作能力:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Base {
|
||||
<<DeclarativeBase>>
|
||||
}
|
||||
class AsyncEngine {
|
||||
+create_async_engine()
|
||||
}
|
||||
class AsyncSession {
|
||||
+AsyncSession()
|
||||
}
|
||||
class SessionMaker {
|
||||
+async_session_maker
|
||||
}
|
||||
Base <|-- Department
|
||||
Base <|-- Staff
|
||||
Base <|-- Indicator
|
||||
Base <|-- Assessment
|
||||
Base <|-- AssessmentDetail
|
||||
AsyncEngine --> AsyncSession : "创建"
|
||||
SessionMaker --> AsyncSession : "管理"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L23-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L200)
|
||||
|
||||
### 安全认证系统
|
||||
|
||||
集成JWT令牌认证和密码加密,提供多层级的权限控制:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SecurityModule {
|
||||
+OAuth2PasswordBearer oauth2_scheme
|
||||
+verify_password()
|
||||
+get_password_hash()
|
||||
+create_access_token()
|
||||
+decode_token()
|
||||
+get_current_user()
|
||||
+get_current_active_user()
|
||||
+get_current_admin_user()
|
||||
+get_current_manager_user()
|
||||
}
|
||||
class TokenPayload {
|
||||
+str exp
|
||||
+str sub
|
||||
}
|
||||
class User {
|
||||
+int id
|
||||
+str username
|
||||
+str role
|
||||
+bool is_active
|
||||
}
|
||||
SecurityModule --> TokenPayload : "验证"
|
||||
SecurityModule --> User : "获取"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
|
||||
**Section sources**
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用经典的三层架构模式,实现了清晰的关注点分离:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表示层 (API Layer)"
|
||||
ROUTERS[API路由器]
|
||||
ENDPOINTS[端点处理器]
|
||||
end
|
||||
subgraph "业务逻辑层 (Service Layer)"
|
||||
ASSESSMENT_SERVICE[考核服务]
|
||||
DEPARTMENT_SERVICE[科室服务]
|
||||
STAFF_SERVICE[员工服务]
|
||||
SALARY_SERVICE[薪资服务]
|
||||
end
|
||||
subgraph "数据访问层 (Data Access Layer)"
|
||||
MODELS[ORM模型]
|
||||
DATABASE[(PostgreSQL数据库)]
|
||||
end
|
||||
subgraph "基础设施层"
|
||||
CONFIG[配置管理]
|
||||
SECURITY[安全认证]
|
||||
LOGGING[日志系统]
|
||||
end
|
||||
ROUTERS --> ENDPOINTS
|
||||
ENDPOINTS --> ASSESSMENT_SERVICE
|
||||
ENDPOINTS --> DEPARTMENT_SERVICE
|
||||
ENDPOINTS --> STAFF_SERVICE
|
||||
ASSESSMENT_SERVICE --> MODELS
|
||||
DEPARTMENT_SERVICE --> MODELS
|
||||
STAFF_SERVICE --> MODELS
|
||||
MODELS --> DATABASE
|
||||
ROUTERS --> SECURITY
|
||||
ENDPOINTS --> SECURITY
|
||||
ASSESSMENT_SERVICE --> LOGGING
|
||||
CONFIG --> ROUTERS
|
||||
CONFIG --> DATABASE
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L200)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L200)
|
||||
|
||||
### 模块间依赖关系
|
||||
|
||||
系统遵循依赖倒置原则,上层模块不依赖下层模块的具体实现:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "外部依赖"
|
||||
FASTAPI[FastAPI框架]
|
||||
SQLALCHEMY[SQLAlchemy 2.0]
|
||||
POSTGRESQL[PostgreSQL]
|
||||
end
|
||||
subgraph "应用层"
|
||||
MAIN[main.py]
|
||||
ROUTERS[API路由器]
|
||||
SERVICES[业务服务]
|
||||
MODELS[数据模型]
|
||||
SCHEMAS[数据模式]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
CONFIG[配置管理]
|
||||
DATABASE[数据库连接]
|
||||
SECURITY[安全认证]
|
||||
LOGGING[日志系统]
|
||||
end
|
||||
FASTAPI --> MAIN
|
||||
SQLALCHEMY --> MODELS
|
||||
POSTGRESQL --> DATABASE
|
||||
MAIN --> ROUTERS
|
||||
ROUTERS --> SERVICES
|
||||
SERVICES --> MODELS
|
||||
MODELS --> DATABASE
|
||||
MAIN --> CONFIG
|
||||
ROUTERS --> CONFIG
|
||||
SERVICES --> CONFIG
|
||||
SERVICES --> SECURITY
|
||||
MODELS --> SECURITY
|
||||
MAIN --> LOGGING
|
||||
SERVICES --> LOGGING
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
**Section sources**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### API路由模块
|
||||
|
||||
系统采用版本化的API设计,v1版本包含完整的功能模块:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API版本控制"
|
||||
V1_API[API v1 路由器]
|
||||
end
|
||||
subgraph "功能模块"
|
||||
AUTH[认证模块]
|
||||
DEPARTMENTS[科室管理]
|
||||
STAFF[员工管理]
|
||||
INDICATORS[指标管理]
|
||||
ASSESSMENTS[考核管理]
|
||||
SALARY[薪资计算]
|
||||
STATS[统计分析]
|
||||
FINANCE[财务管理]
|
||||
PERFORMANCE_PLANS[绩效计划]
|
||||
MENUS[菜单管理]
|
||||
TEMPLATES[模板管理]
|
||||
end
|
||||
V1_API --> AUTH
|
||||
V1_API --> DEPARTMENTS
|
||||
V1_API --> STAFF
|
||||
V1_API --> INDICATORS
|
||||
V1_API --> ASSESSMENTS
|
||||
V1_API --> SALARY
|
||||
V1_API --> STATS
|
||||
V1_API --> FINANCE
|
||||
V1_API --> PERFORMANCE_PLANS
|
||||
V1_API --> MENUS
|
||||
V1_API --> TEMPLATES
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
|
||||
#### 考核管理API流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant Router as 路由器
|
||||
participant Service as 服务层
|
||||
participant Model as 数据模型
|
||||
participant DB as 数据库
|
||||
Client->>Router : GET /api/v1/assessments
|
||||
Router->>Service : get_list()
|
||||
Service->>DB : 查询考核记录
|
||||
DB-->>Service : 返回结果集
|
||||
Service->>Service : 处理分页和过滤
|
||||
Service-->>Router : 返回处理后的数据
|
||||
Router-->>Client : JSON响应
|
||||
Note over Router,Service : 考核状态流转
|
||||
Client->>Router : POST /api/v1/assessments/{id}/submit
|
||||
Router->>Service : submit()
|
||||
Service->>DB : 更新状态为SUBMITTED
|
||||
DB-->>Service : 确认更新
|
||||
Service-->>Router : 返回提交结果
|
||||
Router-->>Client : 状态更新确认
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L18-L200)
|
||||
|
||||
**Section sources**
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L1-L200)
|
||||
|
||||
### 数据模型设计
|
||||
|
||||
系统采用枚举类型确保数据完整性,支持平衡计分卡的四个维度:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENT {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
numeric base_salary
|
||||
numeric performance_ratio
|
||||
enum status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATOR {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum indicator_type
|
||||
enum bs_dimension
|
||||
numeric weight
|
||||
numeric max_score
|
||||
numeric target_value
|
||||
string target_unit
|
||||
text calculation_method
|
||||
text assessment_method
|
||||
text deduction_standard
|
||||
string data_source
|
||||
string applicable_dept_types
|
||||
boolean is_veto
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
ASSESSMENT {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
string period_type
|
||||
numeric total_score
|
||||
numeric weighted_score
|
||||
enum status
|
||||
int assessor_id FK
|
||||
int reviewer_id FK
|
||||
datetime submit_time
|
||||
datetime review_time
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
ASSESSMENT_DETAIL {
|
||||
int id PK
|
||||
int assessment_id FK
|
||||
int indicator_id FK
|
||||
numeric actual_value
|
||||
numeric score
|
||||
text evidence
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENT ||--o{ STAFF : "拥有"
|
||||
STAFF ||--o{ ASSESSMENT : "参与"
|
||||
INDICATOR ||--o{ ASSESSMENT_DETAIL : "被评估"
|
||||
ASSESSMENT ||--o{ ASSESSMENT_DETAIL : "包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L200)
|
||||
|
||||
#### 数据验证流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
START([请求到达]) --> VALIDATE_INPUT[验证输入参数]
|
||||
VALIDATE_INPUT --> INPUT_VALID{参数有效?}
|
||||
INPUT_VALID --> |否| RETURN_ERROR[返回错误响应]
|
||||
INPUT_VALID --> |是| CHECK_AUTH[检查认证状态]
|
||||
CHECK_AUTH --> AUTH_VALID{认证有效?}
|
||||
AUTH_VALID --> |否| RETURN_AUTH_ERROR[返回认证错误]
|
||||
AUTH_VALID --> |是| CHECK_PERMISSION[检查权限]
|
||||
CHECK_PERMISSION --> HAS_PERMISSION{有权限?}
|
||||
HAS_PERMISSION --> |否| RETURN_PERM_ERROR[返回权限错误]
|
||||
HAS_PERMISSION --> |是| PROCESS_REQUEST[处理业务逻辑]
|
||||
PROCESS_REQUEST --> SERVICE_CALL[调用服务层]
|
||||
SERVICE_CALL --> DB_OPERATION[数据库操作]
|
||||
DB_OPERATION --> DB_SUCCESS{操作成功?}
|
||||
DB_SUCCESS --> |否| HANDLE_DB_ERROR[处理数据库错误]
|
||||
DB_SUCCESS --> |是| FORMAT_RESPONSE[格式化响应]
|
||||
HANDLE_DB_ERROR --> RETURN_ERROR
|
||||
FORMAT_RESPONSE --> RETURN_SUCCESS[返回成功响应]
|
||||
RETURN_AUTH_ERROR --> END([结束])
|
||||
RETURN_PERM_ERROR --> END
|
||||
RETURN_ERROR --> END
|
||||
RETURN_SUCCESS --> END
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
|
||||
**Section sources**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L200)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L200)
|
||||
|
||||
### 初始化脚本系统
|
||||
|
||||
系统提供完整的数据初始化功能,支持多种科室类型的指标模板:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "初始化流程"
|
||||
INIT_SCRIPT[init_templates.py]
|
||||
DATA_SOURCE[指标模板数据]
|
||||
ENGINE[数据库引擎]
|
||||
SESSION[异步会话]
|
||||
end
|
||||
subgraph "模板类型"
|
||||
GENERAL[通用模板]
|
||||
SURGICAL[手术科室模板]
|
||||
MEDICAL_TECH[医技科室模板]
|
||||
ADMIN[行政科室模板]
|
||||
LOGISTICS[后勤科室模板]
|
||||
end
|
||||
INIT_SCRIPT --> DATA_SOURCE
|
||||
INIT_SCRIPT --> ENGINE
|
||||
ENGINE --> SESSION
|
||||
DATA_SOURCE --> INIT_SCRIPT
|
||||
GENERAL --> INIT_SCRIPT
|
||||
SURGICAL --> INIT_SCRIPT
|
||||
MEDICAL_TECH --> INIT_SCRIPT
|
||||
ADMIN --> INIT_SCRIPT
|
||||
LOGISTICS --> INIT_SCRIPT
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L1-L200)
|
||||
|
||||
**Section sources**
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L1-L200)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 外部依赖管理
|
||||
|
||||
系统使用requirements.txt统一管理所有Python依赖:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "Web框架"
|
||||
FASTAPI[fastapi>=0.115.0]
|
||||
UVICORN[uvicorn[standard]>=0.32.0]
|
||||
end
|
||||
subgraph "数据库相关"
|
||||
SQLALCHEMY[sqlalchemy>=2.0.36]
|
||||
ASYNCPG[asyncpg>=0.30.0]
|
||||
ALEMBIC[alembic>=1.14.0]
|
||||
end
|
||||
subgraph "数据验证"
|
||||
PYDANTIC[pydantic>=2.10.0]
|
||||
SETTINGS[pydantic-settings>=2.6.0]
|
||||
EMAIL[email-validator>=2.2.0]
|
||||
end
|
||||
subgraph "安全认证"
|
||||
JOSE[python-jose[cryptography]>=3.3.0]
|
||||
PASSLIB[passlib[bcrypt]>=1.7.4]
|
||||
end
|
||||
subgraph "开发工具"
|
||||
DOTENV[python-dotenv>=1.0.0]
|
||||
HTTPX[httpx>=0.28.0]
|
||||
PYTEST[pytest>=8.0.0]
|
||||
ASYNCIO[pytest-asyncio>=0.24.0]
|
||||
end
|
||||
FASTAPI --> UVICORN
|
||||
SQLALCHEMY --> ASYNCPG
|
||||
PYDANTIC --> SETTINGS
|
||||
JOSE --> PASSLIB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
### 环境配置管理
|
||||
|
||||
系统采用.env.example文件提供配置模板,支持多环境部署:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
ENV_EXAMPLE[.env.example] --> ENV_FILE[实际.env文件]
|
||||
ENV_FILE --> CONFIG[配置加载]
|
||||
CONFIG --> SETTINGS[Settings对象]
|
||||
SETTINGS --> APPLICATION[应用程序]
|
||||
subgraph "配置类别"
|
||||
DB_CONFIG[数据库配置]
|
||||
JWT_CONFIG[JWT配置]
|
||||
DEBUG_CONFIG[调试配置]
|
||||
CORS_CONFIG[CORS配置]
|
||||
end
|
||||
ENV_FILE --> DB_CONFIG
|
||||
ENV_FILE --> JWT_CONFIG
|
||||
ENV_FILE --> DEBUG_CONFIG
|
||||
ENV_FILE --> CORS_CONFIG
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/.env.example](file://backend/.env.example#L1-L11)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
|
||||
**Section sources**
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [backend/.env.example](file://backend/.env.example#L1-L11)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 异步数据库操作
|
||||
|
||||
系统全面采用SQLAlchemy 2.0的异步特性,提升并发处理能力:
|
||||
|
||||
- 使用异步引擎和会话工厂
|
||||
- 支持连接池管理和溢出控制
|
||||
- 实现自动事务管理和异常回滚
|
||||
|
||||
### 缓存策略
|
||||
|
||||
- 配置LRU缓存的Settings单例
|
||||
- 数据库连接池优化
|
||||
- 请求级别的中间件缓存
|
||||
|
||||
### 日志性能优化
|
||||
|
||||
- 文件轮转避免日志文件过大
|
||||
- 多级别日志分离(应用日志、错误日志)
|
||||
- 异步日志写入减少阻塞
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题诊断
|
||||
|
||||
**数据库连接问题**
|
||||
- 检查DATABASE_URL配置
|
||||
- 验证PostgreSQL服务状态
|
||||
- 确认网络连接和防火墙设置
|
||||
|
||||
**JWT认证失败**
|
||||
- 验证SECRET_KEY配置
|
||||
- 检查令牌过期时间设置
|
||||
- 确认用户状态为激活
|
||||
|
||||
**API路由错误**
|
||||
- 检查API_PREFIX配置
|
||||
- 验证路由注册顺序
|
||||
- 确认中间件配置正确
|
||||
|
||||
### 调试技巧
|
||||
|
||||
1. **启用调试模式**: 设置DEBUG=True查看详细日志
|
||||
2. **检查环境变量**: 确保.env文件配置正确
|
||||
3. **验证数据库迁移**: 运行alembic升级检查
|
||||
4. **测试API端点**: 使用OpenAPI文档测试接口
|
||||
|
||||
**Section sources**
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L1-L65)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 结论
|
||||
|
||||
该医院绩效管理系统采用了现代化的软件架构设计,具有以下特点:
|
||||
|
||||
**架构优势**
|
||||
- 清晰的分层设计,职责分离明确
|
||||
- 异步编程模型,提升系统性能
|
||||
- 类型安全的配置管理
|
||||
- 完整的认证授权机制
|
||||
|
||||
**扩展性考虑**
|
||||
- 模块化设计便于功能扩展
|
||||
- 数据库迁移机制支持版本演进
|
||||
- 标准化的API设计便于前端集成
|
||||
|
||||
**最佳实践建议**
|
||||
- 遵循单一职责原则
|
||||
- 使用类型注解提高代码可读性
|
||||
- 实施完善的错误处理机制
|
||||
- 定期进行性能监控和优化
|
||||
|
||||
该系统为医院绩效管理提供了完整的技术解决方案,具备良好的可维护性和扩展性。
|
||||
333
.qoder/repowiki/zh/content/快速开始.md
Normal file
333
.qoder/repowiki/zh/content/快速开始.md
Normal file
@@ -0,0 +1,333 @@
|
||||
# 快速开始
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/.env.example](file://backend/.env.example)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/init_db.py](file://backend/init_db.py)
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能注意事项](#性能注意事项)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向希望快速搭建并运行“医院绩效管理系统”的开发者,覆盖后端 FastAPI 服务、前端 Vue 3 应用、数据库初始化与配置、环境变量设置、默认管理员账号与首次登录流程,以及常见问题排查与验证步骤。系统采用前后端分离架构,后端提供 REST API,前端通过代理访问后端接口。
|
||||
|
||||
## 项目结构
|
||||
- 后端(Python/FastAPI)位于 backend 目录,包含 API 路由、核心配置、数据库模型、安全模块与初始化脚本。
|
||||
- 前端(Vue 3/Vite)位于 frontend 目录,包含页面组件、状态管理、API 请求封装与开发服务器配置。
|
||||
- 文档与参考材料位于 docs 与 参考文档 目录,便于对照业务背景与设计说明。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
A["app/main.py<br/>应用入口与路由挂载"]
|
||||
B["app/core/config.py<br/>配置加载(settings)"]
|
||||
C["app/api/v1/*.py<br/>API 路由"]
|
||||
D["app/models/models.py<br/>数据模型"]
|
||||
E["app/core/security.py<br/>认证与令牌"]
|
||||
F["init_db.py / app/core/init_db.py<br/>初始化脚本"]
|
||||
end
|
||||
subgraph "前端"
|
||||
G["vite.config.js<br/>开发服务器与代理"]
|
||||
H["src/views/Login.vue<br/>登录页"]
|
||||
I["src/stores/user.js<br/>用户状态"]
|
||||
J["src/api/auth.js<br/>认证请求封装"]
|
||||
end
|
||||
K["backend/.env.example<br/>环境变量示例"]
|
||||
L["backend/requirements.txt<br/>依赖清单"]
|
||||
H --> J --> C
|
||||
I --> J
|
||||
G --> C
|
||||
A --> C
|
||||
B --> A
|
||||
E --> C
|
||||
F --> D
|
||||
K -.-> B
|
||||
L -.-> A
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L80)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L260)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L43)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L4-L11)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L79)
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L12-L30)
|
||||
- [backend/.env.example](file://backend/.env.example#L1-L11)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L80)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
|
||||
## 核心组件
|
||||
- 应用入口与路由:后端通过主程序创建 FastAPI 实例,注册路由前缀、CORS 中间件与健康检查端点。
|
||||
- 配置模块:集中管理应用名、版本、API 前缀、数据库连接、JWT 密钥与跨域白名单等。
|
||||
- 认证与安全:提供密码哈希、JWT 令牌签发与校验、OAuth2 密码流、当前用户解析与权限校验。
|
||||
- 数据模型:定义科室、员工、指标、考核、计划、菜单、模板等核心实体及其关系。
|
||||
- 初始化脚本:创建数据库表并填充示例数据,包含默认管理员账号。
|
||||
- 前端登录与代理:前端本地开发服务器代理到后端,登录成功写入本地存储并跳转首页。
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L80)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L34-L43)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L146)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L79)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
|
||||
## 架构总览
|
||||
系统采用前后端分离部署:
|
||||
- 前端通过 Vite 开发服务器启动,本地代理将 /api 前缀请求转发至后端。
|
||||
- 后端使用 FastAPI 提供 REST API,支持异步数据库访问与 JWT 认证。
|
||||
- 数据库初始化可通过脚本自动完成,或结合 Alembic 进行迁移管理。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
FE["前端开发服务器<br/>vite.config.js: 5173"]
|
||||
API["后端服务<br/>app/main.py: 8000"]
|
||||
DB["数据库<br/>PostgreSQL/SQLite(迁移)"]
|
||||
AUTH["认证模块<br/>app/core/security.py"]
|
||||
MODELS["数据模型<br/>app/models/models.py"]
|
||||
FE --> |"/api 代理"| API
|
||||
API --> AUTH
|
||||
API --> MODELS
|
||||
MODELS --> DB
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L83-L91)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L146)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L7)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 后端安装与配置
|
||||
- Python 版本与虚拟环境
|
||||
- 使用 Python 3.10+,建议在虚拟环境中进行隔离开发。
|
||||
- 依赖安装
|
||||
- 在 backend 目录执行安装命令,安装后端所需依赖。
|
||||
- 环境变量
|
||||
- 复制示例文件为 .env 并按需修改数据库连接、密钥与调试开关。
|
||||
- 数据库初始化
|
||||
- 可选择使用初始化脚本创建表与示例数据;或使用 Alembic 进行迁移。
|
||||
- 启动后端服务
|
||||
- 在 backend 目录运行主程序,监听 8000 端口。
|
||||
|
||||
章节来源
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [backend/.env.example](file://backend/.env.example#L1-L11)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L79)
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L103-L110)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L7)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L83-L91)
|
||||
|
||||
### 前端安装与配置
|
||||
- 依赖安装
|
||||
- 在 frontend 目录执行安装命令,安装 Vue 3、路由、状态管理与开发工具。
|
||||
- 开发服务器与代理
|
||||
- Vite 默认端口 5173,配置将 /api 前缀代理到后端 8000 端口。
|
||||
- 启动前端
|
||||
- 在 frontend 目录运行开发命令,浏览器访问本地地址。
|
||||
|
||||
章节来源
|
||||
- [frontend/package.json](file://frontend/package.json#L1-L27)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
|
||||
### 数据库配置与初始化
|
||||
- 数据库类型与驱动
|
||||
- 后端默认使用 PostgreSQL 异步驱动,Alembic 配置中也包含 SQLite 示例。
|
||||
- 初始化策略
|
||||
- 方式一:使用初始化脚本创建表与示例数据,包含默认管理员账号。
|
||||
- 方式二:使用 Alembic 进行迁移管理,适用于生产或更复杂的版本演进场景。
|
||||
- 初始数据
|
||||
- 脚本会创建示例科室、员工、指标与管理员用户,便于快速体验。
|
||||
|
||||
章节来源
|
||||
- [backend/.env.example](file://backend/.env.example#L4)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L7)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L79)
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L103-L110)
|
||||
|
||||
### 系统启动流程(后端)
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Dev as "开发者"
|
||||
participant Backend as "后端进程(app/main.py)"
|
||||
participant DB as "数据库"
|
||||
Dev->>Backend : 启动后端服务
|
||||
Backend->>Backend : 加载配置(settings)
|
||||
Backend->>DB : 建立连接/创建表(可选)
|
||||
Backend-->>Dev : 监听 8000 端口
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L80)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L18)
|
||||
|
||||
### 登录与认证流程(前后端)
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as "用户"
|
||||
participant Front as "前端(Login.vue)"
|
||||
participant Store as "Pinia(user.js)"
|
||||
participant API as "后端(auth.py)"
|
||||
participant Sec as "安全模块(security.py)"
|
||||
User->>Front : 输入用户名/密码
|
||||
Front->>Store : 调用 login(username,password)
|
||||
Store->>API : POST /api/v1/auth/login
|
||||
API->>Sec : 校验密码/生成JWT
|
||||
API-->>Store : 返回 access_token
|
||||
Store->>Store : 写入localStorage并保存token
|
||||
Store-->>Front : 登录成功回调
|
||||
Front-->>User : 跳转首页
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L73-L89)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
- [frontend/src/api/auth.js](file://frontend/src/api/auth.js#L4-L11)
|
||||
- [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#L34-L43)
|
||||
|
||||
### 默认管理员账号与首次登录
|
||||
- 默认账号
|
||||
- 用户名:admin
|
||||
- 密码:admin123
|
||||
- 登录入口
|
||||
- 前端登录页内置默认值,也可手动输入。
|
||||
- 登录后行为
|
||||
- 成功后前端保存 token 并跳转首页。
|
||||
|
||||
章节来源
|
||||
- [backend/init_db.py](file://backend/init_db.py#L69-L76)
|
||||
- [frontend/src/views/Login.vue](file://frontend/src/views/Login.vue#L64-L66)
|
||||
- [frontend/src/stores/user.js](file://frontend/src/stores/user.js#L11-L20)
|
||||
|
||||
### 验证步骤
|
||||
- 后端健康检查
|
||||
- 访问后端健康端点,确认返回健康状态与版本信息。
|
||||
- 前端代理连通性
|
||||
- 在前端开发环境下,登录页能正常发起 /api/v1/auth/login 请求并收到响应。
|
||||
- 数据库可用性
|
||||
- 初始化脚本执行后,相关表与示例数据存在,可查询验证。
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L54-L56)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L18)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L79)
|
||||
|
||||
## 依赖关系分析
|
||||
- 后端依赖
|
||||
- Web 框架与 ASGI 服务器、SQLAlchemy 2.0、异步数据库驱动、Pydantic、JWT、密码哈希、环境变量加载等。
|
||||
- 前端依赖
|
||||
- Vue 3、路由、状态管理、HTTP 客户端、UI 组件库与开发工具。
|
||||
- 代理关系
|
||||
- 前端开发服务器将 /api 前缀请求代理到后端,避免跨域问题。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
R["requirements.txt"] --> BE["后端依赖"]
|
||||
P["package.json"] --> FE["前端依赖"]
|
||||
VCFG["vite.config.js"] --> PROXY["/api 代理"]
|
||||
PROXY --> BE
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L18)
|
||||
|
||||
章节来源
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L18)
|
||||
|
||||
## 性能注意事项
|
||||
- 数据库连接池
|
||||
- 后端配置了连接池大小与溢出数量,可根据并发需求调整。
|
||||
- 异步 I/O
|
||||
- 后端采用异步数据库访问,前端请求通过代理转发,整体具备较好的并发处理能力。
|
||||
- 前端打包
|
||||
- 生产构建时建议开启压缩与 Tree Shaking,减少包体积。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L21)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
|
||||
## 故障排查指南
|
||||
- 端口冲突
|
||||
- 后端默认 8000,前端默认 5173;若端口被占用,请在相应配置中修改。
|
||||
- 代理未生效
|
||||
- 确认前端代理配置指向正确的后端地址与端口。
|
||||
- 数据库连接失败
|
||||
- 检查环境变量中的数据库 URL 是否正确,数据库服务是否启动。
|
||||
- 登录失败
|
||||
- 确认初始化脚本已执行,管理员账号存在;检查密码是否正确。
|
||||
- CORS 问题
|
||||
- 确认后端 CORS 白名单包含前端地址,或在开发环境下允许本地源。
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L42-L48)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L29)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L18)
|
||||
- [backend/.env.example](file://backend/.env.example#L4)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L69-L76)
|
||||
|
||||
## 结论
|
||||
按照本指南完成环境准备、依赖安装、数据库初始化与系统启动后,即可在本地运行完整的前后端系统。默认管理员账号可用于首次登录与功能验证。如需扩展或接入真实数据库,可在配置模块与环境变量中进行相应调整。
|
||||
|
||||
## 附录
|
||||
|
||||
### 环境变量配置说明
|
||||
- 数据库连接
|
||||
- 用于 PostgreSQL 的连接字符串,包含主机、端口、数据库名与凭据。
|
||||
- JWT 密钥
|
||||
- 用于签发与校验访问令牌,生产环境需足够复杂且保密。
|
||||
- 调试模式
|
||||
- 控制日志与异常输出级别,开发阶段可开启。
|
||||
|
||||
章节来源
|
||||
- [backend/.env.example](file://backend/.env.example#L4-L10)
|
||||
|
||||
### 初始数据导入方法
|
||||
- 使用初始化脚本
|
||||
- 执行脚本创建表与示例数据,包含默认管理员账号。
|
||||
- 使用 Alembic
|
||||
- 通过迁移配置与版本化脚本管理数据库演进。
|
||||
|
||||
章节来源
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L79)
|
||||
- [backend/app/core/init_db.py](file://backend/app/core/init_db.py#L103-L110)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L7)
|
||||
477
.qoder/repowiki/zh/content/故障排除.md
Normal file
477
.qoder/repowiki/zh/content/故障排除.md
Normal file
@@ -0,0 +1,477 @@
|
||||
# 故障排除
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt)
|
||||
- [backend/.env.example](file://backend/.env.example)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [docs/backend.md](file://docs/backend.md)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js)
|
||||
- [frontend/package.json](file://frontend/package.json)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本指南面向运维与开发人员,聚焦“医院绩效系统”的启动失败、数据库连接问题、API 接口错误、前端加载异常、日志分析、性能瓶颈定位、内存泄漏检测、网络连接问题、权限配置错误以及数据不一致等常见问题,提供系统化的诊断方法、错误代码含义与解决方案,并给出调试工具使用、开发与生产环境故障策略。
|
||||
|
||||
## 项目结构
|
||||
系统采用前后端分离架构:
|
||||
- 后端:FastAPI + SQLAlchemy 2.0 + PostgreSQL,支持异步 IO,提供 REST API。
|
||||
- 前端:Vue 3 + Element Plus + Axios,通过 Vite 开发服务器运行,代理转发到后端。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_Vite["Vite 开发服务器<br/>端口 5173"]
|
||||
FE_Axios["Axios 实例<br/>baseURL: /api/v1"]
|
||||
end
|
||||
subgraph "后端"
|
||||
BE_Uvicorn["Uvicorn 服务器<br/>端口 8000"]
|
||||
BE_FastAPI["FastAPI 应用"]
|
||||
BE_Router["API 路由聚合"]
|
||||
BE_DB["SQLAlchemy 异步引擎<br/>PostgreSQL"]
|
||||
end
|
||||
FE_Vite --> FE_Axios
|
||||
FE_Axios --> BE_Uvicorn
|
||||
BE_Uvicorn --> BE_FastAPI
|
||||
BE_FastAPI --> BE_Router
|
||||
BE_Router --> BE_DB
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L7-L12)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L19-L51)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
|
||||
|
||||
章节来源
|
||||
- [docs/backend.md](file://docs/backend.md#L16-L58)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L19-L51)
|
||||
|
||||
## 核心组件
|
||||
- 应用入口与异常处理:负责创建 FastAPI 实例、注册路由、CORS、健康检查与全局异常处理。
|
||||
- 配置中心:集中管理应用名、版本、API 前缀、数据库连接、JWT、跨域、分页等配置。
|
||||
- 数据库层:异步引擎与会话工厂,提供依赖注入式数据库会话。
|
||||
- 日志系统:按日切分的滚动日志,区分普通日志与错误日志,统一输出格式。
|
||||
- 安全模块:OAuth2 密码流、JWT 编解码、用户校验与权限判定。
|
||||
- 前端请求封装:Axios 实例、请求/响应拦截器、错误提示与自动登出。
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L77)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L46)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L17-L64)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L20-L110)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L63)
|
||||
|
||||
## 架构总览
|
||||
系统启动与请求处理的关键流程如下:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Dev as "开发者/运维"
|
||||
participant FE as "前端浏览器"
|
||||
participant Vite as "Vite 代理"
|
||||
participant Uvicorn as "Uvicorn"
|
||||
participant FastAPI as "FastAPI 应用"
|
||||
participant Router as "API 路由"
|
||||
participant DB as "数据库"
|
||||
Dev->>Uvicorn : 启动后端服务
|
||||
Dev->>FE : 启动前端开发服务器
|
||||
FE->>Vite : 访问 /api/v1/*
|
||||
Vite->>Uvicorn : 代理转发
|
||||
Uvicorn->>FastAPI : 路由匹配
|
||||
FastAPI->>Router : 调用对应处理器
|
||||
Router->>DB : 异步查询/写入
|
||||
DB-->>Router : 返回结果
|
||||
Router-->>FastAPI : 标准响应
|
||||
FastAPI-->>Uvicorn : HTTP 响应
|
||||
Uvicorn-->>Vite : HTTP 响应
|
||||
Vite-->>FE : 前端渲染
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L54-L77)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L19)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L7-L12)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 后端异常与健康检查
|
||||
- 健康检查端点:用于快速判断后端是否存活。
|
||||
- 异常处理:对 HTTP 异常、请求验证异常与全局异常进行记录与透传,便于定位问题。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["请求进入"]) --> Match["路由匹配"]
|
||||
Match --> Handler["业务处理器"]
|
||||
Handler --> Ok{"处理成功?"}
|
||||
Ok --> |是| Resp["返回 2xx/业务响应"]
|
||||
Ok --> |否| Err["抛出异常"]
|
||||
Err --> Log["记录日志"]
|
||||
Log --> Raise["向上抛出"]
|
||||
Raise --> ClientErr["客户端错误码返回"]
|
||||
Resp --> End(["结束"])
|
||||
ClientErr --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L77)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L54-L77)
|
||||
|
||||
### 数据库连接与事务
|
||||
- 异步引擎与会话工厂:支持高并发与长连接复用。
|
||||
- 依赖注入式会话:自动提交、回滚与关闭,避免资源泄露。
|
||||
- 连接池参数:可通过配置调整池大小与溢出上限。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class AsyncEngine {
|
||||
+create_async_engine(url, echo)
|
||||
}
|
||||
class AsyncSessionMaker {
|
||||
+async_sessionmaker(engine, class_, expire_on_commit)
|
||||
}
|
||||
class AsyncSession {
|
||||
+__enter__()
|
||||
+__exit__()
|
||||
+commit()
|
||||
+rollback()
|
||||
+close()
|
||||
}
|
||||
AsyncEngine <.. AsyncSessionMaker : "创建"
|
||||
AsyncSessionMaker --> AsyncSession : "工厂创建"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
|
||||
### 安全与认证
|
||||
- OAuth2 密码流:统一登录入口,返回 JWT。
|
||||
- 用户校验:从令牌解析用户 ID,查询数据库并校验状态与角色。
|
||||
- 权限判定:管理员、经理等角色访问控制。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant Auth as "认证路由"
|
||||
participant DB as "数据库"
|
||||
participant JWT as "JWT 工具"
|
||||
Client->>Auth : POST /api/v1/auth/login
|
||||
Auth->>DB : 查询用户
|
||||
DB-->>Auth : 用户对象
|
||||
Auth->>JWT : 生成访问令牌
|
||||
JWT-->>Auth : access_token
|
||||
Auth-->>Client : Token 响应
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L82)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
|
||||
### 前端请求拦截与错误处理
|
||||
- Axios 实例:统一 base URL、超时与头部。
|
||||
- 请求拦截:自动附加 Bearer Token。
|
||||
- 响应拦截:统一错误码处理、HTTP 状态码映射、网络错误提示与自动登出。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Req["发起请求"] --> Interceptor["请求拦截器<br/>附加 Token"]
|
||||
Interceptor --> Send["发送到后端"]
|
||||
Send --> Resp{"响应成功?"}
|
||||
Resp --> |是| Parse["解析业务响应"]
|
||||
Resp --> |否| Handle["响应拦截器处理"]
|
||||
Handle --> Status{"HTTP 状态码"}
|
||||
Status --> |401| Logout["清除 Token 并跳转登录"]
|
||||
Status --> |403/404/500| Msg["提示错误信息"]
|
||||
Status --> |其他| NetErr["网络错误提示"]
|
||||
Parse --> Done["返回数据"]
|
||||
Logout --> Done
|
||||
Msg --> Done
|
||||
NetErr --> Done
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L63)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L63)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L19)
|
||||
|
||||
## 依赖关系分析
|
||||
- 后端依赖:FastAPI、SQLAlchemy 2.0、asyncpg、Alembic、Pydantic、Pydantic Settings、Passlib、Uvicorn 等。
|
||||
- 前端依赖:Vue 3、Vue Router、Pinia、Axios、Element Plus、ECharts、Day.js 等。
|
||||
- 开发与运行:后端通过 Uvicorn 运行,前端通过 Vite 开发服务器运行并通过代理转发到后端。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端依赖"
|
||||
F["FastAPI"]
|
||||
S["SQLAlchemy 2.0"]
|
||||
A["asyncpg"]
|
||||
Al["Alembic"]
|
||||
P["Pydantic/Settings"]
|
||||
Pa["Passlib"]
|
||||
U["Uvicorn"]
|
||||
end
|
||||
subgraph "前端依赖"
|
||||
V["Vue 3"]
|
||||
VR["Vue Router"]
|
||||
Pi["Pinia"]
|
||||
Ax["Axios"]
|
||||
EP["Element Plus"]
|
||||
E["ECharts"]
|
||||
D["Day.js"]
|
||||
end
|
||||
F --> S --> A
|
||||
F --> U
|
||||
P --> F
|
||||
Pa --> F
|
||||
Al --> S
|
||||
V --> VR --> Ax
|
||||
V --> Pi
|
||||
V --> EP
|
||||
V --> E
|
||||
V --> D
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
章节来源
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L17)
|
||||
- [frontend/package.json](file://frontend/package.json#L11-L25)
|
||||
|
||||
## 性能考虑
|
||||
- 数据库连接池:合理设置池大小与溢出上限,避免连接争用与超时。
|
||||
- 异步查询:优先使用异步 ORM 查询,减少阻塞。
|
||||
- 分页与索引:接口分页参数限制与数据库索引优化,降低查询成本。
|
||||
- 日志级别:生产环境建议提升日志级别,减少磁盘 IO。
|
||||
- 前端缓存与懒加载:减少重复请求与首屏压力。
|
||||
|
||||
[本节为通用指导,无需列出章节来源]
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 一、系统启动失败
|
||||
常见症状
|
||||
- 后端启动报错(端口占用、依赖缺失、配置错误)
|
||||
- 前端无法访问或 404
|
||||
|
||||
排查步骤
|
||||
1. 检查后端端口与依赖
|
||||
- 确认端口未被占用;查看依赖安装是否完整。
|
||||
- 参考后端启动命令与依赖清单。
|
||||
2. 检查环境变量与配置
|
||||
- 确认 .env 或环境变量中数据库连接字符串、密钥等配置正确。
|
||||
3. 检查前端代理
|
||||
- 确认 Vite 代理指向正确的后端地址与端口。
|
||||
4. 查看日志
|
||||
- 后端日志目录与文件命名按日期切分,结合错误日志定位。
|
||||
|
||||
章节来源
|
||||
- [docs/backend.md](file://docs/backend.md#L454-L475)
|
||||
- [backend/.env.example](file://backend/.env.example#L3-L10)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L12-L20)
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L17-L20)
|
||||
|
||||
### 二、数据库连接问题
|
||||
常见症状
|
||||
- 启动时报数据库连接失败
|
||||
- 接口出现超时或连接池耗尽
|
||||
|
||||
排查步骤
|
||||
1. 检查数据库服务状态与可达性
|
||||
- 确认 PostgreSQL 正常运行且监听端口开放。
|
||||
2. 校验连接字符串
|
||||
- 对照示例文件中的连接串,确保主机、端口、数据库名、用户名与密码正确。
|
||||
3. 调整连接池参数
|
||||
- 根据并发与资源情况调整池大小与溢出上限。
|
||||
4. 查看数据库层日志
|
||||
- 结合后端日志定位具体 SQL 与异常。
|
||||
|
||||
章节来源
|
||||
- [backend/.env.example](file://backend/.env.example#L4)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L10-L20)
|
||||
|
||||
### 三、API 接口错误
|
||||
常见症状
|
||||
- 400 参数校验失败
|
||||
- 401 未认证/令牌过期
|
||||
- 403 权限不足
|
||||
- 404 资源不存在
|
||||
- 500 服务器内部错误
|
||||
|
||||
排查步骤
|
||||
1. 参数校验
|
||||
- 检查请求体字段类型、长度与枚举值是否符合 Pydantic 模式定义。
|
||||
2. 认证与权限
|
||||
- 确认携带有效 Bearer Token;检查用户状态与角色。
|
||||
3. 路由与处理器
|
||||
- 确认路由前缀与路径正确;查看处理器是否抛出预期异常。
|
||||
4. 日志分析
|
||||
- 使用异常处理器记录的上下文信息定位问题。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L315-L345)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L77)
|
||||
|
||||
### 四、前端加载异常
|
||||
常见症状
|
||||
- 页面空白、静态资源 404
|
||||
- 登录后页面不跳转或白屏
|
||||
|
||||
排查步骤
|
||||
1. 检查代理配置
|
||||
- 确认 Vite 代理将 /api 前缀转发到后端地址。
|
||||
2. 检查请求拦截器
|
||||
- 确认本地存储中存在有效 Token;检查响应拦截器对 401 的处理。
|
||||
3. 浏览器网络面板
|
||||
- 观察 /api/v1/* 请求状态码与响应内容。
|
||||
4. 控制台错误
|
||||
- 查看前端打包产物与运行时错误。
|
||||
|
||||
章节来源
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L19)
|
||||
- [frontend/src/api/request.js](file://frontend/src/api/request.js#L14-L63)
|
||||
|
||||
### 五、日志分析方法
|
||||
- 日志位置与命名:按日期切分的日志文件,区分普通与错误日志。
|
||||
- 日志格式:包含时间、模块名、级别与消息。
|
||||
- 分析要点:关注异常堆栈、请求 URL、状态码与业务错误信息。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/logging_config.py](file://backend/app/core/logging_config.py#L17-L59)
|
||||
|
||||
### 六、性能瓶颈定位
|
||||
- 数据库层面
|
||||
- 检查慢查询与索引缺失;优化分页与联表查询。
|
||||
- 应用层面
|
||||
- 使用异步查询减少阻塞;限制分页大小;开启连接池调优。
|
||||
- 前端层面
|
||||
- 减少不必要的请求与重渲染;启用懒加载与缓存。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L31-L33)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
|
||||
|
||||
### 七、内存泄漏检测
|
||||
- 后端
|
||||
- 确保每个请求生命周期内的数据库会话正确关闭与回滚。
|
||||
- 避免在全局持有大对象或长生命周期缓存。
|
||||
- 前端
|
||||
- 清理事件监听器与定时器;避免循环引用;及时释放大数组与图片对象。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
### 八、网络连接问题
|
||||
- 后端
|
||||
- 检查 CORS 配置与允许的来源列表。
|
||||
- 前端
|
||||
- 确认代理与跨域头设置;检查浏览器同源策略与证书问题。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L28-L29)
|
||||
- [frontend/vite.config.js](file://frontend/vite.config.js#L14-L19)
|
||||
|
||||
### 九、权限配置错误
|
||||
- 用户状态
|
||||
- 确保用户处于启用状态;检查角色字段与权限映射。
|
||||
- JWT 配置
|
||||
- 确认密钥与算法配置;检查令牌有效期与签发方。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L110)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L23-L26)
|
||||
|
||||
### 十、数据不一致
|
||||
- 事务边界
|
||||
- 确保业务操作在单个事务中完成;必要时使用悲观/乐观锁。
|
||||
- 并发控制
|
||||
- 使用唯一约束与幂等设计;避免竞态条件。
|
||||
- 数据模型
|
||||
- 检查外键与约束;确保枚举值与默认值一致。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L14-L146)
|
||||
|
||||
### 十一、调试工具使用
|
||||
- 后端
|
||||
- 使用 Uvicorn 开发模式热重载;利用 OpenAPI 文档与 ReDoc 进行接口调试。
|
||||
- 前端
|
||||
- 使用 Vue DevTools 与浏览器开发者工具;借助 Axios Mock 或后端联调。
|
||||
|
||||
章节来源
|
||||
- [docs/backend.md](file://docs/backend.md#L454-L475)
|
||||
- [frontend/package.json](file://frontend/package.json#L6-L10)
|
||||
|
||||
### 十二、开发环境与生产环境差异
|
||||
- 开发环境
|
||||
- DEBUG 开启;日志级别较低;CORS 来源宽松。
|
||||
- 生产环境
|
||||
- 关闭 DEBUG;严格 CORS;使用强密钥;启用 HTTPS;监控与告警。
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L15)
|
||||
- [backend/.env.example](file://backend/.env.example#L9-L10)
|
||||
|
||||
## 结论
|
||||
通过明确的启动流程、完善的异常与日志机制、严格的权限与配置管理,以及前后端协同的代理与拦截器,系统具备良好的可观测性与可维护性。遇到问题时,建议遵循“先日志、再配置、后接口”的顺序,结合本文提供的图示与步骤,快速定位并解决问题。
|
||||
|
||||
## 附录
|
||||
- 常用端点与职责
|
||||
- 健康检查:/health
|
||||
- 认证:/api/v1/auth/login、/api/v1/auth/register、/api/v1/auth/me
|
||||
- 员工管理:/api/v1/staff
|
||||
- 科室管理:/api/v1/departments
|
||||
- 指标管理:/api/v1/indicators
|
||||
- 考核管理:/api/v1/assessments
|
||||
- 工资管理:/api/v1/salary
|
||||
- 统计报表:/api/v1/stats
|
||||
- 财务核算:/api/v1/finance
|
||||
- 绩效计划:/api/v1/performance_plans
|
||||
- 菜单管理:/api/v1/menus
|
||||
- 指标模板:/api/v1/templates
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L54-L56)
|
||||
- [backend/app/api/v1/__init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
660
.qoder/repowiki/zh/content/数据库设计/实体关系设计.md
Normal file
660
.qoder/repowiki/zh/content/数据库设计/实体关系设计.md
Normal file
@@ -0,0 +1,660 @@
|
||||
# 实体关系设计
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [database.py](file://backend/app/core/database.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)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心实体](#核心实体)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细实体分析](#详细实体分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件为医院绩效系统的实体关系设计文档,详细描述了系统中所有核心实体之间的关系映射。该系统采用基于平衡计分卡的绩效管理体系,涵盖了科室管理、员工管理、绩效考核、工资核算、指标模板等多个业务领域。文档重点解释了一对一、一对多、多对多关系的设计原理和业务逻辑,包含外键约束、级联操作和引用完整性保证,并提供了完整的ER图说明。
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统采用前后端分离架构,后端使用FastAPI + SQLAlchemy异步ORM框架,数据库采用PostgreSQL。项目结构清晰地按照功能模块组织:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端架构"
|
||||
API[API路由层]
|
||||
Services[业务服务层]
|
||||
Models[数据模型层]
|
||||
Database[数据库层]
|
||||
end
|
||||
subgraph "前端架构"
|
||||
Vue[Vue.js前端]
|
||||
Components[组件库]
|
||||
Router[路由系统]
|
||||
end
|
||||
API --> Services
|
||||
Services --> Models
|
||||
Models --> Database
|
||||
Vue --> API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
**章节来源**
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 核心实体
|
||||
|
||||
系统包含以下核心实体,每个实体都承载着特定的业务职责:
|
||||
|
||||
### 基础实体
|
||||
- **Department**: 科室信息管理,支持多级组织架构
|
||||
- **Staff**: 员工信息管理,包含职位、职称、薪资等信息
|
||||
- **User**: 系统用户管理,支持角色权限控制
|
||||
|
||||
### 考核相关实体
|
||||
- **Assessment**: 绩效考核记录,管理考核流程状态
|
||||
- **AssessmentDetail**: 考核明细,记录具体指标得分
|
||||
- **Indicator**: 考核指标定义,支持多种指标类型
|
||||
|
||||
### 计划与模板实体
|
||||
- **PerformancePlan**: 绩效计划管理,支持多层级计划
|
||||
- **PlanKpiRelation**: 计划与指标关联关系
|
||||
- **IndicatorTemplate**: 指标模板,支持按科室类型分类
|
||||
- **TemplateIndicator**: 模板与指标关联关系
|
||||
|
||||
### 财务实体
|
||||
- **SalaryRecord**: 工资核算记录
|
||||
- **DepartmentFinance**: 科室财务记录
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构设计,确保业务逻辑与数据访问的分离:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
Frontend[前端Vue应用]
|
||||
end
|
||||
subgraph "应用层"
|
||||
API[FastAPI路由]
|
||||
Services[业务服务]
|
||||
end
|
||||
subgraph "数据层"
|
||||
ORM[SQLAlchemy ORM]
|
||||
DB[(PostgreSQL数据库)]
|
||||
end
|
||||
Frontend --> API
|
||||
API --> Services
|
||||
Services --> ORM
|
||||
ORM --> DB
|
||||
subgraph "核心实体关系"
|
||||
Department --> Staff
|
||||
Staff --> Assessment
|
||||
Assessment --> AssessmentDetail
|
||||
AssessmentDetail --> Indicator
|
||||
Staff --> SalaryRecord
|
||||
Department --> DepartmentFinance
|
||||
PerformancePlan --> PlanKpiRelation
|
||||
IndicatorTemplate --> TemplateIndicator
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
## 详细实体分析
|
||||
|
||||
### Department - 科室实体
|
||||
|
||||
Department实体是整个系统的核心组织单元,支持多级嵌套的科室结构:
|
||||
|
||||
```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
|
||||
}
|
||||
class Staff {
|
||||
+int id
|
||||
+string employee_id
|
||||
+string name
|
||||
+int department_id
|
||||
+string position
|
||||
+string title
|
||||
+float base_salary
|
||||
+float performance_ratio
|
||||
+StaffStatus status
|
||||
+datetime hire_date
|
||||
}
|
||||
Department "1" o-- "N" Staff : "包含"
|
||||
Department "1" <-- "N" Department : "子科室"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
|
||||
**业务逻辑**:
|
||||
- 支持多级科室嵌套(parent_id自关联)
|
||||
- 通过level字段维护层级关系
|
||||
- dept_type枚举定义了8种科室类型
|
||||
- 提供sort_order进行排序管理
|
||||
|
||||
**外键约束**:
|
||||
- parent_id -> departments.id (自关联)
|
||||
- 外键约束确保引用完整性
|
||||
|
||||
**索引设计**:
|
||||
- idx_dept_type: 加速科室类型查询
|
||||
- idx_dept_parent: 加速父子关系查询
|
||||
|
||||
### Staff - 员工实体
|
||||
|
||||
Staff实体管理所有员工信息,与Department形成一对多关系:
|
||||
|
||||
```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
|
||||
}
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentStatus status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
}
|
||||
class SalaryRecord {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float base_salary
|
||||
+float performance_score
|
||||
+float performance_bonus
|
||||
+float deduction
|
||||
+float allowance
|
||||
+float total_salary
|
||||
+string status
|
||||
}
|
||||
class User {
|
||||
+int id
|
||||
+string username
|
||||
+string password_hash
|
||||
+int staff_id
|
||||
+string role
|
||||
+bool is_active
|
||||
}
|
||||
Department --> Staff : "1 : N"
|
||||
Staff --> Assessment : "1 : N"
|
||||
Staff --> SalaryRecord : "1 : N"
|
||||
Staff --> User : "1 : 1"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L179)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
**业务逻辑**:
|
||||
- employee_id唯一标识员工身份
|
||||
- performance_ratio影响最终绩效奖金计算
|
||||
- status枚举管理员工生命周期状态
|
||||
- 与User实体建立一对一关系用于系统权限
|
||||
|
||||
**外键约束**:
|
||||
- department_id -> departments.id (强制约束)
|
||||
- staff_id (Assessment) -> staff.id (级联更新/删除)
|
||||
|
||||
**索引设计**:
|
||||
- idx_staff_dept: 加速科室员工查询
|
||||
- idx_staff_status: 加速状态过滤查询
|
||||
|
||||
### Assessment - 考核记录实体
|
||||
|
||||
Assessment实体管理完整的考核流程,包含多个角色参与:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Employee as 员工
|
||||
participant Assessor as 考核人
|
||||
participant Reviewer as 审核人
|
||||
participant System as 系统
|
||||
Employee->>System : 创建考核记录
|
||||
System->>Assessor : 分配考核任务
|
||||
Assessor->>System : 填写考核结果
|
||||
System->>Reviewer : 提交审核
|
||||
Reviewer->>System : 审核通过/驳回
|
||||
System->>Employee : 通知考核结果
|
||||
System->>System : 生成工资记录
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L179)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L105-L146)
|
||||
|
||||
**业务逻辑**:
|
||||
- 支持草稿、已提交、已审核、已确认、已驳回等状态
|
||||
- assessor_id和reviewer_id允许同一人或不同人
|
||||
- 自动计算total_score和weighted_score
|
||||
- 与AssessmentDetail形成一对多关系
|
||||
|
||||
**外键约束**:
|
||||
- staff_id -> staff.id (RESTRICT)
|
||||
- assessor_id -> staff.id (SET NULL)
|
||||
- reviewer_id -> staff.id (SET NULL)
|
||||
|
||||
**级联操作**:
|
||||
- Assessment删除时,details自动删除 (DELETE-ORPHAN)
|
||||
|
||||
### AssessmentDetail - 考核明细实体
|
||||
|
||||
AssessmentDetail实体记录具体的指标得分:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+string evidence
|
||||
+string remark
|
||||
}
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string calculation_method
|
||||
+bool is_veto
|
||||
}
|
||||
Assessment --> AssessmentDetail : "1 : N"
|
||||
Indicator --> AssessmentDetail : "1 : N"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L181-L203)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
|
||||
**业务逻辑**:
|
||||
- 记录每个指标的实际值和计算得分
|
||||
- 支持证据材料上传
|
||||
- is_veto字段实现一票否决机制
|
||||
|
||||
**外键约束**:
|
||||
- assessment_id -> assessments.id (CASCADE DELETE)
|
||||
- indicator_id -> indicators.id (RESTRICT)
|
||||
|
||||
### Indicator - 指标实体
|
||||
|
||||
Indicator实体定义了完整的考核指标体系:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
}
|
||||
Indicator --> AssessmentDetail : "1 : N"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
|
||||
**业务逻辑**:
|
||||
- 支持质量、数量、效率、服务、成本五种指标类型
|
||||
- BSC维度支持财务、客户、内部流程、学习与成长四个维度
|
||||
- applicable_dept_types存储适用科室类型的JSON数组
|
||||
- 支持复杂的计算方法和扣分标准
|
||||
|
||||
**约束条件**:
|
||||
- weight > 0 的检查约束
|
||||
- code唯一性约束
|
||||
|
||||
### SalaryRecord - 工资记录实体
|
||||
|
||||
SalaryRecord实体管理工资核算过程:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始工资核算]) --> CheckAssessment["检查是否存在已确认的考核记录"]
|
||||
CheckAssessment --> HasAssessment{"存在已确认考核?"}
|
||||
HasAssessment --> |否| Error["返回错误:未找到已确认的考核记录"]
|
||||
HasAssessment --> |是| CheckExisting["检查是否已存在工资记录"]
|
||||
CheckExisting --> HasExisting{"已存在工资记录?"}
|
||||
HasExisting --> |是| Error
|
||||
HasExisting --> |否| Calculate["计算各项工资项目"]
|
||||
Calculate --> Generate["生成工资记录"]
|
||||
Generate --> Confirm["设置状态为已确认"]
|
||||
Confirm --> End([完成])
|
||||
Error --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L96-L111)
|
||||
|
||||
**业务逻辑**:
|
||||
- 基于考核结果计算绩效奖金
|
||||
- 支持批量生成功能
|
||||
- 与Assessment形成间接关联关系
|
||||
|
||||
**外键约束**:
|
||||
- staff_id -> staff.id (RESTRICT)
|
||||
|
||||
### PerformancePlan - 绩效计划实体
|
||||
|
||||
PerformancePlan实体管理多层次的绩效计划:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class PerformancePlan {
|
||||
+int id
|
||||
+string plan_name
|
||||
+string plan_code
|
||||
+PlanLevel plan_level
|
||||
+int plan_year
|
||||
+int plan_month
|
||||
+string plan_type
|
||||
+int department_id
|
||||
+int staff_id
|
||||
+int parent_plan_id
|
||||
+string description
|
||||
+string strategic_goals
|
||||
+string key_initiatives
|
||||
+PlanStatus status
|
||||
+int submitter_id
|
||||
+int approver_id
|
||||
+int version
|
||||
+bool is_active
|
||||
}
|
||||
class PlanKpiRelation {
|
||||
+int id
|
||||
+int plan_id
|
||||
+int indicator_id
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+float weight
|
||||
+string scoring_method
|
||||
+string scoring_params
|
||||
}
|
||||
PerformancePlan --> PlanKpiRelation : "1 : N"
|
||||
PerformancePlan --> PerformancePlan : "1 : N (父子计划)"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L270-L312)
|
||||
- [models.py](file://backend/app/models/models.py#L314-L339)
|
||||
|
||||
**业务逻辑**:
|
||||
- 支持医院级、科室级、个人级三个层级
|
||||
- 支持年度和月度两种计划类型
|
||||
- parent_plan_id实现计划的层次化管理
|
||||
|
||||
**外键约束**:
|
||||
- department_id -> departments.id (SET NULL)
|
||||
- staff_id -> staff.id (SET NULL)
|
||||
- parent_plan_id -> performance_plans.id (SET NULL)
|
||||
|
||||
### IndicatorTemplate & TemplateIndicator - 模板实体
|
||||
|
||||
模板系统支持按科室类型预设指标组合:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class IndicatorTemplate {
|
||||
+int id
|
||||
+string template_name
|
||||
+string template_code
|
||||
+TemplateType template_type
|
||||
+string description
|
||||
+string dimension_weights
|
||||
+string assessment_cycle
|
||||
+bool is_active
|
||||
}
|
||||
class TemplateIndicator {
|
||||
+int id
|
||||
+int template_id
|
||||
+int indicator_id
|
||||
+string category
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+float weight
|
||||
+string scoring_method
|
||||
+string scoring_params
|
||||
+int sort_order
|
||||
}
|
||||
IndicatorTemplate --> TemplateIndicator : "1 : N"
|
||||
TemplateIndicator --> Indicator : "M : N"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L409)
|
||||
- [models.py](file://backend/app/models/models.py#L411-L438)
|
||||
|
||||
**业务逻辑**:
|
||||
- 按科室类型提供标准化的指标模板
|
||||
- 支持维度权重配置
|
||||
- sort_order控制指标显示顺序
|
||||
|
||||
**约束条件**:
|
||||
- template_code唯一性
|
||||
- template_id + indicator_id唯一性组合
|
||||
|
||||
### DepartmentFinance - 科室财务实体
|
||||
|
||||
DepartmentFinance实体管理科室财务数据:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class DepartmentFinance {
|
||||
+int id
|
||||
+int department_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+FinanceType finance_type
|
||||
+string category
|
||||
+float amount
|
||||
+string source
|
||||
+string remark
|
||||
}
|
||||
class Department {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+DeptType dept_type
|
||||
}
|
||||
Department --> DepartmentFinance : "1 : N"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L75)
|
||||
|
||||
**业务逻辑**:
|
||||
- 支持收入和支出两类财务记录
|
||||
- category字段区分具体财务项目
|
||||
- amount字段强制非负数
|
||||
|
||||
**约束条件**:
|
||||
- amount >= 0 的检查约束
|
||||
- 复合索引优化查询性能
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统实体间存在复杂的依赖关系,通过外键约束确保数据一致性:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "组织架构依赖"
|
||||
Department --> Staff
|
||||
Staff --> Assessment
|
||||
Assessment --> AssessmentDetail
|
||||
AssessmentDetail --> Indicator
|
||||
end
|
||||
subgraph "计划管理依赖"
|
||||
PerformancePlan --> PlanKpiRelation
|
||||
PlanKpiRelation --> Indicator
|
||||
PerformancePlan --> PerformancePlan
|
||||
end
|
||||
subgraph "模板系统依赖"
|
||||
IndicatorTemplate --> TemplateIndicator
|
||||
TemplateIndicator --> Indicator
|
||||
end
|
||||
subgraph "财务关联依赖"
|
||||
Department --> DepartmentFinance
|
||||
Staff --> SalaryRecord
|
||||
end
|
||||
subgraph "用户系统依赖"
|
||||
Staff --> User
|
||||
PerformancePlan --> User
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
**外键约束策略**:
|
||||
- 强制约束:department_id, staff_id, indicator_id
|
||||
- 级联约束:Assessment删除时自动删除AssessmentDetail
|
||||
- 设置为空:staff_id在User中可为空,便于用户与员工解耦
|
||||
|
||||
**级联操作配置**:
|
||||
- Assessment.cascade(delete-orphan): 删除Assessment时自动清理明细
|
||||
- PlanKpiRelation.cascade(delete-orphan): 删除计划时清理指标关联
|
||||
- 多对多关系通过中间表实现,避免复杂的级联操作
|
||||
|
||||
## 性能考虑
|
||||
|
||||
系统在设计时充分考虑了性能优化:
|
||||
|
||||
### 索引策略
|
||||
- 复合索引优化常用查询模式
|
||||
- 枚举字段建立独立索引
|
||||
- 时间字段建立范围查询索引
|
||||
|
||||
### 查询优化
|
||||
- 使用selectinload减少N+1查询问题
|
||||
- 合理的连接策略避免笛卡尔积
|
||||
- 分页查询限制结果集大小
|
||||
|
||||
### 缓存策略
|
||||
- 配置数据库连接池
|
||||
- 异步查询提升并发性能
|
||||
- 合理的事务管理避免锁竞争
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
**1. 外键约束冲突**
|
||||
- 症状:插入或更新数据时报外键约束错误
|
||||
- 解决:检查关联实体是否存在且状态有效
|
||||
- 预防:在业务层先验证关联关系
|
||||
|
||||
**2. 数据重复问题**
|
||||
- 症状:唯一约束冲突
|
||||
- 解决:检查employee_id、code、template_code等唯一字段
|
||||
- 预防:在创建前进行唯一性检查
|
||||
|
||||
**3. 级联删除问题**
|
||||
- 症状:删除主记录时意外删除相关数据
|
||||
- 解决:检查cascade配置,必要时调整为RESTRICT
|
||||
- 预防:在删除前确认级联影响范围
|
||||
|
||||
**4. 性能问题**
|
||||
- 症状:查询响应缓慢
|
||||
- 解决:检查索引使用情况,优化查询条件
|
||||
- 预防:定期分析查询执行计划
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L144-L146)
|
||||
- [finance.py](file://backend/app/models/finance.py#L73-L74)
|
||||
|
||||
## 结论
|
||||
|
||||
本实体关系设计文档全面阐述了医院绩效系统的数据模型架构。系统采用规范化的数据库设计,通过合理的实体划分和关系映射,实现了以下目标:
|
||||
|
||||
1. **业务完整性**:完整覆盖医院绩效管理的各个业务环节
|
||||
2. **数据一致性**:通过外键约束和级联操作确保数据完整性
|
||||
3. **扩展性**:支持多层级组织架构和灵活的指标模板系统
|
||||
4. **性能优化**:合理的索引设计和查询策略
|
||||
5. **安全性**:通过用户权限管理和数据访问控制
|
||||
|
||||
该设计为后续的功能扩展和系统维护奠定了坚实的基础,能够满足医院绩效管理的复杂业务需求。
|
||||
599
.qoder/repowiki/zh/content/数据库设计/数据字典/基础数据字段.md
Normal file
599
.qoder/repowiki/zh/content/数据库设计/数据字典/基础数据字段.md
Normal file
@@ -0,0 +1,599 @@
|
||||
# 基础数据字段
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件聚焦于基础数据字段的详细数据字典,覆盖以下核心表:
|
||||
- 科室信息表(Department)
|
||||
- 员工信息表(Staff)
|
||||
- 用户表(User)
|
||||
|
||||
同时补充与基础数据强相关的财务记录表(DepartmentFinance)字段说明,以及与字段相关的枚举类型、索引设计、约束与业务规则。文档提供字段定义、类型与长度、空值与默认值、业务含义、取值范围、注释说明、业务规则约束、字段间关联关系与外键约束、索引设计与性能考虑,并给出实际使用示例与最佳实践建议。
|
||||
|
||||
## 项目结构
|
||||
本项目采用前后端分离架构,后端基于 FastAPI + SQLAlchemy ORM,数据库迁移使用 Alembic。基础数据模型集中在 models 模块,API 路由位于 app/api/v1 下,数据字典与 ER 图见 docs/database.md。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
A["models.py<br/>数据模型"]
|
||||
B["finance.py<br/>财务模型"]
|
||||
C["schemas.py<br/>Pydantic模式"]
|
||||
D["alembic 迁移<br/>001_initial.py / 002_template.py"]
|
||||
E["API 路由<br/>departments.py / staff.py"]
|
||||
end
|
||||
subgraph "文档"
|
||||
F["docs/database.md<br/>ER图与字段说明"]
|
||||
end
|
||||
A --> D
|
||||
B --> D
|
||||
C --> E
|
||||
E --> A
|
||||
F --> A
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L64-L149)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L64)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L91)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L17-L108)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L17-L124)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L64-L149)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L64)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L91)
|
||||
- [database.md](file://docs/database.md#L97-L232)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L17-L108)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L17-L124)
|
||||
|
||||
## 核心组件
|
||||
- 科室信息表(Department)
|
||||
- 员工信息表(Staff)
|
||||
- 用户表(User)
|
||||
- 科室财务记录表(DepartmentFinance)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
## 架构总览
|
||||
基础数据字段与业务流程的关系如下:
|
||||
- Department 与 Staff 为 1:N 关系(部门-员工)
|
||||
- Staff 与 User 为 N:1 关系(员工-用户)
|
||||
- DepartmentFinance 与 Department 为 1:N 关系(科室-财务记录)
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
boolean is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
decimal base_salary
|
||||
decimal performance_ratio
|
||||
enum status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
USERS {
|
||||
int id PK
|
||||
string username UK
|
||||
string password_hash
|
||||
int staff_id FK
|
||||
string role
|
||||
boolean is_active
|
||||
datetime last_login
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENT_FINANCES {
|
||||
int id PK
|
||||
int department_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
enum finance_type
|
||||
string category
|
||||
decimal amount
|
||||
string source
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS ||--o{ STAFF : "1:N"
|
||||
STAFF ||--o{ USERS : "N:1"
|
||||
DEPARTMENTS ||--o{ DEPARTMENT_FINANCES : "1:N"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L64)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 科室信息表(Department)
|
||||
- 表名:departments
|
||||
- 主键:id(自增整数)
|
||||
- 唯一键:code(唯一)
|
||||
- 外键:parent_id 引用 departments.id(自关联,表示上级科室)
|
||||
- 索引:idx_dept_type、idx_dept_parent
|
||||
- 枚举:dept_type(来自 DeptType)
|
||||
|
||||
字段定义与规则
|
||||
- id
|
||||
- 类型:整数(主键)
|
||||
- 约束:自增、非空
|
||||
- 默认值:无
|
||||
- 业务含义:科室唯一标识
|
||||
- 取值范围:正整数
|
||||
- 注释:主键
|
||||
- 关联关系:parent_id 自关联指向自身
|
||||
- 索引:PK
|
||||
- name
|
||||
- 类型:字符串(最大长度 100)
|
||||
- 约束:非空
|
||||
- 默认值:无
|
||||
- 业务含义:科室名称
|
||||
- 取值范围:长度不超过 100
|
||||
- 注释:科室名称
|
||||
- code
|
||||
- 类型:字符串(最大长度 20)
|
||||
- 约束:唯一、非空
|
||||
- 默认值:无
|
||||
- 业务含义:科室编码(全局唯一)
|
||||
- 取值范围:长度不超过 20
|
||||
- 注释:科室编码
|
||||
- 索引:UK
|
||||
- dept_type
|
||||
- 类型:枚举(DeptType)
|
||||
- 约束:非空
|
||||
- 默认值:无
|
||||
- 业务含义:科室类型
|
||||
- 取值范围:clinical_surgical、clinical_nonsurgical_ward、clinical_nonsurgical_noward、medical_tech、medical_auxiliary、nursing、admin、finance、logistics
|
||||
- 注释:科室类型
|
||||
- 索引:idx_dept_type
|
||||
- parent_id
|
||||
- 类型:整数
|
||||
- 约束:可空,外键引用 departments.id
|
||||
- 默认值:空
|
||||
- 业务含义:上级科室 ID(自关联)
|
||||
- 取值范围:对应存在的 id 或空
|
||||
- 注释:上级科室
|
||||
- 索引:idx_dept_parent
|
||||
- level
|
||||
- 类型:整数
|
||||
- 约束:默认 1
|
||||
- 默认值:1
|
||||
- 业务含义:层级(1-5)
|
||||
- 取值范围:1-5
|
||||
- 注释:层级
|
||||
- sort_order
|
||||
- 类型:整数
|
||||
- 约束:默认 0
|
||||
- 默认值:0
|
||||
- 业务含义:排序
|
||||
- 注释:排序
|
||||
- is_active
|
||||
- 类型:布尔
|
||||
- 约束:默认 true
|
||||
- 默认值:true
|
||||
- 业务含义:是否启用
|
||||
- 注释:是否启用
|
||||
- description
|
||||
- 类型:文本
|
||||
- 约束:可空
|
||||
- 默认值:空
|
||||
- 业务含义:描述
|
||||
- 注释:描述
|
||||
- created_at / updated_at
|
||||
- 类型:日期时间
|
||||
- 约束:默认当前时间;更新时自动更新
|
||||
- 默认值:无
|
||||
- 业务含义:创建/更新时间
|
||||
- 注释:创建时间、更新时间
|
||||
|
||||
业务规则与最佳实践
|
||||
- 编码唯一性:code 必须全局唯一,新增前需校验重复
|
||||
- 层级与排序:level 与 sort_order 用于树形展示与排序
|
||||
- 自关联:parent_id 支持多级组织架构,查询时注意避免环路
|
||||
- 索引:dept_type 与 parent_id 建议在过滤与树形查询中使用
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L41)
|
||||
- [database.md](file://docs/database.md#L99-L116)
|
||||
|
||||
### 员工信息表(Staff)
|
||||
- 表名:staff
|
||||
- 主键:id(自增整数)
|
||||
- 唯一键:employee_id(唯一)
|
||||
- 外键:department_id 引用 departments.id
|
||||
- 索引:idx_staff_dept、idx_staff_status
|
||||
- 枚举:status(来自 StaffStatus)
|
||||
|
||||
字段定义与规则
|
||||
- id
|
||||
- 类型:整数(主键)
|
||||
- 约束:自增、非空
|
||||
- 默认值:无
|
||||
- 业务含义:员工唯一标识
|
||||
- 注释:主键
|
||||
- employee_id
|
||||
- 类型:字符串(最大长度 20)
|
||||
- 约束:唯一、非空
|
||||
- 默认值:无
|
||||
- 业务含义:工号(唯一)
|
||||
- 取值范围:长度不超过 20
|
||||
- 注释:工号
|
||||
- 索引:UK
|
||||
- name
|
||||
- 类型:字符串(最大长度 50)
|
||||
- 约束:非空
|
||||
- 默认值:无
|
||||
- 业务含义:姓名
|
||||
- 取值范围:长度不超过 50
|
||||
- 注释:姓名
|
||||
- department_id
|
||||
- 类型:整数
|
||||
- 约束:非空,外键引用 departments.id
|
||||
- 默认值:无
|
||||
- 业务含义:所属科室
|
||||
- 注释:所属科室
|
||||
- 索引:idx_staff_dept
|
||||
- position
|
||||
- 类型:字符串(最大长度 50)
|
||||
- 约束:非空
|
||||
- 默认值:无
|
||||
- 业务含义:职位
|
||||
- 取值范围:长度不超过 50
|
||||
- 注释:职位
|
||||
- title
|
||||
- 类型:字符串(最大长度 50)
|
||||
- 约束:可空
|
||||
- 默认值:空
|
||||
- 业务含义:职称
|
||||
- 注释:职称
|
||||
- phone
|
||||
- 类型:字符串(最大长度 20)
|
||||
- 约束:可空
|
||||
- 默认值:空
|
||||
- 业务含义:联系电话
|
||||
- 注释:联系电话
|
||||
- email
|
||||
- 类型:字符串(最大长度 100)
|
||||
- 约束:可空
|
||||
- 默认值:空
|
||||
- 业务含义:邮箱
|
||||
- 注释:邮箱
|
||||
- base_salary
|
||||
- 类型:数值(精度 10,小数 2)
|
||||
- 约束:默认 0
|
||||
- 默认值:0
|
||||
- 业务含义:基本工资
|
||||
- 取值范围:≥0
|
||||
- 注释:基本工资
|
||||
- performance_ratio
|
||||
- 类型:数值(精度 5,小数 2)
|
||||
- 约束:默认 1.0
|
||||
- 默认值:1.0
|
||||
- 业务含义:绩效系数(0-5)
|
||||
- 取值范围:0-5
|
||||
- 注释:绩效系数
|
||||
- status
|
||||
- 类型:枚举(StaffStatus)
|
||||
- 约束:默认 active
|
||||
- 默认值:active
|
||||
- 业务含义:员工状态
|
||||
- 取值范围:active、leave、resigned、retired
|
||||
- 注释:状态
|
||||
- 索引:idx_staff_status
|
||||
- hire_date
|
||||
- 类型:日期时间
|
||||
- 约束:可空
|
||||
- 默认值:空
|
||||
- 业务含义:入职日期
|
||||
- 注释:入职日期
|
||||
- created_at / updated_at
|
||||
- 类型:日期时间
|
||||
- 约束:默认当前时间;更新时自动更新
|
||||
- 默认值:无
|
||||
- 业务含义:创建/更新时间
|
||||
- 注释:创建时间、更新时间
|
||||
|
||||
业务规则与最佳实践
|
||||
- 工号唯一性:employee_id 必须唯一,新增前需校验重复
|
||||
- 状态枚举:仅允许枚举值,避免脏数据
|
||||
- 薪资与系数:base_salary 与 performance_ratio 用于后续绩效工资计算
|
||||
- 索引:department_id 与 status 用于筛选与分页
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L42-L64)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
- [database.md](file://docs/database.md#L117-L136)
|
||||
|
||||
### 用户表(User)
|
||||
- 表名:users
|
||||
- 主键:id(自增整数)
|
||||
- 唯一键:username(唯一)
|
||||
- 外键:staff_id 引用 staff.id
|
||||
- 索引:idx_user_username
|
||||
|
||||
字段定义与规则
|
||||
- id
|
||||
- 类型:整数(主键)
|
||||
- 约束:自增、非空
|
||||
- 默认值:无
|
||||
- 业务含义:用户唯一标识
|
||||
- 注释:主键
|
||||
- username
|
||||
- 类型:字符串(最大长度 50)
|
||||
- 约束:唯一、非空
|
||||
- 默认值:无
|
||||
- 业务含义:用户名
|
||||
- 取值范围:长度不超过 50
|
||||
- 注释:用户名
|
||||
- 索引:UK
|
||||
- password_hash
|
||||
- 类型:字符串(最大长度 255)
|
||||
- 约束:非空
|
||||
- 默认值:无
|
||||
- 业务含义:密码哈希
|
||||
- 注释:密码哈希
|
||||
- staff_id
|
||||
- 类型:整数
|
||||
- 约束:可空,外键引用 staff.id
|
||||
- 默认值:空
|
||||
- 业务含义:关联员工
|
||||
- 注释:关联员工
|
||||
- role
|
||||
- 类型:字符串(最大长度 20)
|
||||
- 约束:默认 staff
|
||||
- 默认值:staff
|
||||
- 业务含义:角色
|
||||
- 取值范围:admin、manager、staff
|
||||
- 注释:角色
|
||||
- is_active
|
||||
- 类型:布尔
|
||||
- 约束:默认 true
|
||||
- 默认值:true
|
||||
- 业务含义:是否启用
|
||||
- 注释:是否启用
|
||||
- last_login
|
||||
- 类型:日期时间
|
||||
- 约束:可空
|
||||
- 默认值:空
|
||||
- 业务含义:最后登录时间
|
||||
- 注释:最后登录
|
||||
- created_at / updated_at
|
||||
- 类型:日期时间
|
||||
- 约束:默认当前时间;更新时自动更新
|
||||
- 默认值:无
|
||||
- 业务含义:创建/更新时间
|
||||
- 注释:创建时间、更新时间
|
||||
|
||||
业务规则与最佳实践
|
||||
- 用户名唯一性:username 必须唯一
|
||||
- 角色枚举:仅允许 admin、manager、staff
|
||||
- 关联员工:staff_id 可空,表示未绑定员工的系统用户
|
||||
- 登录追踪:last_login 用于审计与安全策略
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L156-L172)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L314-L345)
|
||||
- [database.md](file://docs/database.md#L218-L232)
|
||||
|
||||
### 科室财务记录表(DepartmentFinance)
|
||||
- 表名:department_finances
|
||||
- 主键:id(自增整数)
|
||||
- 外键:department_id 引用 departments.id
|
||||
- 索引:idx_finance_dept、idx_finance_period、idx_finance_type、idx_finance_category
|
||||
- 枚举:finance_type(来自 FinanceType)
|
||||
- 约束:amount ≥ 0
|
||||
|
||||
字段定义与规则
|
||||
- id
|
||||
- 类型:整数(主键)
|
||||
- 约束:自增、非空
|
||||
- 默认值:无
|
||||
- 业务含义:财务记录唯一标识
|
||||
- 注释:主键
|
||||
- department_id
|
||||
- 类型:整数
|
||||
- 约束:非空,外键引用 departments.id
|
||||
- 默认值:无
|
||||
- 业务含义:所属科室
|
||||
- 注释:科室ID
|
||||
- 索引:idx_finance_dept
|
||||
- period_year / period_month
|
||||
- 类型:整数
|
||||
- 约束:非空
|
||||
- 默认值:无
|
||||
- 业务含义:年度/月份
|
||||
- 注释:年度、月份
|
||||
- 索引:idx_finance_period
|
||||
- finance_type
|
||||
- 类型:枚举(FinanceType)
|
||||
- 约束:非空
|
||||
- 默认值:无
|
||||
- 业务含义:财务类型(收入/支出)
|
||||
- 取值范围:revenue、expense
|
||||
- 注释:财务类型
|
||||
- 索引:idx_finance_type
|
||||
- category
|
||||
- 类型:字符串(最大长度 50)
|
||||
- 约束:非空
|
||||
- 默认值:无
|
||||
- 业务含义:类别(如检查费、床位费等)
|
||||
- 取值范围:长度不超过 50
|
||||
- 注释:类别
|
||||
- 索引:idx_finance_category
|
||||
- amount
|
||||
- 类型:数值(精度 12,小数 2)
|
||||
- 约束:默认 0,且 ≥ 0
|
||||
- 默认值:0
|
||||
- 业务含义:金额
|
||||
- 取值范围:≥0
|
||||
- 注释:金额
|
||||
- 约束:check(amount >= 0)
|
||||
- source
|
||||
- 类型:字符串(最大长度 100)
|
||||
- 约束:可空
|
||||
- 默认值:空
|
||||
- 业务含义:数据来源
|
||||
- 注释:数据来源
|
||||
- remark
|
||||
- 类型:文本
|
||||
- 约束:可空
|
||||
- 默认值:空
|
||||
- 业务含义:备注
|
||||
- 注释:备注
|
||||
- created_at / updated_at
|
||||
- 类型:日期时间
|
||||
- 约束:默认当前时间;更新时自动更新
|
||||
- 默认值:无
|
||||
- 业务含义:创建/更新时间
|
||||
- 注释:创建时间、更新时间
|
||||
|
||||
业务规则与最佳实践
|
||||
- 金额非负:通过约束保证 amount ≥ 0
|
||||
- 类别与类型:category 与 finance_type 组合用于财务归类与统计
|
||||
- 周期聚合:period_year 与 period_month 用于月度/年度汇总
|
||||
|
||||
章节来源
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
|
||||
## 依赖分析
|
||||
- Department 与 Staff 的关系:1:N(部门-员工),通过 department_id 外键关联
|
||||
- Staff 与 User 的关系:N:1(员工-用户),通过 staff_id 外键关联
|
||||
- Department 与 DepartmentFinance 的关系:1:N(科室-财务记录),通过 department_id 外键关联
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
DEPT["Department"] --> |FK| STAFF["Staff"]
|
||||
STAFF --> |FK| USER["User"]
|
||||
DEPT --> |FK| FIN["DepartmentFinance"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
## 性能考量
|
||||
- 索引设计
|
||||
- Department:idx_dept_type、idx_dept_parent,适合按类型过滤与树形查询
|
||||
- Staff:idx_staff_dept、idx_staff_status,适合按科室与状态筛选
|
||||
- Assessments:idx_assessment_staff、idx_assessment_period、idx_assessment_status,适合按员工、周期与状态查询
|
||||
- SalaryRecords:idx_salary_staff、idx_salary_period,适合按员工与周期查询
|
||||
- Users:idx_user_username,适合按用户名登录
|
||||
- DepartmentFinance:idx_finance_dept、idx_finance_period、idx_finance_type、idx_finance_category,适合财务统计与聚合
|
||||
- 约束与校验
|
||||
- Staff.performance_ratio 与 Indicator.weight 使用 Pydantic 校验(ge/le),数据库层使用 CheckConstraint(如 DepartmentFinance.amount ≥ 0)
|
||||
- 查询建议
|
||||
- 分页与过滤:优先使用带索引的列进行 where 条件与 order by
|
||||
- 树形查询:Department.parent_id + level 用于层级展示
|
||||
- 聚合统计:DepartmentFinance 按 period_year/month + category + type 聚合
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L82-L86)
|
||||
- [models.py](file://backend/app/models/models.py#L111-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L174-L178)
|
||||
- [models.py](file://backend/app/models/models.py#L227-L230)
|
||||
- [models.py](file://backend/app/models/models.py#L258-L260)
|
||||
- [finance.py](file://backend/app/models/finance.py#L68-L74)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L117-L136)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L158-L176)
|
||||
|
||||
## 故障排查指南
|
||||
- 新增科室失败(编码重复)
|
||||
- 现象:创建接口返回错误,提示编码已存在
|
||||
- 排查:检查 departments.code 是否唯一;确认是否已有相同编码
|
||||
- 处理:修改编码或删除冲突记录
|
||||
- 新增员工失败(工号重复)
|
||||
- 现象:创建接口返回错误,提示工号已存在
|
||||
- 排查:检查 staff.employee_id 是否唯一
|
||||
- 处理:修改工号或删除冲突记录
|
||||
- 删除科室失败(存在子科室)
|
||||
- 现象:删除接口返回错误,提示无法删除
|
||||
- 排查:确认该科室是否存在子科室(parent_id 指向该 id)
|
||||
- 处理:先删除子科室或调整组织架构
|
||||
- 薪资/财务金额异常
|
||||
- 现象:DepartmentFinance.amount 出现负值
|
||||
- 排查:检查数据来源与业务逻辑;确认约束是否生效
|
||||
- 处理:修正数据或调整业务流程
|
||||
|
||||
章节来源
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L74-L77)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L75-L78)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L104-L106)
|
||||
- [finance.py](file://backend/app/models/finance.py#L73-L74)
|
||||
|
||||
## 结论
|
||||
本文档对基础数据字段进行了系统梳理,明确了字段类型、长度、空值与默认值、业务含义、取值范围、注释说明、业务规则约束、外键关系与索引设计,并提供了性能考量与故障排查建议。遵循这些字段规范与最佳实践,有助于确保数据一致性、查询性能与业务稳定性。
|
||||
|
||||
## 附录
|
||||
- 字段使用示例(示意)
|
||||
- 新增科室:提供 name、code、dept_type、parent_id、level、sort_order、is_active、description
|
||||
- 新增员工:提供 employee_id、name、department_id、position、title、phone、email、base_salary、performance_ratio、status、hire_date
|
||||
- 新增用户:提供 username、password_hash、staff_id、role、is_active、last_login
|
||||
- 新增财务记录:提供 department_id、finance_type、category、amount、period_year、period_month、source、remark
|
||||
- 最佳实践
|
||||
- 唯一性:严格维护 code 与 employee_id 的唯一性
|
||||
- 枚举:统一使用模型中定义的枚举类型,避免拼写差异
|
||||
- 索引:在高频查询列上保持索引,定期评估查询计划
|
||||
- 校验:前端与后端双重校验,确保数据质量
|
||||
473
.qoder/repowiki/zh/content/数据库设计/数据字典/指标模板字段.md
Normal file
473
.qoder/repowiki/zh/content/数据库设计/数据字典/指标模板字段.md
Normal file
@@ -0,0 +1,473 @@
|
||||
# 指标模板字段
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [template_service.py](file://backend/app/services/template_service.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue)
|
||||
- [template.js](file://frontend/src/api/template.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文件聚焦于指标模板相关字段的数据字典,覆盖以下核心实体与关系:
|
||||
- 指标模板表(IndicatorTemplate)
|
||||
- 模板指标关联表(TemplateIndicator)
|
||||
- 模板类型枚举(TemplateType)
|
||||
- 指标与模板的多对多关联关系
|
||||
- 维度权重配置与指标分类管理
|
||||
- 模板版本管理与继承关系设计
|
||||
- 激活状态与使用范围约束
|
||||
|
||||
本文件同时提供字段定义、约束说明、数据流向与前后端交互示例,帮助开发者与运维人员快速理解与使用模板系统。
|
||||
|
||||
## 项目结构
|
||||
模板系统由后端模型与服务、API路由、前端页面与接口组成,形成“模型-服务-接口-视图”的完整链路。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
M["models.py<br/>数据模型"]
|
||||
S["template_service.py<br/>服务层"]
|
||||
A["templates.py<br/>API路由"]
|
||||
SC["schemas.py<br/>Pydantic模式"]
|
||||
ALEMBIC["002_template.py<br/>迁移脚本"]
|
||||
end
|
||||
subgraph "前端"
|
||||
V["Templates.vue<br/>模板管理页面"]
|
||||
API["template.js<br/>模板API封装"]
|
||||
end
|
||||
V --> API
|
||||
API --> A
|
||||
A --> S
|
||||
S --> M
|
||||
M --> ALEMBIC
|
||||
SC --> A
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L640-L743)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L640-L743)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
|
||||
## 核心组件
|
||||
- 指标模板表(IndicatorTemplate)
|
||||
- 字段:id、template_name、template_code、template_type、description、dimension_weights、assessment_cycle、is_active、created_at、updated_at
|
||||
- 关系:与模板指标关联表一对多
|
||||
- 约束:唯一索引(template_code)、索引(template_type、is_active)
|
||||
|
||||
- 模板指标关联表(TemplateIndicator)
|
||||
- 字段:id、template_id、indicator_id、category、target_value、target_unit、weight、scoring_method、scoring_params、sort_order、remark、created_at、updated_at
|
||||
- 关系:与模板表、指标表多对一
|
||||
- 约束:唯一索引(template_id, indicator_id)、索引(template_id、indicator_id)
|
||||
|
||||
- 模板类型枚举(TemplateType)
|
||||
- 类型:general、surgical、nonsurgical_ward、nonsurgical_noward、medical_tech、nursing、admin、logistics
|
||||
|
||||
- 指标表(Indicator)
|
||||
- 字段:id、name、code、indicator_type、bs_dimension、weight、max_score、target_value、target_unit、calculation_method、assessment_method、deduction_standard、data_source、applicable_dept_types、is_veto、is_active、created_at、updated_at
|
||||
- 约束:CheckConstraint(weight > 0)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [models.py](file://backend/app/models/models.py#L375-L385)
|
||||
|
||||
## 架构总览
|
||||
模板系统采用“模板-指标”多对多关系,通过模板指标关联表实现灵活配置。模板类型决定适用科室范围,维度权重用于汇总计算,指标分类用于二级归类,权重与评分方法用于最终得分计算。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
INDICATOR_TEMPLATE {
|
||||
int id PK
|
||||
string template_name
|
||||
string template_code UK
|
||||
string template_type
|
||||
text description
|
||||
text dimension_weights
|
||||
string assessment_cycle
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
TEMPLATE_INDICATOR {
|
||||
int id PK
|
||||
int template_id FK
|
||||
int indicator_id FK
|
||||
string category
|
||||
numeric target_value
|
||||
string target_unit
|
||||
numeric weight
|
||||
string scoring_method
|
||||
text scoring_params
|
||||
int sort_order
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATOR {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
string indicator_type
|
||||
string bs_dimension
|
||||
numeric weight
|
||||
numeric max_score
|
||||
numeric target_value
|
||||
string target_unit
|
||||
text calculation_method
|
||||
text assessment_method
|
||||
text deduction_standard
|
||||
string data_source
|
||||
text applicable_dept_types
|
||||
boolean is_veto
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATOR_TEMPLATE ||--o{ TEMPLATE_INDICATOR : "包含"
|
||||
INDICATOR ||--o{ TEMPLATE_INDICATOR : "被包含"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 指标模板表(IndicatorTemplate)字段字典
|
||||
- id
|
||||
- 类型:整数
|
||||
- 主键:是
|
||||
- 描述:模板主键
|
||||
- 约束:自增
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L391-L391)
|
||||
|
||||
- template_name
|
||||
- 类型:字符串(最大长度200)
|
||||
- 描述:模板名称
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L392-L392)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L699-L700)
|
||||
|
||||
- template_code
|
||||
- 类型:字符串(最大长度50)
|
||||
- 描述:模板编码(唯一)
|
||||
- 约束:唯一索引
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L393-L393)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L27-L36)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L700-L701)
|
||||
|
||||
- template_type
|
||||
- 类型:枚举(TemplateType)
|
||||
- 描述:模板类型
|
||||
- 取值:general、surgical、nonsurgical_ward、nonsurgical_noward、medical_tech、nursing、admin、logistics
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L394-L394)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L702-L702)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L28-L28)
|
||||
|
||||
- description
|
||||
- 类型:文本
|
||||
- 描述:模板描述
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L395-L395)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L703-L703)
|
||||
|
||||
- dimension_weights
|
||||
- 类型:文本(JSON)
|
||||
- 描述:维度权重配置(财务、客户、内部流程、学习与成长)
|
||||
- 示例:{"financial": 35, "customer": 30, "internal_process": 25, "learning_growth": 10}
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L396-L396)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L704-L704)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L88-L88)
|
||||
|
||||
- assessment_cycle
|
||||
- 类型:字符串(最大长度20)
|
||||
- 描述:考核周期(monthly/quarterly/annual)
|
||||
- 默认值:monthly
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L397-L397)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L705-L705)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L89-L89)
|
||||
|
||||
- is_active
|
||||
- 类型:布尔
|
||||
- 描述:是否启用
|
||||
- 默认值:true
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L398-L398)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L728-L728)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L32-L32)
|
||||
|
||||
- created_at/updated_at
|
||||
- 类型:日期时间
|
||||
- 描述:创建与更新时间
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L399-L400)
|
||||
- [models.py](file://backend/app/models/models.py#L400-L400)
|
||||
|
||||
- 关系与索引
|
||||
- 关系:与模板指标关联表一对多
|
||||
- 索引:template_type、is_active
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L402-L408)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L38-L39)
|
||||
|
||||
### 模板指标关联表(TemplateIndicator)字段字典
|
||||
- id
|
||||
- 类型:整数
|
||||
- 主键:是
|
||||
- 描述:模板指标关联主键
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L415-L415)
|
||||
|
||||
- template_id
|
||||
- 类型:整数
|
||||
- 外键:指向 indicator_templates.id
|
||||
- 描述:模板ID
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L416-L416)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L45-L57)
|
||||
|
||||
- indicator_id
|
||||
- 类型:整数
|
||||
- 外键:指向 indicators.id
|
||||
- 描述:指标ID
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L417-L417)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L46-L57)
|
||||
|
||||
- category
|
||||
- 类型:字符串(最大长度100)
|
||||
- 描述:指标分类(二级指标分类)
|
||||
- 示例:收支管理、患者满意度、质量与安全
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L418-L418)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L657-L657)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L90-L108)
|
||||
|
||||
- target_value/target_unit
|
||||
- 类型:数值/字符串
|
||||
- 描述:目标值与单位
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L419-L420)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L658-L659)
|
||||
|
||||
- weight
|
||||
- 类型:数值(默认1.0)
|
||||
- 描述:在模板内的权重
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L421-L421)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L660-L660)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L91-L107)
|
||||
|
||||
- scoring_method/scoring_params
|
||||
- 类型:字符串/文本
|
||||
- 描述:评分方法与参数(JSON)
|
||||
- 方法:range、target、deduction、bonus、veto
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L422-L423)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L661-L662)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L211-L217)
|
||||
|
||||
- sort_order
|
||||
- 类型:整数
|
||||
- 描述:排序
|
||||
- 默认值:0
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L424-L424)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L191-L202)
|
||||
|
||||
- remark
|
||||
- 类型:文本
|
||||
- 描述:备注
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L425-L425)
|
||||
|
||||
- created_at/updated_at
|
||||
- 类型:日期时间
|
||||
- 描述:创建与更新时间
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L426-L427)
|
||||
|
||||
- 关系与索引
|
||||
- 关系:与模板表、指标表多对一
|
||||
- 索引:template_id、indicator_id、(template_id, indicator_id)唯一
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L429-L437)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L61-L63)
|
||||
|
||||
### 模板类型枚举(TemplateType)
|
||||
- 取值与含义
|
||||
- general:通用模板
|
||||
- surgical:手术临床科室
|
||||
- nonsurgical_ward:非手术有病房科室
|
||||
- nonsurgical_noward:非手术无病房科室
|
||||
- medical_tech:医技科室
|
||||
- nursing:护理单元
|
||||
- admin:行政科室
|
||||
- logistics:后勤科室
|
||||
- 使用场景
|
||||
- 用于区分模板适用科室类型,配合指标的适用科室类型字段实现过滤
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L375-L385)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L642-L652)
|
||||
|
||||
### 指标分类管理与维度权重配置
|
||||
- 指标分类(category)
|
||||
- 作用:对模板内的指标进行二级分类,便于统计与展示
|
||||
- 示例:收支管理、患者满意度、质量与安全、内部服务效率等
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L418-L418)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L90-L108)
|
||||
|
||||
- 维度权重(dimension_weights)
|
||||
- 结构:JSON对象,键为维度标识,值为百分比
|
||||
- 维度:financial、customer、internal_process、learning_growth
|
||||
- 用途:用于模板层面的维度汇总与权重分配
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L396-L396)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L704-L704)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L88-L88)
|
||||
|
||||
- 指标维度(bs_dimension)
|
||||
- 作用:指标所属的平衡计分卡维度,与模板维度权重协同使用
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L125-L125)
|
||||
- [init_templates.py](file://backend/init_indicator_templates.py#L28-L38)
|
||||
|
||||
### 模板与指标的多对多关联与权重分配机制
|
||||
- 关联关系
|
||||
- 通过 TemplateIndicator 实现模板与指标的多对多绑定
|
||||
- 每个模板内的指标可独立设置权重、目标值、评分方法等
|
||||
- 权重分配
|
||||
- 模板维度权重:用于模板层面的维度汇总
|
||||
- 指标权重:用于模板内指标的加权计算
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L411-L431)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L110-L124)
|
||||
|
||||
### 模板版本管理与继承关系
|
||||
- 版本字段
|
||||
- 当前模型未内置版本字段;如需版本管理,可在模板表中扩展 version 字段
|
||||
- 继承关系
|
||||
- 可通过模板类型与指标适用科室类型实现“继承”效果:通用模板可作为特定模板的父模板,再叠加差异字段
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L391-L400)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L82-L186)
|
||||
|
||||
### 激活状态与使用范围约束
|
||||
- 激活状态(is_active)
|
||||
- 控制模板是否可用
|
||||
- 前端通过开关切换,后端接口支持批量更新
|
||||
- 使用范围
|
||||
- 模板类型(template_type)限定适用科室类型
|
||||
- 指标的适用科室类型(applicable_dept_types)进一步限制
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L398-L398)
|
||||
- [models.py](file://backend/app/models/models.py#L134-L134)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L22-L42)
|
||||
|
||||
## 依赖分析
|
||||
模板系统的关键依赖关系如下:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
ENUM["TemplateType 枚举"] --> IT["IndicatorTemplate 模型"]
|
||||
IT --> TI["TemplateIndicator 模型"]
|
||||
IND["Indicator 模型"] --> TI
|
||||
SVC["TemplateService 服务"] --> IT
|
||||
SVC --> TI
|
||||
API["templates.py 路由"] --> SVC
|
||||
SCHEMA["schemas.py 模式"] --> API
|
||||
FRONT["Templates.vue 页面"] --> API
|
||||
API --> FRONT
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L375-L385)
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L640-L743)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L375-L385)
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L640-L743)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 模板列表按 template_type 与 is_active 进行过滤,建议保持索引有效
|
||||
- 模板详情加载时使用 selectinload 预加载关联指标,避免 N+1 查询
|
||||
- 写入优化
|
||||
- 批量添加模板指标时,服务层会自动设置排序,减少重复计算
|
||||
- 前端渲染
|
||||
- 前端对维度权重进行 JSON 解析与可视化展示,注意空值处理与错误捕获
|
||||
|
||||
## 故障排查指南
|
||||
- 模板编码冲突
|
||||
- 现象:创建模板时报错“模板编码已存在”
|
||||
- 排查:检查唯一索引约束与迁移脚本
|
||||
- 章节来源
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L136-L139)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L36-L36)
|
||||
|
||||
- 指标重复添加
|
||||
- 现象:添加模板指标返回失败
|
||||
- 排查:检查唯一索引(template_id, indicator_id)
|
||||
- 章节来源
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L174-L182)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L63-L63)
|
||||
|
||||
- 维度权重解析失败
|
||||
- 现象:前端维度权重显示异常
|
||||
- 排查:确认 JSON 格式正确,服务端/前端均做容错处理
|
||||
- 章节来源
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L310-L317)
|
||||
|
||||
- 指标权重校验
|
||||
- 现象:指标权重小于等于0导致异常
|
||||
- 排查:数据库层有 CheckConstraint,前端也应限制输入范围
|
||||
- 章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L145-L145)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L158-L158)
|
||||
|
||||
## 结论
|
||||
指标模板系统通过清晰的模型设计与严格的约束,实现了模板类型、维度权重、指标分类与权重分配的灵活配置。模板与指标的多对多关系通过关联表实现解耦,支持按科室类型与适用范围进行精细化管理。建议后续在模板表中增加版本字段以完善版本管理能力,并在前端增强对 JSON 参数的校验与提示,提升系统的稳定性与易用性。
|
||||
596
.qoder/repowiki/zh/content/数据库设计/数据字典/数据字典.md
Normal file
596
.qoder/repowiki/zh/content/数据库设计/数据字典/数据字典.md
Normal file
@@ -0,0 +1,596 @@
|
||||
# 数据字典
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py)
|
||||
- [docs/database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本数据字典面向医院绩效管理系统,系统围绕“科室—员工—考核—工资—财务”主线构建,涵盖指标管理、计划管理、模板管理、财务核算等模块。本文档从字段层面梳理每个实体的数据定义(业务含义、数据类型、长度/精度限制、取值范围、默认值),明确枚举类型及其使用场景,阐述字段与业务实体的对应关系,给出数据流转过程,并提供维护更新规范与查询使用指南。
|
||||
|
||||
## 项目结构
|
||||
系统采用前后端分离架构,后端基于FastAPI + SQLAlchemy,采用分层设计(API → Service → Model),前端Vue3 + Vite。数据库采用SQLite(开发环境),通过Alembic进行版本化迁移。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
FE["前端界面<br/>Vue3 + Vite"] --> API["后端API<br/>FastAPI"]
|
||||
API --> SVC["服务层<br/>各模块Service"]
|
||||
SVC --> MODELS["模型层<br/>SQLAlchemy ORM"]
|
||||
MODELS --> DB["数据库<br/>SQLite"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L1-L217)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L1-L217)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
## 核心组件
|
||||
- 数据模型层:定义实体、字段、约束、索引、枚举类型
|
||||
- 模式层(Pydantic):定义API输入输出结构、字段校验规则
|
||||
- API层:定义REST接口、参数、返回结构
|
||||
- 服务层:封装业务逻辑、事务处理、数据聚合
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 架构概览
|
||||
系统围绕“绩效考核—工资核算—财务分析”的主流程展开,指标与模板驱动考核,考核结果驱动工资生成,财务模块提供收支与结余分析。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "基础数据"
|
||||
DEPT["科室表<br/>departments"]
|
||||
STAFF["员工表<br/>staff"]
|
||||
USERS["用户表<br/>users"]
|
||||
end
|
||||
subgraph "指标与计划"
|
||||
IND["指标表<br/>indicators"]
|
||||
TPL["模板表<br/>indicator_templates"]
|
||||
TIND["模板指标关联<br/>template_indicators"]
|
||||
PLAN["绩效计划表<br/>performance_plans"]
|
||||
REL["计划指标关联<br/>plan_kpi_relations"]
|
||||
end
|
||||
subgraph "考核与工资"
|
||||
ASSESS["考核记录表<br/>assessments"]
|
||||
DETAIL["考核明细表<br/>assessment_details"]
|
||||
SAL["工资记录表<br/>salary_records"]
|
||||
end
|
||||
subgraph "财务"
|
||||
FIN["科室财务记录<br/>department_finances"]
|
||||
end
|
||||
DEPT <-- "1:N" --> STAFF
|
||||
STAFF <-- "N:1" --> DEPT
|
||||
STAFF <-- "N:1" --> USERS
|
||||
IND <-- "N:1" --> DETAIL
|
||||
ASSESS <-- "1:N" --> DETAIL
|
||||
DETAIL <-- "N:1" --> IND
|
||||
PLAN <-- "1:N" --> REL
|
||||
REL <-- "N:1" --> IND
|
||||
STAFF <-- "N:1" --> ASSESS
|
||||
STAFF <-- "N:1" --> SAL
|
||||
DEPT <-- "N:1" --> FIN
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [docs/database.md](file://docs/database.md#L1-L286)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 1) 基础数据实体
|
||||
|
||||
#### 1.1 科室表 departments
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- name: 字符串, 长度100, 非空, 说明: 科室名称
|
||||
- code: 字符串, 长度20, 唯一, 非空, 说明: 科室编码
|
||||
- dept_type: 枚举, 非空, 说明: 科室类型
|
||||
- parent_id: 整型, 外键, 说明: 上级科室
|
||||
- level: 整型, 默认1, 说明: 层级
|
||||
- sort_order: 整型, 默认0, 说明: 排序
|
||||
- is_active: 布尔, 默认true, 说明: 是否启用
|
||||
- description: 文本, 说明: 描述
|
||||
- created_at/updated_at: 时间戳, 说明: 创建/更新时间
|
||||
- 约束与索引
|
||||
- 唯一键: code
|
||||
- 索引: idx_dept_type, idx_dept_parent
|
||||
- 业务含义
|
||||
- 支持多级组织架构,支持停用/启用;用于员工归属、计划/模板适用范围等
|
||||
- 默认值与取值范围
|
||||
- level: 1-5
|
||||
- sort_order: 任意整数
|
||||
- is_active: true/false
|
||||
- 使用场景
|
||||
- 员工入职时绑定科室;计划/模板按科室类型筛选适用范围
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L64-L103)
|
||||
- [docs/database.md](file://docs/database.md#L99-L116)
|
||||
|
||||
#### 1.2 员工表 staff
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- employee_id: 字符串, 长度20, 唯一, 非空, 说明: 工号
|
||||
- name: 字符串, 长度50, 非空, 说明: 姓名
|
||||
- department_id: 整型, 外键, 非空, 说明: 所属科室
|
||||
- position: 字符串, 长度50, 非空, 说明: 职位
|
||||
- title: 字符串, 长度50, 说明: 职称
|
||||
- phone/email: 字符串, 长度20/100, 说明: 联系方式
|
||||
- base_salary: 数值, 精度(10,2), 默认0, 说明: 基本工资
|
||||
- performance_ratio: 数值, 精度(5,2), 默认1.0, 说明: 绩效系数
|
||||
- status: 枚举, 默认active, 说明: 员工状态
|
||||
- hire_date: 时间戳, 说明: 入职日期
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 唯一键: employee_id
|
||||
- 索引: idx_staff_dept, idx_staff_status
|
||||
- 业务含义
|
||||
- 基于基本工资与绩效系数计算绩效奖金;参与考核与工资生成
|
||||
- 默认值与取值范围
|
||||
- base_salary ≥ 0
|
||||
- 0 ≤ performance_ratio ≤ 5
|
||||
- 使用场景
|
||||
- 薪资计算、部门统计、计划责任人
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L107-L150)
|
||||
- [docs/database.md](file://docs/database.md#L117-L137)
|
||||
|
||||
#### 1.3 用户表 users
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- username: 字符串, 长度50, 唯一, 非空, 说明: 用户名
|
||||
- password_hash: 字符串, 长度255, 非空, 说明: 密码哈希
|
||||
- staff_id: 整型, 外键, 说明: 关联员工
|
||||
- role: 字符串, 长度20, 默认staff, 说明: 角色
|
||||
- is_active: 布尔, 默认true, 说明: 是否启用
|
||||
- last_login: 时间戳, 说明: 最后登录
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 唯一键: username
|
||||
- 索引: idx_user_username
|
||||
- 业务含义
|
||||
- 系统访问控制与权限管理的基础
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L315-L345)
|
||||
|
||||
### 2) 指标与模板
|
||||
|
||||
#### 2.1 指标表 indicators
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- name/code: 字符串, 长度100/20, 唯一, 非空, 说明: 指标名称/编码
|
||||
- indicator_type: 枚举, 非空, 说明: 指标类型
|
||||
- bs_dimension: 枚举, 非空, 说明: 平衡计分卡维度
|
||||
- weight: 数值, 精度(5,2), 默认1.0, 说明: 权重
|
||||
- max_score: 数值, 精度(5,2), 默认100, 说明: 最高分值
|
||||
- target_value/target_unit: 数值/字符串, 说明: 目标值与单位
|
||||
- calculation_method/assessment_method/deduction_standard/data_source: 文本, 说明: 计算/考核/扣分/数据来源
|
||||
- applicable_dept_types: 文本(JSON数组), 说明: 适用科室类型
|
||||
- is_veto: 布尔, 默认false, 说明: 是否一票否决
|
||||
- is_active: 布尔, 默认true, 说明: 是否启用
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 约束: weight > 0
|
||||
- 索引: idx_indicator_type
|
||||
- 业务含义
|
||||
- 考核的最小颗粒,决定评分与权重;支持JSON存储适用范围
|
||||
- 默认值与取值范围
|
||||
- weight > 0
|
||||
- max_score ≥ 0
|
||||
- 使用场景
|
||||
- 考核打分、计划目标设定、模板匹配
|
||||
|
||||
章节来源
|
||||
- [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-L193)
|
||||
- [docs/database.md](file://docs/database.md#L138-L158)
|
||||
|
||||
#### 2.2 指标模板表 indicator_templates
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- template_name/code: 字符串, 长度200/50, 唯一, 非空
|
||||
- template_type: 枚举, 非空, 说明: 模板类型
|
||||
- description: 文本, 说明: 模板描述
|
||||
- dimension_weights: 文本(JSON), 说明: 维度权重
|
||||
- assessment_cycle: 字符串, 长度20, 默认monthly, 说明: 考核周期
|
||||
- is_active: 布尔, 默认true
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 索引: idx_template_type, idx_template_active
|
||||
- 业务含义
|
||||
- 为不同科室类型提供标准化指标集合,支持批量导入
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L409)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L698-L732)
|
||||
|
||||
#### 2.3 模板指标关联表 template_indicators
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- template_id/indicator_id: 整型, 外键, 非空, 说明: 模板与指标
|
||||
- category: 字符串, 长度100, 说明: 指标分类(二级指标)
|
||||
- target_value/target_unit: 数值/字符串, 说明: 目标值与单位
|
||||
- weight: 数值, 精度(5,2), 默认1.0
|
||||
- scoring_method/scoring_params: 字符串/文本(JSON), 说明: 评分方法与参数
|
||||
- sort_order: 整型, 默认0, 说明: 排序
|
||||
- remark: 文本, 说明: 备注
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 索引: idx_ti_template, idx_ti_indicator, idx_ti_unique(模板+指标唯一)
|
||||
- 业务含义
|
||||
- 将指标纳入模板,支持排序与评分参数配置
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L411-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L654-L696)
|
||||
|
||||
### 3) 考核与工资
|
||||
|
||||
#### 3.1 考核记录表 assessments
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- staff_id: 整型, 外键, 非空, 说明: 被考核员工
|
||||
- period_year/period_month: 整型, 非空, 说明: 考核年度/月份
|
||||
- period_type: 字符串, 长度20, 默认monthly, 说明: 周期类型
|
||||
- total_score/weighted_score: 数值, 精度(5,2), 默认0, 说明: 总分/加权得分
|
||||
- status: 枚举, 默认draft, 说明: 状态
|
||||
- assessor_id/reviewer_id: 整型, 外键, 说明: 考核人/审核人
|
||||
- submit_time/review_time: 时间戳, 说明: 提交/审核时间
|
||||
- remark: 文本, 说明: 备注
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 索引: idx_assessment_staff, idx_assessment_period, idx_assessment_status
|
||||
- 业务含义
|
||||
- 记录一次完整的考核流程,支持草稿、提交、审核、确认、驳回
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L179)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L220-L271)
|
||||
- [docs/database.md](file://docs/database.md#L159-L180)
|
||||
|
||||
#### 3.2 考核明细表 assessment_details
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- assessment_id/indicator_id: 整型, 外键, 非空
|
||||
- actual_value: 数值, 精度(10,2), 说明: 实际值
|
||||
- score: 数值, 精度(5,2), 默认0, 说明: 得分
|
||||
- evidence: 文本, 说明: 佐证材料
|
||||
- remark: 文本, 说明: 备注
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 索引: idx_detail_assessment, idx_detail_indicator
|
||||
- 业务含义
|
||||
- 记录每个指标的得分与实际值,支撑总分与加权得分计算
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L181-L203)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L196-L219)
|
||||
- [docs/database.md](file://docs/database.md#L181-L196)
|
||||
|
||||
#### 3.3 工资记录表 salary_records
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- staff_id: 整型, 外键, 非空
|
||||
- period_year/period_month: 整型, 非空
|
||||
- base_salary/performance_score/performance_bonus/deduction/allowance: 数值, 精度(10,2)/(5,2), 默认0, 说明: 基本工资/绩效得分/绩效奖金/扣款/补贴
|
||||
- total_salary: 数值, 精度(10,2), 默认0, 说明: 应发工资
|
||||
- status: 字符串, 长度20, 默认pending, 说明: 状态
|
||||
- remark: 文本, 说明: 备注
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 索引: idx_salary_staff, idx_salary_period
|
||||
- 业务含义
|
||||
- 基于考核结果生成工资,支持确认与批量确认
|
||||
|
||||
章节来源
|
||||
- [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-L312)
|
||||
- [docs/database.md](file://docs/database.md#L197-L217)
|
||||
|
||||
### 4) 绩效计划
|
||||
|
||||
#### 4.1 绩效计划表 performance_plans
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- plan_name/code: 字符串, 长度200/50, 唯一, 非空
|
||||
- plan_level: 枚举, 非空, 说明: 计划层级(hospital/department/individual)
|
||||
- plan_year/plan_month: 整型/可选, 说明: 年度/月份
|
||||
- plan_type: 字符串, 长度20, 默认annual, 说明: 计划类型(annual/monthly)
|
||||
- department_id/staff_id: 整型/可选, 外键, 说明: 所属科室/责任人
|
||||
- parent_plan_id: 整型, 外键, 说明: 上级计划
|
||||
- description/strategic_goals/key_initiatives: 文本, 说明: 描述/战略目标/关键举措
|
||||
- status: 枚举, 默认draft, 说明: 状态
|
||||
- submitter_id/approver_id: 整型, 外键, 说明: 提交人/审批人
|
||||
- submit_time/approve_time: 时间戳, 说明: 提交/审批时间
|
||||
- approve_remark: 文本, 说明: 审批意见
|
||||
- version: 整型, 默认1, 说明: 版本号
|
||||
- is_active: 布尔, 默认true, 说明: 是否启用
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 索引: idx_plan_level, idx_plan_year, idx_plan_department, idx_plan_status
|
||||
- 业务含义
|
||||
- 支持医院/科室/个人三级计划,支持父子计划与审批流程
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L270-L312)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L519-L570)
|
||||
|
||||
#### 4.2 计划指标关联表 plan_kpi_relations
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- plan_id/indicator_id: 整型, 外键, 非空
|
||||
- target_value/target_unit: 数值/字符串, 说明: 目标值与单位
|
||||
- weight: 数值, 精度(5,2), 默认1.0, 说明: 权重
|
||||
- scoring_method/scoring_params: 字符串/文本(JSON), 说明: 评分方法与参数
|
||||
- remark: 文本, 说明: 备注
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 索引: idx_relation_plan, idx_relation_indicator, idx_relation_unique(计划+指标唯一)
|
||||
- 业务含义
|
||||
- 将指标纳入具体计划,支持目标与权重配置
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L314-L339)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L481-L518)
|
||||
|
||||
### 5) 财务核算
|
||||
|
||||
#### 5.1 科室财务记录表 department_finances
|
||||
- 字段定义
|
||||
- id: 整型, 主键, 自增
|
||||
- department_id: 整型, 外键, 非空
|
||||
- period_year/period_month: 整型, 非空
|
||||
- finance_type: 枚举, 非空, 说明: 收入/支出
|
||||
- category: 字符串, 长度50, 非空, 说明: 类别
|
||||
- amount: 数值, 精度(12,2), 默认0, 说明: 金额
|
||||
- source: 字符串, 长度100, 说明: 数据来源
|
||||
- remark: 文本, 说明: 备注
|
||||
- created_at/updated_at: 时间戳
|
||||
- 约束与索引
|
||||
- 约束: amount ≥ 0
|
||||
- 索引: idx_finance_dept, idx_finance_period, idx_finance_type, idx_finance_category
|
||||
- 业务含义
|
||||
- 记录各科室的收支明细,支持按类别统计与结余计算
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L75)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L407-L452)
|
||||
|
||||
### 6) 枚举类型与取值范围
|
||||
|
||||
- 科室类型 DeptType
|
||||
- 取值: clinical_surgical, clinical_nonsurgical_ward, clinical_nonsurgical_noward, medical_tech, medical_auxiliary, nursing, admin, finance, logistics
|
||||
- 用途: 控制模板与计划适用范围
|
||||
|
||||
- 员工状态 StaffStatus
|
||||
- 取值: active, leave, resigned, retired
|
||||
|
||||
- 考核状态 AssessmentStatus
|
||||
- 取值: draft, submitted, reviewed, finalized, rejected
|
||||
|
||||
- 指标类型 IndicatorType
|
||||
- 取值: quality, quantity, efficiency, service, cost
|
||||
|
||||
- 计划层级 PlanLevel
|
||||
- 取值: hospital, department, individual
|
||||
|
||||
- 计划状态 PlanStatus
|
||||
- 取值: draft, pending, approved, rejected, active, completed, cancelled
|
||||
|
||||
- 菜单类型 MenuType
|
||||
- 取值: menu, button
|
||||
|
||||
- 模板类型 TemplateType
|
||||
- 取值: general, surgical, nonsurgical_ward, nonsurgical_noward, medical_tech, nursing, admin, logistics
|
||||
|
||||
- 财务类型 FinanceType
|
||||
- 取值: revenue, expense
|
||||
|
||||
- 收入类别 RevenueCategory
|
||||
- 取值: examination, lab_test, radiology, bed, nursing, treatment, surgery, injection, oxygen, other
|
||||
|
||||
- 支出类别 ExpenseCategory
|
||||
- 取值: material, personnel, maintenance, utility, other
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L16-L43)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L233-L242)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L341-L345)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L375-L385)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L16-L43)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L12-L45)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L463-L479)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L584-L588)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L642-L652)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L378-L405)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L378-L405)
|
||||
|
||||
### 7) 数据流转说明
|
||||
|
||||
#### 7.1 考核到工资的流程
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant API as "API"
|
||||
participant Svc as "SalaryService"
|
||||
participant DB as "数据库"
|
||||
API->>Svc : "根据考核生成工资"
|
||||
Svc->>DB : "查询已确认的考核记录"
|
||||
DB-->>Svc : "返回考核与明细"
|
||||
Svc->>Svc : "计算绩效得分/奖金"
|
||||
Svc->>DB : "写入工资记录"
|
||||
DB-->>Svc : "返回记录ID"
|
||||
Svc-->>API : "生成成功"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L111)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L194-L206)
|
||||
|
||||
#### 7.2 财务收支统计流程
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> Fetch["查询科室收支记录"]
|
||||
Fetch --> Group["按类别分组统计"]
|
||||
Group --> Sum["计算合计"]
|
||||
Sum --> Balance["结余 = 收入合计 - 支出合计"]
|
||||
Balance --> End(["结束"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L21-L155)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L75)
|
||||
|
||||
## 依赖分析
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
STAFF["staff"] --> DEPT["departments"]
|
||||
STAFF --> USERS["users"]
|
||||
ASSESS["assessments"] --> STAFF
|
||||
ASSESS --> DETAIL["assessment_details"]
|
||||
DETAIL --> IND["indicators"]
|
||||
SAL["salary_records"] --> STAFF
|
||||
PLAN["performance_plans"] --> DEPT
|
||||
PLAN --> STAFF
|
||||
PLAN --> REL["plan_kpi_relations"]
|
||||
REL --> IND
|
||||
TPL["indicator_templates"] --> TIND["template_indicators"]
|
||||
TIND --> IND
|
||||
FIN["department_finances"] --> DEPT
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
## 性能考虑
|
||||
- 索引策略
|
||||
- 对常用过滤字段建立索引(如科室类型、状态、周期、部门)
|
||||
- 对外键字段建立索引,减少连接开销
|
||||
- 查询优化
|
||||
- 使用selectinload预加载关联对象,避免N+1查询
|
||||
- 分页查询配合COUNT子查询,避免全表扫描
|
||||
- 数据类型选择
|
||||
- 数值使用Decimal保证精度;字符串使用VARCHAR并设置合理上限
|
||||
- 缓存建议
|
||||
- 对静态枚举与模板列表可做内存缓存,降低数据库压力
|
||||
|
||||
## 故障排除指南
|
||||
- 常见错误与定位
|
||||
- “指标/模板/科室编码已存在”:检查唯一约束冲突
|
||||
- “无法删除,存在子记录”:先清理子项再删除
|
||||
- “无法生成/确认工资”:检查考核状态与重复生成
|
||||
- “无效的类别”:确认财务类别枚举值
|
||||
- 排查步骤
|
||||
- 查看API返回状态码与错误信息
|
||||
- 检查数据库约束与索引是否生效
|
||||
- 核对枚举值是否在允许范围内
|
||||
- 使用服务层日志定位业务流程异常点
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L78-L82)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L103-L107)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L104-L110)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L170-L175)
|
||||
|
||||
## 结论
|
||||
本数据字典系统性梳理了医院绩效管理系统的数据结构与业务规则,明确了字段定义、枚举取值、默认值与约束、索引策略与使用场景,并给出了数据流转与维护规范。建议在后续迭代中持续完善字段注释、扩展审计字段、引入字段变更追踪机制,确保数据治理的可追溯性与一致性。
|
||||
|
||||
## 附录
|
||||
|
||||
### A. 字段与业务实体对应关系
|
||||
- 科室 → 员工:一对多
|
||||
- 员工 → 考核:一对多
|
||||
- 考核 → 明细:一对多
|
||||
- 明细 → 指标:多对一
|
||||
- 员工 → 工资:一对多
|
||||
- 计划 → 指标:多对多(通过plan_kpi_relations)
|
||||
- 模板 → 指标:多对多(通过template_indicators)
|
||||
- 科室 → 财务:一对多
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
### B. 数据字典维护与更新规范
|
||||
- 新增字段
|
||||
- 在模型层定义字段与约束,补充Pydantic模式
|
||||
- 在API层增加参数校验与默认值
|
||||
- 在服务层处理字段映射与业务逻辑
|
||||
- 更新数据库迁移脚本并升级数据库
|
||||
- 修改字段
|
||||
- 评估兼容性与影响范围
|
||||
- 通过迁移脚本安全变更,保留历史数据
|
||||
- 更新API与模式校验规则
|
||||
- 删除字段
|
||||
- 确认无业务依赖后,通过迁移脚本删除
|
||||
- 清理相关API与服务逻辑
|
||||
|
||||
### C. 数据字典查询与使用指南
|
||||
- 基础查询
|
||||
- 通过API参数过滤(如科室类型、状态、周期)
|
||||
- 使用分页参数控制返回数量
|
||||
- 高级查询
|
||||
- 结合多个条件组合查询
|
||||
- 使用树形结构查询科室层级
|
||||
- 数据导出
|
||||
- 指标与模板支持批量导入/导出
|
||||
- 财务模块支持按类别统计与汇总
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L51)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L56)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L75)
|
||||
- [backend/app/api/v1/finance.py](file://backend/app/api/v1/finance.py#L116-L155)
|
||||
469
.qoder/repowiki/zh/content/数据库设计/数据字典/枚举类型定义.md
Normal file
469
.qoder/repowiki/zh/content/数据库设计/数据字典/枚举类型定义.md
Normal file
@@ -0,0 +1,469 @@
|
||||
# 枚举类型定义
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py)
|
||||
- [template_service.py](file://backend/app/services/template_service.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档提供了医院绩效管理系统中所有枚举类型的完整数据字典。系统采用平衡计分卡(BSC)理论框架,通过标准化的枚举类型确保业务逻辑的一致性和可维护性。
|
||||
|
||||
该系统涵盖了从基础科室管理到复杂绩效考核的完整业务流程,所有关键业务状态和分类都通过精心设计的枚举类型来实现。
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统采用分层架构设计,枚举类型分布在多个层次中:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据模型层"
|
||||
A[models.py<br/>数据库模型枚举]
|
||||
end
|
||||
subgraph "API层"
|
||||
B[templates.py<br/>模板管理API]
|
||||
C[departments.py<br/>科室管理API]
|
||||
D[menus.py<br/>菜单管理API]
|
||||
end
|
||||
subgraph "服务层"
|
||||
E[template_service.py<br/>模板服务]
|
||||
F[department_service.py<br/>科室服务]
|
||||
G[menu_service.py<br/>菜单服务]
|
||||
end
|
||||
subgraph "脚本层"
|
||||
H[init_templates.py<br/>模板初始化]
|
||||
end
|
||||
A --> B
|
||||
A --> C
|
||||
A --> D
|
||||
B --> E
|
||||
C --> F
|
||||
D --> G
|
||||
H --> A
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L16-L438)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
## 核心组件
|
||||
|
||||
系统定义了以下主要枚举类型:
|
||||
|
||||
### 科室类型 (DeptType)
|
||||
用于标识医院各类科室的标准化分类体系。
|
||||
|
||||
### 平衡计分卡维度 (BSCDimension)
|
||||
基于财务、客户、内部流程、学习成长四个维度的绩效评估框架。
|
||||
|
||||
### 员工状态 (StaffStatus)
|
||||
员工在组织中的生命周期状态管理。
|
||||
|
||||
### 考核状态 (AssessmentStatus)
|
||||
绩效考核流程中的状态流转控制。
|
||||
|
||||
### 指标类型 (IndicatorType)
|
||||
不同类型绩效指标的分类标准。
|
||||
|
||||
### 计划状态 (PlanStatus)
|
||||
绩效计划执行过程中的状态管理。
|
||||
|
||||
### 菜单类型 (MenuType)
|
||||
系统菜单结构的类型区分。
|
||||
|
||||
### 模板类型 (TemplateType)
|
||||
绩效指标模板的分类体系。
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L16-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L44)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用统一的枚举类型管理策略,确保跨层一致性:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class DeptType {
|
||||
+CLINICAL_SURGICAL
|
||||
+CLINICAL_NONSURGICAL_WARD
|
||||
+CLINICAL_NONSURGICAL_NOWARD
|
||||
+MEDICAL_TECH
|
||||
+MEDICAL_AUXILIARY
|
||||
+NURSING
|
||||
+ADMIN
|
||||
+FINANCE
|
||||
+LOGISTICS
|
||||
}
|
||||
class BSCDimension {
|
||||
+FINANCIAL
|
||||
+CUSTOMER
|
||||
+INTERNAL_PROCESS
|
||||
+LEARNING_GROWTH
|
||||
}
|
||||
class StaffStatus {
|
||||
+ACTIVE
|
||||
+LEAVE
|
||||
+RESIGNED
|
||||
+RETIRED
|
||||
}
|
||||
class AssessmentStatus {
|
||||
+DRAFT
|
||||
+SUBMITTED
|
||||
+REVIEWED
|
||||
+FINALIZED
|
||||
+REJECTED
|
||||
}
|
||||
class IndicatorType {
|
||||
+QUALITY
|
||||
+QUANTITY
|
||||
+EFFICIENCY
|
||||
+SERVICE
|
||||
+COST
|
||||
}
|
||||
class PlanStatus {
|
||||
+DRAFT
|
||||
+PENDING
|
||||
+APPROVED
|
||||
+REJECTED
|
||||
+ACTIVE
|
||||
+COMPLETED
|
||||
+CANCELLED
|
||||
}
|
||||
class MenuType {
|
||||
+MENU
|
||||
+BUTTON
|
||||
}
|
||||
class TemplateType {
|
||||
+GENERAL
|
||||
+SURGICAL
|
||||
+NON_SURGICAL_WARD
|
||||
+NON_SURGICAL_NOWARD
|
||||
+MEDICAL_TECH
|
||||
+NURSING
|
||||
+ADMIN
|
||||
+LOGISTICS
|
||||
}
|
||||
DeptType --> BSCDimension : "影响"
|
||||
IndicatorType --> BSCDimension : "映射"
|
||||
TemplateType --> DeptType : "适用"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L16-L438)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 科室类型 (DeptType) 数据字典
|
||||
|
||||
| 枚举值 | 业务含义 | 适用科室 | 使用场景 | 约束条件 |
|
||||
|--------|----------|----------|----------|----------|
|
||||
| clinical_surgical | 手术临床科室 | 外科、骨科、胸外科等 | 手术量、手术质量评估 | DRG/ RBRVS 计费 |
|
||||
| clinical_nonsurgical_ward | 非手术有病房科室 | 内科、儿科、神经科等 | 住院患者管理、病床使用率 | 床位周转率评估 |
|
||||
| clinical_nonsurgical_noward | 非手术无病房科室 | 急诊科、观察室等 | 急诊处理能力、观察患者管理 | 急诊周转时间 |
|
||||
| medical_tech | 医技科室 | 检验科、放射科、超声科等 | 检查报告质量、服务效率 | 报告准确率、及时性 |
|
||||
| medical_auxiliary | 医辅科室 | 病理科、药剂科等 | 辅助诊断支持、药品管理 | 质量控制标准 |
|
||||
| nursing | 护理单元 | 各病区护理单元 | 护理质量、患者满意度 | 护理技术操作规范 |
|
||||
| admin | 行政科室 | 院办、党办、财务科等 | 管理效能、服务支持 | 内部客户满意度 |
|
||||
| finance | 财务科室 | 财务科 | 财务核算、成本控制 | 会计准则遵循 |
|
||||
| logistics | 后勤保障科室 | 总务科、设备科等 | 后勤保障、设备维护 | 设备完好率 |
|
||||
|
||||
**使用场景示例**:
|
||||
- 指标模板选择:不同科室类型适用不同的指标模板
|
||||
- 数据筛选:按科室类型过滤统计数据
|
||||
- 权限控制:特定功能对特定科室类型开放
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L16-L26)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L82-L186)
|
||||
|
||||
### 平衡计分卡维度 (BSCDimension) 数据字典
|
||||
|
||||
| 维度值 | 业务含义 | 权重范围 | 关键指标示例 | 适用场景 |
|
||||
|--------|----------|----------|--------------|----------|
|
||||
| financial | 财务维度 | 30%-40% | 收支结余率、成本控制、资产效率 | 财务绩效评估 |
|
||||
| customer | 顾客维度 | 25%-35% | 患者满意度、服务可及性、投诉管理 | 服务质量评估 |
|
||||
| internal_process | 内部流程维度 | 20%-30% | 医疗质量、医疗安全、院感控制 | 运营效率评估 |
|
||||
| learning_growth | 学习成长维度 | 5%-15% | 科研教学、人才培养、业务学习 | 能力发展评估 |
|
||||
|
||||
**权重配置原则**:
|
||||
- 通用模板:财务40%,客户30%,内部流程25%,学习成长5%
|
||||
- 手术科室:财务35%,客户20%,内部流程30%,学习成长15%
|
||||
- 医技科室:财务20%,客户30%,内部流程40%,学习成长10%
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L29-L34)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L63-L74)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L88-L186)
|
||||
|
||||
### 员工状态 (StaffStatus) 数据字典
|
||||
|
||||
| 状态值 | 业务含义 | 系统行为 | 统计影响 | 权限控制 |
|
||||
|--------|----------|----------|----------|----------|
|
||||
| active | 在职 | 可参与考核、享受绩效 | 计入在岗人员统计 | 完整权限 |
|
||||
| leave | 休假 | 不参与考核、暂停绩效 | 不计入在岗统计 | 有限权限 |
|
||||
| resigned | 离职 | 不参与考核、结算薪酬 | 不再统计 | 无权限 |
|
||||
| retired | 退休 | 不参与考核、结算薪酬 | 不再统计 | 无权限 |
|
||||
|
||||
**状态流转图**:
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> active
|
||||
active --> leave : 请假/调休
|
||||
leave --> active : 返回工作
|
||||
active --> resigned : 离职办理
|
||||
active --> retired : 退休办理
|
||||
resigned --> [*]
|
||||
retired --> [*]
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L37-L42)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L24-L28)
|
||||
|
||||
### 考核状态 (AssessmentStatus) 数据字典
|
||||
|
||||
| 状态值 | 业务含义 | 系统权限 | 数据处理 | 流程控制 |
|
||||
|--------|----------|----------|----------|----------|
|
||||
| draft | 草稿 | 创建/编辑 | 临时保存 | 初始状态 |
|
||||
| submitted | 已提交 | 审核查看 | 待审核状态 | 提交流程 |
|
||||
| reviewed | 已审核 | 确认审批 | 审核中 | 审核流程 |
|
||||
| finalized | 已确认 | 工资核算 | 生效状态 | 结束状态 |
|
||||
| rejected | 已驳回 | 重新编辑 | 退回修改 | 异常流程 |
|
||||
|
||||
**状态流转流程**:
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as 用户
|
||||
participant S as 系统
|
||||
participant A as 审核人
|
||||
participant P as 系统
|
||||
U->>S : 创建/编辑考核
|
||||
S->>S : 状态=draft
|
||||
U->>S : 提交考核
|
||||
S->>S : 状态=submitted
|
||||
A->>S : 审核通过
|
||||
S->>S : 状态=reviewed
|
||||
A->>S : 确认生效
|
||||
S->>S : 状态=finalized
|
||||
S->>P : 生成工资记录
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L45-L51)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L31-L36)
|
||||
|
||||
### 指标类型 (IndicatorType) 数据字典
|
||||
|
||||
| 类型值 | 业务含义 | 计算方法 | 评估标准 | 示例指标 |
|
||||
|--------|----------|----------|----------|----------|
|
||||
| quality | 质量指标 | 定性/定量评估 | 百分比/分数制 | 甲级病历率、满意度 |
|
||||
| quantity | 数量指标 | 绝对数值统计 | 完成率/达标率 | 手术台次、门诊量 |
|
||||
| efficiency | 效率指标 | 比较/比率分析 | 时间/成本效率 | 住院日、周转率 |
|
||||
| service | 服务指标 | 客户满意度 | 星级/评分制 | 服务态度、及时性 |
|
||||
| cost | 成本指标 | 成本效益分析 | 成本控制效果 | 材料消耗、成本率 |
|
||||
|
||||
**评估方法分类**:
|
||||
- 区间法:设定目标区间,按比例扣分
|
||||
- 目标参照法:与目标值对比,超耗扣分
|
||||
- 加分法:超额完成给予奖励分
|
||||
- 扣分法:违规事件直接扣分
|
||||
- 一票否决:重大事故直接无效
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L54-L60)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L39-L44)
|
||||
|
||||
### 计划状态 (PlanStatus) 数据字典
|
||||
|
||||
| 状态值 | 业务含义 | 审批流程 | 统计作用 | 系统控制 |
|
||||
|--------|----------|----------|----------|----------|
|
||||
| draft | 草稿 | 无需审批 | 临时保存 | 创建/修改 |
|
||||
| pending | 待审批 | 上级审批 | 待执行 | 提交申请 |
|
||||
| approved | 已批准 | 审批通过 | 执行准备 | 正式生效 |
|
||||
| rejected | 已驳回 | 审批拒绝 | 修改调整 | 退回修改 |
|
||||
| active | 执行中 | 开始执行 | 实际执行 | 进行中 |
|
||||
| completed | 已完成 | 执行结束 | 归档统计 | 结束状态 |
|
||||
| cancelled | 已取消 | 主动取消 | 终止执行 | 异常终止 |
|
||||
|
||||
**计划层级**:
|
||||
- hospital:医院级计划,全局性目标
|
||||
- department:科室级计划,部门目标
|
||||
- individual:个人级计划,员工目标
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L233-L241)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L463-L478)
|
||||
|
||||
### 菜单类型 (MenuType) 数据字典
|
||||
|
||||
| 类型值 | 业务含义 | 界面表现 | 权限控制 | 使用场景 |
|
||||
|--------|----------|----------|----------|----------|
|
||||
| menu | 菜单 | 可展开的导航项 | 路由访问权限 | 主要功能入口 |
|
||||
| button | 按钮 | 可点击的操作按钮 | 功能操作权限 | 具体业务操作 |
|
||||
|
||||
**菜单结构**:
|
||||
- 一级菜单:工作台、科室管理、员工管理等
|
||||
- 二级菜单:具体的业务功能页面
|
||||
- 按钮权限:新增、编辑、删除、查看等操作
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L341-L344)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L584-L587)
|
||||
|
||||
### 模板类型 (TemplateType) 数据字典
|
||||
|
||||
| 类型值 | 业务含义 | 适用范围 | 权重配置 | 特殊要求 |
|
||||
|--------|----------|----------|----------|----------|
|
||||
| general | 通用模板 | 全院各科室 | 4维均衡 | 基础通用指标 |
|
||||
| surgical | 手术临床科室 | 外科、妇科、眼科等 | 财务35% | DRG/RBRVS导向 |
|
||||
| nonsurgical_ward | 非手术有病房科室 | 内科、儿科等 | 4维均衡 | 住院管理重点 |
|
||||
| nonsurgical_noward | 非手术无病房科室 | 急诊、观察室等 | 4维均衡 | 急诊效率评估 |
|
||||
| medical_tech | 医技科室 | 检验、放射、超声等 | 内部流程40% | 质量效率双核心 |
|
||||
| nursing | 护理单元 | 各病区护理单元 | 顾客30% | 护理质量优先 |
|
||||
| admin | 行政科室 | 院办、党办、财务等 | 顾客40% | 服务支持导向 |
|
||||
| logistics | 后勤科室 | 总务、设备、基建等 | 内部流程40% | 保障效率优先 |
|
||||
|
||||
**模板特点**:
|
||||
- **通用模板**:平衡四维度,适合大多数科室
|
||||
- **手术模板**:强调财务效率,体现技术价值
|
||||
- **医技模板**:注重质量与效率并重
|
||||
- **行政模板**:突出服务支持能力
|
||||
- **后勤模板**:重视保障及时性
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L375-L384)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L642-L651)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L45-L60)
|
||||
|
||||
## 依赖分析
|
||||
|
||||
### 数据库迁移依赖
|
||||
|
||||
系统通过 Alembic 迁移管理枚举类型的数据库存储:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[初始版本] --> B[添加指标维度字段]
|
||||
B --> C[模板类型定义]
|
||||
C --> D[枚举类型持久化]
|
||||
E[DeptType] --> F[departments表]
|
||||
G[BSCDimension] --> H[indicators表]
|
||||
I[AssessmentStatus] --> J[assessments表]
|
||||
K[TemplateType] --> L[indicator_templates表]
|
||||
F --> M[SQL约束]
|
||||
H --> M
|
||||
J --> M
|
||||
L --> M
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L173)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L65-L95)
|
||||
|
||||
### 业务流程依赖
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "业务流程"
|
||||
A[科室类型] --> B[指标模板]
|
||||
B --> C[绩效考核]
|
||||
C --> D[工资核算]
|
||||
end
|
||||
subgraph "状态管理"
|
||||
E[员工状态] --> F[考核状态]
|
||||
F --> G[计划状态]
|
||||
end
|
||||
subgraph "系统集成"
|
||||
H[菜单类型] --> I[权限控制]
|
||||
I --> J[界面展示]
|
||||
end
|
||||
B --> F
|
||||
C --> G
|
||||
D --> G
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L270-L293)
|
||||
|
||||
**章节来源**
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L65-L95)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L270-L293)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 枚举类型性能优化
|
||||
|
||||
1. **数据库索引优化**
|
||||
- 科室类型:departments.dept_type
|
||||
- 员工状态:staff.status
|
||||
- 考核状态:assessments.status
|
||||
- 指标类型:indicators.indicator_type
|
||||
|
||||
2. **查询性能**
|
||||
- 使用枚举值进行精确匹配优于字符串模糊查询
|
||||
- 合理利用数据库索引提高查询效率
|
||||
- 避免在 WHERE 子句中进行枚举值转换
|
||||
|
||||
3. **内存使用**
|
||||
- 枚举类型占用固定内存空间
|
||||
- 避免频繁创建新的枚举实例
|
||||
- 使用枚举缓存机制减少重复创建
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
**问题1:枚举值不一致**
|
||||
- 症状:数据库中存储的枚举值与代码定义不匹配
|
||||
- 解决方案:检查 Alembic 迁移文件,确保数据库字段类型正确
|
||||
|
||||
**问题2:状态流转异常**
|
||||
- 症状:考核状态无法正常转换
|
||||
- 解决方案:验证状态转换规则,检查业务逻辑实现
|
||||
|
||||
**问题3:模板应用错误**
|
||||
- 症状:指标模板不适用于特定科室类型
|
||||
- 解决方案:检查 applicable_dept_types 字段配置
|
||||
|
||||
**问题4:权限控制失效**
|
||||
- 症状:菜单权限不生效
|
||||
- 解决方案:验证 MenuType 和权限标识配置
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L16-L438)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L270-L293)
|
||||
|
||||
## 结论
|
||||
|
||||
本系统通过标准化的枚举类型设计,实现了以下目标:
|
||||
|
||||
1. **业务一致性**:统一的枚举定义确保各模块间业务逻辑的一致性
|
||||
2. **可维护性**:集中化的枚举管理便于后续扩展和维护
|
||||
3. **可扩展性**:清晰的枚举层次结构支持业务需求变化
|
||||
4. **数据完整性**:数据库层面的约束保证数据质量
|
||||
|
||||
建议在后续开发中:
|
||||
- 定期审查和更新枚举定义
|
||||
- 建立枚举变更的审批流程
|
||||
- 完善枚举值的业务文档
|
||||
- 加强枚举类型的单元测试
|
||||
414
.qoder/repowiki/zh/content/数据库设计/数据字典/系统菜单字段.md
Normal file
414
.qoder/repowiki/zh/content/数据库设计/数据字典/系统菜单字段.md
Normal file
@@ -0,0 +1,414 @@
|
||||
# 系统菜单字段
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py)
|
||||
- [menu.js](file://frontend/src/api/menu.js)
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue)
|
||||
- [Layout.vue](file://frontend/src/views/Layout.vue)
|
||||
- [index.js](file://frontend/src/router/index.js)
|
||||
- [security.py](file://backend/app/core/security.py)
|
||||
- [create_menu_tables.py](file://backend/create_menu_tables.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档提供了医院绩效系统中系统菜单相关字段的详细数据字典。涵盖了系统菜单表(Menu)、菜单类型枚举(MenuType)等字段定义,详细说明了菜单层级结构、权限控制、路由配置等相关字段。文档包含了菜单树形结构的父子关系和排序机制,提供了菜单权限验证和动态加载的字段设计说明,以及菜单可见性和激活状态的字段约束。同时说明了菜单与功能权限的关联关系。
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统采用前后端分离架构,菜单管理功能分布在以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端层"
|
||||
FE_API[菜单API调用]
|
||||
FE_VIEW[菜单管理界面]
|
||||
FE_ROUTER[前端路由]
|
||||
end
|
||||
subgraph "后端层"
|
||||
API[菜单API路由]
|
||||
SERVICE[菜单业务逻辑]
|
||||
MODEL[菜单数据模型]
|
||||
SCHEMA[数据验证模式]
|
||||
end
|
||||
subgraph "数据库层"
|
||||
DB[(MySQL数据库)]
|
||||
end
|
||||
FE_API --> API
|
||||
FE_VIEW --> FE_API
|
||||
FE_ROUTER --> FE_VIEW
|
||||
API --> SERVICE
|
||||
SERVICE --> MODEL
|
||||
MODEL --> DB
|
||||
SCHEMA --> API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
|
||||
**章节来源**
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 菜单数据模型
|
||||
|
||||
系统菜单采用自引用的树形结构设计,支持无限层级的菜单组织。每个菜单项包含完整的元数据信息,用于前端渲染和权限控制。
|
||||
|
||||
### 菜单类型枚举
|
||||
|
||||
系统支持两种菜单类型:
|
||||
- **菜单(Menu)**: 用于页面导航的主要菜单项
|
||||
- **按钮(Button)**: 用于页面内功能按钮的权限控制
|
||||
|
||||
### 菜单字段定义
|
||||
|
||||
| 字段名 | 数据类型 | 是否可空 | 默认值 | 描述 |
|
||||
|--------|----------|----------|--------|------|
|
||||
| id | Integer | 否 | 自增 | 菜单唯一标识符 |
|
||||
| parent_id | Integer | 是 | NULL | 父菜单ID,自引用外键 |
|
||||
| menu_type | Enum | 否 | menu | 菜单类型(MENU/BUTTON) |
|
||||
| menu_name | String(100) | 否 | - | 菜单显示名称 |
|
||||
| menu_icon | String(50) | 是 | NULL | Element Plus图标名称 |
|
||||
| path | String(200) | 否 | - | Vue Router路由路径 |
|
||||
| component | String(200) | 是 | NULL | 页面组件路径 |
|
||||
| permission | String(100) | 是 | NULL | 权限标识符 |
|
||||
| sort_order | Integer | 否 | 0 | 排序权重 |
|
||||
| is_visible | Boolean | 否 | TRUE | 是否在菜单中显示 |
|
||||
| is_active | Boolean | 否 | TRUE | 菜单是否启用 |
|
||||
| created_at | DateTime | 否 | 当前时间 | 创建时间戳 |
|
||||
| updated_at | DateTime | 否 | 当前时间 | 更新时间戳 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L590-L638)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统菜单架构采用经典的三层架构模式,实现了完整的菜单生命周期管理:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 前端客户端
|
||||
participant API as 菜单API
|
||||
participant Service as 菜单服务
|
||||
participant Model as 数据模型
|
||||
participant DB as 数据库
|
||||
Client->>API : GET /menus/tree?visible_only=true
|
||||
API->>Service : get_tree(visible_only)
|
||||
Service->>Model : 查询菜单树
|
||||
Model->>DB : SQL查询
|
||||
DB-->>Model : 菜单数据
|
||||
Model-->>Service : 菜单对象
|
||||
Service->>Service : 转换为字典结构
|
||||
Service-->>API : 菜单树数据
|
||||
API-->>Client : JSON响应
|
||||
Note over Client,DB : 菜单树形结构加载流程
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L17-L29)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
|
||||
**章节来源**
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L17-L29)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 菜单树形结构设计
|
||||
|
||||
系统采用自引用关系实现菜单树形结构,支持无限层级嵌套:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Menu {
|
||||
+Integer id
|
||||
+Integer parent_id
|
||||
+MenuType menu_type
|
||||
+String menu_name
|
||||
+String menu_icon
|
||||
+String path
|
||||
+String component
|
||||
+String permission
|
||||
+Integer sort_order
|
||||
+Boolean is_visible
|
||||
+Boolean is_active
|
||||
+DateTime created_at
|
||||
+DateTime updated_at
|
||||
+children : Menu[]
|
||||
+parent : Menu
|
||||
}
|
||||
class MenuType {
|
||||
<<enumeration>>
|
||||
MENU
|
||||
BUTTON
|
||||
}
|
||||
Menu --> Menu : "parent_id -> id"
|
||||
Menu --> Menu : "children"
|
||||
Menu --> MenuType : "uses"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [models.py](file://backend/app/models/models.py#L341-L345)
|
||||
|
||||
### 菜单权限控制机制
|
||||
|
||||
系统实现了多层次的权限控制体系:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([用户请求菜单]) --> CheckAuth["检查用户认证"]
|
||||
CheckAuth --> AuthOK{"认证通过?"}
|
||||
AuthOK --> |否| Deny["拒绝访问"]
|
||||
AuthOK --> |是| LoadTree["加载菜单树"]
|
||||
LoadTree --> FilterVisible["过滤可见菜单"]
|
||||
FilterVisible --> FilterActive["过滤启用菜单"]
|
||||
FilterActive --> SortOrder["按排序字段排序"]
|
||||
SortOrder --> BuildTree["构建菜单树"]
|
||||
BuildTree --> ReturnMenu["返回菜单数据"]
|
||||
Deny --> End([结束])
|
||||
ReturnMenu --> End
|
||||
style Start fill:#e1f5fe
|
||||
style End fill:#ffebee
|
||||
style Deny fill:#ffebee
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L91)
|
||||
|
||||
### 菜单排序机制
|
||||
|
||||
系统支持多维度排序控制:
|
||||
|
||||
1. **主排序**: `sort_order` 字段,数值越小优先级越高
|
||||
2. **次排序**: `id` 字段,确保相同排序值的稳定性
|
||||
3. **层级排序**: 顶级菜单优先于子菜单
|
||||
|
||||
**章节来源**
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L24-L24)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L49-L49)
|
||||
|
||||
### 菜单可见性控制
|
||||
|
||||
系统通过两个独立字段控制菜单的显示状态:
|
||||
|
||||
| 控制字段 | 类型 | 默认值 | 作用域 | 影响范围 |
|
||||
|----------|------|--------|--------|----------|
|
||||
| is_visible | Boolean | TRUE | 菜单树渲染 | 前端菜单树显示 |
|
||||
| is_active | Boolean | TRUE | 功能启用 | 菜单功能可用性 |
|
||||
|
||||
**章节来源**
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L20-L21)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L600-L601)
|
||||
|
||||
### 菜单与功能权限关联
|
||||
|
||||
系统通过 `permission` 字段实现菜单与功能权限的关联:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
MENUS {
|
||||
int id PK
|
||||
int parent_id FK
|
||||
enum menu_type
|
||||
string menu_name
|
||||
string menu_icon
|
||||
string path
|
||||
string component
|
||||
string permission
|
||||
int sort_order
|
||||
boolean is_visible
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
USERS {
|
||||
int id PK
|
||||
string username UK
|
||||
string password_hash
|
||||
string role
|
||||
boolean is_active
|
||||
datetime last_login
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
USER_PERMISSIONS {
|
||||
int user_id FK
|
||||
string permission
|
||||
boolean granted
|
||||
datetime granted_at
|
||||
}
|
||||
MENUS ||--o{ MENUS : "parent_id -> id"
|
||||
USERS ||--o{ USER_PERMISSIONS : "has"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [security.py](file://backend/app/core/security.py#L94-L109)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L358-L358)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L598-L598)
|
||||
|
||||
### 前端菜单管理界面
|
||||
|
||||
前端提供了完整的菜单管理功能:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Admin as 管理员
|
||||
participant View as 菜单管理界面
|
||||
participant API as 菜单API
|
||||
participant Service as 菜单服务
|
||||
participant DB as 数据库
|
||||
Admin->>View : 打开菜单管理页面
|
||||
View->>API : 加载菜单列表
|
||||
API->>Service : get_list()
|
||||
Service->>DB : 查询菜单
|
||||
DB-->>Service : 菜单数据
|
||||
Service-->>API : 菜单列表
|
||||
API-->>View : 返回数据
|
||||
View-->>Admin : 显示菜单表格
|
||||
Admin->>View : 新建菜单
|
||||
View->>API : create_menu()
|
||||
API->>Service : create()
|
||||
Service->>DB : 插入菜单
|
||||
DB-->>Service : 成功
|
||||
Service-->>API : 菜单对象
|
||||
API-->>View : 返回结果
|
||||
View-->>Admin : 显示成功消息
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue#L144-L152)
|
||||
- [menu.js](file://frontend/src/api/menu.js#L18-L21)
|
||||
|
||||
**章节来源**
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue#L1-L265)
|
||||
- [menu.js](file://frontend/src/api/menu.js#L1-L37)
|
||||
|
||||
## 依赖分析
|
||||
|
||||
系统菜单功能涉及多个组件间的复杂依赖关系:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据层"
|
||||
MenuModel[Menu模型]
|
||||
MenuType[MenuType枚举]
|
||||
end
|
||||
subgraph "业务层"
|
||||
MenuService[MenuService]
|
||||
Security[安全模块]
|
||||
end
|
||||
subgraph "接口层"
|
||||
MenuAPI[菜单API]
|
||||
Schema[数据模式]
|
||||
end
|
||||
subgraph "表现层"
|
||||
Frontend[前端界面]
|
||||
Router[Vue Router]
|
||||
end
|
||||
MenuAPI --> MenuService
|
||||
MenuService --> MenuModel
|
||||
MenuService --> Security
|
||||
MenuAPI --> Schema
|
||||
Frontend --> MenuAPI
|
||||
Router --> Frontend
|
||||
MenuModel --> MenuType
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L341-L345)
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L341-L345)
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库索引优化
|
||||
|
||||
系统为菜单表建立了多个关键索引以提升查询性能:
|
||||
|
||||
| 索引名称 | 字段组合 | 用途 | 性能影响 |
|
||||
|----------|----------|------|----------|
|
||||
| idx_menu_parent | parent_id | 父子关系查询 | 快速定位子菜单 |
|
||||
| idx_menu_type | menu_type | 类型过滤查询 | 快速筛选菜单类型 |
|
||||
| idx_menu_visible | is_visible | 可见性过滤 | 快速筛选显示菜单 |
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
1. **延迟加载**: 使用 `selectinload` 优化N+1查询问题
|
||||
2. **条件过滤**: 在服务层统一处理查询条件
|
||||
3. **排序优化**: 利用复合索引支持排序查询
|
||||
|
||||
### 前端性能优化
|
||||
|
||||
1. **菜单树缓存**: 避免重复加载相同的菜单树
|
||||
2. **懒加载**: 路由组件按需加载
|
||||
3. **虚拟滚动**: 大数据量时使用虚拟滚动
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
| 问题类型 | 症状 | 可能原因 | 解决方案 |
|
||||
|----------|------|----------|----------|
|
||||
| 菜单不显示 | 菜单树为空 | is_visible=false 或 is_active=false | 检查菜单状态字段 |
|
||||
| 菜单排序异常 | 菜单顺序错误 | sort_order字段冲突 | 重新设置排序值 |
|
||||
| 子菜单无法删除 | 删除报错 | 存在子菜单依赖 | 先删除子菜单再删除父菜单 |
|
||||
| 权限控制失效 | 无权限访问 | permission字段缺失 | 添加正确的权限标识符 |
|
||||
|
||||
### 调试工具
|
||||
|
||||
1. **数据库查询**: 使用SQL查询验证菜单状态
|
||||
2. **API测试**: 使用Postman测试菜单接口
|
||||
3. **浏览器调试**: 检查前端控制台错误
|
||||
|
||||
**章节来源**
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L86-L98)
|
||||
- [security.py](file://backend/app/core/security.py#L94-L109)
|
||||
|
||||
## 结论
|
||||
|
||||
系统菜单字段设计体现了良好的软件工程实践,通过清晰的数据模型、完善的权限控制和高效的查询机制,实现了灵活的菜单管理功能。自引用的树形结构设计支持复杂的菜单层级,而权限标识符则为细粒度的权限控制提供了基础。
|
||||
|
||||
系统的关键优势包括:
|
||||
- **灵活性**: 支持无限层级的菜单结构
|
||||
- **可扩展性**: 易于添加新的菜单类型和字段
|
||||
- **安全性**: 多层次的权限控制机制
|
||||
- **易用性**: 完整的前端管理界面
|
||||
|
||||
未来可以考虑的改进方向:
|
||||
- 增加菜单访问日志功能
|
||||
- 实现菜单模板化管理
|
||||
- 添加菜单权限继承机制
|
||||
- 优化大数据量场景下的性能表现
|
||||
454
.qoder/repowiki/zh/content/数据库设计/数据字典/绩效计划字段.md
Normal file
454
.qoder/repowiki/zh/content/数据库设计/数据字典/绩效计划字段.md
Normal file
@@ -0,0 +1,454 @@
|
||||
# 绩效计划字段
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [create_plan_tables.py](file://backend/create_plan_tables.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件为医院绩效系统中绩效计划相关字段的详细数据字典,涵盖以下核心实体:
|
||||
- 绩效计划表(PerformancePlan)
|
||||
- 计划层级(PlanLevel)
|
||||
- 计划状态(PlanStatus)
|
||||
- 计划指标关联表(PlanKpiRelation)
|
||||
|
||||
文档详细说明了计划层级结构、计划审批流程、指标权重分配等相关字段,并包含计划执行跟踪和状态管理的字段约束。同时提供计划与指标关联关系的数据字典说明,以及计划版本管理和变更追踪的字段设计。
|
||||
|
||||
## 项目结构
|
||||
|
||||
该系统采用典型的三层架构设计:
|
||||
- API层:处理HTTP请求和响应
|
||||
- 服务层:实现业务逻辑和工作流控制
|
||||
- 数据模型层:定义数据库表结构和关系
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API层"
|
||||
API[performance_plans.py]
|
||||
end
|
||||
subgraph "服务层"
|
||||
Service[performance_plan_service.py]
|
||||
end
|
||||
subgraph "模型层"
|
||||
Models[models.py]
|
||||
Schemas[schemas.py]
|
||||
end
|
||||
subgraph "数据库"
|
||||
DB[(SQLite/PostgreSQL)]
|
||||
end
|
||||
API --> Service
|
||||
Service --> Models
|
||||
Models --> DB
|
||||
Schemas --> API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [models.py](file://backend/app/models/models.py#L270-L339)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 绩效计划表(PerformancePlan)
|
||||
|
||||
绩效计划表是整个绩效管理体系的核心实体,用于存储各级别(医院级、科室级、个人级)的绩效计划信息。
|
||||
|
||||
#### 基础字段定义
|
||||
|
||||
| 字段名 | 类型 | 约束 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键, 自增 | 计划唯一标识符 |
|
||||
| plan_name | String(200) | 非空 | 计划名称 |
|
||||
| plan_code | String(50) | 唯一, 非空 | 计划编码,全局唯一 |
|
||||
| plan_level | Enum | 非空 | 计划层级:hospital/department/individual |
|
||||
| plan_year | Integer | 非空 | 计划年度(2000-2100) |
|
||||
| plan_month | Integer | 可空 | 计划月份(1-12),仅月度计划使用 |
|
||||
| plan_type | String(20) | 默认 annual | 计划类型:annual/monthly |
|
||||
| department_id | Integer | 外键 | 所属科室ID |
|
||||
| staff_id | Integer | 外键 | 责任人ID |
|
||||
| parent_plan_id | Integer | 外键 | 上级计划ID,支持层级结构 |
|
||||
| description | Text | 可空 | 计划描述 |
|
||||
| strategic_goals | Text | 可空 | 战略目标 |
|
||||
| key_initiatives | Text | 可空 | 关键举措 |
|
||||
| status | Enum | 默认 draft | 计划状态:draft/pending/approved/rejected/active/completed/cancelled |
|
||||
| submitter_id | Integer | 外键 | 提交人ID |
|
||||
| submit_time | DateTime | 可空 | 提交时间 |
|
||||
| approver_id | Integer | 外键 | 审批人ID |
|
||||
| approve_time | DateTime | 可空 | 审批时间 |
|
||||
| approve_remark | Text | 可空 | 审批意见 |
|
||||
| version | Integer | 默认 1 | 版本号,用于版本管理 |
|
||||
| is_active | Boolean | 默认 TRUE | 是否启用 |
|
||||
| created_at | DateTime | 默认当前时间 | 创建时间 |
|
||||
| updated_at | DateTime | 默认当前时间 | 更新时间 |
|
||||
|
||||
#### 索引设计
|
||||
|
||||
- idx_plan_level:按计划层级查询优化
|
||||
- idx_plan_year:按年度查询优化
|
||||
- idx_plan_department:按科室查询优化
|
||||
- idx_plan_status:按状态查询优化
|
||||
|
||||
### 计划层级(PlanLevel)
|
||||
|
||||
计划层级枚举定义了绩效计划的组织层次结构:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class PlanLevel {
|
||||
+hospital : "医院级"
|
||||
+department : "科室级"
|
||||
+individual : "个人级"
|
||||
}
|
||||
class PerformancePlan {
|
||||
+plan_level : PlanLevel
|
||||
+parent_plan_id : int
|
||||
+child_plans : PerformancePlan[]
|
||||
}
|
||||
PerformancePlan --> PlanLevel : "使用"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L263-L268)
|
||||
- [models.py](file://backend/app/models/models.py#L277-L304)
|
||||
|
||||
### 计划状态(PlanStatus)
|
||||
|
||||
计划状态枚举定义了完整的审批和执行生命周期:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 待审批 : "提交"
|
||||
待审批 --> 已批准 : "审批通过"
|
||||
待审批 --> 已驳回 : "审批驳回"
|
||||
已批准 --> 执行中 : "激活"
|
||||
已批准 --> 已取消 : "取消"
|
||||
执行中 --> 已完成 : "完成"
|
||||
执行中 --> 已取消 : "取消"
|
||||
已完成 --> [*]
|
||||
已取消 --> [*]
|
||||
已驳回 --> [*]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L233-L242)
|
||||
|
||||
### 计划指标关联表(PlanKpiRelation)
|
||||
|
||||
计划指标关联表建立了计划与具体考核指标之间的多对多关系,支持每个指标在不同计划中的差异化配置。
|
||||
|
||||
#### 关联字段定义
|
||||
|
||||
| 字段名 | 类型 | 约束 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键, 自增 | 关联关系唯一标识符 |
|
||||
| plan_id | Integer | 外键, 非空 | 关联的计划ID |
|
||||
| indicator_id | Integer | 外键, 非空 | 关联的指标ID |
|
||||
| target_value | Decimal(10,2) | 可空 | 目标值 |
|
||||
| target_unit | String(50) | 可空 | 目标值单位 |
|
||||
| weight | Decimal(5,2) | 默认 1.0 | 权重(0-100) |
|
||||
| scoring_method | String(50) | 可空 | 评分方法 |
|
||||
| scoring_params | Text | 可空 | 评分参数(JSON格式) |
|
||||
| remark | Text | 可空 | 备注 |
|
||||
| created_at | DateTime | 默认当前时间 | 创建时间 |
|
||||
| updated_at | DateTime | 默认当前时间 | 更新时间 |
|
||||
|
||||
#### 关联关系
|
||||
|
||||
- 一对多:一个计划可以关联多个指标
|
||||
- 一对多:一个指标可以出现在多个计划中
|
||||
- 唯一约束:同一计划下的指标必须唯一
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L314-L339)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L481-L517)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用RESTful API设计,支持完整的CRUD操作和业务流程控制:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "API层"
|
||||
participant Service as "服务层"
|
||||
participant Model as "模型层"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /plans/{plan_id}
|
||||
API->>Service : get_by_id(plan_id)
|
||||
Service->>Model : 查询PerformancePlan
|
||||
Model->>DB : SQL查询
|
||||
DB-->>Model : 返回结果
|
||||
Model-->>Service : PerformancePlan对象
|
||||
Service-->>API : 格式化响应
|
||||
API-->>Client : JSON数据
|
||||
Note over Client,DB : 审批流程示例
|
||||
Client->>API : POST /plans/{plan_id}/approve
|
||||
API->>Service : approve(approver_id, approved, remark)
|
||||
Service->>Model : 更新状态和审批信息
|
||||
Model->>DB : 更新操作
|
||||
DB-->>Model : 确认更新
|
||||
Model-->>Service : 更新结果
|
||||
Service-->>API : 审批结果
|
||||
API-->>Client : 审批状态
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L194-L241)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L144-L182)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 计划层级结构
|
||||
|
||||
系统支持三级层级结构,通过parent_plan_id字段实现自关联:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
HospitalPlan["医院级计划<br/>parent_plan_id: NULL"]
|
||||
DeptPlan1["科室级计划<br/>parent_plan_id: 医院级计划ID"]
|
||||
DeptPlan2["科室级计划<br/>parent_plan_id: 医院级计划ID"]
|
||||
IndividualPlan1["个人级计划<br/>parent_plan_id: 科室级计划ID"]
|
||||
IndividualPlan2["个人级计划<br/>parent_plan_id: 科室级计划ID"]
|
||||
HospitalPlan --> DeptPlan1
|
||||
HospitalPlan --> DeptPlan2
|
||||
DeptPlan1 --> IndividualPlan1
|
||||
DeptPlan1 --> IndividualPlan2
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L283-L301)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L319-L341)
|
||||
|
||||
### 计划审批流程
|
||||
|
||||
审批流程严格遵循状态机设计,确保业务合规性:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> Draft["草稿状态<br/>DRAFT"]
|
||||
Draft --> Submit["提交申请<br/>SUBMIT"]
|
||||
Submit --> Pending["待审批<br/>PENDING"]
|
||||
Pending --> Approve{"审批决定"}
|
||||
Approve --> |通过| Approved["已批准<br/>APPROVED"]
|
||||
Approve --> |驳回| Rejected["已驳回<br/>REJECTED"]
|
||||
Approved --> Activate["激活计划<br/>ACTIVE"]
|
||||
Activate --> Completed["完成<br/>COMPLETED"]
|
||||
Rejected --> End([结束])
|
||||
Completed --> End
|
||||
Active --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
|
||||
|
||||
### 指标权重分配
|
||||
|
||||
指标权重分配支持动态配置,每个计划可以为相同指标设置不同的权重:
|
||||
|
||||
#### 权重约束
|
||||
- 权重范围:0-100
|
||||
- 总权重:同一计划内所有指标权重之和通常为100%
|
||||
- 动态调整:支持运行时修改权重分配
|
||||
|
||||
#### 评分参数
|
||||
支持JSON格式的评分参数,如:
|
||||
```json
|
||||
{
|
||||
"threshold": 90,
|
||||
"bonus": 1.2,
|
||||
"penalty": 0.8
|
||||
}
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L486-L488)
|
||||
- [models.py](file://backend/app/models/models.py#L323-L325)
|
||||
|
||||
### 计划执行跟踪
|
||||
|
||||
系统提供完整的过程跟踪机制:
|
||||
|
||||
#### 时间戳管理
|
||||
- created_at:记录创建时间
|
||||
- updated_at:自动更新时间戳
|
||||
- submit_time:提交时间
|
||||
- approve_time:审批时间
|
||||
|
||||
#### 版本管理
|
||||
- version字段:支持版本追踪
|
||||
- is_active:控制计划启用状态
|
||||
- 支持历史版本对比
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L288-L296)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L120-L128)
|
||||
|
||||
### 计划与指标关联关系
|
||||
|
||||
关联关系通过PlanKpiRelation表实现,支持灵活的配置:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
PERFORMANCE_PLANS {
|
||||
int id PK
|
||||
string plan_name
|
||||
int plan_year
|
||||
enum plan_level
|
||||
int department_id FK
|
||||
int staff_id FK
|
||||
}
|
||||
PLAN_KPI_RELATIONS {
|
||||
int id PK
|
||||
int plan_id FK
|
||||
int indicator_id FK
|
||||
decimal weight
|
||||
decimal target_value
|
||||
string target_unit
|
||||
}
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string name
|
||||
string code
|
||||
enum indicator_type
|
||||
decimal weight
|
||||
}
|
||||
PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : "包含"
|
||||
INDICATORS ||--o{ PLAN_KPI_RELATIONS : "被包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L270-L339)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统采用清晰的分层依赖关系:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "外部依赖"
|
||||
FastAPI[FastAPI框架]
|
||||
SQLAlchemy[SQLAlchemy ORM]
|
||||
Alembic[Alembic迁移]
|
||||
end
|
||||
subgraph "内部模块"
|
||||
API[API层]
|
||||
Service[服务层]
|
||||
Models[模型层]
|
||||
Schemas[模式层]
|
||||
end
|
||||
FastAPI --> API
|
||||
SQLAlchemy --> Models
|
||||
Alembic --> Models
|
||||
API --> Service
|
||||
Service --> Models
|
||||
Service --> Schemas
|
||||
Models --> Schemas
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L18)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L13)
|
||||
|
||||
### 数据库迁移
|
||||
|
||||
系统使用Alembic进行数据库版本管理,支持增量升级和降级:
|
||||
|
||||
#### 迁移版本
|
||||
- 001_initial:初始版本,创建基础表结构
|
||||
- 002_template:添加指标模板相关表
|
||||
|
||||
#### 迁移特性
|
||||
- 自动检测模型变化
|
||||
- 支持安全的数据库演进
|
||||
- 提供回滚能力
|
||||
|
||||
**章节来源**
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化
|
||||
|
||||
1. **索引策略**
|
||||
- 多列组合索引用于常用查询条件
|
||||
- 唯一索引确保数据完整性
|
||||
- 选择性索引提升查询性能
|
||||
|
||||
2. **查询优化**
|
||||
- 使用selectinload避免N+1查询问题
|
||||
- 分页查询支持大数据集
|
||||
- 条件查询减少数据传输
|
||||
|
||||
### 缓存策略
|
||||
|
||||
- 配置适当的缓存层
|
||||
- 对静态配置数据进行缓存
|
||||
- 利用数据库连接池
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **计划状态异常**
|
||||
- 检查状态转换规则
|
||||
- 验证审批权限
|
||||
- 确认时间戳完整性
|
||||
|
||||
2. **指标关联问题**
|
||||
- 验证唯一性约束
|
||||
- 检查权重分配合理性
|
||||
- 确认评分参数格式
|
||||
|
||||
3. **数据库连接问题**
|
||||
- 检查连接池配置
|
||||
- 验证迁移版本一致性
|
||||
- 监控数据库性能
|
||||
|
||||
### 调试建议
|
||||
|
||||
1. **日志记录**
|
||||
- 启用详细的API日志
|
||||
- 记录关键业务操作
|
||||
- 监控错误堆栈
|
||||
|
||||
2. **测试策略**
|
||||
- 单元测试覆盖核心逻辑
|
||||
- 集成测试验证流程
|
||||
- 性能测试评估瓶颈
|
||||
|
||||
**章节来源**
|
||||
- [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#L194-L241)
|
||||
|
||||
## 结论
|
||||
|
||||
本数据字典详细描述了医院绩效系统中绩效计划相关的核心字段和业务逻辑。系统采用清晰的分层架构,支持完整的计划生命周期管理,包括:
|
||||
|
||||
- 多层级的组织结构支持
|
||||
- 完整的审批流程控制
|
||||
- 灵活的指标权重配置
|
||||
- 详细的执行跟踪机制
|
||||
- 强大的版本管理功能
|
||||
|
||||
通过合理的数据库设计和API接口,系统能够有效支撑医院的绩效管理体系,为不同层级的组织提供个性化的绩效管理解决方案。
|
||||
364
.qoder/repowiki/zh/content/数据库设计/数据字典/考核相关字段.md
Normal file
364
.qoder/repowiki/zh/content/数据库设计/数据字典/考核相关字段.md
Normal file
@@ -0,0 +1,364 @@
|
||||
# 考核相关字段
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
|
||||
- [assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [database.md](file://docs/数据库设计.md)
|
||||
- [详细设计文档.md](file://docs/详细设计文档.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件聚焦于“考核相关字段”的数据字典与业务规则,覆盖以下对象:
|
||||
- 考核记录表(Assessment)
|
||||
- 考核明细表(AssessmentDetail)
|
||||
- 考核状态枚举(AssessmentStatus)
|
||||
- 考核周期、状态流转、评分计算、完整性校验与一致性保障机制
|
||||
- 考核结果计算与统计分析相关字段说明
|
||||
|
||||
目标是帮助开发者与业务人员快速理解字段含义、取值范围、约束条件、状态转换与计算逻辑,并提供排障建议与最佳实践。
|
||||
|
||||
## 项目结构
|
||||
后端采用分层架构:API 控制器 → 服务层 → ORM 模型;前端通过 API 与后端交互,展示与操作考核流程。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
FE["前端视图<br/>Assessments.vue / AssessmentDetail.vue"] --> API["FastAPI 路由<br/>assessments.py"]
|
||||
API --> SVC["服务层<br/>assessment_service.py"]
|
||||
SVC --> DB["SQLAlchemy 模型<br/>models.py"]
|
||||
DB --> SQL["数据库表<br/>assessments / assessment_details"]
|
||||
API --> STATS["统计接口<br/>stats.py"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L96)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L202)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
|
||||
章节来源
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L96)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L202)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
|
||||
## 核心组件
|
||||
- Assessment(考核记录表)
|
||||
- 关键字段:period_year、period_month、period_type、total_score、weighted_score、status、assessor_id、reviewer_id、submit_time、review_time、remark
|
||||
- 业务规则:按月度周期生成记录;总分与加权得分由明细计算;状态驱动流程推进
|
||||
- AssessmentDetail(考核明细表)
|
||||
- 关键字段:assessment_id、indicator_id、actual_value、score、evidence、remark
|
||||
- 业务规则:每个指标一条明细;得分与佐证材料可编辑(草稿态)
|
||||
- AssessmentStatus(考核状态枚举)
|
||||
- 草稿(draft)、已提交(submitted)、已审核(reviewed)、已确认(finalized)、已驳回(rejected)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L149-L202)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L31-L36)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
|
||||
## 架构总览
|
||||
考核流程由前端触发,经 API 路由进入服务层,持久化到数据库模型,最终支持统计分析。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "API 路由"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "模型/数据库"
|
||||
FE->>API : "提交/审核/确认"
|
||||
API->>SVC : "调用对应方法"
|
||||
SVC->>DB : "读取/更新 Assessment/Details"
|
||||
DB-->>SVC : "返回实体"
|
||||
SVC-->>API : "返回处理结果"
|
||||
API-->>FE : "返回响应"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L227-L255)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Assessment(考核记录表)数据字典
|
||||
- 字段定义与约束
|
||||
- id:主键,自增整数
|
||||
- staff_id:外键指向员工,必填
|
||||
- period_year:整数,必填,年份范围约束见后端校验
|
||||
- period_month:整数,必填,1-12
|
||||
- period_type:字符串,默认 monthly
|
||||
- total_score:数值,总分,创建时由明细得分求和
|
||||
- weighted_score:数值,加权得分,按指标权重加权求和
|
||||
- status:状态枚举,默认 draft
|
||||
- assessor_id:外键,考核人
|
||||
- reviewer_id:外键,审核人
|
||||
- submit_time:提交时间
|
||||
- review_time:审核时间
|
||||
- remark:备注
|
||||
- created_at/updated_at:时间戳
|
||||
|
||||
- 业务规则
|
||||
- 考核周期:以年/月为单位,period_type 默认 monthly
|
||||
- 总分与加权得分:由明细聚合计算
|
||||
- 状态流转:草稿 → 已提交 → 已审核 → 已确认;或草稿 → 已驳回
|
||||
- 时间字段:提交/审核时写入对应时间
|
||||
|
||||
- 约束与索引
|
||||
- 索引:staff_id、period_year+period_month、status
|
||||
- 约束:状态枚举值限定
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L220-L257)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
- [database.md](file://docs/数据库设计.md#L159-L177)
|
||||
|
||||
### AssessmentDetail(考核明细表)数据字典
|
||||
- 字段定义与约束
|
||||
- id:主键,自增整数
|
||||
- assessment_id:外键,必填
|
||||
- indicator_id:外键,必填
|
||||
- actual_value:实际值,可选
|
||||
- score:数值,得分,创建默认 0
|
||||
- evidence:佐证材料,可选
|
||||
- remark:备注
|
||||
- created_at/updated_at:时间戳
|
||||
|
||||
- 业务规则
|
||||
- 每个指标一条明细
|
||||
- 草稿态允许编辑得分与佐证材料
|
||||
- 服务层在创建/更新时重新计算总分与加权得分
|
||||
|
||||
- 约束与索引
|
||||
- 索引:assessment_id、indicator_id
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L196-L218)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
|
||||
### AssessmentStatus(考核状态枚举)数据字典
|
||||
- 枚举值
|
||||
- draft:草稿
|
||||
- submitted:已提交
|
||||
- reviewed:已审核
|
||||
- finalized:已确认
|
||||
- rejected:已驳回
|
||||
|
||||
- 状态转换规则
|
||||
- 草稿 → 已提交(提交)
|
||||
- 已提交 → 已审核 或 已驳回(审核)
|
||||
- 已审核 → 已确认(确认)
|
||||
- 草稿/已驳回 → 可更新(更新时仅允许草稿或已驳回)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L45-L52)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L31-L36)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
|
||||
### 考核周期与状态流转
|
||||
- 考核周期
|
||||
- 默认周期类型为 monthly
|
||||
- 不同指标模板可配置周期(如年度、季度),但记录层面以年/月为单位
|
||||
- 状态流转
|
||||
- 提交:将状态从草稿改为已提交并记录提交时间
|
||||
- 审核:将状态从已提交改为已审核或已驳回,并记录审核时间
|
||||
- 确认:将状态从已审核改为已确认
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 已提交 : "提交"
|
||||
已提交 --> 已审核 : "审核通过"
|
||||
已提交 --> 已驳回 : "审核驳回"
|
||||
已审核 --> 已确认 : "确认"
|
||||
已确认 --> [*]
|
||||
已驳回 --> 草稿 : "重新编辑"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L57-L63)
|
||||
|
||||
章节来源
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L57-L63)
|
||||
|
||||
### 评分计算与字段约束
|
||||
- 总分计算
|
||||
- 总分 = 明细得分之和
|
||||
- 加权得分计算
|
||||
- 加权得分 = Σ(明细得分 × 指标权重)
|
||||
- 权重来自指标表(指标权重 > 0)
|
||||
- 字段约束
|
||||
- 指标权重必须大于 0(数据库 CheckConstraint)
|
||||
- 年度/月份范围在 Pydantic 层面有限制
|
||||
- 得分字段有最小值 0 的约束
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["创建/更新考核"]) --> LoadDetails["加载明细与指标"]
|
||||
LoadDetails --> SumScore["总分 = Σ 明细.score"]
|
||||
LoadDetails --> WeightCalc["加权得分 = Σ 明细.score × 指标.weight"]
|
||||
SumScore --> SaveAssessment["保存 Assessment"]
|
||||
WeightCalc --> SaveAssessment
|
||||
SaveAssessment --> End(["完成"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
|
||||
章节来源
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
|
||||
### 完整性检查与一致性保障
|
||||
- 前端约束
|
||||
- 草稿态允许编辑得分与佐证材料,得分上限为指标最大分值
|
||||
- 状态按钮随状态变化显示
|
||||
- 后端约束
|
||||
- 状态流转严格限制(仅草稿/已驳回可更新;仅已提交可审核;仅已审核可确认)
|
||||
- 批量创建时按年/月/员工去重,避免重复记录
|
||||
- 指标权重 > 0 的数据库约束
|
||||
- 统计一致性
|
||||
- 统计接口基于当前周期与部门维度聚合,确保跨部门/跨周期对比一致
|
||||
|
||||
章节来源
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L57-L96)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L57-L63)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
|
||||
- [models.py](file://backend/app/models/models.py#L144-L146)
|
||||
|
||||
### 考核结果计算与统计分析
|
||||
- 计算字段
|
||||
- total_score:总分
|
||||
- weighted_score:加权得分
|
||||
- 统计接口
|
||||
- 科室绩效统计、周期统计、趋势分析、排名等
|
||||
- 前端展示平均分、总人数、奖金汇总等
|
||||
|
||||
章节来源
|
||||
- [stats.py](file://backend/app/api/v1/stats.py#L36-L242)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L31-L74)
|
||||
|
||||
## 依赖关系分析
|
||||
- 模型层
|
||||
- Assessment ←→ AssessmentDetail(一对多)
|
||||
- Assessment ←→ Staff(多对一)
|
||||
- AssessmentDetail ←→ Indicator(多对一)
|
||||
- 服务层
|
||||
- 服务层负责状态流转、计算与批量创建
|
||||
- API 层
|
||||
- 提供 CRUD、提交、审核、确认、批量创建等接口
|
||||
- 前端
|
||||
- 视图根据状态动态渲染按钮与输入框
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+string period_type
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentStatus status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
+datetime submit_time
|
||||
+datetime review_time
|
||||
+string remark
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+string evidence
|
||||
+string remark
|
||||
}
|
||||
class Staff
|
||||
class Indicator
|
||||
Assessment "1" o-- "*" AssessmentDetail : "明细"
|
||||
Assessment "many" --> "1" Staff : "员工"
|
||||
AssessmentDetail "many" --> "1" Indicator : "指标"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L149-L202)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L149-L202)
|
||||
|
||||
## 性能考量
|
||||
- 查询性能
|
||||
- 为 staff_id、period_year+period_month、status 建立索引,有利于筛选与排序
|
||||
- 写入性能
|
||||
- 批量创建时按部门与周期预检,避免重复记录
|
||||
- 计算性能
|
||||
- 总分与加权得分在服务层一次性计算,减少多次往返
|
||||
- 建议
|
||||
- 对高频查询增加复合索引
|
||||
- 对大表进行分区或归档策略(如历史周期)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L174-L178)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
|
||||
|
||||
## 故障排查指南
|
||||
- 常见问题
|
||||
- 状态不可变更:仅草稿/已驳回可更新;仅已提交可审核;仅已审核可确认
|
||||
- 无法提交/审核/确认:检查当前状态是否符合预期
|
||||
- 批量创建重复:系统按 staff_id+period_year+period_month 去重
|
||||
- 指标权重异常:数据库约束要求权重 > 0
|
||||
- 前端定位
|
||||
- 查看状态标签与按钮可用性
|
||||
- 校验得分上限与佐证材料输入
|
||||
- 后端定位
|
||||
- 检查服务层状态判断与时间字段写入
|
||||
- 核对明细聚合逻辑与指标权重
|
||||
|
||||
章节来源
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L57-L63)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L57-L96)
|
||||
|
||||
## 结论
|
||||
本数据字典明确了考核记录与明细的核心字段、状态流转、评分计算与约束条件,并结合前后端实现展示了完整的业务闭环。遵循上述规则可确保数据一致性与流程可控性,同时为后续扩展(如维度得分、模板周期等)提供清晰边界。
|
||||
|
||||
## 附录
|
||||
- API 路由与前端交互
|
||||
- 列表/详情/创建/更新/提交/审核/确认/批量创建
|
||||
- 前端通过 assessment.js 发起请求,Assessments.vue 与 AssessmentDetail.vue 控制 UI 行为
|
||||
|
||||
章节来源
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L96)
|
||||
438
.qoder/repowiki/zh/content/数据库设计/数据库设计.md
Normal file
438
.qoder/repowiki/zh/content/数据库设计/数据库设计.md
Normal file
@@ -0,0 +1,438 @@
|
||||
# 数据库设计
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/init_db.py](file://backend/init_db.py)
|
||||
- [docs/database.md](file://docs/database.md)
|
||||
- [docs/详细设计文档.md](file://docs/详细设计文档.md)
|
||||
- [backend/create_menu_tables.py](file://backend/create_menu_tables.py)
|
||||
- [backend/create_plan_tables.py](file://backend/create_plan_tables.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“医院绩效系统”的数据库设计,围绕核心数据模型(Department、Staff、Assessment、AssessmentDetail、SalaryRecord)给出完整的ER实体关系图、表结构与字段定义、主键/外键/索引/约束设计原则、数据类型与长度限制、业务规则实现、数据字典、典型数据示例、数据库迁移策略与版本管理、以及性能优化建议。文档同时结合后端模型定义与迁移脚本,确保设计与实现一致。
|
||||
|
||||
## 项目结构
|
||||
后端采用 SQLAlchemy ORM + Alembic 进行模型定义与迁移管理,数据库连接通过异步引擎实现;迁移脚本位于 alembic/versions 下,环境配置由 alembic/env.py 和 alembic.ini 提供;核心模型集中在 backend/app/models/models.py,财务相关模型在 backend/app/models/finance.py。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据库层"
|
||||
DB[(PostgreSQL/SQLite)]
|
||||
end
|
||||
subgraph "迁移与配置"
|
||||
AEnv["alembic/env.py"]
|
||||
AIni["alembic.ini"]
|
||||
V001["versions/001_initial.py"]
|
||||
V002["versions/002_template.py"]
|
||||
end
|
||||
subgraph "模型与服务"
|
||||
Models["models.py<br/>核心模型"]
|
||||
Finance["finance.py<br/>财务模型"]
|
||||
DBMod["database.py<br/>异步引擎/会话"]
|
||||
Cfg["config.py<br/>配置"]
|
||||
InitDB["init_db.py<br/>初始化脚本"]
|
||||
end
|
||||
AEnv --> V001
|
||||
AEnv --> V002
|
||||
AIni --> AEnv
|
||||
DBMod --> Models
|
||||
DBMod --> Finance
|
||||
Cfg --> DBMod
|
||||
InitDB --> Models
|
||||
InitDB --> DBMod
|
||||
Models --> DB
|
||||
Finance --> DB
|
||||
V001 --> DB
|
||||
V002 --> DB
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
|
||||
|
||||
章节来源
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
|
||||
|
||||
## 核心组件
|
||||
本节聚焦于系统的核心数据模型:Department(科室)、Staff(员工)、Assessment(考核记录)、AssessmentDetail(考核明细)、SalaryRecord(工资核算记录)。这些模型通过外键形成稳定的层次关系,支撑绩效计划、指标模板、财务核算等扩展能力。
|
||||
|
||||
- Department(科室)
|
||||
- 主键:id
|
||||
- 外键:parent_id → departments.id(自关联,支持多级组织树)
|
||||
- 索引:idx_dept_type、idx_dept_parent
|
||||
- 约束:code 唯一;is_active 默认启用
|
||||
- 关系:与 Staff 一对多;与自身一对一(子/父)
|
||||
|
||||
- Staff(员工)
|
||||
- 主键:id
|
||||
- 外键:department_id → departments.id
|
||||
- 索引:idx_staff_dept、idx_staff_status
|
||||
- 约束:employee_id 唯一;status 枚举;base_salary/performance_ratio 数值范围合理
|
||||
- 关系:与 Department 多对一;与 Assessment、SalaryRecord 一对多
|
||||
|
||||
- Assessment(考核记录)
|
||||
- 主键:id
|
||||
- 外键:staff_id → staff.id;assessor_id/reviewer_id → staff.id(自关联)
|
||||
- 索引:idx_assessment_staff、idx_assessment_period、idx_assessment_status
|
||||
- 约束:period_year/period_month 组合用于周期查询;status 枚举
|
||||
- 关系:与 Staff 多对一;与 AssessmentDetail 一对多(级联删除)
|
||||
|
||||
- AssessmentDetail(考核明细)
|
||||
- 主键:id
|
||||
- 外键:assessment_id → assessments.id;indicator_id → indicators.id
|
||||
- 索引:idx_detail_assessment、idx_detail_indicator
|
||||
- 关系:与 Assessment、Indicator 多对一
|
||||
|
||||
- SalaryRecord(工资核算记录)
|
||||
- 主键:id
|
||||
- 外键:staff_id → staff.id
|
||||
- 索引:idx_salary_staff、idx_salary_period
|
||||
- 约束:total_salary 由基础字段计算得出;status 字符串枚举
|
||||
- 关系:与 Staff 多对一
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L230)
|
||||
|
||||
## 架构总览
|
||||
下图展示核心模型之间的实体关系与依赖方向,体现从组织结构到人员、再到考核与薪酬的完整闭环。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
string dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
boolean is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
numeric base_salary
|
||||
numeric performance_ratio
|
||||
string status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
ASSESSMENTS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
string period_type
|
||||
numeric total_score
|
||||
numeric 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_DETAILS {
|
||||
int id PK
|
||||
int assessment_id FK
|
||||
int indicator_id FK
|
||||
numeric actual_value
|
||||
numeric score
|
||||
text evidence
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
SALARY_RECORDS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
numeric base_salary
|
||||
numeric performance_score
|
||||
numeric performance_bonus
|
||||
numeric deduction
|
||||
numeric allowance
|
||||
numeric total_salary
|
||||
string status
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS ||--o{ STAFF : "1:N"
|
||||
STAFF ||--o{ ASSESSMENTS : "1:N"
|
||||
STAFF ||--o{ SALARY_RECORDS : "1:N"
|
||||
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "1:N"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L230)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Department(科室)分析
|
||||
- 设计要点
|
||||
- 自关联 parent_id 支持多层级组织树,level 与 sort_order 辅助排序与层级判断。
|
||||
- dept_type 使用枚举,统一管理 9 类科室类型,便于筛选与报表统计。
|
||||
- idx_dept_type、idx_dept_parent 提升按类型与父子关系的查询效率。
|
||||
- 业务规则
|
||||
- code 唯一,保证科室编码规范;is_active 控制启用状态。
|
||||
- 典型数据示例
|
||||
- 内科、外科、妇产科、儿科、放射科、检验科、财务科、人事科等。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L27-L39)
|
||||
|
||||
### Staff(员工)分析
|
||||
- 设计要点
|
||||
- employee_id 唯一,作为外部识别码;department_id 外键关联科室。
|
||||
- base_salary 与 performance_ratio 为薪酬计算基础;status 枚举管理在职状态。
|
||||
- idx_staff_dept、idx_staff_status 优化按科室与状态的检索。
|
||||
- 业务规则
|
||||
- hire_date 记录入职时间;updated_at 自动更新时间戳。
|
||||
- 典型数据示例
|
||||
- 张三、李四、王五、赵六、钱七、孙八、周九、吴十等员工信息。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L42-L53)
|
||||
|
||||
### Assessment(考核记录)分析
|
||||
- 设计要点
|
||||
- period_year 与 period_month 组合唯一性可用于周期性考核的快速定位。
|
||||
- assessor_id 与 reviewer_id 自关联 staff,支持多人协作与审核流程。
|
||||
- status 枚举覆盖草稿、提交、审核、确认、驳回等状态流转。
|
||||
- idx_assessment_staff、idx_assessment_period、idx_assessment_status 提升查询性能。
|
||||
- 业务规则
|
||||
- total_score 与 weighted_score 用于汇总与加权计算;submit_time、review_time 记录关键节点时间。
|
||||
- 典型数据示例
|
||||
- 某员工某年某月的考核记录,包含多个指标得分与佐证材料链接。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L179)
|
||||
|
||||
### AssessmentDetail(考核明细)分析
|
||||
- 设计要点
|
||||
- assessment_id 与 indicator_id 组成明细项,支持多指标、多周期的细粒度记录。
|
||||
- actual_value 与 score 记录实际值与得分;evidence 与 remark 支持审计与说明。
|
||||
- idx_detail_assessment、idx_detail_indicator 优化明细查询。
|
||||
- 业务规则
|
||||
- 与 Assessment 的级联删除保证数据一致性;与 Indicator 的关联确保指标有效性。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L181-L203)
|
||||
|
||||
### SalaryRecord(工资核算记录)分析
|
||||
- 设计要点
|
||||
- period_year 与 period_month 组合用于月度工资归集;staff_id 外键关联员工。
|
||||
- total_salary 由基础字段计算,避免冗余存储;status 字符串枚举控制流程状态。
|
||||
- idx_salary_staff、idx_salary_period 优化按员工与周期的检索。
|
||||
- 业务规则
|
||||
- 仅允许待确认状态下的更新;最终结算后冻结变更。
|
||||
- 典型数据示例
|
||||
- 基本工资、绩效得分、绩效奖金、扣款、补贴、应发工资等字段构成完整薪酬清单。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
|
||||
|
||||
### 财务核算模型(DepartmentFinance)分析
|
||||
- 设计要点
|
||||
- department_id 外键关联科室;finance_type 与 category 组合区分收入/支出与具体类别。
|
||||
- amount 使用数值类型并带非负校验;period_year/period_month 用于月度归集。
|
||||
- idx_finance_dept、idx_finance_period、idx_finance_type、idx_finance_category 提升财务报表查询效率。
|
||||
- 业务规则
|
||||
- amount ≥ 0;category 与 finance_type 枚举化,便于多维分析。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L75)
|
||||
|
||||
### 指标模板与计划管理(扩展能力)
|
||||
- 指标模板(IndicatorTemplate)与模板指标(TemplateIndicator)
|
||||
- 通过模板类型与维度权重,支持不同科室类型的指标套用;模板与指标的多对多关系通过中间表维护。
|
||||
- idx_template_type、idx_template_active 与 idx_ti_unique 索引提升模板与关联查询效率。
|
||||
- 绩效计划(PerformancePlan)与计划指标(PlanKpiRelation)
|
||||
- 支持医院级、科室级、个人级三层计划;parent_plan_id 形成计划树;version 字段用于版本管理。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L270-L338)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L91)
|
||||
|
||||
## 依赖分析
|
||||
- 模型依赖
|
||||
- models.py 定义了核心实体与关系;finance.py 作为财务扩展模型,通过延迟导入避免循环依赖。
|
||||
- Alembic 迁移脚本 versions/001_initial.py 与 versions/002_template.py 与模型定义保持一一对应。
|
||||
- 运行时依赖
|
||||
- database.py 提供异步引擎与会话工厂;config.py 提供数据库连接字符串与池参数;env.py 与 alembic.ini 配置迁移环境。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Cfg["config.py"] --> DB["database.py"]
|
||||
DB --> Models["models.py"]
|
||||
DB --> Finance["finance.py"]
|
||||
AEnv["alembic/env.py"] --> V001["versions/001_initial.py"]
|
||||
AEnv --> V002["versions/002_template.py"]
|
||||
AIni["alembic.ini"] --> AEnv
|
||||
InitDB["init_db.py"] --> DB
|
||||
InitDB --> Models
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [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/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
|
||||
|
||||
章节来源
|
||||
- [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/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L1-L83)
|
||||
|
||||
## 性能考虑
|
||||
- 索引策略
|
||||
- 按查询热点建立复合索引:如 assessments 的 (period_year, period_month),salary_records 的 (period_year, period_month),有效降低周期性统计的扫描成本。
|
||||
- 对枚举字段(如 dept_type、status)建立单列索引,提升过滤效率。
|
||||
- 数值精度
|
||||
- 金额与分数使用 Numeric(precision, scale) 精确存储,避免浮点误差;例如 base_salary、performance_bonus、deduction 等均采用 DECIMAL(10,2)。
|
||||
- 查询优化
|
||||
- 使用关系预加载(relationship)减少 N+1 查询;对高频报表场景可引入物化视图或汇总表。
|
||||
- 连接池与并发
|
||||
- 通过 DATABASE_POOL_SIZE 与 DATABASE_MAX_OVERFLOW 控制连接池大小,避免高并发下的连接争用。
|
||||
- 异步执行
|
||||
- 异步引擎与会话减少阻塞,适合高吞吐的 API 场景。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L86)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L111-L115)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L174-L179)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L199-L203)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L227-L230)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
|
||||
## 故障排查指南
|
||||
- 迁移失败
|
||||
- 确认 alembic.ini 中 sqlalchemy.url 与 config.py 中 DATABASE_URL 一致;检查 Alembic 环境配置(env.py)是否正确指向 Base.metadata。
|
||||
- 使用离线模式验证迁移脚本语法:alembic -c backend/alembic.ini --raiseerr revision --autogenerate -m "test"。
|
||||
- 连接问题
|
||||
- 检查 DATABASE_URL 是否可达;确认数据库服务运行状态;查看 DEBUG 输出定位异常。
|
||||
- 数据不一致
|
||||
- 核对 Assessment 与 AssessmentDetail 的级联删除策略;确认 SalaryRecord 的状态机(仅待确认可更新)。
|
||||
- 初始化数据
|
||||
- 使用 init_db.py 创建表并插入测试数据;若已有数据则跳过插入逻辑,避免重复。
|
||||
|
||||
章节来源
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L21-L65)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
|
||||
|
||||
## 结论
|
||||
本数据库设计以 Department、Staff、Assessment、AssessmentDetail、SalaryRecord 为核心,配合财务核算与指标模板/计划管理扩展,形成从组织到个人、从指标到薪酬的完整闭环。通过合理的索引、数值精度与异步连接池配置,兼顾了查询性能与并发稳定性。借助 Alembic 的迁移机制,能够安全地演进数据库结构并管理版本。
|
||||
|
||||
## 附录
|
||||
|
||||
### 数据字典(核心表)
|
||||
- departments(科室)
|
||||
- 字段:id、name、code(UNIQUE)、dept_type、parent_id、level、sort_order、is_active、description、created_at、updated_at
|
||||
- 索引:idx_dept_type、idx_dept_parent
|
||||
- staff(员工)
|
||||
- 字段:id、employee_id(UNIQUE)、name、department_id、position、title、phone、email、base_salary、performance_ratio、status、hire_date、created_at、updated_at
|
||||
- 索引:idx_staff_dept、idx_staff_status
|
||||
- assessments(考核记录)
|
||||
- 字段:id、staff_id、period_year、period_month、period_type、total_score、weighted_score、status、assessor_id、reviewer_id、submit_time、review_time、remark、created_at、updated_at
|
||||
- 索引:idx_assessment_staff、idx_assessment_period、idx_assessment_status
|
||||
- assessment_details(考核明细)
|
||||
- 字段:id、assessment_id、indicator_id、actual_value、score、evidence、remark、created_at、updated_at
|
||||
- 索引:idx_detail_assessment、idx_detail_indicator
|
||||
- salary_records(工资核算记录)
|
||||
- 字段:id、staff_id、period_year、period_month、base_salary、performance_score、performance_bonus、deduction、allowance、total_salary、status、remark、created_at、updated_at
|
||||
- 索引:idx_salary_staff、idx_salary_period
|
||||
|
||||
章节来源
|
||||
- [docs/database.md](file://docs/database.md#L99-L216)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L230)
|
||||
|
||||
### 数据库迁移与版本管理
|
||||
- 迁移命令
|
||||
- 生成迁移:alembic -c backend/alembic.ini --raiseerr revision --autogenerate -m "描述"
|
||||
- 升级到最新:alembic -c backend/alembic.ini upgrade head
|
||||
- 回滚一步:alembic -c backend/alembic.ini downgrade -1
|
||||
- 版本文件
|
||||
- 初始版本:versions/001_initial.py
|
||||
- 指标模板版本:versions/002_template.py
|
||||
- 环境配置
|
||||
- alembic/env.py 指向 Base.metadata 并支持异步迁移
|
||||
- alembic.ini 提供默认 SQLite 路径,生产环境请替换为 PostgreSQL URL
|
||||
|
||||
章节来源
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L91)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
|
||||
### 典型数据示例
|
||||
- 科室:内科、外科、妇产科、儿科、放射科、检验科、财务科、人事科
|
||||
- 员工:张三、李四、王五、赵六、钱七、孙八、周九、吴十
|
||||
- 考核:某员工某年某月的多指标得分与佐证材料
|
||||
- 工资:基本工资、绩效得分、绩效奖金、扣款、补贴、应发工资
|
||||
|
||||
章节来源
|
||||
- [backend/init_db.py](file://backend/init_db.py#L27-L79)
|
||||
- [docs/详细设计文档.md](file://docs/详细设计文档.md#L642-L662)
|
||||
342
.qoder/repowiki/zh/content/数据库设计/数据库迁移.md
Normal file
342
.qoder/repowiki/zh/content/数据库设计/数据库迁移.md
Normal file
@@ -0,0 +1,342 @@
|
||||
# 数据库迁移
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/init_db.py](file://backend/init_db.py)
|
||||
- [backend/create_menu_tables.py](file://backend/create_menu_tables.py)
|
||||
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py)
|
||||
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [docs/database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本设计文档围绕基于 Alembic 的数据库迁移框架展开,系统阐述版本化数据库变更管理流程、迁移策略与最佳实践,并结合仓库现有迁移脚本与模型定义,给出迁移脚本编写规范、命名约定、初始结构演进策略、数据保护与回滚机制,以及迁移执行命令与工具使用指南。文档同时提供可视化图示帮助读者快速理解迁移架构与数据流。
|
||||
|
||||
## 项目结构
|
||||
后端采用 SQLAlchemy 异步 ORM 与 Alembic 进行数据库版本管理,核心目录与文件如下:
|
||||
- Alembic 配置与环境:backend/alembic.ini、backend/alembic/env.py
|
||||
- 迁移版本脚本:backend/alembic/versions/*.py
|
||||
- 模型定义:backend/app/models/models.py
|
||||
- 数据库连接与会话:backend/app/core/database.py
|
||||
- 初始数据库与测试数据:backend/init_db.py
|
||||
- 菜单与计划表创建脚本:backend/create_menu_tables.py、backend/create_plan_tables.py
|
||||
- 指标表扩展脚本:backend/migrate_indicators.py
|
||||
- 指标模板初始化脚本:backend/init_indicator_templates.py
|
||||
- 系统配置:backend/app/core/config.py
|
||||
- 文档说明:docs/database.md
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A["Alembic 配置<br/>backend/alembic.ini"] --> B["Alembic 环境<br/>backend/alembic/env.py"]
|
||||
B --> C["迁移版本脚本<br/>backend/alembic/versions/*"]
|
||||
D["模型定义<br/>backend/app/models/models.py"] --> B
|
||||
E["数据库连接<br/>backend/app/core/database.py"] --> B
|
||||
F["初始数据库脚本<br/>backend/init_db.py"] --> E
|
||||
G["菜单表脚本<br/>backend/create_menu_tables.py"] --> E
|
||||
H["指标扩展脚本<br/>backend/migrate_indicators.py"] --> E
|
||||
I["指标模板初始化<br/>backend/init_indicator_templates.py"] --> E
|
||||
J["系统配置<br/>backend/app/core/config.py"] --> E
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
- [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/init_db.py](file://backend/init_db.py#L1-L83)
|
||||
- [backend/create_menu_tables.py](file://backend/create_menu_tables.py#L1-L27)
|
||||
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py#L1-L46)
|
||||
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py#L1-L375)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [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)
|
||||
|
||||
## 核心组件
|
||||
- Alembic 环境与配置
|
||||
- env.py:定义离线/在线迁移执行逻辑,绑定目标元数据 Base.metadata,支持异步引擎连接。
|
||||
- alembic.ini:配置脚本位置、路径分隔符、数据库 URL(默认 SQLite),日志级别等。
|
||||
- 模型与元数据
|
||||
- models.py:定义所有数据模型及其枚举、索引与约束;Base 作为 DeclarativeBase 基类,供 Alembic 识别变更。
|
||||
- database.py:创建异步引擎与会话工厂,提供依赖注入接口。
|
||||
- 迁移版本脚本
|
||||
- 001_initial.py:初始版本,创建 departments、staff、indicators、assessments、assessment_details、salary_records、users 等表及索引。
|
||||
- 002_template.py:新增指标模板与模板指标关联表,并向 indicators 表动态添加字段(兼容性处理)。
|
||||
- 辅助脚本
|
||||
- init_db.py:创建所有表并插入测试数据。
|
||||
- create_menu_tables.py:创建菜单相关表并初始化默认菜单。
|
||||
- migrate_indicators.py:直接通过 SQL 为 indicators 表添加字段(非 Alembic 方式)。
|
||||
- init_indicator_templates.py:初始化各类科室的指标模板数据。
|
||||
- app/core/config.py:提供 DATABASE_URL 等配置,影响 Alembic 连接目标。
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
- [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/init_db.py](file://backend/init_db.py#L1-L83)
|
||||
- [backend/create_menu_tables.py](file://backend/create_menu_tables.py#L1-L27)
|
||||
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py#L1-L46)
|
||||
- [backend/init_indicator_templates.py](file://backend/init_indicator_templates.py#L1-L375)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 架构总览
|
||||
下图展示 Alembic 在本项目中的运行时架构:env.py 读取 alembic.ini 配置,绑定 models.py 中的 Base.metadata,通过异步引擎连接数据库,按版本脚本顺序执行 upgrade/downgrade。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "Alembic 运行时"
|
||||
CFG["alembic.ini<br/>配置文件"] --> ENV["env.py<br/>迁移入口"]
|
||||
ENV --> META["models.py: Base.metadata<br/>目标元数据"]
|
||||
ENV --> ENG["database.py: AsyncEngine<br/>异步引擎"]
|
||||
ENV --> V001["versions/001_initial.py<br/>初始迁移"]
|
||||
ENV --> V002["versions/002_template.py<br/>模板迁移"]
|
||||
end
|
||||
ENG --> DB["数据库实例<br/>SQLite 或 PostgreSQL"]
|
||||
META --> DB
|
||||
V001 --> DB
|
||||
V002 --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [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/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 组件A:Alembic 环境与配置
|
||||
- 功能职责
|
||||
- 离线模式:直接从 alembic.ini 读取 sqlalchemy.url,配置上下文并执行迁移。
|
||||
- 在线模式:通过 async_engine_from_config 创建异步引擎,连接数据库后执行迁移。
|
||||
- 目标元数据:绑定 models.Base.metadata,确保基于 ORM 模型的自动检测与版本生成。
|
||||
- 关键点
|
||||
- 异步迁移:env.py 使用 asyncio 协程驱动异步引擎,避免阻塞。
|
||||
- 日志配置:alembic.ini 控制日志级别与输出格式,便于调试。
|
||||
- 命令与工具
|
||||
- 生成迁移:alembic revision --autogenerate -m "描述"
|
||||
- 执行迁移:alembic upgrade head
|
||||
- 回滚迁移:alembic downgrade -1
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant CLI as "命令行"
|
||||
participant Env as "env.py"
|
||||
participant Cfg as "alembic.ini"
|
||||
participant Meta as "models.Base.metadata"
|
||||
participant Eng as "AsyncEngine"
|
||||
participant DB as "数据库"
|
||||
CLI->>Env : 运行迁移命令
|
||||
Env->>Cfg : 读取配置(sqlalchemy.url)
|
||||
Env->>Meta : 绑定目标元数据
|
||||
Env->>Eng : 创建异步引擎
|
||||
Env->>DB : 连接并执行迁移
|
||||
DB-->>Env : 返回迁移结果
|
||||
Env-->>CLI : 输出状态
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L21-L65)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25)
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L1-L44)
|
||||
- [docs/database.md](file://docs/database.md#L272-L285)
|
||||
|
||||
### 组件B:初始数据库结构与演进
|
||||
- 初始版本(001_initial)
|
||||
- 创建核心表:departments、staff、indicators、assessments、assessment_details、salary_records、users。
|
||||
- 定义索引与外键约束,确保查询效率与数据一致性。
|
||||
- 模板版本(002_template)
|
||||
- 新增指标模板表与模板指标关联表,支持按模板生成指标组合。
|
||||
- 对 indicators 表进行字段扩展(bs_dimension、target_unit、assessment_method、deduction_standard、data_source、applicable_dept_types、is_veto),并通过列存在性检查避免重复添加。
|
||||
- 演进策略
|
||||
- 采用增量迁移:每个版本只做必要变更,保持幂等与可回滚。
|
||||
- 兼容性处理:在字段添加前检查是否存在,避免生产环境报错。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> CheckCols["检查指标表字段是否存在"]
|
||||
CheckCols --> AddBs["添加 bs_dimension 字段"]
|
||||
CheckCols --> AddUnit["添加 target_unit 字段"]
|
||||
CheckCols --> AddMethod["添加 assessment_method 字段"]
|
||||
CheckCols --> AddDed["添加 deduction_standard 字段"]
|
||||
CheckCols --> AddSource["添加 data_source 字段"]
|
||||
CheckCols --> AddTypes["添加 applicable_dept_types 字段"]
|
||||
CheckCols --> AddVeto["添加 is_veto 字段"]
|
||||
AddBs --> Done(["完成"])
|
||||
AddUnit --> Done
|
||||
AddMethod --> Done
|
||||
AddDed --> Done
|
||||
AddSource --> Done
|
||||
AddTypes --> Done
|
||||
AddVeto --> Done
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L65-L91)
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
### 组件C:数据保护与回滚机制
|
||||
- 回滚策略
|
||||
- 每个版本脚本均实现 downgrade,按逆序删除表或字段,确保可回滚到上一版本。
|
||||
- 建议在生产环境执行回滚前备份数据库。
|
||||
- 数据保护
|
||||
- 迁移脚本中对字段添加前进行存在性检查,避免重复执行导致失败。
|
||||
- 使用事务包装迁移操作,失败时回滚,减少不一致风险。
|
||||
- 备选脚本
|
||||
- migrate_indicators.py 通过直接 SQL 扩展字段,适用于紧急修复场景,但不建议作为常规迁移手段。
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L175-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L93-L96)
|
||||
- [backend/migrate_indicators.py](file://backend/migrate_indicators.py#L9-L42)
|
||||
|
||||
### 组件D:迁移脚本编写规范与命名约定
|
||||
- 版本命名
|
||||
- 使用递增编号(如 001_initial、002_template),确保顺序正确。
|
||||
- 文件名与 revision ID 保持一致,便于追踪。
|
||||
- 脚本结构
|
||||
- 必须包含 upgrade() 与 downgrade() 函数。
|
||||
- 字段添加需先检查是否存在,避免重复执行。
|
||||
- 尽量使用 Alembic API(op.*)而非原生 SQL,保证跨数据库兼容性。
|
||||
- 注释与元信息
|
||||
- 在文件头部包含消息、修订 ID、修订者、创建日期等信息,提升可维护性。
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L20)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L20)
|
||||
|
||||
### 组件E:迁移执行命令与工具使用
|
||||
- 常用命令
|
||||
- 生成迁移:alembic revision --autogenerate -m "描述"
|
||||
- 执行迁移:alembic upgrade head
|
||||
- 回滚迁移:alembic downgrade -1
|
||||
- 环境变量与配置
|
||||
- DATABASE_URL 来自 app/core/config.py,影响 Alembic 连接目标(默认 SQLite,开发环境可切换 PostgreSQL)。
|
||||
- alembic.ini 中的 sqlalchemy.url 也可直接指定数据库连接字符串。
|
||||
|
||||
**章节来源**
|
||||
- [docs/database.md](file://docs/database.md#L272-L285)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L7-L7)
|
||||
|
||||
## 依赖关系分析
|
||||
- 模块耦合
|
||||
- env.py 依赖 models.Base.metadata 与 app.core.config.settings,确保迁移目标与数据库连接一致。
|
||||
- database.py 提供 AsyncEngine 与 AsyncSession,被 env.py 用于异步迁移。
|
||||
- 外部依赖
|
||||
- Alembic:提供迁移生成、执行与回滚能力。
|
||||
- SQLAlchemy:ORM 模型与异步引擎,驱动迁移元数据与连接。
|
||||
- 潜在风险
|
||||
- 直接 SQL 扩展(如 migrate_indicators.py)与 Alembic 管理的迁移并存,可能造成版本不一致,建议统一迁移到 Alembic。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
ENV["env.py"] --> META["models.Base.metadata"]
|
||||
ENV --> CFG["app/core/config.py"]
|
||||
ENV --> ENG["app/core/database.py"]
|
||||
ENG --> DB["数据库"]
|
||||
V1["001_initial.py"] --> DB
|
||||
V2["002_template.py"] --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L10-L18)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L23-L25)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L20)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L1-L66)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
## 性能考量
|
||||
- 索引设计
|
||||
- 初始版本为高频查询字段建立索引(如 departments.dept_type、staff.department_id 等),提升查询性能。
|
||||
- 迁移执行
|
||||
- 使用异步引擎减少阻塞;批量 DDL 操作建议合并,避免频繁连接。
|
||||
- 数据量增长
|
||||
- 随着 assessments、assessment_details 等表数据增长,需定期评估索引有效性与查询计划。
|
||||
|
||||
[本节为通用指导,无需特定文件引用]
|
||||
|
||||
## 故障排查指南
|
||||
- 常见问题
|
||||
- 迁移失败:检查 downgrade 实现是否完整;确认字段存在性检查逻辑;查看 Alembic 日志级别。
|
||||
- 连接错误:核对 alembic.ini 与 app/core/config.py 中的 DATABASE_URL;确认数据库服务可用。
|
||||
- 字段重复添加:确保字段存在性检查逻辑生效;避免 Alembic 与直接 SQL 并行修改同一表。
|
||||
- 排查步骤
|
||||
- 查看 Alembic 输出日志,定位失败节点。
|
||||
- 手动执行 downgrade 指定版本,清理异常状态后再重试。
|
||||
- 备份数据库后进行回滚与重试。
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/env.py](file://backend/alembic/env.py#L21-L65)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L175-L183)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L93-L96)
|
||||
- [backend/alembic.ini](file://backend/alembic.ini#L20-L43)
|
||||
|
||||
## 结论
|
||||
本项目采用 Alembic 管理数据库版本,结合 SQLAlchemy 异步 ORM 与明确的迁移脚本规范,实现了从初始结构到模板化的演进。通过字段存在性检查、完善的 downgrade 与日志配置,提升了迁移的安全性与可维护性。建议未来逐步将直接 SQL 扩展迁移纳入 Alembic 管理,统一迁移策略,确保版本一致性与可追溯性。
|
||||
|
||||
[本节为总结性内容,无需特定文件引用]
|
||||
|
||||
## 附录
|
||||
|
||||
### A. 迁移命令速查
|
||||
- 生成迁移:alembic revision --autogenerate -m "描述"
|
||||
- 执行迁移:alembic upgrade head
|
||||
- 回滚迁移:alembic downgrade -1
|
||||
|
||||
**章节来源**
|
||||
- [docs/database.md](file://docs/database.md#L272-L285)
|
||||
|
||||
### B. 初始数据库结构概览
|
||||
- 核心表
|
||||
- departments、staff、indicators、assessments、assessment_details、salary_records、users
|
||||
- 关键索引
|
||||
- 高频过滤字段建立索引,如 dept_type、parent_id、department_id、status 等
|
||||
- 约束与枚举
|
||||
- 外键约束、唯一约束、Check 约束与枚举类型(如 DeptType、IndicatorType 等)
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L182)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L438)
|
||||
493
.qoder/repowiki/zh/content/数据库设计/索引与约束设计.md
Normal file
493
.qoder/repowiki/zh/content/数据库设计/索引与约束设计.md
Normal file
@@ -0,0 +1,493 @@
|
||||
# 索引与约束设计
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [env.py](file://backend/alembic/env.py)
|
||||
- [init_db.py](file://backend/init_db.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件聚焦于该医院绩效系统的数据库索引与约束设计,系统性梳理各表的索引策略(单列、复合、唯一)、约束实现(主键、外键、检查、唯一),并结合业务场景给出性能分析、查询优化建议、约束对数据完整性的作用以及索引维护与监控建议。内容严格基于仓库中的模型定义、迁移脚本与文档,避免臆测。
|
||||
|
||||
## 项目结构
|
||||
系统采用 SQLAlchemy ORM + Alembic 迁移的典型后端架构,数据库层通过异步引擎连接,模型文件集中定义表结构、索引与约束,迁移脚本负责版本演进。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据库层"
|
||||
Engine["异步引擎<br/>engine"]
|
||||
Session["会话工厂<br/>async_session_maker"]
|
||||
Base["ORM基类<br/>Base"]
|
||||
end
|
||||
subgraph "模型层"
|
||||
Models["模型定义<br/>models.py"]
|
||||
Finance["财务模型<br/>finance.py"]
|
||||
end
|
||||
subgraph "迁移层"
|
||||
Env["Alembic环境<br/>env.py"]
|
||||
V001["初始迁移<br/>001_initial.py"]
|
||||
V002["模板迁移<br/>002_template.py"]
|
||||
end
|
||||
Engine --> Session
|
||||
Session --> Base
|
||||
Base --> Models
|
||||
Base --> Finance
|
||||
Env --> V001
|
||||
Env --> V002
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [database.py](file://backend/app/core/database.py#L10-L20)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L20)
|
||||
- [finance.py](file://backend/app/models/finance.py#L1-L20)
|
||||
- [env.py](file://backend/alembic/env.py#L10-L18)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
章节来源
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [env.py](file://backend/alembic/env.py#L1-L66)
|
||||
|
||||
## 核心组件
|
||||
- 异步数据库引擎与会话工厂:负责连接与事务管理,支持并发读写。
|
||||
- ORM模型基类:统一模型继承,承载索引与约束声明。
|
||||
- 模型定义:集中定义表结构、字段类型、索引与约束。
|
||||
- Alembic迁移:版本化管理数据库结构变更,确保团队协作一致性。
|
||||
|
||||
章节来源
|
||||
- [database.py](file://backend/app/core/database.py#L10-L20)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L20)
|
||||
- [finance.py](file://backend/app/models/finance.py#L1-L15)
|
||||
- [env.py](file://backend/alembic/env.py#L10-L18)
|
||||
|
||||
## 架构概览
|
||||
系统通过 Alembic 将模型定义映射为数据库表结构,并在迁移脚本中显式声明索引与约束。模型层使用 SQLAlchemy 的 Index 与 CheckConstraint 等机制,迁移层通过 op.create_index/op.create_table 等操作同步到数据库。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Dev as "开发者"
|
||||
participant Alembic as "Alembic"
|
||||
participant Env as "env.py"
|
||||
participant Conn as "数据库连接"
|
||||
participant DB as "数据库"
|
||||
Dev->>Alembic : 生成/执行迁移
|
||||
Alembic->>Env : 加载目标元数据
|
||||
Env->>Conn : 获取异步连接
|
||||
Conn->>DB : 执行DDL建表/索引/约束
|
||||
DB-->>Conn : 返回结果
|
||||
Conn-->>Alembic : 提交/回滚
|
||||
Alembic-->>Dev : 迁移完成
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [env.py](file://backend/alembic/env.py#L42-L53)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 员工信息表(staff)
|
||||
- 主键:id(自增)
|
||||
- 唯一约束:employee_id(工号唯一)
|
||||
- 外键:department_id → departments.id
|
||||
- 单列索引:idx_staff_dept(department_id)、idx_staff_status(status)
|
||||
- 复合索引:无
|
||||
- 检查约束:无
|
||||
- 设计要点
|
||||
- 员工工号唯一,便于跨模块引用与去重。
|
||||
- 员工状态与所属科室是高频过滤条件,分别建立单列索引以提升 WHERE 查询效率。
|
||||
- 与部门的多对一关系通过外键约束保证引用完整性。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L42-L64)
|
||||
|
||||
### 科室信息表(departments)
|
||||
- 主键:id(自增)
|
||||
- 唯一约束:code(科室编码唯一)
|
||||
- 外键:parent_id → departments.id(自关联,树形结构)
|
||||
- 单列索引:idx_dept_type(dept_type)、idx_dept_parent(parent_id)
|
||||
- 复合索引:无
|
||||
- 检查约束:无
|
||||
- 设计要点
|
||||
- 科室编码唯一,支撑业务识别与报表统计。
|
||||
- 科室类型与层级关系常用于筛选与聚合,单列索引覆盖常见查询模式。
|
||||
- 自关联外键支持组织架构树的层次遍历与父子关系校验。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L41)
|
||||
|
||||
### 考核记录表(assessments)
|
||||
- 主键:id(自增)
|
||||
- 外键:staff_id → staff.id;assessor_id/reviewer_id → staff.id(自关联)
|
||||
- 单列索引:idx_assessment_staff(staff_id)、idx_assessment_status(status)
|
||||
- 复合索引:idx_assessment_period(period_year, period_month)
|
||||
- 检查约束:无
|
||||
- 设计要点
|
||||
- 考核周期复合索引覆盖“按年月统计”等典型查询。
|
||||
- 员工与状态索引满足“某员工某状态”的快速检索。
|
||||
- 多个自关联外键确保考核流程的完整性。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L87-L112)
|
||||
|
||||
### 考核明细表(assessment_details)
|
||||
- 主键:id(自增)
|
||||
- 外键:assessment_id → assessments.id;indicator_id → indicators.id
|
||||
- 单列索引:idx_detail_assessment(assessment_id)、idx_detail_indicator(indicator_id)
|
||||
- 复合索引:无
|
||||
- 检查约束:无
|
||||
- 设计要点
|
||||
- 明细表按考核记录与指标分别建立单列索引,支撑“查看某考核的所有指标”和“查看某指标在所有考核中的表现”。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L114-L131)
|
||||
|
||||
### 工资核算记录表(salary_records)
|
||||
- 主键:id(自增)
|
||||
- 外键:staff_id → staff.id
|
||||
- 单列索引:idx_salary_staff(staff_id)
|
||||
- 复合索引:idx_salary_period(period_year, period_month)
|
||||
- 检查约束:无
|
||||
- 设计要点
|
||||
- 工资按员工与周期查询频繁,分别建立单列与复合索引以优化检索与聚合。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
|
||||
### 系统用户表(users)
|
||||
- 主键:id(自增)
|
||||
- 唯一约束:username(用户名唯一)
|
||||
- 外键:staff_id → staff.id(可选关联)
|
||||
- 单列索引:idx_user_username(username)
|
||||
- 复合索引:无
|
||||
- 检查约束:无
|
||||
- 设计要点
|
||||
- 登录凭据唯一性由用户名唯一约束保证,索引加速登录与鉴权查询。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L244-L260)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L156-L172)
|
||||
|
||||
### 绩效计划表(performance_plans)
|
||||
- 主键:id(自增)
|
||||
- 唯一约束:plan_code(计划编码唯一)
|
||||
- 外键:department_id → departments.id;staff_id → staff.id;submitter_id/approver_id → users.id;parent_plan_id → performance_plans.id(自关联)
|
||||
- 单列索引:idx_plan_level(plan_level)、idx_plan_year(plan_year)、idx_plan_department(department_id)、idx_plan_status(status)
|
||||
- 复合索引:无
|
||||
- 检查约束:无
|
||||
- 设计要点
|
||||
- 计划层级、年份、状态与部门是常见的过滤维度,单列索引覆盖主要查询场景。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L270-L311)
|
||||
|
||||
### 计划-指标关联表(plan_kpi_relations)
|
||||
- 主键:id(自增)
|
||||
- 外键:plan_id → performance_plans.id;indicator_id → indicators.id
|
||||
- 单列索引:idx_relation_plan(plan_id)、idx_relation_indicator(indicator_id)
|
||||
- 复合索引:idx_relation_unique(plan_id, indicator_id, unique=True)
|
||||
- 检查约束:无
|
||||
- 设计要点
|
||||
- 关联表的复合唯一索引确保“同一计划下的同一指标仅出现一次”,避免重复绑定。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L314-L338)
|
||||
|
||||
### 指标模板表(indicator_templates)
|
||||
- 主键:id(自增)
|
||||
- 唯一约束:template_code(模板编码唯一)
|
||||
- 单列索引:idx_template_type(template_type)、idx_template_active(is_active)
|
||||
- 复合索引:无
|
||||
- 检查约束:无
|
||||
- 设计要点
|
||||
- 模板类型与启用状态是筛选热点,单列索引满足模板选择与激活状态查询。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L387-L408)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L22-L39)
|
||||
|
||||
### 模板-指标关联表(template_indicators)
|
||||
- 主键:id(自增)
|
||||
- 外键:template_id → indicator_templates.id;indicator_id → indicators.id
|
||||
- 单列索引:idx_ti_template(template_id)、idx_ti_indicator(indicator_id)
|
||||
- 复合索引:idx_ti_unique(template_id, indicator_id, unique=True)
|
||||
- 检查约束:无
|
||||
- 设计要点
|
||||
- 关联表的复合唯一索引确保“同一模板下的同一指标仅出现一次”,避免重复绑定。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L411-L437)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L41-L63)
|
||||
|
||||
### 财务记录表(department_finances)
|
||||
- 主键:id(自增)
|
||||
- 外键:department_id → departments.id
|
||||
- 单列索引:idx_finance_dept(department_id)、idx_finance_period(period_year, period_month)、idx_finance_type(finance_type)、idx_finance_category(category)
|
||||
- 复合索引:无
|
||||
- 检查约束:ck_finance_amount(amount >= 0)
|
||||
- 设计要点
|
||||
- 财务按科室、周期、类型与类别查询频繁,单列索引覆盖这些过滤维度。
|
||||
- 金额非负的检查约束保证财务数据的数值正确性。
|
||||
|
||||
章节来源
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
### 考核指标表(indicators)
|
||||
- 主键:id(自增)
|
||||
- 唯一约束:code(指标编码唯一)
|
||||
- 单列索引:idx_indicator_type(indicator_type)
|
||||
- 复合索引:无
|
||||
- 检查约束:ck_indicator_weight(weight > 0)
|
||||
- 设计要点
|
||||
- 指标类型索引满足按类型筛选与统计。
|
||||
- 权重正数检查约束确保指标权重的合理性。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L66-L85)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string code UK
|
||||
string dept_type
|
||||
int parent_id FK
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
int department_id FK
|
||||
string status
|
||||
}
|
||||
ASSESSMENTS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
string status
|
||||
}
|
||||
ASSESSMENT_DETAILS {
|
||||
int id PK
|
||||
int assessment_id FK
|
||||
int indicator_id FK
|
||||
}
|
||||
SALARY_RECORDS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
}
|
||||
USERS {
|
||||
int id PK
|
||||
string username UK
|
||||
}
|
||||
PERFORMANCE_PLANS {
|
||||
int id PK
|
||||
string plan_code UK
|
||||
string plan_level
|
||||
int department_id FK
|
||||
string status
|
||||
}
|
||||
PLAN_KPI_RELATIONS {
|
||||
int id PK
|
||||
int plan_id FK
|
||||
int indicator_id FK
|
||||
}
|
||||
INDICATOR_TEMPLATES {
|
||||
int id PK
|
||||
string template_code UK
|
||||
string template_type
|
||||
boolean is_active
|
||||
}
|
||||
TEMPLATE_INDICATORS {
|
||||
int id PK
|
||||
int template_id FK
|
||||
int indicator_id FK
|
||||
}
|
||||
DEPARTMENT_FINANCES {
|
||||
int id PK
|
||||
int department_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
string finance_type
|
||||
string category
|
||||
}
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string code UK
|
||||
string indicator_type
|
||||
numeric weight
|
||||
}
|
||||
DEPARTMENTS ||--o{ STAFF : "1:N"
|
||||
STAFF ||--o{ ASSESSMENTS : "1:N"
|
||||
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "1:N"
|
||||
STAFF ||--o{ SALARY_RECORDS : "1:N"
|
||||
DEPARTMENTS ||--o{ DEPARTMENT_FINANCES : "1:N"
|
||||
INDICATORS ||--o{ ASSESSMENT_DETAILS : "1:N"
|
||||
INDICATORS ||--o{ PLAN_KPI_RELATIONS : "1:N"
|
||||
INDICATORS ||--o{ TEMPLATE_INDICATORS : "1:N"
|
||||
INDICATOR_TEMPLATES ||--o{ TEMPLATE_INDICATORS : "1:N"
|
||||
PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : "1:N"
|
||||
USERS ||--o{ PERFORMANCE_PLANS : "1:N"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L437)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L22-L96)
|
||||
|
||||
## 性能考量
|
||||
|
||||
- 索引策略与查询模式匹配
|
||||
- 员工与科室:按部门与状态过滤频繁,单列索引 idx_staff_dept、idx_staff_status、idx_dept_type、idx_dept_parent 能有效降低扫描范围。
|
||||
- 考核与工资:按员工与周期查询最常见,单列索引 idx_assessment_staff、idx_salary_staff,以及复合索引 idx_assessment_period、idx_salary_period 覆盖“某员工某周期”的查询。
|
||||
- 模板与计划:按类型、状态、启用状态过滤,单列索引 idx_template_type、idx_template_active、idx_plan_level、idx_plan_year、idx_plan_department、idx_plan_status。
|
||||
- 财务:按科室、周期、类型、类别过滤,单列索引 idx_finance_dept、idx_finance_period、idx_finance_type、idx_finance_category。
|
||||
|
||||
- 复合索引选择
|
||||
- 考核与工资的“年+月”组合索引能显著提升范围查询与分组统计性能。
|
||||
- 关联表的“计划+指标”复合唯一索引避免重复绑定,同时作为唯一约束提升查询稳定性。
|
||||
|
||||
- 检查约束
|
||||
- 指标权重与财务金额的非负检查约束在写入阶段即拦截异常数据,减少后续修复成本。
|
||||
|
||||
- 查询优化建议
|
||||
- 对高频过滤字段(如 status、dept_type、finance_type)优先使用单列索引。
|
||||
- 对范围查询(如 period_year/period_month)优先使用复合索引。
|
||||
- 避免 SELECT *,明确字段以减少 IO。
|
||||
- 对大表分页查询使用 LIMIT/OFFSET 或基于游标的分页策略,避免深度分页导致的性能退化。
|
||||
|
||||
- 索引维护与监控
|
||||
- 定期分析表与索引统计信息,识别未使用或冗余索引。
|
||||
- 监控慢查询日志,定位缺失索引的查询模式并补充索引。
|
||||
- 在高并发写入场景下,评估索引数量对写入性能的影响,必要时调整索引策略。
|
||||
|
||||
## 故障排查指南
|
||||
|
||||
- 索引缺失导致的慢查询
|
||||
- 症状:WHERE/JOIN/ORDER BY/聚合查询耗时长。
|
||||
- 排查:确认相关字段是否具备单列或复合索引;检查查询执行计划。
|
||||
- 处置:根据查询模式新增索引或调整现有索引顺序。
|
||||
|
||||
- 唯一约束冲突
|
||||
- 症状:插入/更新时报唯一约束冲突。
|
||||
- 排查:确认唯一字段(如 employee_id、code、username、plan_code、template_code)是否重复。
|
||||
- 处置:修正数据或调整业务逻辑,避免重复提交。
|
||||
|
||||
- 外键约束失败
|
||||
- 症状:插入/更新时报外键约束错误。
|
||||
- 排查:确认被引用表是否存在对应记录;确认字段类型与长度一致。
|
||||
- 处置:先创建被引用记录,再进行关联写入。
|
||||
|
||||
- 检查约束触发
|
||||
- 症状:插入/更新时报检查约束错误(如权重非正、金额为负)。
|
||||
- 排查:核对业务输入是否符合约束条件。
|
||||
- 处置:修正业务逻辑或前端校验,确保数据合法。
|
||||
|
||||
- 迁移与版本问题
|
||||
- 症状:迁移失败或版本不一致。
|
||||
- 排查:检查 Alembic 版本历史与当前数据库状态;确认迁移脚本语法正确。
|
||||
- 处置:使用 Alembic 命令检查/回滚/升级至目标版本。
|
||||
|
||||
章节来源
|
||||
- [env.py](file://backend/alembic/env.py#L42-L53)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
## 结论
|
||||
本系统在模型层与迁移层均明确声明了索引与约束,覆盖了业务高频查询与数据完整性需求。通过单列与复合索引的合理布局,配合外键与检查约束,既保证了查询性能,也强化了数据一致性。建议持续监控查询性能与索引使用情况,动态优化索引策略以适应业务增长。
|
||||
|
||||
## 附录
|
||||
|
||||
### 索引与约束清单(按表)
|
||||
|
||||
- departments
|
||||
- 唯一:code
|
||||
- 外键:parent_id → departments.id
|
||||
- 单列索引:idx_dept_type、idx_dept_parent
|
||||
|
||||
- staff
|
||||
- 唯一:employee_id
|
||||
- 外键:department_id → departments.id
|
||||
- 单列索引:idx_staff_dept、idx_staff_status
|
||||
|
||||
- indicators
|
||||
- 唯一:code
|
||||
- 单列索引:idx_indicator_type
|
||||
- 检查约束:weight > 0
|
||||
|
||||
- assessments
|
||||
- 外键:staff_id → staff.id;assessor_id/reviewer_id → staff.id
|
||||
- 单列索引:idx_assessment_staff、idx_assessment_status
|
||||
- 复合索引:idx_assessment_period
|
||||
|
||||
- assessment_details
|
||||
- 外键:assessment_id → assessments.id;indicator_id → indicators.id
|
||||
- 单列索引:idx_detail_assessment、idx_detail_indicator
|
||||
|
||||
- salary_records
|
||||
- 外键:staff_id → staff.id
|
||||
- 单列索引:idx_salary_staff
|
||||
- 复合索引:idx_salary_period
|
||||
|
||||
- users
|
||||
- 唯一:username
|
||||
- 外键:staff_id → staff.id
|
||||
- 单列索引:idx_user_username
|
||||
|
||||
- performance_plans
|
||||
- 唯一:plan_code
|
||||
- 外键:department_id → departments.id;staff_id → staff.id;submitter_id/approver_id → users.id;parent_plan_id → performance_plans.id
|
||||
- 单列索引:idx_plan_level、idx_plan_year、idx_plan_department、idx_plan_status
|
||||
|
||||
- plan_kpi_relations
|
||||
- 外键:plan_id → performance_plans.id;indicator_id → indicators.id
|
||||
- 单列索引:idx_relation_plan、idx_relation_indicator
|
||||
- 复合唯一索引:idx_relation_unique
|
||||
|
||||
- indicator_templates
|
||||
- 唯一:template_code
|
||||
- 单列索引:idx_template_type、idx_template_active
|
||||
|
||||
- template_indicators
|
||||
- 外键:template_id → indicator_templates.id;indicator_id → indicators.id
|
||||
- 单列索引:idx_ti_template、idx_ti_indicator
|
||||
- 复合唯一索引:idx_ti_unique
|
||||
|
||||
- department_finances
|
||||
- 外键:department_id → departments.id
|
||||
- 单列索引:idx_finance_dept、idx_finance_period、idx_finance_type、idx_finance_category
|
||||
- 检查约束:amount >= 0
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L437)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L22-L96)
|
||||
582
.qoder/repowiki/zh/content/数据库设计/表结构设计/枚举类型定义.md
Normal file
582
.qoder/repowiki/zh/content/数据库设计/表结构设计/枚举类型定义.md
Normal file
@@ -0,0 +1,582 @@
|
||||
# 枚举类型定义
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [init_db.py](file://backend/app/core/init_db.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [department_service.py](file://backend/app/services/department_service.py)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心枚举类型](#核心枚举类型)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档详细介绍了医院绩效系统中的所有自定义枚举类型定义,包括它们的设计思路、取值范围、业务含义和使用场景。系统采用强类型枚举确保数据的一致性和完整性,通过SQLAlchemy映射到数据库中的字符串字段,并在API层提供类型安全的接口。
|
||||
|
||||
## 项目结构
|
||||
|
||||
枚举类型主要分布在以下三个层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据模型层"
|
||||
A[models.py<br/>数据库模型枚举]
|
||||
end
|
||||
subgraph "数据验证层"
|
||||
B[schemas.py<br/>Pydantic模型枚举]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
C[init_db.py<br/>初始化枚举]
|
||||
D[finance.py<br/>财务枚举]
|
||||
end
|
||||
subgraph "API接口层"
|
||||
E[departments.py<br/>科室API]
|
||||
F[performance_plans.py<br/>计划API]
|
||||
end
|
||||
A --> B
|
||||
B --> C
|
||||
C --> D
|
||||
D --> E
|
||||
E --> F
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L15-L345)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L10-L652)
|
||||
- [init_db.py](file://backend/app/core/init_db.py#L9-L115)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 核心枚举类型
|
||||
|
||||
### 科室类型 (DeptType)
|
||||
|
||||
科室类型枚举定义了医院各类科室的分类体系,采用字符串值存储,支持多层级科室组织结构。
|
||||
|
||||
**设计思路:**
|
||||
- 按照医院科室的功能属性进行分类
|
||||
- 支持从属关系的层级结构
|
||||
- 为指标模板选择提供依据
|
||||
|
||||
**取值范围:**
|
||||
- `CLINICAL_SURGICAL`: 手术临床科室
|
||||
- `CLINICAL_NONSURGICAL_WARD`: 非手术有病房科室
|
||||
- `CLINICAL_NONSURGICAL_NOWARD`: 非手术无病房科室
|
||||
- `MEDICAL_TECH`: 医技科室
|
||||
- `MEDICAL_AUXILIARY`: 医辅科室
|
||||
- `NURSING`: 护理单元
|
||||
- `ADMIN`: 行政科室
|
||||
- `FINANCE`: 财务科室
|
||||
- `LOGISTICS`: 后勤保障科室
|
||||
|
||||
**业务含义:**
|
||||
- 用于区分不同功能属性的科室
|
||||
- 支持按科室类型进行筛选和统计
|
||||
- 为绩效指标模板的适用性提供分类依据
|
||||
|
||||
**使用场景:**
|
||||
- 科室信息管理
|
||||
- 绩效指标模板匹配
|
||||
- 数据统计分析
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L16-L27)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L22)
|
||||
|
||||
### 平衡计分卡维度 (BSCDimension)
|
||||
|
||||
平衡计分卡维度枚举实现了经典的四个维度考核框架。
|
||||
|
||||
**设计思路:**
|
||||
- 基于平衡计分卡理论框架
|
||||
- 四个维度相互补充,全面评估组织绩效
|
||||
- 支持多维度的综合评价
|
||||
|
||||
**取值范围:**
|
||||
- `FINANCIAL`: 财务维度
|
||||
- `CUSTOMER`: 客户维度
|
||||
- `INTERNAL_PROCESS`: 内部流程维度
|
||||
- `LEARNING_GROWTH`: 学习与成长维度
|
||||
|
||||
**业务含义:**
|
||||
- 财务维度:关注财务表现和盈利能力
|
||||
- 客户维度:关注客户满意度和服务质量
|
||||
- 内部流程维度:关注运营效率和流程优化
|
||||
- 学习与成长维度:关注员工能力和组织发展
|
||||
|
||||
**使用场景:**
|
||||
- 绩效指标设计
|
||||
- 综合评价体系构建
|
||||
- 战略目标分解
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L29-L35)
|
||||
|
||||
### 员工状态 (StaffStatus)
|
||||
|
||||
员工状态枚举跟踪员工在组织中的生命周期状态。
|
||||
|
||||
**设计思路:**
|
||||
- 覆盖员工从入职到离职的完整生命周期
|
||||
- 支持状态变更的审计追踪
|
||||
- 为薪资计算和权限管理提供依据
|
||||
|
||||
**取值范围:**
|
||||
- `ACTIVE`: 在职
|
||||
- `LEAVE`: 休假
|
||||
- `RESIGNED`: 离职
|
||||
- `RETIRED`: 退休
|
||||
|
||||
**业务含义:**
|
||||
- ACTIVE: 当前在岗工作
|
||||
- LEAVE: 正式请假状态
|
||||
- RESIGNED: 主动辞职
|
||||
- RETIRED: 达到退休年龄
|
||||
|
||||
**使用场景:**
|
||||
- 员工信息管理
|
||||
- 薪资发放控制
|
||||
- 系统权限管理
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L37-L43)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L24-L29)
|
||||
|
||||
### 考核状态 (AssessmentStatus)
|
||||
|
||||
考核状态枚举管理绩效考核流程的各个阶段。
|
||||
|
||||
**设计思路:**
|
||||
- 实现完整的考核流程管理
|
||||
- 支持多级审批和状态流转
|
||||
- 提供清晰的流程可视化
|
||||
|
||||
**取值范围:**
|
||||
- `DRAFT`: 草稿
|
||||
- `SUBMITTED`: 已提交
|
||||
- `REVIEWED`: 已审核
|
||||
- `FINALIZED`: 已确认
|
||||
- `REJECTED`: 已驳回
|
||||
|
||||
**业务含义:**
|
||||
- DRAFT: 考核记录创建但未提交
|
||||
- SUBMITTED: 已提交等待审批
|
||||
- REVIEWED: 审核通过等待最终确认
|
||||
- FINALIZED: 最终确认完成
|
||||
- REJECTED: 审批被拒绝
|
||||
|
||||
**使用场景:**
|
||||
- 绩效考核流程控制
|
||||
- 审批权限管理
|
||||
- 数据状态追踪
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L45-L52)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L31-L37)
|
||||
|
||||
### 指标类型 (IndicatorType)
|
||||
|
||||
指标类型枚举定义了绩效指标的分类体系。
|
||||
|
||||
**设计思路:**
|
||||
- 基于平衡计分卡的指标分类
|
||||
- 支持不同类型指标的差异化管理
|
||||
- 便于指标的统计分析和比较
|
||||
|
||||
**取值范围:**
|
||||
- `QUALITY`: 质量指标
|
||||
- `QUANTITY`: 数量指标
|
||||
- `EFFICIENCY`: 效率指标
|
||||
- `SERVICE`: 服务指标
|
||||
- `COST`: 成本指标
|
||||
|
||||
**业务含义:**
|
||||
- QUALITY: 关注工作质量和效果
|
||||
- QUANTITY: 关注工作量和产出数量
|
||||
- EFFICIENCY: 关注资源利用效率
|
||||
- SERVICE: 关注服务质量水平
|
||||
- COST: 关注成本控制效果
|
||||
|
||||
**使用场景:**
|
||||
- 指标设计和分类
|
||||
- 绩效计算和评分
|
||||
- 统计分析和报告
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L39-L45)
|
||||
|
||||
### 计划状态 (PlanStatus)
|
||||
|
||||
计划状态枚举管理绩效计划的生命周期。
|
||||
|
||||
**设计思路:**
|
||||
- 支持从创建到完成的完整计划管理
|
||||
- 提供清晰的状态流转路径
|
||||
- 支持计划的版本管理和变更追踪
|
||||
|
||||
**取值范围:**
|
||||
- `DRAFT`: 草稿
|
||||
- `PENDING`: 待审批
|
||||
- `APPROVED`: 已批准
|
||||
- `REJECTED`: 已驳回
|
||||
- `ACTIVE`: 执行中
|
||||
- `COMPLETED`: 已完成
|
||||
- `CANCELLED`: 已取消
|
||||
|
||||
**业务含义:**
|
||||
- DRAFT: 计划草稿状态
|
||||
- PENDING: 等待上级审批
|
||||
- APPROVED: 审批通过准备执行
|
||||
- REJECTED: 审批被拒绝
|
||||
- ACTIVE: 正在执行的计划
|
||||
- COMPLETED: 执行完成的计划
|
||||
- CANCELLED: 主动取消的计划
|
||||
|
||||
**使用场景:**
|
||||
- 绩效计划管理
|
||||
- 审批流程控制
|
||||
- 计划执行追踪
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L233-L242)
|
||||
|
||||
### 菜单类型 (MenuType)
|
||||
|
||||
菜单类型枚举区分系统界面的导航元素。
|
||||
|
||||
**设计思路:**
|
||||
- 支持复杂的菜单层级结构
|
||||
- 区分页面菜单和操作按钮
|
||||
- 为权限控制提供基础
|
||||
|
||||
**取值范围:**
|
||||
- `MENU`: 菜单
|
||||
- `BUTTON`: 按钮
|
||||
|
||||
**业务含义:**
|
||||
- MENU: 导航菜单项,可包含子菜单
|
||||
- BUTTON: 页面上的操作按钮,无子菜单
|
||||
|
||||
**使用场景:**
|
||||
- 系统权限管理
|
||||
- 界面导航控制
|
||||
- 功能访问控制
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L341-L345)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L584-L588)
|
||||
|
||||
### 财务相关枚举
|
||||
|
||||
#### 收入类别 (RevenueCategory)
|
||||
- `EXAMINATION`: 检查费
|
||||
- `LAB_TEST`: 检验费
|
||||
- `RADIOLOGY`: 放射费
|
||||
- `BED`: 床位费
|
||||
- `NURSING`: 护理费
|
||||
- `TREATMENT`: 治疗费
|
||||
- `SURGERY`: 手术费
|
||||
- `INJECTION`: 注射费
|
||||
- `OXYGEN`: 吸氧费
|
||||
- `OTHER`: 其他
|
||||
|
||||
#### 支出类别 (ExpenseCategory)
|
||||
- `MATERIAL`: 材料费
|
||||
- `PERSONNEL`: 人员支出
|
||||
- `MAINTENANCE`: 维修费
|
||||
- `UTILITY`: 水电费
|
||||
- `OTHER`: 其他
|
||||
|
||||
#### 财务类型 (FinanceType)
|
||||
- `REVENUE`: 收入
|
||||
- `EXPENSE`: 支出
|
||||
|
||||
**章节来源**
|
||||
- [finance.py](file://backend/app/models/finance.py#L16-L43)
|
||||
|
||||
## 架构概览
|
||||
|
||||
枚举类型在整个系统中的架构分布如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据持久层"
|
||||
A[SQLAlchemy Enum<br/>String存储]
|
||||
B[数据库索引<br/>性能优化]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
C[模型定义<br/>类型约束]
|
||||
D[服务层<br/>状态流转]
|
||||
end
|
||||
subgraph "接口层"
|
||||
E[API路由<br/>参数验证]
|
||||
F[Pydantic模型<br/>数据序列化]
|
||||
end
|
||||
subgraph "前端展示层"
|
||||
G[Vue组件<br/>状态显示]
|
||||
H[表格展示<br/>枚举翻译]
|
||||
end
|
||||
A --> C
|
||||
C --> D
|
||||
D --> E
|
||||
E --> F
|
||||
F --> G
|
||||
G --> H
|
||||
B --> A
|
||||
B --> C
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L69-L354)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L652)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 数据库存储方式
|
||||
|
||||
所有枚举类型在数据库中以字符串形式存储,使用SQLAlchemy的Enum映射:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
ENUM_VALUES {
|
||||
string value PK
|
||||
string description
|
||||
string category
|
||||
}
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string dept_type FK
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string status FK
|
||||
}
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string indicator_type FK
|
||||
string bs_dimension FK
|
||||
}
|
||||
DEPARTMENTS }o--|| ENUM_VALUES : "has"
|
||||
STAFF }o--|| ENUM_VALUES : "has"
|
||||
INDICATORS }o--|| ENUM_VALUES : "has"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L69-L125)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L28-L79)
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
系统通过以下方式优化枚举查询性能:
|
||||
|
||||
1. **数据库索引优化**
|
||||
- 科室类型索引:`idx_dept_type`
|
||||
- 员工状态索引:`idx_staff_status`
|
||||
- 考核状态索引:`idx_assessment_status`
|
||||
|
||||
2. **查询条件优化**
|
||||
```python
|
||||
# 使用枚举值进行精确匹配
|
||||
query = query.where(Department.dept_type == dept_type)
|
||||
query = query.where(Staff.status == StaffStatus.ACTIVE)
|
||||
```
|
||||
|
||||
3. **批量查询优化**
|
||||
- 使用`selectinload`进行关联查询
|
||||
- 避免N+1查询问题
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L82-L178)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L25-L43)
|
||||
|
||||
### API使用流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "API接口"
|
||||
participant Service as "服务层"
|
||||
participant Model as "数据模型"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /departments?type=clinical_surgical
|
||||
API->>Service : get_list(dept_type="clinical_surgical")
|
||||
Service->>Model : Department.dept_type == "clinical_surgical"
|
||||
Model->>DB : SELECT * FROM departments WHERE dept_type = ?
|
||||
DB-->>Model : 查询结果
|
||||
Model-->>Service : Department对象列表
|
||||
Service-->>API : 部门列表
|
||||
API-->>Client : JSON响应
|
||||
Note over Client,DB : 使用枚举值进行类型安全的查询
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L20-L41)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L17-L43)
|
||||
|
||||
**章节来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L65)
|
||||
|
||||
### 状态流转流程
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> DRAFT : 创建计划
|
||||
DRAFT --> PENDING : 提交审批
|
||||
PENDING --> APPROVED : 审批通过
|
||||
PENDING --> REJECTED : 审批驳回
|
||||
APPROVED --> ACTIVE : 激活执行
|
||||
ACTIVE --> COMPLETED : 执行完成
|
||||
ACTIVE --> CANCELLED : 取消计划
|
||||
COMPLETED --> [*]
|
||||
REJECTED --> [*]
|
||||
CANCELLED --> [*]
|
||||
note right of DRAFT
|
||||
草稿状态
|
||||
可编辑修改
|
||||
end note
|
||||
note right of PENDING
|
||||
等待审批
|
||||
不可修改
|
||||
end note
|
||||
note right of APPROVED
|
||||
已批准
|
||||
准备执行
|
||||
end note
|
||||
note right of ACTIVE
|
||||
执行中
|
||||
数据录入
|
||||
end note
|
||||
note right of COMPLETED
|
||||
已完成
|
||||
统计分析
|
||||
end note
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
|
||||
- [models.py](file://backend/app/models/models.py#L233-L242)
|
||||
|
||||
**章节来源**
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "核心枚举"
|
||||
A[DeptType]
|
||||
B[StaffStatus]
|
||||
C[AssessmentStatus]
|
||||
D[IndicatorType]
|
||||
E[PlanStatus]
|
||||
F[MenuType]
|
||||
end
|
||||
subgraph "模型映射"
|
||||
G[Department.dept_type]
|
||||
H[Staff.status]
|
||||
I[Assessment.status]
|
||||
J[Indicator.indicator_type]
|
||||
K[Indicator.bs_dimension]
|
||||
L[PerformancePlan.status]
|
||||
M[Menu.menu_type]
|
||||
end
|
||||
subgraph "API使用"
|
||||
N[departments.py]
|
||||
O[performance_plans.py]
|
||||
P[staff.py]
|
||||
Q[indicators.py]
|
||||
end
|
||||
A --> G
|
||||
B --> H
|
||||
C --> I
|
||||
D --> J
|
||||
E --> L
|
||||
F --> M
|
||||
G --> N
|
||||
H --> P
|
||||
I --> Q
|
||||
J --> Q
|
||||
L --> O
|
||||
M --> N
|
||||
style A fill:#e1f5fe
|
||||
style E fill:#e8f5e8
|
||||
style C fill:#fff3e0
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L69-L354)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L652)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 存储优化
|
||||
- **字符串存储**:所有枚举值以字符串形式存储,占用空间小
|
||||
- **索引优化**:为常用查询字段建立数据库索引
|
||||
- **唯一约束**:确保枚举值的唯一性和一致性
|
||||
|
||||
### 查询优化
|
||||
- **精确匹配**:使用等值查询而非模糊匹配
|
||||
- **批量操作**:支持批量枚举值的查询和过滤
|
||||
- **缓存策略**:可将常用的枚举值缓存到内存中
|
||||
|
||||
### 内存优化
|
||||
- **类型安全**:编译时检查枚举值的有效性
|
||||
- **序列化开销**:字符串枚举比整数枚举有更高的序列化开销
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
1. **枚举值不匹配**
|
||||
- 症状:数据库插入失败,提示枚举值无效
|
||||
- 解决:检查枚举定义是否与数据库schema一致
|
||||
- 验证:使用`SELECT DISTINCT column FROM table`检查现有值
|
||||
|
||||
2. **查询性能问题**
|
||||
- 症状:大量枚举查询导致性能下降
|
||||
- 解决:添加适当的数据库索引
|
||||
- 优化:使用`EXPLAIN`分析查询计划
|
||||
|
||||
3. **状态流转异常**
|
||||
- 症状:计划状态无法正常转换
|
||||
- 解决:检查状态转换逻辑和前置条件
|
||||
- 调试:查看状态转换日志和时间戳
|
||||
|
||||
**章节来源**
|
||||
- [init_db.py](file://backend/app/core/init_db.py#L33-L115)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L17-L150)
|
||||
|
||||
## 结论
|
||||
|
||||
该医院绩效系统的枚举类型设计体现了以下特点:
|
||||
|
||||
1. **完整性**:覆盖了医院管理的所有关键业务领域
|
||||
2. **一致性**:统一的数据存储格式和查询方式
|
||||
3. **可扩展性**:支持未来业务需求的变化和扩展
|
||||
4. **性能优化**:通过索引和查询优化确保系统性能
|
||||
5. **类型安全**:编译时检查确保数据的正确性
|
||||
|
||||
通过合理的枚举设计和实现,系统能够有效支撑医院绩效管理的各项业务需求,为决策提供可靠的数据支持。
|
||||
362
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/员工信息表.md
Normal file
362
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/员工信息表.md
Normal file
@@ -0,0 +1,362 @@
|
||||
# 员工信息表
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件围绕员工信息表(staff)展开,系统性说明字段的业务含义、状态枚举值、与科室表的一对多关系,以及在考核与工资核算中的应用。同时提供索引设计与数据完整性约束说明,并给出典型使用场景与最佳实践。
|
||||
|
||||
## 项目结构
|
||||
员工信息表位于后端数据模型层,配合服务层、API层与前端页面协同工作,形成“数据模型—服务—接口—视图”的完整链路。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
M["models.py<br/>数据模型"]
|
||||
S["staff_service.py<br/>员工服务"]
|
||||
API["staff.py<br/>员工API"]
|
||||
SAL_API["salary.py<br/>工资API"]
|
||||
SAL_SVC["salary_service.py<br/>工资服务"]
|
||||
SCH["schemas.py<br/>数据模式"]
|
||||
end
|
||||
subgraph "前端"
|
||||
FE["Staff.vue<br/>员工管理页面"]
|
||||
end
|
||||
M --> S
|
||||
S --> API
|
||||
API --> FE
|
||||
SAL_API --> SAL_SVC
|
||||
SAL_SVC --> M
|
||||
SCH --> API
|
||||
SCH --> SAL_API
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L1-L313)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L42-L64)
|
||||
- [database.md](file://docs/database.md#L117-L136)
|
||||
|
||||
## 核心组件
|
||||
- 数据模型:定义员工表结构、字段约束、索引与关系。
|
||||
- 服务层:封装员工查询、创建、更新、删除等业务逻辑。
|
||||
- API层:对外暴露REST接口,处理请求与响应。
|
||||
- 数据模式:定义请求/响应的数据结构与校验规则。
|
||||
- 前端页面:提供员工信息的增删改查与筛选能力。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L1-L313)
|
||||
|
||||
## 架构总览
|
||||
员工信息表与科室表构成一对多关系:一个科室可包含多名员工;一名员工仅属于一个科室。员工表还与考核记录表、工资记录表存在一对多关系,用于支撑绩效考核与工资核算。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
bool is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
numeric base_salary
|
||||
numeric performance_ratio
|
||||
enum status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
ASSESSMENTS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
string period_type
|
||||
numeric total_score
|
||||
numeric weighted_score
|
||||
enum status
|
||||
int assessor_id FK
|
||||
int reviewer_id FK
|
||||
datetime submit_time
|
||||
datetime review_time
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
SALARY_RECORDS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
numeric base_salary
|
||||
numeric performance_score
|
||||
numeric performance_bonus
|
||||
numeric deduction
|
||||
numeric allowance
|
||||
numeric total_salary
|
||||
string status
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS ||--o{ STAFF : "拥有"
|
||||
STAFF ||--o{ ASSESSMENTS : "产生"
|
||||
STAFF ||--o{ SALARY_RECORDS : "产生"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L64)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L64)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 字段业务含义与约束
|
||||
- 工号(employee_id):唯一标识员工,用于跨系统识别与关联。
|
||||
- 姓名(name):员工真实姓名。
|
||||
- 所属科室(department_id):外键关联科室表,限定员工归属。
|
||||
- 职位(position):员工在岗位上的职责描述。
|
||||
- 职称(title):专业技术或管理职称。
|
||||
- 联系电话(phone)、邮箱(email):通讯信息。
|
||||
- 基本工资(base_salary):固定薪酬基数,参与工资核算。
|
||||
- 绩效系数(performance_ratio):影响绩效奖金的浮动系数,数值越大,奖金越高。
|
||||
- 状态(status):员工状态枚举,见下节。
|
||||
- 入职日期(hire_date):记录入职时间。
|
||||
- created_at/updated_at:记录创建与更新时间戳。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L42-L64)
|
||||
- [database.md](file://docs/database.md#L117-L136)
|
||||
|
||||
### 状态枚举与作用机制
|
||||
- 在职(active):正常在岗,参与考核与工资核算。
|
||||
- 休假(leave):暂时离岗,通常不参与当期考核或按规则折算。
|
||||
- 离职(resigned):已离开医院,一般不再参与后续考核与工资核算。
|
||||
- 退休(retired):达到退休年龄,通常不再参与日常考核与工资核算。
|
||||
|
||||
在服务层与API层中,状态常用于过滤查询与业务判断,例如:
|
||||
- 列表查询时按状态筛选;
|
||||
- 生成工资时仅对在职员工进行计算;
|
||||
- 前端展示时对不同状态使用不同标签样式。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L37-L43)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L17-L49)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L49)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L13-L18)
|
||||
|
||||
### 绩效系数的作用机制
|
||||
- 绩效奖金 = 绩效基数 × (绩效得分/100) × 绩效系数
|
||||
- 绩效系数越大,相同绩效得分能获得更高奖金,体现对高绩效员工的激励。
|
||||
- 工资服务层提供计算方法,支持按员工的绩效系数与考核得分生成绩效奖金。
|
||||
|
||||
章节来源
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L167-L170)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L96-L129)
|
||||
|
||||
### 与科室表的一对多关系
|
||||
- 一个科室可包含多名员工;
|
||||
- 一名员工仅属于一个科室;
|
||||
- 员工表通过外键department_id关联科室表;
|
||||
- 前端页面在展示员工列表时,会补充显示科室名称,便于直观查看。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L35-L41)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L27)
|
||||
|
||||
### 在考核与工资核算中的应用
|
||||
- 考核记录表(assessments)与员工表(staff)是一对多关系,用于记录每位员工的考核周期、得分与状态。
|
||||
- 工资记录表(salary_records)与员工表(staff)是一对多关系,用于记录每月工资构成与状态。
|
||||
- 工资生成流程:根据已确认的考核记录,读取员工的基本工资与绩效系数,计算绩效奖金并生成工资记录。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端页面"
|
||||
participant API as "工资API"
|
||||
participant SVC as "工资服务"
|
||||
participant DB as "数据库"
|
||||
participant ST as "员工表"
|
||||
participant AS as "考核记录表"
|
||||
FE->>API : "POST /salary/generate?staff_id&period_year&period_month"
|
||||
API->>SVC : "generate_from_assessment(staff_id, year, month)"
|
||||
SVC->>DB : "查询员工信息(含performance_ratio)"
|
||||
DB-->>SVC : "返回员工(含基本工资、系数)"
|
||||
SVC->>DB : "查询已确认的考核记录(weighted_score)"
|
||||
DB-->>SVC : "返回考核记录"
|
||||
SVC->>SVC : "计算绩效奖金 = 基数×(得分/100)×系数"
|
||||
SVC->>DB : "插入工资记录(total_salary=基本工资+奖金)"
|
||||
DB-->>SVC : "返回工资记录"
|
||||
SVC-->>API : "返回工资记录ID"
|
||||
API-->>FE : "生成成功"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L96-L111)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L191)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
|
||||
### 典型使用场景
|
||||
- 人员管理:新增/编辑/删除员工,按科室、状态、关键词筛选,分页展示。
|
||||
- 考核分配:为员工生成考核任务,记录考核结果与状态流转。
|
||||
- 工资计算:根据考核结果与员工基本信息,自动生成工资记录,支持批量生成与确认。
|
||||
|
||||
章节来源
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L1-L313)
|
||||
|
||||
### 索引设计与数据完整性约束
|
||||
- 员工表索引
|
||||
- idx_staff_dept:加速按科室查询;
|
||||
- idx_staff_status:加速按状态查询。
|
||||
- 员工表约束
|
||||
- 唯一约束:employee_id;
|
||||
- 外键约束:department_id 引用 departments.id。
|
||||
- 迁移脚本与文档一致,确保索引与约束在数据库中正确创建。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L111-L114)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L42-L64)
|
||||
- [database.md](file://docs/database.md#L117-L136)
|
||||
|
||||
## 依赖分析
|
||||
- 模型层依赖SQLAlchemy ORM定义实体与关系;
|
||||
- 服务层依赖模型层进行数据访问与业务计算;
|
||||
- API层依赖服务层与数据模式进行请求处理与响应构造;
|
||||
- 前端页面依赖API层进行数据交互。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE["Staff.vue"] --> API["staff.py"]
|
||||
API --> SVC["staff_service.py"]
|
||||
SVC --> MODELS["models.py"]
|
||||
API --> SCH["schemas.py"]
|
||||
SAL_FE["工资API调用"] --> SAL_API["salary.py"]
|
||||
SAL_API --> SAL_SVC["salary_service.py"]
|
||||
SAL_SVC --> MODELS
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
|
||||
章节来源
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化:利用idx_staff_dept与idx_staff_status索引,避免全表扫描;
|
||||
- 分页与排序:服务层对列表查询进行分页与排序,减轻前端压力;
|
||||
- 关联查询:使用selectinload按需加载关联数据,避免N+1查询问题;
|
||||
- 批量操作:工资模块提供批量生成与批量确认,提升大规模数据处理效率。
|
||||
|
||||
章节来源
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L26-L49)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L32-L58)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L193-L219)
|
||||
|
||||
## 故障排查指南
|
||||
- 工号重复:创建员工时若工号已存在,接口会返回错误;
|
||||
- 员工不存在:更新或删除员工时若找不到对应记录,接口会返回错误;
|
||||
- 考核未确认:根据考核生成工资时,要求考核状态为已确认,否则无法生成;
|
||||
- 状态限制:更新工资记录时仅允许对“待确认”状态进行修改;
|
||||
- 权限限制:创建、更新、删除员工与生成/确认工资均需管理员或经理权限。
|
||||
|
||||
章节来源
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L75-L81)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L79-L91)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L104-L110)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L104-L124)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L222-L231)
|
||||
|
||||
## 结论
|
||||
员工信息表是医院绩效系统的基础数据之一,承载着人员管理、考核与工资核算的关键信息。通过合理的字段设计、状态枚举与索引策略,以及完善的前后端协作,能够有效支撑系统的高效运行与业务闭环。
|
||||
|
||||
## 附录
|
||||
- 员工状态枚举值对照
|
||||
- active:在职
|
||||
- leave:休假
|
||||
- resigned:离职
|
||||
- retired:退休
|
||||
- 绩效系数范围:默认1.0,最大不超过5.0,前端输入也做了相应限制。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L37-L43)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L117)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L111-L113)
|
||||
382
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/工资核算记录表.md
Normal file
382
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/工资核算记录表.md
Normal file
@@ -0,0 +1,382 @@
|
||||
# 工资核算记录表
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [Salary.vue](file://frontend/src/views/salary/Salary.vue)
|
||||
- [init_db.py](file://backend/init_db.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
工资核算记录表(salary_records)是医院绩效管理系统中的核心数据表,用于记录和管理员工的工资核算信息。该表通过与员工信息表(staff)、考核记录表(assessments)等关键表的关联,实现了从绩效考核到工资发放的完整业务流程。
|
||||
|
||||
本表支持按月度周期进行工资核算,包含基本工资、绩效奖金、补贴、扣款等多个维度的工资构成要素,并通过状态字段实现了工资记录的生命周期管理。
|
||||
|
||||
## 项目结构
|
||||
|
||||
工资核算记录表在系统中的位置和作用如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据模型层"
|
||||
SR[SalaryRecord<br/>工资核算记录表]
|
||||
ST[Staff<br/>员工信息表]
|
||||
AS[Assessment<br/>考核记录表]
|
||||
end
|
||||
subgraph "服务层"
|
||||
SS[SalaryService<br/>工资核算服务]
|
||||
end
|
||||
subgraph "API层"
|
||||
API[Salary API<br/>工资核算接口]
|
||||
end
|
||||
subgraph "前端界面"
|
||||
UI[Salary.vue<br/>工资管理界面]
|
||||
end
|
||||
ST --> SR
|
||||
AS --> SS
|
||||
SS --> SR
|
||||
SS --> API
|
||||
API --> UI
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 数据模型定义
|
||||
|
||||
工资核算记录表采用SQLAlchemy ORM映射,具有以下核心特性:
|
||||
|
||||
- **主键标识**:自增整数ID作为唯一标识符
|
||||
- **外键关联**:关联到员工信息表(staff_id)
|
||||
- **索引优化**:针对员工ID和工资周期建立复合索引
|
||||
- **数据精度**:使用Numeric类型确保财务数据的精确性
|
||||
|
||||
### 字段详细说明
|
||||
|
||||
| 字段名 | 数据类型 | 默认值 | 业务含义 | 精度要求 |
|
||||
|--------|----------|--------|----------|----------|
|
||||
| id | Integer | 自增 | 工资记录唯一标识 | 无 |
|
||||
| staff_id | Integer | 无 | 员工ID | 外键约束 |
|
||||
| period_year | Integer | 无 | 年度 | 无 |
|
||||
| period_month | Integer | 无 | 月份 | 1-12 |
|
||||
| base_salary | Numeric(10,2) | 0.00 | 基本工资 | 精确到分 |
|
||||
| performance_score | Numeric(5,2) | 0.00 | 绩效得分 | 0-100分 |
|
||||
| performance_bonus | Numeric(10,2) | 0.00 | 绩效奖金 | 精确到分 |
|
||||
| deduction | Numeric(10,2) | 0.00 | 扣款 | 精确到分 |
|
||||
| allowance | Numeric(10,2) | 0.00 | 补贴 | 精确到分 |
|
||||
| total_salary | Numeric(10,2) | 0.00 | 应发工资 | 精确到分 |
|
||||
| status | String(20) | "pending" | 状态 | 枚举值 |
|
||||
| remark | Text | null | 备注 | 文本 |
|
||||
| created_at | DateTime | 当前时间 | 创建时间 | 时间戳 |
|
||||
| updated_at | DateTime | 当前时间 | 更新时间 | 时间戳 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
|
||||
## 架构概览
|
||||
|
||||
工资核算系统的整体架构采用分层设计,确保了业务逻辑的清晰分离和数据的一致性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as 前端界面
|
||||
participant API as API接口
|
||||
participant Service as 服务层
|
||||
participant Model as 数据模型
|
||||
participant DB as 数据库
|
||||
UI->>API : 查询工资记录
|
||||
API->>Service : get_list()
|
||||
Service->>Model : 查询SalaryRecord
|
||||
Model->>DB : 执行SQL查询
|
||||
DB-->>Model : 返回结果集
|
||||
Model-->>Service : SalaryRecord对象
|
||||
Service-->>API : 处理后的数据
|
||||
API-->>UI : 响应结果
|
||||
Note over UI,DB : 异步数据库操作
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L20-L51)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L21-L58)
|
||||
|
||||
**章节来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 工资计算公式
|
||||
|
||||
工资核算的核心计算逻辑遵循以下公式:
|
||||
|
||||
```
|
||||
应发工资 = 基本工资 + 绩效奖金 + 补贴 - 扣款
|
||||
```
|
||||
|
||||
其中,绩效奖金的计算采用以下公式:
|
||||
|
||||
```
|
||||
绩效奖金 = 绩效基数 × (绩效得分/100) × 绩效系数
|
||||
```
|
||||
|
||||
系统中预设的绩效基数为3000.0元,这一数值可以根据医院的实际情况进行调整。
|
||||
|
||||
### 状态管理机制
|
||||
|
||||
工资记录的状态流转遵循严格的业务规则:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 待确认
|
||||
待确认 --> 已确认 : 确认操作
|
||||
已确认 --> 待确认 : 状态重置不支持
|
||||
note right of 待确认
|
||||
新创建的工资记录默认状态
|
||||
可进行编辑和确认
|
||||
end note
|
||||
note right of 已确认
|
||||
已确认的工资记录
|
||||
不允许再次编辑
|
||||
end note
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L222-L231)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L234-L259)
|
||||
|
||||
### 业务流程详解
|
||||
|
||||
#### 单个工资记录生成流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> GetAssessment["获取考核记录"]
|
||||
GetAssessment --> CheckAssessment{"是否存在已确认的<br/>考核记录?"}
|
||||
CheckAssessment --> |否| ReturnNull["返回空值"]
|
||||
CheckAssessment --> |是| CheckExist["检查是否已存在<br/>工资记录"]
|
||||
CheckExist --> |已存在| ReturnNull
|
||||
CheckExist --> |不存在| CalcBonus["计算绩效奖金"]
|
||||
CalcBonus --> CalcTotal["计算应发工资"]
|
||||
CalcTotal --> CreateRecord["创建工资记录"]
|
||||
CreateRecord --> SetPending["设置状态为待确认"]
|
||||
SetPending --> End([结束])
|
||||
ReturnNull --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
|
||||
#### 批量工资生成流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Manager as 管理员
|
||||
participant API as 批量生成接口
|
||||
participant Service as 服务层
|
||||
participant DB as 数据库
|
||||
Manager->>API : 请求批量生成
|
||||
API->>Service : batch_generate_for_department()
|
||||
Service->>DB : 查询已确认考核记录
|
||||
DB-->>Service : 考核记录列表
|
||||
Service->>Service : 逐条生成工资记录
|
||||
Service->>DB : 批量插入工资记录
|
||||
DB-->>Service : 插入结果
|
||||
Service-->>API : 返回生成统计
|
||||
API-->>Manager : 显示生成结果
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L193-L219)
|
||||
|
||||
**章节来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L71-L190)
|
||||
|
||||
### 数据一致性保证
|
||||
|
||||
系统通过多种机制确保数据的一致性和完整性:
|
||||
|
||||
#### 数据验证机制
|
||||
- **前端验证**:使用Element Plus组件进行输入验证
|
||||
- **后端验证**:Pydantic模型进行数据格式和范围验证
|
||||
- **数据库约束**:Numeric类型确保财务数据精度
|
||||
|
||||
#### 事务处理
|
||||
- **异步事务**:使用SQLAlchemy异步会话确保操作原子性
|
||||
- **批量操作**:支持批量生成和批量确认操作
|
||||
- **错误回滚**:异常情况下自动回滚事务
|
||||
|
||||
#### 并发控制策略
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Request[并发请求] --> CheckStatus{"检查记录状态"}
|
||||
CheckStatus --> |待确认| Proceed[执行操作]
|
||||
CheckStatus --> |已确认| Reject[拒绝操作]
|
||||
Proceed --> UpdateDB[更新数据库]
|
||||
UpdateDB --> Commit[提交事务]
|
||||
Reject --> ErrorResp[返回错误]
|
||||
Commit --> Success[操作成功]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L104-L124)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L222-L231)
|
||||
|
||||
**章节来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L104-L124)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L222-L231)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 数据模型依赖
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SalaryRecord {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float base_salary
|
||||
+float performance_score
|
||||
+float performance_bonus
|
||||
+float deduction
|
||||
+float allowance
|
||||
+float total_salary
|
||||
+string status
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+staff : Staff
|
||||
}
|
||||
class Staff {
|
||||
+int id
|
||||
+string employee_id
|
||||
+string name
|
||||
+int department_id
|
||||
+string position
|
||||
+string title
|
||||
+float base_salary
|
||||
+float performance_ratio
|
||||
+StaffStatus status
|
||||
+datetime hire_date
|
||||
+SalaryRecord[] salary_records
|
||||
}
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentStatus status
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
SalaryRecord --> Staff : "外键关联"
|
||||
Staff --> SalaryRecord : "一对多关系"
|
||||
Assessment --> Staff : "外键关联"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
|
||||
### 服务层依赖
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
API[Salary API] --> Service[SalaryService]
|
||||
Service --> Model[SalaryRecord模型]
|
||||
Service --> StaffModel[Staff模型]
|
||||
Service --> AssessmentModel[Assessment模型]
|
||||
Service --> Schema[SalaryRecordSchema]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L14-L15)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L10-L11)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L10-L11)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化
|
||||
|
||||
系统通过以下索引优化查询性能:
|
||||
- **员工索引**:`idx_salary_staff` - 加速按员工查询
|
||||
- **周期索引**:`idx_salary_period` - 加速按年月查询
|
||||
- **组合索引**:支持复杂的多条件查询
|
||||
|
||||
### 批量操作优化
|
||||
|
||||
- **批量生成**:支持按科室批量生成工资记录
|
||||
- **批量确认**:支持按年月批量确认工资记录
|
||||
- **分页查询**:默认每页20条记录,支持最大100条/页
|
||||
|
||||
### 内存管理
|
||||
|
||||
- **异步处理**:使用async/await避免阻塞
|
||||
- **流式查询**:Large result set使用流式处理
|
||||
- **连接池**:数据库连接复用减少开销
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 工资记录状态错误
|
||||
**问题**:尝试编辑已确认的工资记录失败
|
||||
**原因**:状态检查机制阻止了对已确认记录的修改
|
||||
**解决方案**:先将状态重置为待确认,再进行编辑
|
||||
|
||||
#### 绩效奖金计算异常
|
||||
**问题**:绩效奖金计算结果不正确
|
||||
**原因**:绩效基数或绩效系数设置不当
|
||||
**解决方案**:检查员工的绩效系数设置,确认绩效基数配置
|
||||
|
||||
#### 工资记录重复生成
|
||||
**问题**:同一员工同一个月重复生成工资记录
|
||||
**原因**:系统未检测到已存在的工资记录
|
||||
**解决方案**:检查数据库中是否存在重复记录,清理后重新生成
|
||||
|
||||
**章节来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L104-L124)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L155-L164)
|
||||
|
||||
## 结论
|
||||
|
||||
工资核算记录表作为医院绩效管理系统的核心组件,通过严谨的数据模型设计、完善的业务流程控制和可靠的技术实现,为医院的薪酬管理提供了完整的解决方案。
|
||||
|
||||
系统的主要优势包括:
|
||||
- **完整的生命周期管理**:从生成到确认的完整状态流转
|
||||
- **灵活的计算机制**:支持多种工资构成要素的动态计算
|
||||
- **强大的扩展性**:支持批量操作和复杂查询需求
|
||||
- **严格的数据一致性**:通过多种机制确保数据的准确性和完整性
|
||||
|
||||
通过合理使用本系统,医院可以实现绩效工资的自动化核算,提高薪酬管理的效率和准确性,为建立科学合理的绩效管理体系奠定坚实基础。
|
||||
463
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/核心业务表.md
Normal file
463
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/核心业务表.md
Normal file
@@ -0,0 +1,463 @@
|
||||
# 核心业务表
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.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/assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [backend/init_db.py](file://backend/init_db.py)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件聚焦于系统核心业务表的完整结构与使用说明,覆盖以下五张表:
|
||||
- 科室信息表(departments)
|
||||
- 员工信息表(staff)
|
||||
- 考核记录表(assessments)
|
||||
- 考核明细表(assessment_details)
|
||||
- 工资核算记录表(salary_records)
|
||||
|
||||
内容包括:字段定义(数据类型、约束、默认值、业务含义)、主键/外键关系、表间关联关系图、典型使用场景与数据流转过程、索引设计与性能考虑。
|
||||
|
||||
## 项目结构
|
||||
后端采用FastAPI + SQLAlchemy 2.x异步ORM + PostgreSQL,模型定义位于models.py,迁移脚本由Alembic生成,服务层封装业务逻辑,API层提供REST接口。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
A["models/models.py<br/>定义核心模型与关系"]
|
||||
B["alembic/versions/001_initial.py<br/>初始迁移脚本"]
|
||||
C["services/*<br/>业务服务层"]
|
||||
D["api/v1/*<br/>REST API"]
|
||||
E["core/database.py<br/>异步引擎与会话"]
|
||||
F["core/config.py<br/>配置项"]
|
||||
end
|
||||
A --> C
|
||||
B --> A
|
||||
C --> D
|
||||
E --> A
|
||||
F --> E
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L230)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L230)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
|
||||
## 核心组件
|
||||
- 科室信息表(departments)
|
||||
- 主键: id
|
||||
- 外键: parent_id → departments.id(自关联,形成树形组织结构)
|
||||
- 约束: code唯一;level默认1;is_active默认true
|
||||
- 索引: idx_dept_type, idx_dept_parent
|
||||
- 员工信息表(staff)
|
||||
- 主键: id
|
||||
- 外键: department_id → departments.id
|
||||
- 约束: employee_id唯一;status枚举;base_salary/performance_ratio默认值
|
||||
- 索引: idx_staff_dept, idx_staff_status
|
||||
- 考核记录表(assessments)
|
||||
- 主键: id
|
||||
- 外键: staff_id → staff.id;assessor_id/reviewer_id → staff.id(自关联)
|
||||
- 约束: period_year/period_month组合用于周期标识;status枚举;默认草稿
|
||||
- 索引: idx_assessment_staff, idx_assessment_period, idx_assessment_status
|
||||
- 考核明细表(assessment_details)
|
||||
- 主键: id
|
||||
- 外键: assessment_id → assessments.id;indicator_id → indicators.id
|
||||
- 约束: 默认score为0;证据与备注支持空值
|
||||
- 索引: idx_detail_assessment, idx_detail_indicator
|
||||
- 工资核算记录表(salary_records)
|
||||
- 主键: id
|
||||
- 外键: staff_id → staff.id
|
||||
- 约束: period_year/period_month组合;默认pending;total_salary为派生字段(base+bonus+allowance-deduction)
|
||||
- 索引: idx_salary_staff, idx_salary_period
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L230)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L154)
|
||||
|
||||
## 架构总览
|
||||
核心业务表围绕“科室-员工-考核-工资”主线展开,形成如下关系:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
string dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
boolean is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
numeric base_salary
|
||||
numeric performance_ratio
|
||||
string status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
ASSESSMENTS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
string period_type
|
||||
numeric total_score
|
||||
numeric 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_DETAILS {
|
||||
int id PK
|
||||
int assessment_id FK
|
||||
int indicator_id FK
|
||||
numeric actual_value
|
||||
numeric score
|
||||
text evidence
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
SALARY_RECORDS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
numeric base_salary
|
||||
numeric performance_score
|
||||
numeric performance_bonus
|
||||
numeric deduction
|
||||
numeric allowance
|
||||
numeric total_salary
|
||||
string status
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS ||--o{ STAFF : "拥有"
|
||||
STAFF ||--o{ ASSESSMENTS : "产生"
|
||||
STAFF ||--o{ SALARY_RECORDS : "对应"
|
||||
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "包含"
|
||||
ASSESSMENTS }o--|| STAFF : "被考核者"
|
||||
ASSESSMENTS }o--|| STAFF : "考核人/审核人(自关联)"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L230)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L154)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 科室信息表(departments)
|
||||
- 字段与约束
|
||||
- id: 主键,自增
|
||||
- name: 非空,科室名称
|
||||
- code: 非空且唯一,科室编码
|
||||
- dept_type: 非空,枚举类型(含临床、医技、护理、行政、财务、后勤等)
|
||||
- parent_id: 可空,指向自身id,支持树形层级
|
||||
- level: 默认1,层级
|
||||
- sort_order: 默认0,排序
|
||||
- is_active: 默认true,是否启用
|
||||
- description: 描述
|
||||
- created_at/updated_at: 时间戳
|
||||
- 关系
|
||||
- 自关联父子关系(一对多)
|
||||
- 与staff一对多(反向backref: children)
|
||||
- 典型使用场景
|
||||
- 获取科室树形结构(API: GET /api/v1/departments/tree)
|
||||
- 列表查询与筛选(API: GET /api/v1/departments)
|
||||
- 新建/更新/删除(需管理员或经理权限)
|
||||
- 索引
|
||||
- idx_dept_type:按类型过滤
|
||||
- idx_dept_parent:树形查询与层级遍历
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L41)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L51)
|
||||
|
||||
### 员工信息表(staff)
|
||||
- 字段与约束
|
||||
- id: 主键,自增
|
||||
- employee_id: 非空且唯一,工号
|
||||
- name: 非空,姓名
|
||||
- department_id: 非空,外键→departments.id
|
||||
- position/title/phone/email: 基本信息
|
||||
- base_salary: 默认0,基本工资
|
||||
- performance_ratio: 默认1.0,绩效系数
|
||||
- status: 枚举,默认active
|
||||
- hire_date: 入职日期
|
||||
- created_at/updated_at: 时间戳
|
||||
- 关系
|
||||
- belongs_to: department(一对一反向:department.staff)
|
||||
- has_many: assessments(按staff_id反向)
|
||||
- has_many: salary_records(按staff_id反向)
|
||||
- 典型使用场景
|
||||
- 查询某科室员工列表(API: GET /api/v1/staff/department/{department_id})
|
||||
- 列表与筛选(API: GET /api/v1/staff)
|
||||
- 新建/更新/删除(需管理员或经理权限)
|
||||
- 索引
|
||||
- idx_staff_dept:按科室过滤
|
||||
- idx_staff_status:按状态过滤
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L42-L64)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
|
||||
### 考核记录表(assessments)
|
||||
- 字段与约束
|
||||
- id: 主键,自增
|
||||
- staff_id: 非空,外键→staff.id
|
||||
- period_year/month: 非空,周期标识
|
||||
- period_type: 默认monthly
|
||||
- total_score/weighted_score: 数值型,默认0
|
||||
- status: 枚举,默认draft
|
||||
- assessor_id/reviewer_id: 外键→staff.id(自关联)
|
||||
- submit_time/review_time: 审核流程时间
|
||||
- remark: 备注
|
||||
- created_at/updated_at: 时间戳
|
||||
- 关系
|
||||
- belongs_to: staff(正向),反向:staff.assessments
|
||||
- belongs_to: staff(assessor/reviewer,自关联)
|
||||
- has_many: details(AssessmentDetail,级联删除)
|
||||
- 典型使用场景
|
||||
- 列表与筛选(API: GET /api/v1/assessments)
|
||||
- 详情(带指标名称回填)
|
||||
- 提交/审核/确认(API: POST /{id}/submit, /{id}/review, /{id}/finalize)
|
||||
- 批量创建(按科室与指标集合)
|
||||
- 索引
|
||||
- idx_assessment_staff:按员工过滤
|
||||
- idx_assessment_period:按年月周期过滤
|
||||
- idx_assessment_status:按状态过滤
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L179)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L87-L113)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L18-L56)
|
||||
|
||||
### 考核明细表(assessment_details)
|
||||
- 字段与约束
|
||||
- id: 主键,自增
|
||||
- assessment_id: 非空,外键→assessments.id
|
||||
- indicator_id: 非空,外键→indicators.id
|
||||
- actual_value: 实际值
|
||||
- score: 默认0
|
||||
- evidence/remark: 佐证材料与备注
|
||||
- created_at/updated_at: 时间戳
|
||||
- 关系
|
||||
- belongs_to: assessment(反向:details)
|
||||
- belongs_to: indicator(反向:assessment_details)
|
||||
- 典型使用场景
|
||||
- 创建/更新考核时批量写入明细
|
||||
- 读取详情时携带指标名称
|
||||
- 索引
|
||||
- idx_detail_assessment:按考核记录过滤
|
||||
- idx_detail_indicator:按指标过滤
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L181-L203)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L114-L132)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L71-L109)
|
||||
|
||||
### 工资核算记录表(salary_records)
|
||||
- 字段与约束
|
||||
- id: 主键,自增
|
||||
- staff_id: 非空,外键→staff.id
|
||||
- period_year/month: 非空,周期标识
|
||||
- base_salary/performance_score/performance_bonus/deduction/allowance: 数值型,默认0
|
||||
- total_salary: 默认0,派生字段(base+bonus+allowance−deduction)
|
||||
- status: 默认pending
|
||||
- remark: 备注
|
||||
- created_at/updated_at: 时间戳
|
||||
- 关系
|
||||
- belongs_to: staff(反向:salary_records)
|
||||
- 典型使用场景
|
||||
- 列表与筛选(API: GET /api/v1/salary)
|
||||
- 详情(带员工与科室名称)
|
||||
- 从已确认考核生成工资(API: POST /generate)
|
||||
- 批量生成/确认
|
||||
- 索引
|
||||
- idx_salary_staff:按员工过滤
|
||||
- idx_salary_period:按年月周期过滤
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
- [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#L21-L59)
|
||||
|
||||
## 依赖分析
|
||||
- 数据库连接与引擎
|
||||
- 使用异步SQLAlchemy引擎与会话工厂,PostgreSQL驱动
|
||||
- 迁移与建表
|
||||
- 初始迁移脚本创建上述五张核心表,并建立相应索引
|
||||
- 服务层依赖
|
||||
- AssessmentService与SalaryService分别封装考核与工资的业务逻辑
|
||||
- API层依赖
|
||||
- 各API路由调用对应服务层方法,返回标准化响应
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
CFG["config.py<br/>DATABASE_URL等配置"] --> DB["database.py<br/>异步引擎/会话"]
|
||||
DB --> MODELS["models.py<br/>核心模型"]
|
||||
MIG["001_initial.py<br/>迁移脚本"] --> MODELS
|
||||
MODELS --> SVC_ASSESS["assessment_service.py"]
|
||||
MODELS --> SVC_SALARY["salary_service.py"]
|
||||
SVC_ASSESS --> API_ASSESS["assessments.py"]
|
||||
SVC_SALARY --> API_SALARY["salary.py"]
|
||||
API_DEPT["departments.py"] --> SVC_ASSESS
|
||||
API_STAFF["staff.py"] --> SVC_SALARY
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L230)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [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/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/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [backend/app/core/database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L230)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [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/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)
|
||||
|
||||
## 性能考量
|
||||
- 索引策略
|
||||
- departments:按dept_type与parent_id建立索引,支撑类型筛选与树形查询
|
||||
- staff:按department_id与status建立索引,支撑科室与状态过滤
|
||||
- assessments:按staff_id、period_year+period_month、status建立索引,支撑员工周期与状态查询
|
||||
- assessment_details:按assessment_id与indicator_id建立索引,支撑明细查询
|
||||
- salary_records:按staff_id与period_year+period_month建立索引,支撑员工周期查询
|
||||
- 数据类型选择
|
||||
- 数值型采用numeric(precision, scale),确保财务与评分精度
|
||||
- 日期时间统一使用DateTime,便于排序与范围查询
|
||||
- 查询优化建议
|
||||
- 列表查询尽量结合索引列过滤(如period、status、dept_id)
|
||||
- 使用selectinload或joinedload减少N+1查询(服务层已示范)
|
||||
- 批量操作使用flush/commit合并事务,降低往返开销
|
||||
- 并发与连接池
|
||||
- 通过配置项设置连接池大小与溢出,避免高并发下的连接争用
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L111-L114)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L174-L178)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L199-L202)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L227-L230)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
|
||||
## 故障排查指南
|
||||
- 数据库连接问题
|
||||
- 检查DATABASE_URL、数据库是否存在、凭据是否正确
|
||||
- 参考:[QWEN.md](file://QWEN.md#L535-L540)
|
||||
- 迁移失败
|
||||
- 查看迁移状态与历史,必要时降级再升级
|
||||
- 参考:[QWEN.md](file://QWEN.md#L541-L552)
|
||||
- 重复唯一键
|
||||
- 科室编码重复:departments.code唯一
|
||||
- 员工工号重复:staff.employee_id唯一
|
||||
- 参考:API层在创建时进行存在性检查
|
||||
- 业务状态限制
|
||||
- 考核仅允许在草稿或驳回状态下更新
|
||||
- 工资仅允许在pending状态下更新
|
||||
- 参考:服务层状态判断逻辑
|
||||
- 初始化数据
|
||||
- 可运行初始化脚本创建默认科室、员工、指标与管理员账户
|
||||
- 参考:[init_db.py](file://backend/init_db.py#L11-L83)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L74-L78)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L75-L79)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L117-L119)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L107-L108)
|
||||
- [backend/init_db.py](file://backend/init_db.py#L11-L83)
|
||||
- [QWEN.md](file://QWEN.md#L535-L552)
|
||||
|
||||
## 结论
|
||||
本文系统梳理了核心业务表的结构、关系与使用方式,明确了索引设计与性能要点,并提供了常见问题的排查路径。基于该模型,系统实现了从“科室组织—员工—考核—工资”的闭环管理,满足医院绩效管理的关键需求。
|
||||
|
||||
## 附录
|
||||
- 数据流转示例(从考核到工资)
|
||||
- 考核流程:创建→提交→审核→确认(状态变更)
|
||||
- 工资生成:根据已确认考核与员工绩效系数计算绩效奖金,生成工资记录
|
||||
- 确认发放:批量或单条确认,进入待发放状态
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant API as "API 层"
|
||||
participant SvcAssess as "AssessmentService"
|
||||
participant SvcSalary as "SalaryService"
|
||||
participant DB as "数据库"
|
||||
API->>SvcAssess : "创建/提交/审核/确认 考核"
|
||||
SvcAssess->>DB : "写入assessments与assessment_details"
|
||||
API->>SvcSalary : "根据staff_id+period生成工资"
|
||||
SvcSalary->>DB : "读取staff与finalized assessment"
|
||||
SvcSalary->>SvcSalary : "计算绩效奖金与总工资"
|
||||
SvcSalary->>DB : "写入salary_records"
|
||||
API->>SvcSalary : "确认工资"
|
||||
SvcSalary->>DB : "更新status=pending→confirmed"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L80-L146)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L96-L143)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L71-L206)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L231)
|
||||
402
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/科室信息表.md
Normal file
402
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/科室信息表.md
Normal file
@@ -0,0 +1,402 @@
|
||||
# 科室信息表
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [department_service.py](file://backend/app/services/department_service.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [api.md](file://docs/api.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
科室信息表是医院绩效管理系统中的核心基础数据表,用于存储医院各个科室的基本信息和组织架构关系。该表实现了完整的树形结构管理,支持多层级的科室组织关系,并为绩效考核、员工管理、财务核算等功能提供基础数据支撑。
|
||||
|
||||
## 项目结构
|
||||
|
||||
科室信息表在项目中的位置和相关组件分布如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端架构"
|
||||
A[models.py<br/>数据模型定义]
|
||||
B[department_service.py<br/>业务逻辑层]
|
||||
C[departments.py<br/>API路由层]
|
||||
D[schemas.py<br/>数据模式定义]
|
||||
end
|
||||
subgraph "前端界面"
|
||||
E[Departments.vue<br/>科室管理界面]
|
||||
end
|
||||
subgraph "数据库"
|
||||
F[departments表<br/>实际数据存储]
|
||||
G[idx_dept_type<br/>类型索引]
|
||||
H[idx_dept_parent<br/>父级索引]
|
||||
end
|
||||
A --> B
|
||||
B --> C
|
||||
C --> E
|
||||
A --> F
|
||||
F --> G
|
||||
F --> H
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L13-L150)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L13-L150)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 数据模型定义
|
||||
|
||||
科室信息表采用SQLAlchemy ORM映射,定义了完整的字段结构和约束条件:
|
||||
|
||||
| 字段名 | 类型 | 约束 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键, 自增 | 科室唯一标识符 |
|
||||
| name | String(100) | 非空 | 科室名称 |
|
||||
| code | String(20) | 唯一, 非空 | 科室编码,全局唯一 |
|
||||
| dept_type | Enum | 非空 | 科室类型枚举 |
|
||||
| parent_id | Integer | 外键 | 上级科室ID,自关联 |
|
||||
| level | Integer | 默认1 | 层级深度,从1开始 |
|
||||
| sort_order | Integer | 默认0 | 排序权重 |
|
||||
| is_active | Boolean | 默认True | 是否启用状态 |
|
||||
| description | Text | 可空 | 科室描述信息 |
|
||||
| created_at | DateTime | 默认当前时间 | 创建时间戳 |
|
||||
| updated_at | DateTime | 默认当前时间 | 更新时间戳 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L23-L40)
|
||||
|
||||
### 科室类型枚举
|
||||
|
||||
系统定义了9种科室类型,每种类型都有明确的业务含义:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[科室类型枚举] --> B[临床科室]
|
||||
A --> C[医技科室]
|
||||
A --> D[医辅科室]
|
||||
A --> E[护理单元]
|
||||
A --> F[行政科室]
|
||||
A --> G[财务科室]
|
||||
A --> H[后勤保障科室]
|
||||
B --> B1[手术临床科室]
|
||||
B --> B2[非手术有病房科室]
|
||||
B --> B3[非手术无病房科室]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L16-L26)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L16-L26)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L22)
|
||||
|
||||
## 架构概览
|
||||
|
||||
科室信息表的完整架构包括数据模型、业务逻辑、API接口和前端界面四个层次:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as 前端界面
|
||||
participant API as API层
|
||||
participant Service as 业务服务层
|
||||
participant Model as 数据模型层
|
||||
participant DB as 数据库
|
||||
UI->>API : GET /departments/tree
|
||||
API->>Service : get_tree()
|
||||
Service->>Model : 查询所有科室
|
||||
Model->>DB : SELECT * FROM departments
|
||||
DB-->>Model : 科室数据
|
||||
Model-->>Service : Department对象列表
|
||||
Service->>Service : 构建树形结构
|
||||
Service-->>API : DepartmentTree列表
|
||||
API-->>UI : 树形数据
|
||||
Note over UI,DB : 树形结构构建过程
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L43-L51)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
**章节来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 数据模型类分析
|
||||
|
||||
```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 DeptType {
|
||||
<<enumeration>>
|
||||
+CLINICAL_SURGICAL
|
||||
+CLINICAL_NONSURGICAL_WARD
|
||||
+CLINICAL_NONSURGICAL_NOWARD
|
||||
+MEDICAL_TECH
|
||||
+MEDICAL_AUXILIARY
|
||||
+NURSING
|
||||
+ADMIN
|
||||
+FINANCE
|
||||
+LOGISTICS
|
||||
}
|
||||
class DepartmentService {
|
||||
+get_list() Department[]
|
||||
+get_by_id(int) Department
|
||||
+get_by_code(string) Department
|
||||
+create(DepartmentCreate) Department
|
||||
+update(int, DepartmentUpdate) Department
|
||||
+delete(int) bool
|
||||
+get_tree() DepartmentTree[]
|
||||
}
|
||||
Department --> DeptType : 使用
|
||||
DepartmentService --> Department : 操作
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [models.py](file://backend/app/models/models.py#L16-L26)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L13-L150)
|
||||
|
||||
### 树形结构实现机制
|
||||
|
||||
系统通过自关联外键实现树形结构,核心实现逻辑如下:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[获取所有科室] --> B[创建ID映射表]
|
||||
B --> C[初始化树节点]
|
||||
C --> D[遍历所有科室]
|
||||
D --> E{是否存在父节点?}
|
||||
E --> |是| F[添加到父节点children]
|
||||
E --> |否| G[添加到根节点列表]
|
||||
F --> H[继续下一个科室]
|
||||
G --> H
|
||||
H --> I[返回根节点列表]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L124-L149)
|
||||
|
||||
**章节来源**
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
### 层级计算机制
|
||||
|
||||
层级计算采用递归继承的方式,确保树形结构的完整性:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[创建新科室] --> B[检查parent_id是否存在]
|
||||
B --> |存在| C[查询父科室]
|
||||
C --> D[level = parent.level + 1]
|
||||
B --> |不存在| E[level = 1]
|
||||
D --> F[保存科室记录]
|
||||
E --> F
|
||||
F --> G[返回新科室]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L62-L78)
|
||||
|
||||
**章节来源**
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L62-L78)
|
||||
|
||||
### API接口设计
|
||||
|
||||
系统提供了完整的CRUD接口,支持多种查询和操作场景:
|
||||
|
||||
| 接口 | 方法 | 路径 | 功能描述 |
|
||||
|------|------|------|----------|
|
||||
| 获取科室列表 | GET | /departments | 分页获取科室列表,支持过滤和排序 |
|
||||
| 获取科室树 | GET | /departments/tree | 获取完整的树形结构 |
|
||||
| 获取科室详情 | GET | /departments/{id} | 根据ID获取科室详情 |
|
||||
| 创建科室 | POST | /departments | 创建新的科室记录 |
|
||||
| 更新科室 | PUT | /departments/{id} | 更新现有科室信息 |
|
||||
| 删除科室 | DELETE | /departments/{id} | 删除指定科室(带安全检查) |
|
||||
|
||||
**章节来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L20-L107)
|
||||
- [api.md](file://docs/api.md#L80-L131)
|
||||
|
||||
### 前端集成实现
|
||||
|
||||
前端界面提供了完整的科室管理功能,包括:
|
||||
|
||||
- **数据展示**:表格形式展示科室基本信息
|
||||
- **树形选择**:使用el-tree-select实现上级科室选择
|
||||
- **类型标签**:不同科室类型显示不同颜色标签
|
||||
- **状态管理**:支持启用/停用状态切换
|
||||
- **权限控制**:仅管理员和经理可以进行CRUD操作
|
||||
|
||||
**章节来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 数据库索引设计
|
||||
|
||||
科室信息表采用了合理的索引策略来优化查询性能:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[departments表] --> B[idx_dept_type]
|
||||
A --> C[idx_dept_parent]
|
||||
A --> D[idx_code_unique]
|
||||
B --> E[类型查询优化]
|
||||
C --> F[父子关系查询优化]
|
||||
D --> G[编码唯一性保证]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L82-L85)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L39-L40)
|
||||
|
||||
### 外部依赖关系
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "外部依赖"
|
||||
A[SQLAlchemy ORM]
|
||||
B[FastAPI框架]
|
||||
C[Element UI]
|
||||
D[PostgreSQL数据库]
|
||||
end
|
||||
subgraph "内部模块"
|
||||
E[models.py]
|
||||
F[department_service.py]
|
||||
G[departments.py]
|
||||
H[schemas.py]
|
||||
end
|
||||
A --> E
|
||||
B --> G
|
||||
C --> I[Departments.vue]
|
||||
D --> E
|
||||
E --> F
|
||||
F --> G
|
||||
G --> I
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L4-L15)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L4-L15)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
1. **索引优化**
|
||||
- `idx_dept_type`:优化按科室类型查询
|
||||
- `idx_dept_parent`:优化树形结构查询
|
||||
- `unique(code)`:确保编码唯一性,支持快速查找
|
||||
|
||||
2. **查询模式优化**
|
||||
- 使用`ORDER BY sort_order, id`确保稳定排序
|
||||
- 分页查询避免一次性加载大量数据
|
||||
- 树形结构构建时使用内存映射减少数据库访问
|
||||
|
||||
3. **缓存策略**
|
||||
- 树形结构结果可以考虑缓存
|
||||
- 常用查询结果可以使用Redis缓存
|
||||
|
||||
### 数据一致性保证
|
||||
|
||||
- **事务处理**:所有CRUD操作都在事务中执行
|
||||
- **约束检查**:删除操作前检查是否有子科室
|
||||
- **并发控制**:使用数据库锁防止并发冲突
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
1. **科室编码重复**
|
||||
- 现象:创建科室时报错"科室编码已存在"
|
||||
- 解决:检查是否存在重复的编码,确保唯一性
|
||||
|
||||
2. **树形结构异常**
|
||||
- 现象:科室树显示不正确或出现循环引用
|
||||
- 解决:检查parent_id字段,确保没有自引用或循环引用
|
||||
|
||||
3. **删除失败**
|
||||
- 现象:删除科室时报错"无法删除,科室下存在子科室"
|
||||
- 解决:先删除子科室,再删除父科室
|
||||
|
||||
4. **层级计算错误**
|
||||
- 现象:新创建科室层级不正确
|
||||
- 解决:检查父科室是否存在,确保正确计算level
|
||||
|
||||
**章节来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L74-L77)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L96-L110)
|
||||
|
||||
### 调试技巧
|
||||
|
||||
1. **数据库层面调试**
|
||||
```sql
|
||||
-- 查看所有科室及其层级关系
|
||||
SELECT id, name, code, parent_id, level FROM departments ORDER BY level, sort_order;
|
||||
|
||||
-- 检查树形结构完整性
|
||||
SELECT parent_id, COUNT(*) as child_count
|
||||
FROM departments
|
||||
GROUP BY parent_id
|
||||
HAVING parent_id IS NOT NULL;
|
||||
```
|
||||
|
||||
2. **API层面调试**
|
||||
- 使用Postman测试各种接口
|
||||
- 检查响应状态码和错误信息
|
||||
- 验证数据格式和约束条件
|
||||
|
||||
## 结论
|
||||
|
||||
科室信息表作为医院绩效管理系统的基础数据表,具有以下特点:
|
||||
|
||||
1. **完整的树形结构**:支持多层级的科室组织关系
|
||||
2. **灵活的类型管理**:涵盖医院各类科室类型
|
||||
3. **完善的权限控制**:基于角色的CRUD权限管理
|
||||
4. **良好的扩展性**:为后续功能扩展提供基础支撑
|
||||
|
||||
通过合理的设计和实现,该表能够有效支撑医院的绩效管理、员工管理、财务核算等多个业务领域,为医院的数字化转型提供坚实的数据基础。
|
||||
299
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/考核指标表.md
Normal file
299
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/考核指标表.md
Normal file
@@ -0,0 +1,299 @@
|
||||
# 考核指标表
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue)
|
||||
- [详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件围绕“考核指标表(indicators)”进行系统化说明,涵盖字段的业务含义、指标类型与平衡计分卡维度的枚举值、权重约束与一票否决机制的设计原理,并结合系统中的模板初始化与前后端交互,给出典型配置场景与使用示例。
|
||||
|
||||
## 项目结构
|
||||
- 后端采用 FastAPI + SQLAlchemy 异步 ORM,指标模型、序列化与 API 路由分别位于 models、schemas、api/v1 与 services 层。
|
||||
- 前端 Vue 页面负责指标的增删改查与状态切换。
|
||||
- 初始化脚本用于批量导入模板指标,便于快速搭建不同科室的指标库。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
FE["前端页面<br/>Indicators.vue"] --> API["API 路由<br/>indicators.py"]
|
||||
API --> SVC["服务层<br/>indicator_service.py"]
|
||||
SVC --> MODEL["数据模型<br/>models.py"]
|
||||
INIT["初始化脚本<br/>init_indicator_templates.py"] --> MODEL
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L1-L296)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L1-L375)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L151-L193)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L1-L375)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L1-L296)
|
||||
|
||||
## 核心组件
|
||||
- 模型层(数据模型):定义指标表结构、枚举类型(指标类型、BSC 维度、科室类型)、约束与索引。
|
||||
- 序列化层(Pydantic):定义指标的请求/响应模型与字段校验规则。
|
||||
- 服务层(业务逻辑):提供指标列表查询、启用状态筛选、创建/更新/删除、模板导入等能力。
|
||||
- API 层(接口):暴露指标 CRUD 与模板导入接口,带权限控制。
|
||||
- 前端页面:提供指标列表展示、搜索过滤、新增/编辑/删除、状态开关等交互。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L39-L44)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L20-L142)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L16-L197)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L17-L118)
|
||||
|
||||
## 架构总览
|
||||
以下类图展示指标相关的核心类与关系,以及与枚举类型的绑定。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class IndicatorType {
|
||||
<<enum>>
|
||||
+quality
|
||||
+quantity
|
||||
+efficiency
|
||||
+service
|
||||
+cost
|
||||
}
|
||||
class BSCDimension {
|
||||
<<enum>>
|
||||
+financial
|
||||
+customer
|
||||
+internal_process
|
||||
+learning_growth
|
||||
}
|
||||
class DeptType {
|
||||
<<enum>>
|
||||
+clinical_surgical
|
||||
+clinical_nonsurgical_ward
|
||||
+clinical_nonsurgical_noward
|
||||
+medical_tech
|
||||
+medical_auxiliary
|
||||
+nursing
|
||||
+admin
|
||||
+finance
|
||||
+logistics
|
||||
}
|
||||
Indicator --> IndicatorType : "使用"
|
||||
Indicator --> BSCDimension : "使用"
|
||||
Indicator --> DeptType : "适用科室类型(JSON)"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 字段业务含义与约束
|
||||
- 指标编码(code):唯一标识指标,用于模板导入与关联,API 层在创建时会校验唯一性。
|
||||
- 指标名称(name):指标的中文名称,用于展示与报表。
|
||||
- 指标类型(indicator_type):质量、数量、效率、服务、成本五类,决定评分方法与目标方向。
|
||||
- 平衡计分卡维度(bs_dimension):财务、客户、内部流程、学习与成长四个维度,用于归类与权重分配。
|
||||
- 权重(weight):指标在所属维度内的权重,模型层包含正数约束;服务层与前端对权重范围做了进一步限制。
|
||||
- 最高分值(max_score):指标可能获得的最高得分,用于评分换算与上限控制。
|
||||
- 目标值(target_value)与单位(target_unit):目标值及其单位,配合评分方法使用。
|
||||
- 计算方法(calculation_method):实际值的计算公式或口径说明。
|
||||
- 考核方法(assessment_method):数据采集与认定方式(如统计报表、问卷调查、系统统计等)。
|
||||
- 扣分标准(deduction_standard):针对扣分法的扣分细则,便于人工复核与申诉处理。
|
||||
- 数据来源(data_source):数据来自哪个系统或部门,确保可追溯。
|
||||
- 适用科室类型(applicable_dept_types):JSON 数组,限定该指标对哪些科室生效。
|
||||
- 是否一票否决(is_veto):当指标为否决项时,若未达标直接判定考核不通过。
|
||||
- 启用状态(is_active):控制指标是否参与当前周期的考核。
|
||||
- 创建/更新时间(created_at/updated_at):审计与版本追踪。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L153-L193)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L71-L112)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L106-L154)
|
||||
|
||||
### 指标类型与平衡计分卡维度
|
||||
- 指标类型(质量、数量、效率、服务、成本):用于区分指标性质与评分方法选择。
|
||||
- BSC 四个维度:
|
||||
- 财务维度:关注收入、成本、结余等财务指标。
|
||||
- 客户维度:关注患者满意度、投诉处理等客户服务指标。
|
||||
- 内部流程维度:关注病历质量、院感控制、制度执行等内部运营指标。
|
||||
- 学习与成长维度:关注培训参与、继续教育等能力建设指标。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [models.py](file://backend/app/models/models.py#L29-L34)
|
||||
|
||||
### 权重约束与一票否决机制
|
||||
- 权重约束:
|
||||
- 数据库层:通过约束保证权重大于 0。
|
||||
- 服务层与前端:对权重范围做了更严格的限制(如前端最小 0.1、最大 10),避免极端权重影响整体平衡。
|
||||
- 一票否决(is_veto):
|
||||
- 当某指标被标记为否决项时,若未达到目标,直接判定该考核记录不通过,无需计算其他指标得分。
|
||||
- 该机制常用于安全、合规类关键指标(如院感控制达标率)。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L144-L146)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L158-L158)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L180-L196)
|
||||
|
||||
### API 流程与调用链
|
||||
以下序列图展示从前端到后端的关键调用链,包括创建指标与模板导入。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端页面<br/>Indicators.vue"
|
||||
participant API as "API 路由<br/>indicators.py"
|
||||
participant SVC as "服务层<br/>indicator_service.py"
|
||||
participant DB as "数据库"
|
||||
FE->>API : "POST /api/v1/indicators"
|
||||
API->>API : "校验权限与编码唯一性"
|
||||
API->>SVC : "create(indicator_data)"
|
||||
SVC->>DB : "插入新指标记录"
|
||||
DB-->>SVC : "返回持久化后的指标"
|
||||
SVC-->>API : "返回指标对象"
|
||||
API-->>FE : "返回创建成功与数据"
|
||||
FE->>API : "POST /api/v1/indicators/templates/import?overwrite=false"
|
||||
API->>SVC : "import_template(template_data, overwrite)"
|
||||
SVC->>DB : "按模板创建/更新指标"
|
||||
DB-->>SVC : "提交事务"
|
||||
SVC-->>API : "返回创建数量"
|
||||
API-->>FE : "返回导入结果"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L201-L273)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L71-L142)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L67-L154)
|
||||
|
||||
### 典型配置场景与使用示例
|
||||
- 场景一:为“临床手术科室”批量导入模板指标
|
||||
- 使用模板导入接口,传入模板数据与科室类型,系统将根据模板生成指标并设置适用科室类型。
|
||||
- 示例字段:指标编码、名称、类型、维度、权重、最高分值、目标值、计算方法、数据来源、是否否决等。
|
||||
- 场景二:新增自定义指标
|
||||
- 前端填写指标基本信息,后端校验编码唯一性与字段合法性,创建后可在考核中启用。
|
||||
- 场景三:启用/停用指标
|
||||
- 前端通过开关切换 is_active,后端提供按状态筛选的列表查询接口。
|
||||
- 场景四:否决项设置
|
||||
- 对关键安全/合规指标(如院感达标率)设置 is_veto=true,确保未达标即不通过。
|
||||
|
||||
章节来源
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L20-L142)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L106-L197)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L22-L375)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L179-L273)
|
||||
|
||||
### 评分方法与权重换算(概念流程)
|
||||
系统提供了多种评分方法,用于将实际值转换为得分。以下流程图展示常见方法的决策过程(概念示意):
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> CheckVeto{"是否为否决项<br/>is_veto = true?"}
|
||||
CheckVeto --> |是| Vetofail["未达标则直接不通过"]
|
||||
CheckVeto --> |否| ChooseMethod["选择评分方法"]
|
||||
ChooseMethod --> Ratio["比值法<br/>实际值/目标值"]
|
||||
ChooseMethod --> Range["区间法<br/>趋高/趋低/趋中"]
|
||||
ChooseMethod --> Deduct["扣分法<br/>权重-扣分"]
|
||||
ChooseMethod --> Bonus["加分法<br/>权重+加分"]
|
||||
Ratio --> WeightCalc["乘以权重得到得分"]
|
||||
Range --> WeightCalc
|
||||
Deduct --> CapZero["扣完为止,不低于0"]
|
||||
Bonus --> CapMax["加分不超过权重50%"]
|
||||
WeightCalc --> End(["结束"])
|
||||
CapZero --> End
|
||||
CapMax --> End
|
||||
Vetofail --> End
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [详细设计.md](file://docs/详细设计.md#L328-L400)
|
||||
|
||||
## 依赖关系分析
|
||||
- 模型层依赖枚举类型(IndicatorType、BSCDimension、DeptType)与 SQLAlchemy 的类型系统。
|
||||
- 服务层依赖模型层进行数据库操作,并对输入数据进行清洗与转换(如适用科室类型 JSON 序列化)。
|
||||
- API 层依赖服务层与权限中间件,提供统一的 HTTP 接口。
|
||||
- 前端依赖 API 提供的数据结构,进行表格展示与表单编辑。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
ENUM["枚举类型<br/>IndicatorType/BSCDimension/DeptType"] --> MODEL["数据模型<br/>models.py"]
|
||||
MODEL --> SVC["服务层<br/>indicator_service.py"]
|
||||
SVC --> API["API 路由<br/>indicators.py"]
|
||||
API --> FE["前端页面<br/>Indicators.vue"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L1-L296)
|
||||
|
||||
## 性能考量
|
||||
- 查询性能:指标列表接口支持按类型、维度、启用状态筛选与分页,建议在高频查询场景下利用数据库索引(模型层已定义相关索引)。
|
||||
- 写入性能:模板导入采用批量写入与事务提交,减少往返开销;注意在大量导入时控制并发与内存占用。
|
||||
- 前端渲染:表格分页与按需加载有助于提升大列表的交互体验。
|
||||
|
||||
## 故障排查指南
|
||||
- 编码重复:创建指标时若编码已存在,接口会返回错误;请更换唯一编码。
|
||||
- 权重异常:若权重小于等于 0 或超出范围,数据库约束或前端校验会拦截;请调整至有效范围。
|
||||
- 否决项判定:若某指标为否决项且未达标,需先满足该指标目标再进入后续评分。
|
||||
- 数据来源缺失:若数据源不可用,建议在计算方法与数据来源字段中明确口径与系统对接方式。
|
||||
|
||||
章节来源
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L78-L84)
|
||||
- [models.py](file://backend/app/models/models.py#L144-L146)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L180-L196)
|
||||
|
||||
## 结论
|
||||
考核指标表是医院绩效管理的基础配置单元。通过明确的字段语义、严谨的权重约束与一票否决机制,系统能够支撑多维度、多科室的差异化考核需求。结合模板导入与前后端协同,可高效完成指标库的构建与维护。
|
||||
|
||||
## 附录
|
||||
- 初始化脚本示例:展示了如何为不同科室批量创建指标模板,便于快速落地。
|
||||
- 前端页面示例:展示了指标的增删改查与状态切换,便于一线人员日常维护。
|
||||
|
||||
章节来源
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L22-L375)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L179-L273)
|
||||
351
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/考核明细表.md
Normal file
351
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/考核明细表.md
Normal file
@@ -0,0 +1,351 @@
|
||||
# 考核明细表
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue)
|
||||
- [assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件围绕“考核明细表(assessment_details)”进行系统化说明,涵盖字段业务含义、与考核记录表(assessments)的多对一关系、与指标表(indicators)的一对一关系、得分计算逻辑、数据验证规则、典型使用场景以及索引与查询优化建议。文档同时结合后端模型定义、服务层实现、API接口与前端交互,帮助读者全面理解该表在医院绩效系统中的作用与实现细节。
|
||||
|
||||
## 项目结构
|
||||
- 后端模型定义位于 models.py,包含 AssessmentDetail 的字段、索引与关系。
|
||||
- 服务层 assessment_service.py 实现了明细的增删改查、加权得分计算与批量初始化。
|
||||
- API 层 assessments.py 提供考核与明细的对外接口。
|
||||
- 数据库迁移脚本 001_initial.py 定义了 assessment_details 的建表语句与索引。
|
||||
- 前端 AssessmentDetail.vue 与 assessment.js 展示了明细的录入、校验与提交流程。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
M["models.py<br/>定义 AssessmentDetail 字段/索引/关系"]
|
||||
S["assessment_service.py<br/>明细增删改/加权计算/批量初始化"]
|
||||
A["assessments.py<br/>API 接口"]
|
||||
end
|
||||
subgraph "前端"
|
||||
V["AssessmentDetail.vue<br/>明细展示/编辑/提交"]
|
||||
JS["assessment.js<br/>HTTP 请求封装"]
|
||||
end
|
||||
DB["数据库<br/>assessment_details 表"]
|
||||
V --> JS
|
||||
JS --> A
|
||||
A --> S
|
||||
S --> M
|
||||
M --> DB
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L114-L131)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L36-L82)
|
||||
- [assessment.js](file://frontend/src/api/assessment.js#L8-L36)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L114-L131)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L36-L82)
|
||||
- [assessment.js](file://frontend/src/api/assessment.js#L8-L36)
|
||||
|
||||
## 核心组件
|
||||
- 考核明细表(AssessmentDetail)
|
||||
- 字段与业务含义:
|
||||
- assessment_id:考核记录ID,用于将明细归集到具体考核记录,形成“明细-记录”的多对一关系。
|
||||
- indicator_id:指标ID,用于将明细与具体指标绑定,形成“明细-指标”的一对一关系。
|
||||
- actual_value:实际值,记录该指标的实际测量结果,支持小数点后两位精度。
|
||||
- score:得分,记录该指标的最终得分,支持小数点后一位精度,默认为0。
|
||||
- evidence:佐证材料,记录支撑该得分的相关证明材料(如截图、报表链接、文件名等)。
|
||||
- remark:备注,用于记录审核意见、补充说明等。
|
||||
- 索引与约束:
|
||||
- idx_detail_assessment:assessment_id 上的索引,加速按考核记录查询明细。
|
||||
- idx_detail_indicator:indicator_id 上的索引,加速按指标查询明细。
|
||||
- 关系:
|
||||
- 与 Assessment 多对一:每个明细属于一个考核记录。
|
||||
- 与 Indicator 一对一:每个明细对应一个指标。
|
||||
|
||||
- 考核记录表(Assessment)
|
||||
- 与 AssessmentDetail 的一对多关系:一个考核记录包含多个明细项。
|
||||
- 总分与加权得分由服务层在创建/更新时计算并写入。
|
||||
|
||||
- 指标表(Indicator)
|
||||
- 与 AssessmentDetail 的一对多关系:一个指标可出现在多个明细中(不同考核记录)。
|
||||
- 服务层在计算加权得分时会读取指标权重。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L114-L131)
|
||||
|
||||
## 架构概览
|
||||
后端采用“模型-服务-接口-前端”分层架构:
|
||||
- 模型层:定义 AssessmentDetail 的字段、索引与关系。
|
||||
- 服务层:负责明细的创建/更新、删除旧明细、计算总分与加权得分、批量初始化。
|
||||
- 接口层:提供获取详情、创建、更新、提交、审核、确认等 API。
|
||||
- 前端:展示明细、允许编辑实际值与得分、提交审核、审核通过/驳回、确认。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端页面"
|
||||
participant API as "API 接口"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库"
|
||||
FE->>API : GET /assessments/{id}
|
||||
API->>SVC : get_by_id(assessment_id)
|
||||
SVC->>DB : 查询 Assessment + selectinload details + indicator
|
||||
DB-->>SVC : 返回 Assessment 及明细
|
||||
SVC-->>API : Assessment 对象
|
||||
API-->>FE : 返回详情含明细
|
||||
FE->>API : PUT /assessments/{id}更新明细
|
||||
API->>SVC : update(assessment_id, details)
|
||||
SVC->>DB : 删除旧明细按 assessment_id
|
||||
SVC->>DB : 插入新明细并计算总分/加权得分
|
||||
DB-->>SVC : 提交事务
|
||||
SVC-->>API : 返回更新后的 Assessment
|
||||
API-->>FE : 返回成功
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L57-L156)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L160-L175)
|
||||
|
||||
章节来源
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L57-L156)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L160-L175)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 字段业务含义与约束
|
||||
- assessment_id
|
||||
- 类型:整数,外键指向 assessments.id。
|
||||
- 业务含义:标识该明细所属的考核记录,形成“明细-记录”的多对一关系。
|
||||
- 约束:非空;需与现有考核记录关联。
|
||||
- indicator_id
|
||||
- 类型:整数,外键指向 indicators.id。
|
||||
- 业务含义:标识该明细对应的指标,形成“明细-指标”的一对一关系。
|
||||
- 约束:非空;需与现有指标关联。
|
||||
- actual_value
|
||||
- 类型:数值(最多10位,小数点后2位),可为空。
|
||||
- 业务含义:该指标的实际测量值,用于支撑评分或作为输入数据。
|
||||
- 约束:可为空;服务层不强制必填。
|
||||
- score
|
||||
- 类型:数值(最多5位,小数点后1位),默认0。
|
||||
- 业务含义:该指标的最终得分,用于计算总分与加权得分。
|
||||
- 约束:非负;服务层在更新时会累加总分,并按指标权重计算加权得分。
|
||||
- evidence
|
||||
- 类型:文本,可为空。
|
||||
- 业务含义:佐证材料,如图片、文件名、链接等,便于审计与复核。
|
||||
- 约束:可为空。
|
||||
- remark
|
||||
- 类型:文本,可为空。
|
||||
- 业务含义:备注,可用于记录审核意见、调整说明等。
|
||||
- 约束:可为空。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L196-L218)
|
||||
|
||||
### 关系与数据一致性
|
||||
- 与 Assessment 的多对一关系
|
||||
- 一个考核记录可包含多个明细;删除考核记录时,明细通过级联删除(由 Assessment 的 cascade 配置决定)。
|
||||
- 与 Indicator 的一对一关系
|
||||
- 一个指标可在多个明细中出现(不同考核记录),但单条明细仅对应一个指标。
|
||||
- 服务层在创建/更新时的处理
|
||||
- 创建:直接插入明细,总分=sum(score),加权得分=Σ(score × 指标权重)。
|
||||
- 更新:先删除旧明细,再插入新明细,重新计算总分与加权得分。
|
||||
- 批量初始化:为某个科室的每位在职员工生成相同指标集合的明细,初始得分为0。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L173-L173)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L207-L262)
|
||||
|
||||
### 得分计算逻辑
|
||||
- 总分(Assessment.total_score)
|
||||
- 计算方式:明细的 score 之和。
|
||||
- 加权得分(Assessment.weighted_score)
|
||||
- 计算方式:Σ(detail.score × detail.indicator.weight)。
|
||||
- 服务层在创建/更新时读取指标权重并累加。
|
||||
- 一票否决(Indicator.is_veto)
|
||||
- 该字段存在于指标表,用于表示是否为一票否决指标。若存在此类指标且其得分导致不达标,可能触发整体否决流程(具体逻辑取决于业务规则与前端/服务层实现)。当前明细表未直接存储 is_veto,但服务层在计算加权得分时会读取指标权重,体现权重影响。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> LoadDetails["加载明细列表"]
|
||||
LoadDetails --> SumScore["sum(score) 计算总分"]
|
||||
SumScore --> GetWeights["逐条读取指标权重"]
|
||||
GetWeights --> WeightedCalc["Σ(score × 指标权重) 计算加权得分"]
|
||||
WeightedCalc --> SaveAssessment["保存 Assessment.total_score 与 weighted_score"]
|
||||
SaveAssessment --> End(["结束"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L74-L84)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L129-L149)
|
||||
|
||||
章节来源
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
|
||||
|
||||
### 数据验证规则
|
||||
- Pydantic 模式(后端)
|
||||
- AssessmentDetailCreate/AssessmentDetailResponse 中对字段进行了范围与类型约束:
|
||||
- score:默认0,最小≥0。
|
||||
- actual_value:可为空,数值类型。
|
||||
- evidence/remark:可为空,字符串类型。
|
||||
- SQL 约束(数据库)
|
||||
- 字段类型与精度:numeric(10,2)/numeric(5,2) 等,确保存储精度。
|
||||
- 非空约束:assessment_id、indicator_id 非空。
|
||||
- 索引:assessment_id、indicator_id 上的索引,提升查询性能。
|
||||
- 前端校验(前端)
|
||||
- 明细表格中对实际值与得分设置了输入范围与精度:
|
||||
- actual_value:数值,精度2位。
|
||||
- score:数值,最小0,最大为指标最高分,精度1位。
|
||||
- 状态控制:仅草稿状态下允许编辑明细,提交后只读显示。
|
||||
|
||||
章节来源
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L196-L218)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L114-L131)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L45-L70)
|
||||
|
||||
### 典型使用场景
|
||||
- 详细评分
|
||||
- 在前端页面中,用户可编辑 actual_value 与 score,服务层据此计算总分与加权得分。
|
||||
- 证据管理
|
||||
- evidence 字段用于记录佐证材料,便于后续审计与复核。
|
||||
- 数据追溯
|
||||
- 通过 assessment_id 可快速定位某次考核的所有明细;通过 indicator_id 可查看某指标在不同考核记录中的表现。
|
||||
- 批量初始化
|
||||
- 服务层支持为某个科室的在职员工批量创建明细,初始得分为0,便于后续统一评分。
|
||||
|
||||
章节来源
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L207-L262)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L36-L82)
|
||||
|
||||
### API 与前端交互
|
||||
- 获取详情
|
||||
- API 返回 Assessment 及其明细,前端渲染明细表格并注入指标名称。
|
||||
- 更新明细
|
||||
- 前端提交包含 indicator_id、actual_value、score、evidence 的数组,服务层删除旧明细并插入新明细,重新计算总分与加权得分。
|
||||
- 提交/审核/确认
|
||||
- 前端调用提交、审核、确认接口,服务层更新状态并持久化。
|
||||
|
||||
章节来源
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L55-L77)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L160-L213)
|
||||
- [assessment.js](file://frontend/src/api/assessment.js#L8-L36)
|
||||
|
||||
## 依赖关系分析
|
||||
- AssessmentDetail 与 Assessment 的多对一
|
||||
- 通过 assessment_id 外键关联,Assessment.details 为反向关系。
|
||||
- AssessmentDetail 与 Indicator 的一对一
|
||||
- 通过 indicator_id 外键关联,Indicator.assessment_details 为反向关系。
|
||||
- 服务层依赖
|
||||
- 服务层在创建/更新时读取指标权重,计算加权得分;在批量初始化时遍历在职员工并为每个员工生成明细。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+string status
|
||||
+AssessmentDetail[] details
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+string evidence
|
||||
+string remark
|
||||
+Assessment assessment
|
||||
+Indicator indicator
|
||||
}
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+float weight
|
||||
+AssessmentDetail[] assessment_details
|
||||
}
|
||||
Assessment "1" <-- "many" AssessmentDetail : "details"
|
||||
Indicator "1" <-- "many" AssessmentDetail : "assessment_details"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L149-L202)
|
||||
|
||||
## 性能考量
|
||||
- 索引设计
|
||||
- idx_detail_assessment:按 assessment_id 查询明细时使用,适合按考核记录聚合明细。
|
||||
- idx_detail_indicator:按指标查询明细时使用,适合按指标维度统计。
|
||||
- 查询优化建议
|
||||
- 按考核记录查询明细:优先使用 assessment_id 进行过滤与排序。
|
||||
- 按指标查询明细:优先使用 indicator_id 进行过滤与排序。
|
||||
- 分页与排序:结合数据库索引与分页参数,避免全表扫描。
|
||||
- 批量操作:批量创建/更新明细时,尽量减少往返次数,使用服务层提供的批量接口。
|
||||
- 大体量数据的性能考虑
|
||||
- 使用索引覆盖查询,避免隐式转换与函数包裹。
|
||||
- 对高频查询(如按年月/状态/科室)考虑复合索引或物化视图(视数据库能力而定)。
|
||||
- 控制单次明细数量,避免一次性加载过多明细导致内存压力。
|
||||
|
||||
章节来源
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L114-L131)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L207-L262)
|
||||
|
||||
## 故障排查指南
|
||||
- 常见问题
|
||||
- 无法提交/审核/确认:检查考核记录状态是否符合要求(草稿、已提交、已审核)。
|
||||
- 明细更新无效:确认前端处于草稿状态,且提交的数据包含完整的 indicator_id、actual_value、score、evidence。
|
||||
- 得分异常:检查指标权重是否正确,以及服务层是否正确读取并参与加权计算。
|
||||
- 排查步骤
|
||||
- 查看 API 返回的状态码与错误信息。
|
||||
- 检查数据库中 assessment_details 的 assessment_id 与 indicator_id 是否有效。
|
||||
- 核对前端传参与后端模式约束是否匹配。
|
||||
- 在服务层增加日志,打印明细集合与计算过程的关键变量。
|
||||
|
||||
章节来源
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L110-L156)
|
||||
|
||||
## 结论
|
||||
考核明细表是连接“考核记录”与“指标”的桥梁,承担着记录实际值、得分与佐证材料的关键职责。通过明确的字段定义、严格的索引设计与服务层的加权计算逻辑,系统能够稳定地支持详细评分、证据管理与数据追溯等核心业务场景。对于大体量数据,建议结合索引与分页策略,持续优化查询路径,确保系统在高并发下的稳定性与性能。
|
||||
|
||||
## 附录
|
||||
- 建议的索引与查询模式
|
||||
- 按 assessment_id 查询明细:使用 idx_detail_assessment。
|
||||
- 按 indicator_id 查询明细:使用 idx_detail_indicator。
|
||||
- 按年月/状态/科室聚合:结合 assessments 表的索引与分页参数进行高效查询。
|
||||
597
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/考核记录表.md
Normal file
597
.qoder/repowiki/zh/content/数据库设计/表结构设计/核心业务表/考核记录表.md
Normal file
@@ -0,0 +1,597 @@
|
||||
# 考核记录表
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [security.py](file://backend/app/core/security.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
考核记录表(assessments)是医院绩效管理系统的核心数据表,用于存储员工的绩效考核信息。该表实现了完整的考核生命周期管理,包括考核创建、提交、审核、确认等流程,并支持多层级的权限控制和状态管理。
|
||||
|
||||
## 项目结构
|
||||
|
||||
考核记录表相关的代码分布在以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端层"
|
||||
FE_API[assessment.js]
|
||||
FE_VIEW[Assessments.vue]
|
||||
end
|
||||
subgraph "后端层"
|
||||
API[assessments.py]
|
||||
SERVICE[assessment_service.py]
|
||||
MODELS[models.py]
|
||||
SCHEMAS[schemas.py]
|
||||
SECURITY[security.py]
|
||||
end
|
||||
subgraph "数据库层"
|
||||
DB[assessments表]
|
||||
DETAIL[assessment_details表]
|
||||
INDEX[idx_assessment_staff<br/>idx_assessment_period<br/>idx_assessment_status]
|
||||
end
|
||||
FE_API --> API
|
||||
FE_VIEW --> FE_API
|
||||
API --> SERVICE
|
||||
SERVICE --> MODELS
|
||||
MODELS --> DB
|
||||
DB --> DETAIL
|
||||
DB --> INDEX
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
|
||||
**章节来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 数据模型定义
|
||||
|
||||
考核记录表采用SQLAlchemy ORM映射,定义了完整的字段结构和关系:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+string period_type
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentStatus status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
+datetime submit_time
|
||||
+datetime review_time
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+staff : Staff
|
||||
+assessor : Staff
|
||||
+reviewer : Staff
|
||||
+details : AssessmentDetail[]
|
||||
}
|
||||
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
|
||||
+assessments : Assessment[]
|
||||
+salary_records : SalaryRecord[]
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+string evidence
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+assessment : Assessment
|
||||
+indicator : Indicator
|
||||
}
|
||||
Assessment --> Staff : "staff_id"
|
||||
Assessment --> Staff : "assessor_id"
|
||||
Assessment --> Staff : "reviewer_id"
|
||||
Assessment --> AssessmentDetail : "details"
|
||||
AssessmentDetail --> Indicator : "indicator_id"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
|
||||
### 字段业务含义详解
|
||||
|
||||
#### 基础字段
|
||||
- **staff_id**: 员工ID,外键关联到员工表,标识被考核的员工
|
||||
- **period_year**: 考核年度,支持2020-2100年的范围
|
||||
- **period_month**: 考核月份,支持1-12的范围
|
||||
- **period_type**: 考核周期类型,默认为"monthly"(月度),支持其他周期类型扩展
|
||||
|
||||
#### 绩效计算字段
|
||||
- **total_score**: 总分,所有考核指标得分的简单相加
|
||||
- **weighted_score**: 加权得分,根据指标权重计算的加权平均分
|
||||
|
||||
#### 状态管理字段
|
||||
- **status**: 考核状态,使用AssessmentStatus枚举管理
|
||||
- **assessor_id**: 考核人ID,负责创建和维护考核记录
|
||||
- **reviewer_id**: 审核人ID,负责审核和批准考核结果
|
||||
|
||||
#### 时间戳字段
|
||||
- **submit_time**: 提交时间,记录考核提交到审核阶段的时间
|
||||
- **review_time**: 审核时间,记录考核审核完成的时间
|
||||
|
||||
#### 备注字段
|
||||
- **remark**: 备注信息,用于记录审核意见或其他说明
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L220-L270)
|
||||
|
||||
## 架构概览
|
||||
|
||||
考核记录表的完整架构包括API层、服务层、数据模型层和数据库层:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 前端客户端
|
||||
participant API as API路由层
|
||||
participant Service as 服务层
|
||||
participant DB as 数据库
|
||||
participant Model as 数据模型
|
||||
Client->>API : GET /assessments
|
||||
API->>Service : get_list()
|
||||
Service->>DB : 查询assessments表
|
||||
DB->>Model : 返回ORM对象
|
||||
Model->>Service : Assessment对象列表
|
||||
Service->>API : Assessment列表
|
||||
API->>Client : JSON响应
|
||||
Client->>API : POST /assessments/{id}/submit
|
||||
API->>Service : submit()
|
||||
Service->>DB : 更新状态为SUBMITTED
|
||||
DB->>Model : 返回更新后的Assessment
|
||||
Service->>API : Assessment对象
|
||||
API->>Client : 提交成功
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L52)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L18-L55)
|
||||
|
||||
**章节来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 状态枚举和转换机制
|
||||
|
||||
考核状态枚举定义了完整的状态转换流程:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿 : 创建考核
|
||||
草稿 --> 已提交 : 提交考核
|
||||
已提交 --> 已审核 : 审核通过
|
||||
已提交 --> 已驳回 : 审核驳回
|
||||
已审核 --> 已确认 : 确认考核
|
||||
已确认 --> [*]
|
||||
已驳回 --> 草稿 : 修改后重新提交
|
||||
```
|
||||
|
||||
**状态转换规则**:
|
||||
- 草稿状态只能由创建者修改,支持重新编辑
|
||||
- 已提交状态只能由审核人处理,不可直接修改
|
||||
- 已审核状态可以被确认,进入最终状态
|
||||
- 已驳回状态可以返回草稿状态进行修正
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L45-L52)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
|
||||
|
||||
### 自关联关系实现
|
||||
|
||||
考核记录表实现了复杂的自关联关系:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
ASSESSMENTS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int assessor_id FK
|
||||
int reviewer_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
string period_type
|
||||
float total_score
|
||||
float weighted_score
|
||||
string status
|
||||
datetime submit_time
|
||||
datetime review_time
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
decimal base_salary
|
||||
decimal performance_ratio
|
||||
string status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
ASSESSMENTS ||--|| STAFF : "staff_id"
|
||||
ASSESSMENTS ||--|| STAFF : "assessor_id"
|
||||
ASSESSMENTS ||--|| STAFF : "reviewer_id"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L169-L173)
|
||||
|
||||
### 权限控制和身份验证
|
||||
|
||||
系统实现了多层级的权限控制机制:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([用户请求]) --> CheckAuth["验证用户身份"]
|
||||
CheckAuth --> CheckRole{"检查用户角色"}
|
||||
CheckRole --> |普通员工| CheckStatus{"检查考核状态"}
|
||||
CheckRole --> |管理员| AllowAdmin["允许所有操作"]
|
||||
CheckRole --> |经理| CheckManager{"检查操作类型"}
|
||||
CheckStatus --> |草稿状态| AllowEdit["允许编辑"]
|
||||
CheckStatus --> |已提交状态| DenyEdit["拒绝编辑"]
|
||||
CheckStatus --> |已审核状态| DenyEdit
|
||||
CheckManager --> |提交/审核| AllowManager["允许审核操作"]
|
||||
CheckManager --> |确认| AllowManager
|
||||
CheckManager --> |创建| DenyManager["拒绝创建"]
|
||||
AllowAdmin --> End([授权通过])
|
||||
AllowEdit --> End
|
||||
AllowManager --> End
|
||||
DenyEdit --> End
|
||||
DenyManager --> End
|
||||
```
|
||||
|
||||
**权限控制规则**:
|
||||
- 普通员工只能操作自己的草稿状态考核
|
||||
- 经理和管理员可以进行审核和确认操作
|
||||
- 不同状态下的操作权限严格限制
|
||||
|
||||
**章节来源**
|
||||
- [security.py](file://backend/app/core/security.py#L94-L109)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
|
||||
|
||||
### API接口设计
|
||||
|
||||
系统提供了完整的RESTful 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 | 管理员/经理 | 批量创建考核 |
|
||||
|
||||
**章节来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L20-L166)
|
||||
|
||||
### 前端集成和使用场景
|
||||
|
||||
前端提供了完整的用户界面和交互体验:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "前端界面"
|
||||
LIST[考核列表页面]
|
||||
DETAIL[考核详情页面]
|
||||
BATCH[批量创建弹窗]
|
||||
end
|
||||
subgraph "API调用"
|
||||
GET_LIST[getAssessments]
|
||||
GET_DETAIL[getAssessment]
|
||||
CREATE[createAssessment]
|
||||
UPDATE[updateAssessment]
|
||||
SUBMIT[submitAssessment]
|
||||
REVIEW[reviewAssessment]
|
||||
FINALIZE[finalizeAssessment]
|
||||
BATCH_CREATE[batchCreateAssessments]
|
||||
end
|
||||
LIST --> GET_LIST
|
||||
DETAIL --> GET_DETAIL
|
||||
LIST --> CREATE
|
||||
LIST --> UPDATE
|
||||
LIST --> SUBMIT
|
||||
LIST --> REVIEW
|
||||
LIST --> FINALIZE
|
||||
BATCH --> BATCH_CREATE
|
||||
```
|
||||
|
||||
**典型使用场景**:
|
||||
|
||||
1. **流程审批场景**:
|
||||
- 员工创建草稿考核
|
||||
- 直接提交到上级审核
|
||||
- 审核通过后自动进入确认阶段
|
||||
|
||||
2. **状态跟踪场景**:
|
||||
- 实时显示考核状态变化
|
||||
- 支持按状态筛选和排序
|
||||
- 提供状态变更历史记录
|
||||
|
||||
3. **数据统计场景**:
|
||||
- 按科室统计平均分
|
||||
- 按时间段分析趋势
|
||||
- 生成绩效报告和图表
|
||||
|
||||
**章节来源**
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [assessment.js](file://frontend/src/api/assessment.js#L1-L50)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 数据库依赖关系
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
string dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
boolean is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
decimal base_salary
|
||||
decimal performance_ratio
|
||||
string status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
ASSESSMENTS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
string period_type
|
||||
decimal total_score
|
||||
decimal 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_DETAILS {
|
||||
int id PK
|
||||
int assessment_id FK
|
||||
int indicator_id FK
|
||||
decimal actual_value
|
||||
decimal score
|
||||
text evidence
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
string indicator_type
|
||||
decimal weight
|
||||
decimal max_score
|
||||
decimal target_value
|
||||
string unit
|
||||
text calculation_method
|
||||
text description
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS ||--o{ STAFF : "1:N"
|
||||
STAFF ||--o{ ASSESSMENTS : "1:N"
|
||||
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "1:N"
|
||||
INDICATORS ||--o{ ASSESSMENT_DETAILS : "1:N"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
|
||||
### 服务层依赖关系
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
API[API路由层] --> Service[AssessmentService]
|
||||
Service --> Model[Assessment模型]
|
||||
Service --> DetailModel[AssessmentDetail模型]
|
||||
Service --> StaffModel[Staff模型]
|
||||
Service --> IndicatorModel[Indicator模型]
|
||||
Service --> Schema[Pydantic Schema]
|
||||
Schema --> CreateSchema[AssessmentCreate]
|
||||
Schema --> UpdateSchema[AssessmentUpdate]
|
||||
Schema --> ResponseSchema[AssessmentResponse]
|
||||
API --> Security[安全验证]
|
||||
Security --> CurrentUser[get_current_active_user]
|
||||
Security --> ManagerUser[get_current_manager_user]
|
||||
Security --> AdminUser[get_current_admin_user]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L11)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L228-L270)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库索引设计
|
||||
|
||||
系统采用了多层次的索引策略来优化查询性能:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "主表索引"
|
||||
IDX_STAFF[idx_assessment_staff]
|
||||
IDX_PERIOD[idx_assessment_period]
|
||||
IDX_STATUS[idx_assessment_status]
|
||||
end
|
||||
subgraph "明细表索引"
|
||||
IDX_DETAIL_ASSESS[idx_detail_assessment]
|
||||
IDX_DETAIL_INDICATOR[idx_detail_indicator]
|
||||
end
|
||||
subgraph "查询优化"
|
||||
OPTIMIZE1[按员工ID查询]
|
||||
OPTIMIZE2[按考核周期查询]
|
||||
OPTIMIZE3[按状态过滤]
|
||||
OPTIMIZE4[按指标ID查询明细]
|
||||
end
|
||||
IDX_STAFF --> OPTIMIZE1
|
||||
IDX_PERIOD --> OPTIMIZE2
|
||||
IDX_STATUS --> OPTIMIZE3
|
||||
IDX_DETAIL_ASSESS --> OPTIMIZE4
|
||||
```
|
||||
|
||||
**索引策略说明**:
|
||||
- `idx_assessment_staff`: 优化按员工查询的性能
|
||||
- `idx_assessment_period`: 优化按考核周期查询的性能
|
||||
- `idx_assessment_status`: 优化按状态过滤的性能
|
||||
- `idx_detail_assessment`: 优化明细查询的性能
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
1. **分页查询**:默认每页20条记录,支持最大100条/页
|
||||
2. **条件过滤**:支持按员工ID、科室ID、年度、月份、状态等条件过滤
|
||||
3. **预加载关系**:使用selectinload优化N+1查询问题
|
||||
4. **批量操作**:支持批量创建和批量查询
|
||||
|
||||
### 缓存策略
|
||||
|
||||
虽然当前实现未使用缓存,但建议在以下场景考虑缓存:
|
||||
- 高频查询的考核统计结果
|
||||
- 员工基本信息
|
||||
- 指标模板数据
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L174-L178)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L28-L55)
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题和解决方案
|
||||
|
||||
#### 状态转换错误
|
||||
**问题**:尝试在错误状态下进行操作
|
||||
**解决方案**:检查当前考核状态,确保状态转换符合业务规则
|
||||
|
||||
#### 权限不足错误
|
||||
**问题**:403 Forbidden错误
|
||||
**解决方案**:确认用户角色是否具有相应权限,检查当前操作是否在允许范围内
|
||||
|
||||
#### 数据完整性错误
|
||||
**问题**:外键约束违反
|
||||
**解决方案**:确保关联的员工、指标等数据存在且有效
|
||||
|
||||
#### 性能问题
|
||||
**问题**:查询响应缓慢
|
||||
**解决方案**:检查索引使用情况,优化查询条件,考虑分页和缓存策略
|
||||
|
||||
### 调试工具和方法
|
||||
|
||||
1. **日志分析**:查看后端日志文件定位问题
|
||||
2. **数据库监控**:使用EXPLAIN分析慢查询
|
||||
3. **API测试**:使用Swagger UI测试接口功能
|
||||
4. **前端调试**:使用浏览器开发者工具调试前端逻辑
|
||||
|
||||
**章节来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L60-L102)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L111-L156)
|
||||
|
||||
## 结论
|
||||
|
||||
考核记录表作为医院绩效管理系统的核心组件,实现了完整的考核生命周期管理和多层级权限控制。通过合理的数据模型设计、完善的API接口、严格的权限控制和优化的数据库索引,系统能够高效地支持医院的绩效管理工作。
|
||||
|
||||
系统的自关联关系设计使得考核人、审核人和被考核员工的身份验证和权限控制变得清晰明确。状态枚举和状态转换机制确保了考核流程的规范性和可追溯性。
|
||||
|
||||
未来可以在现有基础上进一步优化:
|
||||
- 增加缓存机制提升查询性能
|
||||
- 扩展更多统计分析功能
|
||||
- 增强审计日志功能
|
||||
- 支持更多类型的考核周期和指标
|
||||
507
.qoder/repowiki/zh/content/数据库设计/表结构设计/索引与约束设计.md
Normal file
507
.qoder/repowiki/zh/content/数据库设计/表结构设计/索引与约束设计.md
Normal file
@@ -0,0 +1,507 @@
|
||||
# 索引与约束设计
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [init_db.py](file://backend/init_db.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件聚焦于该医院绩效系统的数据库索引与约束设计,系统采用 SQLAlchemy ORM + Alembic 进行模型定义与迁移,结合 PostgreSQL 异步驱动,围绕“科室—员工—考核—指标—工资—计划—模板—菜单—财务”等核心业务实体,系统化梳理主键、外键、唯一索引、复合索引、检查约束的设计原则与性能影响,并给出查询优化建议与并发控制考虑。
|
||||
|
||||
## 项目结构
|
||||
- 数据模型集中于 models 目录,通过 Base 声明式基类统一建模。
|
||||
- Alembic 版本化迁移文件定义了初始表结构与索引。
|
||||
- 配置模块提供数据库连接参数与池化配置。
|
||||
- 文档目录包含数据库 ER 图与表结构说明。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "模型层"
|
||||
M1["models.py<br/>核心业务模型"]
|
||||
M2["finance.py<br/>财务核算模型"]
|
||||
end
|
||||
subgraph "迁移层"
|
||||
V1["001_initial.py<br/>初始版本"]
|
||||
V2["002_template.py<br/>模板扩展"]
|
||||
end
|
||||
subgraph "运行时"
|
||||
C["config.py<br/>配置"]
|
||||
D["database.py<br/>引擎/会话"]
|
||||
I["init_db.py<br/>初始化脚本"]
|
||||
end
|
||||
subgraph "文档"
|
||||
DOC["database.md<br/>ER图与表说明"]
|
||||
end
|
||||
M1 --> V1
|
||||
M2 --> V2
|
||||
V1 --> D
|
||||
V2 --> D
|
||||
C --> D
|
||||
I --> D
|
||||
DOC -.参考.-> M1
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [database.md](file://docs/database.md#L1-L286)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [database.md](file://docs/database.md#L1-L286)
|
||||
|
||||
## 核心组件
|
||||
- 主键与自增:多数表使用整型自增主键,确保全局唯一性与插入性能。
|
||||
- 外键约束:通过 ForeignKey 映射,形成稳定的父子关系与引用完整性。
|
||||
- 唯一约束:对业务唯一字段(如科室编码、员工工号、指标编码、用户名、模板编码)施加唯一约束,避免重复。
|
||||
- 索引策略:针对高频过滤/连接/排序字段建立单列索引;对多条件组合查询建立复合索引;对枚举字段建立索引提升筛选效率。
|
||||
- 检查约束:对数值范围进行约束(如权重>0、金额>=0),保证数据质量与业务规则一致性。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
## 架构总览
|
||||
系统采用分层架构,ORM 层负责模型映射与约束声明,迁移层负责表结构演进,运行时提供异步连接与会话管理。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A["前端(Vue)"] --> B["后端(FastAPI)"]
|
||||
B --> C["服务层"]
|
||||
C --> D["ORM(SQLAlchemy)"]
|
||||
D --> E["数据库(PostgreSQL)"]
|
||||
D --> F["索引/约束"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 科室表(departments)
|
||||
- 主键:id(自增)
|
||||
- 唯一索引:code(科室编码)
|
||||
- 单列索引:dept_type(按类型过滤)、parent_id(树形结构查询)
|
||||
- 外键:parent_id 自引用(树形组织)
|
||||
- 设计要点:dept_type 用于快速筛选不同类型的科室;parent_id 支持层级查询;code 唯一保证业务唯一性。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"departments" {
|
||||
id : integer PK
|
||||
code : varchar(20) UK
|
||||
dept_type : enum
|
||||
parent_id : integer FK
|
||||
level : integer
|
||||
sort_order : integer
|
||||
is_active : boolean
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L41)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L41)
|
||||
|
||||
### 员工表(staff)
|
||||
- 主键:id(自增)
|
||||
- 唯一索引:employee_id(工号)
|
||||
- 单列索引:department_id(按科室统计/查询)、status(按状态筛选)
|
||||
- 外键:department_id → departments.id
|
||||
- 设计要点:department_id 与 status 的索引支持按科室聚合与状态筛选;unique 约束保证工号唯一。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"staff" {
|
||||
id : integer PK
|
||||
employee_id : varchar(20) UK
|
||||
department_id : integer FK
|
||||
status : enum
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L42-L64)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L42-L64)
|
||||
|
||||
### 考核指标表(indicators)
|
||||
- 主键:id(自增)
|
||||
- 唯一索引:code(指标编码)
|
||||
- 单列索引:indicator_type(按类型筛选)
|
||||
- 检查约束:weight > 0(权重必须为正数)
|
||||
- 设计要点:唯一编码保证业务唯一;按类型索引支持快速筛选;检查约束保证权重合法性。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"indicators" {
|
||||
id : integer PK
|
||||
code : varchar(20) UK
|
||||
indicator_type : enum
|
||||
weight : numeric(5,2)
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L66-L85)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L66-L85)
|
||||
|
||||
### 考核记录表(assessments)
|
||||
- 主键:id(自增)
|
||||
- 单列索引:staff_id(按员工查询)、status(按状态筛选)
|
||||
- 复合索引:period_year + period_month(按年月组合查询)
|
||||
- 外键:staff_id → staff.id;assessor_id/reviewer_id → staff.id(自关联)
|
||||
- 设计要点:复合索引支持按年月快速定位;staff_id 索引支撑员工维度统计;status 索引便于流程状态筛选。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"assessments" {
|
||||
id : integer PK
|
||||
staff_id : integer FK
|
||||
period_year : integer
|
||||
period_month : integer
|
||||
status : enum
|
||||
assessor_id : integer FK
|
||||
reviewer_id : integer FK
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L87-L112)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L87-L112)
|
||||
|
||||
### 考核明细表(assessment_details)
|
||||
- 主键:id(自增)
|
||||
- 单列索引:assessment_id(按考核记录查询明细)、indicator_id(按指标查询明细)
|
||||
- 外键:assessment_id → assessments.id;indicator_id → indicators.id
|
||||
- 设计要点:双外键字段分别建立单列索引,满足“按记录查明细”和“按指标查明细”的常见查询模式。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"assessment_details" {
|
||||
id : integer PK
|
||||
assessment_id : integer FK
|
||||
indicator_id : integer FK
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L114-L131)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L114-L131)
|
||||
|
||||
### 工资核算表(salary_records)
|
||||
- 主键:id(自增)
|
||||
- 单列索引:staff_id(按员工查询)、status(按状态筛选)
|
||||
- 复合索引:period_year + period_month(按年月组合查询)
|
||||
- 外键:staff_id → staff.id
|
||||
- 设计要点:复合索引支持按年月快速检索;staff_id 索引支撑员工维度统计。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"salary_records" {
|
||||
id : integer PK
|
||||
staff_id : integer FK
|
||||
period_year : integer
|
||||
period_month : integer
|
||||
status : varchar(20)
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
|
||||
### 用户表(users)
|
||||
- 主键:id(自增)
|
||||
- 唯一索引:username(用户名)
|
||||
- 外键:staff_id → staff.id(可选关联)
|
||||
- 设计要点:username 唯一索引支持登录认证;staff_id 外键实现用户与员工的弱关联。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"users" {
|
||||
id : integer PK
|
||||
username : varchar(50) UK
|
||||
staff_id : integer FK
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L244-L260)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L156-L172)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L244-L260)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L156-L172)
|
||||
|
||||
### 绩效计划表(performance_plans)
|
||||
- 主键:id(自增)
|
||||
- 唯一索引:plan_code(计划编码)
|
||||
- 单列索引:plan_level、plan_year、department_id、status
|
||||
- 外键:department_id → departments.id;staff_id → staff.id;submitter_id/approver_id → users.id;parent_plan_id → performance_plans.id(自关联)
|
||||
- 设计要点:多维索引支持按层级、年份、状态、科室等条件筛选;唯一编码保证业务唯一性。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"performance_plans" {
|
||||
id : integer PK
|
||||
plan_code : varchar(50) UK
|
||||
plan_level : enum
|
||||
plan_year : integer
|
||||
department_id : integer FK
|
||||
status : enum
|
||||
parent_plan_id : integer FK
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L270-L311)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L270-L311)
|
||||
|
||||
### 计划-指标关联表(plan_kpi_relations)
|
||||
- 主键:id(自增)
|
||||
- 单列索引:plan_id、indicator_id
|
||||
- 复合唯一索引:plan_id + indicator_id(唯一关联)
|
||||
- 外键:plan_id → performance_plans.id;indicator_id → indicators.id
|
||||
- 设计要点:复合唯一索引防止重复关联;单列索引支撑按计划或指标查询。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"plan_kpi_relations" {
|
||||
id : integer PK
|
||||
plan_id : integer FK
|
||||
indicator_id : integer FK
|
||||
plan_id+indicator_id : unique
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L314-L338)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L41-L63)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L314-L338)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L41-L63)
|
||||
|
||||
### 模板-指标关联表(template_indicators)
|
||||
- 主键:id(自增)
|
||||
- 单列索引:template_id、indicator_id
|
||||
- 复合唯一索引:template_id + indicator_id(唯一关联)
|
||||
- 外键:template_id → indicator_templates.id;indicator_id → indicators.id
|
||||
- 设计要点:与计划-指标关联一致的索引策略,确保模板维度的高效查询。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"template_indicators" {
|
||||
id : integer PK
|
||||
template_id : integer FK
|
||||
indicator_id : integer FK
|
||||
template_id+indicator_id : unique
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L411-L437)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L41-L63)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L411-L437)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L41-L63)
|
||||
|
||||
### 财务核算表(department_finances)
|
||||
- 主键:id(自增)
|
||||
- 单列索引:department_id、finance_type、category
|
||||
- 复合索引:period_year + period_month(按年月组合查询)
|
||||
- 检查约束:amount >= 0(金额非负)
|
||||
- 外键:department_id → departments.id
|
||||
- 设计要点:多维索引支持按科室、类型、类别、期间的高效查询;检查约束保证财务数据的正向性。
|
||||
|
||||
```mermaid
|
||||
erEntity
|
||||
"department_finances" {
|
||||
id : integer PK
|
||||
department_id : integer FK
|
||||
period_year : integer
|
||||
period_month : integer
|
||||
finance_type : enum
|
||||
category : varchar(50)
|
||||
amount : numeric(12,2)
|
||||
created_at : datetime
|
||||
updated_at : datetime
|
||||
}
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
章节来源
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
## 依赖关系分析
|
||||
- 模型层通过 __table_args__ 声明索引与约束,迁移层通过 Alembic 在数据库层面落地。
|
||||
- 外键关系形成稳定的层次结构(如 departments 树形、assessments 与 staff 的自关联)。
|
||||
- 初始化脚本在首次启动时创建表结构并注入基础数据。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "模型定义"
|
||||
MD["models.py"]
|
||||
MF["finance.py"]
|
||||
end
|
||||
subgraph "迁移执行"
|
||||
MI["001_initial.py"]
|
||||
MT["002_template.py"]
|
||||
end
|
||||
subgraph "运行时"
|
||||
DB["database.py"]
|
||||
CFG["config.py"]
|
||||
INIT["init_db.py"]
|
||||
end
|
||||
MD --> MI
|
||||
MF --> MT
|
||||
MI --> DB
|
||||
MT --> DB
|
||||
CFG --> DB
|
||||
INIT --> DB
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [init_db.py](file://backend/init_db.py#L11-L83)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [init_db.py](file://backend/init_db.py#L11-L83)
|
||||
|
||||
## 性能考量
|
||||
- 索引选择原则
|
||||
- 单列索引:适用于等值/范围查询的过滤字段(如 status、dept_type、indicator_type)。
|
||||
- 复合索引:适用于多条件组合查询(如 assessments 的 period_year + period_month,salary_records 的 period_year + period_month,finance 的 period_year + period_month)。
|
||||
- 唯一索引:保证业务唯一性(code、employee_id、username、plan_code、模板-指标唯一组合)。
|
||||
- 查询优化建议
|
||||
- 使用复合索引覆盖多条件过滤,减少回表与排序开销。
|
||||
- 对枚举字段建立索引,提升 IN/等值过滤效率。
|
||||
- 尽量避免 SELECT *,仅选择必要列,降低 IO。
|
||||
- 对大表的分页查询配合 ORDER BY + LIMIT,确保 ORDER BY 列命中索引。
|
||||
- 并发控制
|
||||
- 使用数据库事务隔离级别与锁策略,避免写放大与死锁。
|
||||
- 对高并发写入场景,合理拆分热点表或引入分区(如按年/月分区)。
|
||||
- 控制批量写入批次大小,避免长事务占用资源。
|
||||
- 数据完整性
|
||||
- 外键约束保证引用完整性;唯一约束保证业务唯一性;检查约束保证数值范围合法。
|
||||
- 在 ORM 层与数据库层双重约束,确保数据一致性。
|
||||
|
||||
[本节为通用性能指导,不直接分析具体文件]
|
||||
|
||||
## 故障排查指南
|
||||
- 索引未生效
|
||||
- 检查查询条件是否与索引列顺序匹配(复合索引前缀匹配)。
|
||||
- 使用 EXPLAIN/ANALYZE 分析执行计划,确认索引扫描路径。
|
||||
- 唯一冲突
|
||||
- 当插入重复唯一键时,捕获数据库异常并提示用户修正(如重复工号、重复指标编码)。
|
||||
- 外键约束失败
|
||||
- 确认被引用记录存在且状态有效;检查删除/更新策略(RESTRICT/CASCADE/SET NULL)。
|
||||
- 检查约束失败
|
||||
- 校验输入数据是否满足约束条件(如权重>0、金额>=0);在业务层提前校验,减少数据库往返。
|
||||
|
||||
[本节为通用排查建议,不直接分析具体文件]
|
||||
|
||||
## 结论
|
||||
该系统在索引与约束设计上遵循“业务唯一性优先、高频查询覆盖、枚举与复合索引配合”的原则,结合外键与检查约束,有效保障了数据完整性与查询性能。建议在后续迭代中持续关注查询执行计划与热点表,适时引入分区与物化视图,进一步提升大规模数据下的响应能力。
|
||||
|
||||
[本节为总结性内容,不直接分析具体文件]
|
||||
|
||||
## 附录
|
||||
- 数据库连接与池化配置
|
||||
- 数据库 URL、连接池大小与溢出配置,确保高并发下的稳定性。
|
||||
- 初始化脚本
|
||||
- 首次启动自动创建表结构并注入基础数据,便于开发与测试环境快速就绪。
|
||||
|
||||
章节来源
|
||||
- [config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [init_db.py](file://backend/init_db.py#L11-L83)
|
||||
1164
.qoder/repowiki/zh/content/数据库设计/表结构设计/表结构设计.md
Normal file
1164
.qoder/repowiki/zh/content/数据库设计/表结构设计/表结构设计.md
Normal file
File diff suppressed because it is too large
Load Diff
433
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/系统用户表.md
Normal file
433
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/系统用户表.md
Normal file
@@ -0,0 +1,433 @@
|
||||
# 系统用户表
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [security.py](file://backend/app/core/security.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [init_db.py](file://backend/app/core/init_db.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
系统用户表(users)是医院绩效考核管理系统的核心数据表,负责存储系统用户的认证和授权信息。该表实现了完整的用户身份管理功能,包括用户名密码管理、角色权限控制、员工关联关系、状态管理和登录认证流程。
|
||||
|
||||
本系统采用现代化的安全架构,使用bcrypt进行密码哈希加密,JWT令牌进行无状态认证,并通过角色权限体系实现细粒度的访问控制。用户表与员工表建立了关联关系,支持将系统用户与实际员工身份进行绑定。
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统用户表位于后端应用的数据模型层,采用SQLAlchemy ORM框架进行数据库映射。整个用户管理系统由以下核心组件构成:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据模型层"
|
||||
User[User模型]
|
||||
Staff[Staff模型]
|
||||
Department[Department模型]
|
||||
end
|
||||
subgraph "认证服务层"
|
||||
Security[Security模块]
|
||||
AuthAPI[Auth API路由]
|
||||
Schemas[Schemas定义]
|
||||
end
|
||||
subgraph "配置管理层"
|
||||
Config[Config配置]
|
||||
InitDB[初始化脚本]
|
||||
end
|
||||
User --> Security
|
||||
AuthAPI --> Security
|
||||
Security --> Config
|
||||
InitDB --> User
|
||||
User --> Staff
|
||||
Staff --> Department
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 用户表结构定义
|
||||
|
||||
系统用户表(users)采用完整的字段定义,确保用户管理的完整性和安全性:
|
||||
|
||||
| 字段名 | 类型 | 约束 | 描述 | 默认值 |
|
||||
|--------|------|------|------|--------|
|
||||
| id | Integer | 主键, 自增 | 用户唯一标识符 | 无 |
|
||||
| username | String(50) | 非空, 唯一 | 用户登录名 | 无 |
|
||||
| password_hash | String(255) | 非空 | 密码哈希值 | 无 |
|
||||
| staff_id | Integer | 外键, 可空 | 关联员工ID | NULL |
|
||||
| role | String(20) | 非空 | 用户角色 | "staff" |
|
||||
| is_active | Boolean | 非空 | 账户启用状态 | TRUE |
|
||||
| last_login | DateTime | 可空 | 最后登录时间 | NULL |
|
||||
| created_at | DateTime | 非空 | 创建时间 | 当前时间 |
|
||||
| updated_at | DateTime | 非空 | 更新时间 | 当前时间 |
|
||||
|
||||
### 角色权限体系
|
||||
|
||||
系统实现了三层角色权限控制机制:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "用户角色层次"
|
||||
Admin[管理员<br/>admin]
|
||||
Manager[经理<br/>manager]
|
||||
Staff[普通员工<br/>staff]
|
||||
end
|
||||
subgraph "权限级别"
|
||||
Level1[完全访问权限]
|
||||
Level2[部分管理权限]
|
||||
Level3[基础操作权限]
|
||||
end
|
||||
Admin --> Level1
|
||||
Manager --> Level2
|
||||
Staff --> Level3
|
||||
Level1 --> Admin
|
||||
Level2 --> Manager
|
||||
Level3 --> Staff
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L321-L327)
|
||||
- [security.py](file://backend/app/core/security.py#L94-L109)
|
||||
|
||||
**章节来源**
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L321-L327)
|
||||
- [security.py](file://backend/app/core/security.py#L94-L109)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统用户管理采用分层架构设计,确保安全性和可维护性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant AuthAPI as 认证API
|
||||
participant Security as 安全模块
|
||||
participant DB as 数据库
|
||||
participant JWT as JWT服务
|
||||
Client->>AuthAPI : POST /auth/login
|
||||
AuthAPI->>DB : 查询用户信息
|
||||
DB-->>AuthAPI : 返回用户记录
|
||||
AuthAPI->>Security : 验证密码
|
||||
Security->>Security : bcrypt校验
|
||||
Security-->>AuthAPI : 验证结果
|
||||
AuthAPI->>JWT : 创建访问令牌
|
||||
JWT-->>AuthAPI : 返回JWT令牌
|
||||
AuthAPI-->>Client : 返回访问令牌
|
||||
Note over Client,JWT : 用户认证完成
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [security.py](file://backend/app/core/security.py#L24-L43)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 用户模型类分析
|
||||
|
||||
用户模型类实现了完整的用户实体定义,包含字段映射、约束条件和索引配置:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class User {
|
||||
+int id
|
||||
+string username
|
||||
+string password_hash
|
||||
+int staff_id
|
||||
+string role
|
||||
+boolean is_active
|
||||
+datetime last_login
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+__tablename__ = "users"
|
||||
+__table_args__
|
||||
+Index(idx_user_username)
|
||||
+ForeignKey(staff_id -> staff.id)
|
||||
}
|
||||
class Staff {
|
||||
+int id
|
||||
+string employee_id
|
||||
+string name
|
||||
+int department_id
|
||||
+string position
|
||||
+string title
|
||||
+float base_salary
|
||||
+float performance_ratio
|
||||
+string status
|
||||
+datetime hire_date
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
User --> Staff : "关联员工"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
|
||||
### 登录认证流程
|
||||
|
||||
系统采用OAuth2密码模式结合JWT令牌的认证机制:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([用户发起登录]) --> ValidateInput["验证用户名密码格式"]
|
||||
ValidateInput --> InputValid{"输入有效?"}
|
||||
InputValid --> |否| ReturnError["返回错误信息"]
|
||||
InputValid --> |是| QueryUser["查询用户信息"]
|
||||
QueryUser --> UserExists{"用户存在?"}
|
||||
UserExists --> |否| ReturnError
|
||||
UserExists --> |是| VerifyPassword["验证密码"]
|
||||
VerifyPassword --> PasswordValid{"密码正确?"}
|
||||
PasswordValid --> |否| ReturnError
|
||||
PasswordValid --> |是| CheckActive["检查账户状态"]
|
||||
CheckActive --> IsActive{"账户启用?"}
|
||||
IsActive --> |否| ReturnDisabled["账户已禁用"]
|
||||
IsActive --> |是| CreateToken["创建JWT访问令牌"]
|
||||
CreateToken --> SetLastLogin["更新最后登录时间"]
|
||||
SetLastLogin --> ReturnToken["返回访问令牌"]
|
||||
ReturnError --> End([结束])
|
||||
ReturnDisabled --> End
|
||||
ReturnToken --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L17-L37)
|
||||
- [security.py](file://backend/app/core/security.py#L24-L31)
|
||||
|
||||
### 密码安全管理
|
||||
|
||||
系统采用bcrypt算法进行密码哈希处理,确保密码存储的安全性:
|
||||
|
||||
| 安全特性 | 实现方式 | 说明 |
|
||||
|----------|----------|------|
|
||||
| 密码哈希 | bcrypt | 使用bcrypt.gensalt()生成盐值 |
|
||||
| 哈希验证 | bcrypt.checkpw() | 验证原始密码与哈希值匹配 |
|
||||
| 令牌加密 | HS256算法 | 使用SECRET_KEY进行JWT签名 |
|
||||
| 过期时间 | 8小时 | ACCESS_TOKEN_EXPIRE_MINUTES=480 |
|
||||
| 传输安全 | HTTPS | 生产环境建议启用HTTPS |
|
||||
|
||||
**章节来源**
|
||||
- [security.py](file://backend/app/core/security.py#L18-L43)
|
||||
- [config.py](file://backend/app/core/config.py#L23-L26)
|
||||
|
||||
### 用户状态管理
|
||||
|
||||
系统实现了灵活的用户状态管理机制:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Active : 创建用户时默认激活
|
||||
Active --> Disabled : 管理员禁用账户
|
||||
Disabled --> Active : 管理员重新激活
|
||||
Active --> [*] : 账户删除
|
||||
note right of Active
|
||||
可正常登录
|
||||
可访问系统功能
|
||||
end note
|
||||
note right of Disabled
|
||||
无法登录系统
|
||||
访问被拒绝
|
||||
end note
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L252-L254)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L91)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L252-L254)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L91)
|
||||
|
||||
### 员工关联关系
|
||||
|
||||
用户表与员工表建立了可选的一对一关联关系:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
float base_salary
|
||||
float performance_ratio
|
||||
string status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
USERS {
|
||||
int id PK
|
||||
string username UK
|
||||
string password_hash
|
||||
int staff_id FK
|
||||
string role
|
||||
boolean is_active
|
||||
datetime last_login
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF ||--o| USERS : "关联"
|
||||
note for STAFF "员工表"
|
||||
note for USERS "用户表"
|
||||
note for USERS "staff_id -> staff.id"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统用户管理模块的依赖关系如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "外部依赖"
|
||||
SQLAlchemy[SQLAlchemy ORM]
|
||||
Bcrypt[bcrypt加密库]
|
||||
JWT[jose JWT库]
|
||||
FastAPI[FastAPI框架]
|
||||
end
|
||||
subgraph "内部模块"
|
||||
UserModel[User模型]
|
||||
SecurityModule[安全模块]
|
||||
AuthAPI[认证API]
|
||||
ConfigModule[配置模块]
|
||||
end
|
||||
subgraph "数据库层"
|
||||
UsersTable[users表]
|
||||
StaffTable[staff表]
|
||||
end
|
||||
SQLAlchemy --> UserModel
|
||||
Bcrypt --> SecurityModule
|
||||
JWT --> SecurityModule
|
||||
FastAPI --> AuthAPI
|
||||
UserModel --> UsersTable
|
||||
UserModel --> StaffTable
|
||||
SecurityModule --> UserModel
|
||||
AuthAPI --> SecurityModule
|
||||
ConfigModule --> SecurityModule
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L16)
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L1-L14)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L16)
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L1-L14)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库性能优化
|
||||
|
||||
1. **索引策略**
|
||||
- 用户名唯一索引:支持快速用户名查找
|
||||
- 复合索引:用于常用查询条件组合
|
||||
|
||||
2. **连接池配置**
|
||||
- 数据库连接池大小:20
|
||||
- 最大溢出连接:10
|
||||
- 异步数据库连接:提升并发性能
|
||||
|
||||
3. **缓存策略**
|
||||
- JWT令牌本地缓存:减少数据库查询
|
||||
- 用户权限缓存:避免重复权限验证
|
||||
|
||||
### 安全性能平衡
|
||||
|
||||
1. **密码哈希成本**
|
||||
- bcrypt默认成本因子:提供良好安全性
|
||||
- 可根据硬件性能调整成本因子
|
||||
|
||||
2. **令牌过期策略**
|
||||
- 8小时有效期:平衡安全性与用户体验
|
||||
- 可配置的过期时间
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
| 问题类型 | 症状 | 可能原因 | 解决方案 |
|
||||
|----------|------|----------|----------|
|
||||
| 登录失败 | 401未授权错误 | 用户名或密码错误 | 检查用户名密码,确认大小写 |
|
||||
| 账户禁用 | 403禁止访问 | 用户被管理员禁用 | 联系管理员重新激活 |
|
||||
| 密码错误 | 验证失败 | bcrypt哈希不匹配 | 确认密码正确性 |
|
||||
| 令牌过期 | 401未授权 | JWT过期 | 重新登录获取新令牌 |
|
||||
| 数据库连接 | 连接超时 | 连接池耗尽 | 增加连接池大小 |
|
||||
|
||||
### 调试工具和方法
|
||||
|
||||
1. **日志分析**
|
||||
- 查看认证API日志
|
||||
- 监控数据库查询性能
|
||||
- 跟踪JWT令牌生命周期
|
||||
|
||||
2. **数据库检查**
|
||||
```sql
|
||||
-- 检查用户表结构
|
||||
SELECT * FROM users LIMIT 1;
|
||||
|
||||
-- 验证用户存在性
|
||||
SELECT COUNT(*) FROM users WHERE username = 'admin';
|
||||
|
||||
-- 检查密码哈希
|
||||
SELECT username, password_hash FROM users WHERE username = 'admin';
|
||||
```
|
||||
|
||||
3. **配置验证**
|
||||
- 检查SECRET_KEY配置
|
||||
- 验证ACCESS_TOKEN_EXPIRE_MINUTES设置
|
||||
- 确认CORS配置正确
|
||||
|
||||
**章节来源**
|
||||
- [auth.py](file://backend/app/api/v1/auth.py#L30-L34)
|
||||
- [security.py](file://backend/app/core/security.py#L55-L82)
|
||||
|
||||
## 结论
|
||||
|
||||
系统用户表(users)作为医院绩效考核管理系统的核心组件,实现了完整的用户身份管理功能。通过采用bcrypt密码哈希、JWT令牌认证和三层角色权限控制,系统确保了用户管理的安全性和灵活性。
|
||||
|
||||
用户表的设计充分考虑了医院管理的实际需求,支持与员工表的关联管理,实现了用户身份与实际工作职责的绑定。同时,系统的异步数据库连接和连接池配置保证了良好的性能表现。
|
||||
|
||||
建议在生产环境中:
|
||||
1. 定期更新SECRET_KEY并妥善保管
|
||||
2. 配置HTTPS确保传输安全
|
||||
3. 设置合理的密码复杂度要求
|
||||
4. 定期审查用户权限分配
|
||||
5. 监控用户登录活动日志
|
||||
|
||||
通过这些措施,可以确保系统用户管理的安全性和可靠性,为医院绩效管理提供坚实的技术支撑。
|
||||
394
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/系统菜单表.md
Normal file
394
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/系统菜单表.md
Normal file
@@ -0,0 +1,394 @@
|
||||
# 系统菜单表
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue)
|
||||
- [menu.js](file://frontend/src/api/menu.js)
|
||||
- [security.py](file://backend/app/core/security.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)
|
||||
- [create_menu_tables.py](file://backend/create_menu_tables.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
系统菜单表(menus)是医院绩效考核管理系统的核心导航组件,负责管理整个系统的菜单结构、权限控制和用户界面导航。该表采用自引用的树形结构设计,支持多层级菜单组织,并通过权限标识实现细粒度的访问控制。
|
||||
|
||||
本系统采用前后端分离架构,后端使用FastAPI + SQLAlchemy,前端使用Vue.js + Element Plus,实现了完整的菜单管理功能,包括菜单树形展示、权限控制、动态路由生成等特性。
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统菜单表位于后端应用的models模块中,与API接口、服务层和前端界面形成完整的菜单管理生态系统:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端架构"
|
||||
Models[数据模型层<br/>models.py]
|
||||
API[API接口层<br/>menus.py]
|
||||
Service[服务层<br/>menu_service.py]
|
||||
Schemas[数据模式<br/>schemas.py]
|
||||
Security[安全认证<br/>security.py]
|
||||
end
|
||||
subgraph "前端架构"
|
||||
Vue[Vue组件<br/>Menus.vue]
|
||||
Api[API调用<br/>menu.js]
|
||||
end
|
||||
subgraph "数据库层"
|
||||
DB[(PostgreSQL数据库)]
|
||||
MenusTable[menus表]
|
||||
end
|
||||
Vue --> Api
|
||||
Api --> API
|
||||
API --> Service
|
||||
Service --> Models
|
||||
Models --> DB
|
||||
DB --> MenusTable
|
||||
Security --> API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 数据模型定义
|
||||
|
||||
系统菜单表采用SQLAlchemy ORM映射,定义了完整的菜单结构和业务规则:
|
||||
|
||||
| 字段名称 | 数据类型 | 约束条件 | 描述 | 默认值 |
|
||||
|---------|---------|---------|------|--------|
|
||||
| id | Integer | 主键, 自增 | 菜单唯一标识符 | - |
|
||||
| parent_id | Integer | 外键(menus.id), 可空 | 父菜单ID | NULL |
|
||||
| menu_type | Enum | 必填, 菜单类型 | 菜单类型(MENU/BUTTON) | MENU |
|
||||
| menu_name | String(100) | 必填, 非空 | 菜单显示名称 | - |
|
||||
| menu_icon | String(50) | 可空 | Element Plus图标名称 | NULL |
|
||||
| path | String(200) | 必填, 非空 | Vue Router路由路径 | - |
|
||||
| component | String(200) | 可空 | 组件路径 | NULL |
|
||||
| permission | String(100) | 可空 | 权限标识符 | NULL |
|
||||
| sort_order | Integer | 必填, ≥0 | 排序权重 | 0 |
|
||||
| is_visible | Boolean | 必填 | 是否对用户可见 | TRUE |
|
||||
| is_active | Boolean | 必填 | 是否启用 | TRUE |
|
||||
| created_at | DateTime | 必填 | 创建时间 | 当前时间 |
|
||||
| updated_at | DateTime | 必填 | 更新时间 | 当前时间 |
|
||||
|
||||
### 菜单类型定义
|
||||
|
||||
系统支持两种菜单类型,用于不同的导航需求:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MenuType {
|
||||
<<enumeration>>
|
||||
MENU : "menu"
|
||||
BUTTON : "button"
|
||||
}
|
||||
class Menu {
|
||||
+int id
|
||||
+int parent_id
|
||||
+MenuType menu_type
|
||||
+string menu_name
|
||||
+string menu_icon
|
||||
+string path
|
||||
+string component
|
||||
+string permission
|
||||
+int sort_order
|
||||
+bool is_visible
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
Menu --> MenuType : uses
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L341-L345)
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L341-L373)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构设计,确保菜单管理功能的可维护性和扩展性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Frontend as 前端界面
|
||||
participant API as API接口
|
||||
participant Service as 服务层
|
||||
participant Model as 数据模型
|
||||
participant DB as 数据库
|
||||
Frontend->>API : GET /menus/tree
|
||||
API->>Service : get_tree(visible_only)
|
||||
Service->>Model : 查询菜单树
|
||||
Model->>DB : SQL查询
|
||||
DB-->>Model : 返回结果集
|
||||
Model-->>Service : 菜单对象列表
|
||||
Service->>Service : 转换为字典格式
|
||||
Service-->>API : 菜单树数据
|
||||
API-->>Frontend : JSON响应
|
||||
Note over Frontend,DB : 用户权限验证由安全中间件处理
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L17-L29)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
|
||||
**章节来源**
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 后端API接口
|
||||
|
||||
系统提供了完整的菜单管理RESTful API,支持CRUD操作和菜单树查询:
|
||||
|
||||
#### 菜单树查询接口
|
||||
```mermaid
|
||||
flowchart TD
|
||||
GetTree[GET /menus/tree] --> ValidateParams[验证请求参数]
|
||||
ValidateParams --> CheckPermissions[检查用户权限]
|
||||
CheckPermissions --> BuildQuery[构建查询条件]
|
||||
BuildQuery --> ApplyFilters[应用过滤器]
|
||||
ApplyFilters --> ExecuteQuery[执行数据库查询]
|
||||
ExecuteQuery --> TransformData[转换数据格式]
|
||||
TransformData --> ReturnResponse[返回响应]
|
||||
CheckPermissions --> |用户未认证| Unauthorized[401 未授权]
|
||||
CheckPermissions --> |用户被禁用| Forbidden[403 禁止访问]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L17-L29)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L91)
|
||||
|
||||
#### 菜单管理操作
|
||||
系统支持以下主要操作:
|
||||
- **创建菜单**: POST `/menus` - 需要管理员或经理权限
|
||||
- **更新菜单**: PUT `/menus/{menu_id}` - 需要管理员或经理权限
|
||||
- **删除菜单**: DELETE `/menus/{menu_id}` - 需要管理员或经理权限
|
||||
- **初始化菜单**: POST `/menus/init` - 需要管理员权限
|
||||
|
||||
**章节来源**
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L98-L164)
|
||||
|
||||
### 服务层实现
|
||||
|
||||
服务层负责业务逻辑处理和数据访问:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MenuService {
|
||||
+get_tree(db, visible_only) List[Dict]
|
||||
+get_list(db, menu_type, is_visible) List[Menu]
|
||||
+get_by_id(db, menu_id) Menu
|
||||
+create(db, menu_data) Menu
|
||||
+update(db, menu_id, menu_data) Menu
|
||||
+delete(db, menu_id) bool
|
||||
+init_default_menus(db) void
|
||||
-_menu_to_dict(menu) Dict
|
||||
}
|
||||
class MenuRepository {
|
||||
+find_all() List[Menu]
|
||||
+find_by_id(id) Menu
|
||||
+save(menu) Menu
|
||||
+delete(menu) void
|
||||
}
|
||||
MenuService --> MenuRepository : uses
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L12-L137)
|
||||
|
||||
**章节来源**
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
|
||||
### 前端界面实现
|
||||
|
||||
前端使用Vue.js实现菜单管理界面,提供直观的可视化操作:
|
||||
|
||||
#### 菜单管理界面功能
|
||||
- **菜单树形展示**: 使用Element Plus Tree组件展示层级关系
|
||||
- **表单编辑**: 支持菜单属性的增删改查
|
||||
- **权限控制**: 基于用户角色的界面元素显示
|
||||
- **实时预览**: 修改后的菜单效果即时反映
|
||||
|
||||
**章节来源**
|
||||
- [Menus.vue](file://frontend/src/views/system/Menus.vue#L1-L265)
|
||||
|
||||
### 权限控制系统
|
||||
|
||||
系统通过多种机制实现菜单权限控制:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph "权限层次"
|
||||
Role[用户角色<br/>admin/manager/staff]
|
||||
Permission[权限标识<br/>system:menu:*]
|
||||
Menu[菜单权限<br/>menu.permission]
|
||||
end
|
||||
subgraph "验证流程"
|
||||
Request[请求到达]
|
||||
CheckRole[检查角色]
|
||||
CheckPermission[检查权限]
|
||||
CheckMenu[检查菜单权限]
|
||||
Allow[允许访问]
|
||||
Deny[拒绝访问]
|
||||
end
|
||||
Request --> CheckRole
|
||||
CheckRole --> CheckPermission
|
||||
CheckPermission --> CheckMenu
|
||||
CheckMenu --> |满足条件| Allow
|
||||
CheckMenu --> |不满足| Deny
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [security.py](file://backend/app/core/security.py#L94-L109)
|
||||
- [models.py](file://backend/app/models/models.py#L358-L358)
|
||||
|
||||
**章节来源**
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L584-L638)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统菜单表与其他组件的依赖关系如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "核心依赖"
|
||||
MenuModel[Menu模型<br/>models.py]
|
||||
MenuAPI[菜单API<br/>menus.py]
|
||||
MenuService[菜单服务<br/>menu_service.py]
|
||||
MenuSchema[菜单模式<br/>schemas.py]
|
||||
end
|
||||
subgraph "安全依赖"
|
||||
Security[安全模块<br/>security.py]
|
||||
User[用户模型<br/>models.py]
|
||||
end
|
||||
subgraph "前端依赖"
|
||||
MenuView[菜单视图<br/>Menus.vue]
|
||||
MenuAPIJS[菜单API<br/>menu.js]
|
||||
end
|
||||
subgraph "数据库依赖"
|
||||
Database[(PostgreSQL)]
|
||||
Migration[数据库迁移<br/>alembic]
|
||||
end
|
||||
MenuAPI --> MenuService
|
||||
MenuService --> MenuModel
|
||||
MenuAPI --> Security
|
||||
Security --> User
|
||||
MenuView --> MenuAPIJS
|
||||
MenuAPIJS --> MenuAPI
|
||||
MenuModel --> Database
|
||||
Migration --> Database
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
1. **索引设计**: 菜单表建立了多个复合索引以优化查询性能
|
||||
2. **懒加载**: 使用selectinload优化N+1查询问题
|
||||
3. **条件过滤**: 支持按类型和可见性进行快速过滤
|
||||
4. **缓存策略**: 可考虑在应用层实现菜单树缓存
|
||||
|
||||
### 数据库设计优化
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
MENUS {
|
||||
integer id PK
|
||||
integer parent_id FK
|
||||
string menu_type
|
||||
string menu_name
|
||||
string menu_icon
|
||||
string path
|
||||
string component
|
||||
string permission
|
||||
integer sort_order
|
||||
boolean is_visible
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
MENUS }o--|| MENUS : "parent_id -> id"
|
||||
INDEXES {
|
||||
idx_menu_parent parent_id
|
||||
idx_menu_type menu_type
|
||||
idx_menu_visible is_visible
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L368-L372)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L368-L372)
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 菜单权限问题
|
||||
- **问题**: 用户无法看到某些菜单
|
||||
- **原因**: 菜单is_visible=false或用户权限不足
|
||||
- **解决**: 检查菜单的is_visible状态和用户的role字段
|
||||
|
||||
#### 菜单树加载失败
|
||||
- **问题**: 菜单树无法正常显示
|
||||
- **原因**: 数据库连接问题或查询条件错误
|
||||
- **解决**: 检查数据库连接配置和索引完整性
|
||||
|
||||
#### 权限验证失败
|
||||
- **问题**: API请求返回403错误
|
||||
- **原因**: 用户角色不是admin或manager
|
||||
- **解决**: 确认用户角色配置和权限分配
|
||||
|
||||
**章节来源**
|
||||
- [security.py](file://backend/app/core/security.py#L94-L109)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L98-L164)
|
||||
|
||||
## 结论
|
||||
|
||||
系统菜单表设计合理,实现了完整的菜单管理功能。通过清晰的分层架构、完善的权限控制和良好的扩展性,为医院绩效考核管理系统提供了可靠的导航基础。
|
||||
|
||||
关键优势包括:
|
||||
- **灵活的树形结构**: 支持任意层级的菜单组织
|
||||
- **细粒度权限控制**: 通过权限标识实现精确的访问控制
|
||||
- **前后端协同**: 前端提供直观的操作界面,后端保证数据一致性
|
||||
- **可扩展性**: 易于添加新的菜单类型和权限规则
|
||||
|
||||
建议在生产环境中重点关注数据库性能优化和权限配置的安全性,确保系统的稳定运行。
|
||||
388
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/绩效计划表.md
Normal file
388
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/绩效计划表.md
Normal file
@@ -0,0 +1,388 @@
|
||||
# 绩效计划表
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
|
||||
- [performance_plan.js](file://frontend/src/api/performance_plan.js)
|
||||
- [Plans.vue](file://frontend/src/views/plan/Plans.vue)
|
||||
- [create_plan_tables.py](file://backend/create_plan_tables.py)
|
||||
- [详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“绩效计划表”(performance_plans)的完整设计与实现,涵盖字段定义、层级设计理念、状态流转机制、审批流程、版本控制与激活管理、以及与科室、员工、用户的关联关系。同时提供创建、审批、执行的最佳实践与流程规范,帮助读者快速理解并正确使用该模块。
|
||||
|
||||
## 项目结构
|
||||
后端采用分层架构:
|
||||
- 数据模型层:定义实体与关系
|
||||
- 模式层:定义请求/响应数据结构
|
||||
- API 层:暴露 REST 接口
|
||||
- 服务层:封装业务逻辑
|
||||
- 前端:调用 API 并呈现交互
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_API["performance_plan.js<br/>前端API封装"]
|
||||
FE_VIEW["Plans.vue<br/>计划管理视图"]
|
||||
end
|
||||
subgraph "后端"
|
||||
API["performance_plans.py<br/>API路由"]
|
||||
SVC["performance_plan_service.py<br/>服务层"]
|
||||
MODELS["models.py<br/>数据模型"]
|
||||
SCHEMAS["schemas.py<br/>数据模式"]
|
||||
end
|
||||
FE_API --> API
|
||||
FE_VIEW --> FE_API
|
||||
API --> SVC
|
||||
SVC --> MODELS
|
||||
API --> SCHEMAS
|
||||
SVC --> SCHEMAS
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [models.py](file://backend/app/models/models.py#L270-L338)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L519-L570)
|
||||
- [performance_plan.js](file://frontend/src/api/performance_plan.js#L1-L67)
|
||||
- [Plans.vue](file://frontend/src/views/plan/Plans.vue#L1-L742)
|
||||
|
||||
章节来源
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [models.py](file://backend/app/models/models.py#L270-L338)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L519-L570)
|
||||
- [performance_plan.js](file://frontend/src/api/performance_plan.js#L1-L67)
|
||||
- [Plans.vue](file://frontend/src/views/plan/Plans.vue#L1-L742)
|
||||
|
||||
## 核心组件
|
||||
- 绩效计划表:存储计划基本信息、层级、年度/月份、状态、审批信息、版本与激活状态等
|
||||
- 计划指标关联表:将计划与指标绑定,记录目标值、权重、评分方法与参数
|
||||
- 相关枚举:计划层级、计划状态、用户、科室类型等
|
||||
- API/服务:提供 CRUD、提交、审批、激活、树形结构、统计等能力
|
||||
- 前端:提供列表、树形、统计卡片、表单编辑与操作按钮
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L270-L338)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L519-L570)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [performance_plan.js](file://frontend/src/api/performance_plan.js#L1-L67)
|
||||
- [Plans.vue](file://frontend/src/views/plan/Plans.vue#L1-L742)
|
||||
|
||||
## 架构总览
|
||||
系统围绕“计划-指标-执行-结果”的闭环展开,前端通过 API 进行交互,后端服务层负责状态机与业务规则,模型层映射到数据库表。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant FE as "前端"
|
||||
participant API as "API路由"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库"
|
||||
U->>FE : 打开计划管理页面
|
||||
FE->>API : GET /plans 列表查询
|
||||
API->>SVC : get_list()
|
||||
SVC->>DB : 查询计划+关联
|
||||
DB-->>SVC : 计划列表
|
||||
SVC-->>API : 返回数据
|
||||
API-->>FE : 渲染列表
|
||||
U->>FE : 新建/编辑计划
|
||||
FE->>API : POST/PUT /plans
|
||||
API->>SVC : create/update
|
||||
SVC->>DB : 写入计划/更新
|
||||
DB-->>SVC : 提交成功
|
||||
SVC-->>API : 返回结果
|
||||
API-->>FE : 成功提示
|
||||
U->>FE : 提交/审批/激活
|
||||
FE->>API : POST /{id}/submit | approve | activate
|
||||
API->>SVC : submit/approve/activate
|
||||
SVC->>DB : 更新状态/时间/审批人
|
||||
DB-->>SVC : 提交成功
|
||||
SVC-->>API : 返回结果
|
||||
API-->>FE : 成功提示
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L161-L241)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
|
||||
- [performance_plan.js](file://frontend/src/api/performance_plan.js#L24-L46)
|
||||
- [Plans.vue](file://frontend/src/views/plan/Plans.vue#L567-L608)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 数据模型与字段定义
|
||||
- 绩效计划表字段
|
||||
- 计划名称、编码、层级(hospital/department/individual)、年度、月份(月度计划可选)、计划类型(annual/monthly)
|
||||
- 所属科室、责任人、上级计划(父子关系)
|
||||
- 描述、战略目标、关键举措
|
||||
- 状态(draft/pending/approved/rejected/active/completed/cancelled)
|
||||
- 提交人、提交时间、审批人、审批时间、审批意见
|
||||
- 版本号、激活状态、创建/更新时间
|
||||
- 计划指标关联表字段
|
||||
- 计划ID、指标ID、目标值、目标单位、权重、评分方法、评分参数(JSON)、备注
|
||||
- 关联关系
|
||||
- 计划与科室、员工、用户(提交人/审批人)的多对一
|
||||
- 计划与指标的多对多(通过关联表)
|
||||
- 计划的父子层级(自关联)
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
PERFORMANCE_PLANS {
|
||||
int id PK
|
||||
string plan_name
|
||||
string plan_code UK
|
||||
enum plan_level
|
||||
int plan_year
|
||||
int plan_month
|
||||
string plan_type
|
||||
int department_id FK
|
||||
int staff_id FK
|
||||
int parent_plan_id FK
|
||||
text description
|
||||
text strategic_goals
|
||||
text key_initiatives
|
||||
enum status
|
||||
int submitter_id FK
|
||||
datetime submit_time
|
||||
int approver_id FK
|
||||
datetime approve_time
|
||||
text approve_remark
|
||||
int version
|
||||
bool is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
PLAN_KPI_RELATIONS {
|
||||
int id PK
|
||||
int plan_id FK
|
||||
int indicator_id FK
|
||||
float target_value
|
||||
string target_unit
|
||||
float weight
|
||||
string scoring_method
|
||||
text scoring_params
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS ||--o{ PERFORMANCE_PLANS : "所属科室"
|
||||
STAFF ||--o{ PERFORMANCE_PLANS : "责任人"
|
||||
USERS ||--o{ PERFORMANCE_PLANS : "提交人/审批人"
|
||||
PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : "包含"
|
||||
INDICATORS ||--o{ PLAN_KPI_RELATIONS : "关联指标"
|
||||
PERFORMANCE_PLANS ||--o{ PERFORMANCE_PLANS : "父子层级"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L270-L338)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L270-L338)
|
||||
|
||||
### 计划层级设计理念与使用场景
|
||||
- 医院级:由院领导制定年度战略目标与关键举措,作为全院计划的顶层目标
|
||||
- 科室级:各科室依据医院级计划分解为本科室的KPI与目标值,形成可执行的中期计划
|
||||
- 个人级:员工依据科室计划制定个人绩效计划,承接关键举措与目标
|
||||
- 层级关系:支持父子计划,便于逐级分解与汇总
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L263-L268)
|
||||
- [详细设计.md](file://docs/详细设计.md#L59-L67)
|
||||
|
||||
### 计划状态管理与流转机制
|
||||
状态机如下:
|
||||
- 草稿(draft) → 待审批(pending):提交
|
||||
- 待审批(pending) → 已批准(approved)/已驳回(rejected):审批
|
||||
- 已批准(approved) → 执行中(active):激活
|
||||
- 执行中(active) → 已完成(completed)/已取消(cancelled):根据业务需要变更
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 待审批 : "提交"
|
||||
待审批 --> 已批准 : "审批通过"
|
||||
待审批 --> 已驳回 : "审批驳回"
|
||||
已批准 --> 执行中 : "激活"
|
||||
执行中 --> 已完成 : "计划完成"
|
||||
执行中 --> 已取消 : "计划取消"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L233-L241)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L233-L241)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
|
||||
|
||||
### 计划与科室、员工、用户的关联关系
|
||||
- 所属科室:通过外键关联科室表,支持层级树形展示
|
||||
- 责任人:通过外键关联员工表,体现计划执行主体
|
||||
- 提交人/审批人:通过外键关联用户表,记录流程责任人
|
||||
- 计划指标:通过关联表与指标表建立多对多关系,支持权重与评分参数配置
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L299-L304)
|
||||
- [models.py](file://backend/app/models/models.py#L314-L338)
|
||||
|
||||
### 计划审批流程、版本控制与激活管理
|
||||
- 审批流程
|
||||
- 提交:将状态从草稿转为待审批,并记录提交时间
|
||||
- 审批:仅允许处于待审批状态的计划进行审批,通过则进入已批准,否则进入已驳回
|
||||
- 激活:仅已批准的计划可激活,进入执行中并标记为启用
|
||||
- 版本控制
|
||||
- 计划表包含版本号字段,支持后续扩展为版本分支/历史版本追踪
|
||||
- 激活状态管理
|
||||
- is_active 字段与状态共同决定计划是否处于执行中
|
||||
|
||||
章节来源
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L194-L241)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
|
||||
- [models.py](file://backend/app/models/models.py#L293-L294)
|
||||
|
||||
### 前端交互与最佳实践
|
||||
- 列表与树形:支持按层级、年度、状态筛选,树形结构展示父子关系
|
||||
- 统计卡片:直观展示各状态数量,便于管理层监控
|
||||
- 表单编辑:支持计划层级、年度/月份、所属科室、责任人、上级计划、KPI关联等
|
||||
- 最佳实践
|
||||
- 新建计划时先完善KPI关联,再提交审批
|
||||
- 审批前确保KPI权重与目标值合理,避免反复退回
|
||||
- 激活前完成所有前置准备(如指标模板、数据源配置)
|
||||
|
||||
章节来源
|
||||
- [performance_plan.js](file://frontend/src/api/performance_plan.js#L1-L67)
|
||||
- [Plans.vue](file://frontend/src/views/plan/Plans.vue#L1-L742)
|
||||
|
||||
## 依赖关系分析
|
||||
- API 依赖服务层,服务层依赖模型层与模式层
|
||||
- 前端通过 API 封装调用后端接口
|
||||
- 计划与指标通过关联表解耦,支持灵活扩展
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE["前端视图/接口"] --> API["API路由"]
|
||||
API --> SVC["服务层"]
|
||||
SVC --> MODELS["数据模型"]
|
||||
API --> SCHEMAS["数据模式"]
|
||||
SVC --> SCHEMAS
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [models.py](file://backend/app/models/models.py#L270-L338)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L519-L570)
|
||||
|
||||
章节来源
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [models.py](file://backend/app/models/models.py#L270-L338)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L519-L570)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化:列表接口支持按层级、年度、状态、科室过滤,配合索引提升查询效率
|
||||
- 关联加载:详情接口按需加载科室、员工、指标关联,避免 N+1 查询
|
||||
- 分页与统计:提供分页与统计接口,降低大数据量下的前端渲染压力
|
||||
- 状态机幂等:服务层对状态转换进行边界检查,避免重复提交导致的状态错乱
|
||||
|
||||
章节来源
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L19-L59)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L62-L73)
|
||||
|
||||
## 故障排查指南
|
||||
- 提交失败:检查计划状态是否为草稿,若非草稿则无法提交
|
||||
- 审批失败:检查计划状态是否为待审批,若非待审批则无法审批
|
||||
- 激活失败:检查计划状态是否为已批准,若非已批准则无法激活
|
||||
- 删除失败:确认计划是否存在且满足删除条件
|
||||
- 前端无数据:检查筛选条件(层级/年度/状态/科室)是否过于严格
|
||||
|
||||
章节来源
|
||||
- [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#L194-L257)
|
||||
|
||||
## 结论
|
||||
绩效计划表模块通过清晰的层级设计、严谨的状态机与完善的审批流程,实现了从战略到执行的闭环管理。结合前端可视化与后端服务层的边界控制,能够有效支撑医院级、科室级与个人级的绩效计划制定与执行。建议在实际使用中遵循“先完善KPI、再提交审批、再激活执行”的流程,确保计划的可执行性与可追溯性。
|
||||
|
||||
## 附录
|
||||
|
||||
### 字段对照表(计划表)
|
||||
- 计划名称:字符串,必填
|
||||
- 计划编码:字符串,唯一,必填
|
||||
- 计划层级:枚举(hospital/department/individual),必填
|
||||
- 计划年度:整数,必填
|
||||
- 计划月份:整数(月度计划可选)
|
||||
- 计划类型:字符串(annual/monthly),默认annual
|
||||
- 所属科室ID:整数(可选)
|
||||
- 责任人ID:整数(可选)
|
||||
- 上级计划ID:整数(可选)
|
||||
- 描述:文本(可选)
|
||||
- 战略目标:文本(可选)
|
||||
- 关键举措:文本(可选)
|
||||
- 状态:枚举(draft/pending/approved/rejected/active/completed/cancelled),默认draft
|
||||
- 提交人ID:整数(可选)
|
||||
- 提交时间:时间戳(可选)
|
||||
- 审批人ID:整数(可选)
|
||||
- 审批时间:时间戳(可选)
|
||||
- 审批意见:文本(可选)
|
||||
- 版本号:整数,默认1
|
||||
- 是否启用:布尔,默认true
|
||||
- 创建/更新时间:时间戳
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L270-L296)
|
||||
|
||||
### 字段对照表(计划指标关联表)
|
||||
- 计划ID:整数,必填
|
||||
- 指标ID:整数,必填
|
||||
- 目标值:数值(可选)
|
||||
- 目标单位:字符串(可选)
|
||||
- 权重:数值,默认1.0
|
||||
- 评分方法:字符串(可选)
|
||||
- 评分参数:JSON(可选)
|
||||
- 备注:文本(可选)
|
||||
- 创建/更新时间:时间戳
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L314-L328)
|
||||
|
||||
### API 接口一览
|
||||
- GET /plans:获取计划列表(支持层级/年度/科室/状态筛选)
|
||||
- GET /plans/tree:获取计划树形结构
|
||||
- GET /plans/stats:获取计划统计
|
||||
- GET /plans/{id}:获取计划详情(含KPI关联)
|
||||
- POST /plans:创建计划(支持KPI关联)
|
||||
- PUT /plans/{id}:更新计划
|
||||
- POST /{id}/submit:提交计划
|
||||
- POST /{id}/approve:审批计划(通过/驳回)
|
||||
- POST /{id}/activate:激活计划
|
||||
- DELETE /{id}:删除计划
|
||||
- POST /{plan_id}/kpi-relations:添加KPI关联
|
||||
- PUT /kpi-relations/{relation_id}:更新KPI关联
|
||||
- DELETE /kpi-relations/{relation_id}:删除KPI关联
|
||||
|
||||
章节来源
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L310)
|
||||
- [performance_plan.js](file://frontend/src/api/performance_plan.js#L1-L67)
|
||||
|
||||
### 数据库初始化
|
||||
- 使用脚本创建计划相关表,确保表结构与模型一致
|
||||
|
||||
章节来源
|
||||
- [create_plan_tables.py](file://backend/create_plan_tables.py#L1-L20)
|
||||
418
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/考核指标模板表.md
Normal file
418
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/考核指标模板表.md
Normal file
@@ -0,0 +1,418 @@
|
||||
# 考核指标模板表
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [template_service.py](file://backend/app/services/template_service.py)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue)
|
||||
- [template.js](file://frontend/src/api/template.js)
|
||||
- [database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件详细说明考核指标模板表(indicator_templates)的设计与实现,涵盖模板表的完整字段定义、模板类型设计理念与适用场景、维度权重配置、模板激活状态管理、模板与指标的关联关系以及模板指标关联表的作用。同时提供模板创建、版本管理、模板应用的最佳实践和使用指南,并给出模板设计、维护、应用的规范和注意事项。
|
||||
|
||||
## 项目结构
|
||||
本项目采用前后端分离架构,后端使用FastAPI + SQLAlchemy,前端使用Vue.js + Element Plus。模板功能涉及以下关键文件:
|
||||
- 数据模型:定义模板表、指标表、模板指标关联表及其关系
|
||||
- 迁移脚本:创建模板表及关联字段
|
||||
- 初始化脚本:提供预设模板数据
|
||||
- API路由:提供模板的增删改查接口
|
||||
- 服务层:封装模板业务逻辑
|
||||
- 前端页面:提供模板管理界面
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
Models["models.py<br/>数据模型"]
|
||||
Migration["002_template.py<br/>数据库迁移"]
|
||||
InitScript["init_templates.py<br/>模板初始化脚本"]
|
||||
APITemplates["templates.py<br/>模板API路由"]
|
||||
Service["template_service.py<br/>模板服务层"]
|
||||
end
|
||||
subgraph "前端"
|
||||
View["Templates.vue<br/>模板管理视图"]
|
||||
API["template.js<br/>前端API封装"]
|
||||
end
|
||||
Models --> Migration
|
||||
Models --> APITemplates
|
||||
APITemplates --> Service
|
||||
Service --> Models
|
||||
View --> API
|
||||
API --> APITemplates
|
||||
InitScript --> Models
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L189-L276)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L189-L276)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
|
||||
## 核心组件
|
||||
本节详细说明模板表的字段定义、模板类型、维度权重配置、激活状态管理,以及模板与指标的关联关系。
|
||||
|
||||
### 模板表字段定义
|
||||
- id:主键,自增整数
|
||||
- template_name:模板名称,字符串,必填
|
||||
- template_code:模板编码,字符串,唯一且必填
|
||||
- template_type:模板类型,枚举,必填
|
||||
- description:模板描述,文本,可选
|
||||
- dimension_weights:维度权重,JSON文本,可选
|
||||
- assessment_cycle:考核周期,字符串,默认"monthly"
|
||||
- is_active:是否启用,布尔,默认True
|
||||
- created_at:创建时间,日期时间
|
||||
- updated_at:更新时间,日期时间
|
||||
|
||||
索引:
|
||||
- idx_template_type:按模板类型索引
|
||||
- idx_template_active:按启用状态索引
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L408)
|
||||
|
||||
### 模板类型与适用场景
|
||||
模板类型枚举包括:
|
||||
- general:通用模板,适用于全院各科室
|
||||
- surgical:手术临床科室,适用于外科、妇科、眼科等手术科室
|
||||
- nonsurgical_ward:非手术有病房科室
|
||||
- nonsurgical_noward:非手术无病房科室
|
||||
- medical_tech:医技科室,如检验科、放射科、超声科、药剂科等
|
||||
- nursing:护理单元
|
||||
- admin:行政科室
|
||||
- logistics:后勤科室
|
||||
|
||||
每种模板类型对应不同的权重分配和指标组合,确保考核内容与科室职责相匹配。
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L375-L385)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L82-L186)
|
||||
|
||||
### 维度权重配置
|
||||
维度权重用于平衡计分卡的四个维度:
|
||||
- financial:财务管理,范围30%-40%
|
||||
- customer:顾客服务,范围25%-35%
|
||||
- internal_process:内部流程,范围20%-30%
|
||||
- learning_growth:学习与成长,范围5%-15%
|
||||
|
||||
权重以JSON格式存储在dimension_weights字段中,便于前端展示和用户调整。
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L63-L74)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L88-L186)
|
||||
|
||||
### 激活状态管理
|
||||
- is_active字段控制模板的启用状态
|
||||
- 前端提供开关控件,支持一键启用/停用
|
||||
- 后端API提供状态更新接口
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L398-L398)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L25-L28)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L459-L462)
|
||||
|
||||
### 模板与指标的关联关系
|
||||
模板通过模板指标关联表(template_indicators)与指标建立多对多关系:
|
||||
- template_id:外键指向模板表
|
||||
- indicator_id:外键指向指标表
|
||||
- category:指标分类(二级指标)
|
||||
- target_value/target_unit:目标值及单位
|
||||
- weight:指标权重
|
||||
- scoring_method/scoring_params:评分方法及参数
|
||||
- sort_order:排序
|
||||
- remark:备注
|
||||
|
||||
关联表提供灵活的指标组合能力,支持不同模板包含不同指标及其权重。
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L411-L438)
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L90-L186)
|
||||
|
||||
## 架构概览
|
||||
模板系统的整体架构由数据模型、API路由、服务层和前端界面组成,形成完整的CRUD闭环。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as "用户"
|
||||
participant Frontend as "前端界面"
|
||||
participant API as "模板API"
|
||||
participant Service as "模板服务"
|
||||
participant DB as "数据库"
|
||||
User->>Frontend : 访问模板管理页面
|
||||
Frontend->>API : GET /templates
|
||||
API->>Service : 查询模板列表
|
||||
Service->>DB : 查询模板数据
|
||||
DB-->>Service : 返回模板列表
|
||||
Service-->>API : 返回模板数据
|
||||
API-->>Frontend : 渲染模板列表
|
||||
User->>Frontend : 新增模板
|
||||
Frontend->>API : POST /templates
|
||||
API->>Service : 创建模板
|
||||
Service->>DB : 插入模板记录
|
||||
DB-->>Service : 返回模板ID
|
||||
Service-->>API : 返回创建结果
|
||||
API-->>Frontend : 显示成功消息
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L22-L42)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L92-L128)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L356-L369)
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 数据模型类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class IndicatorTemplate {
|
||||
+int id
|
||||
+string template_name
|
||||
+string template_code
|
||||
+TemplateType template_type
|
||||
+string description
|
||||
+string dimension_weights
|
||||
+string assessment_cycle
|
||||
+boolean is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+TemplateIndicator[] indicators
|
||||
}
|
||||
class TemplateIndicator {
|
||||
+int id
|
||||
+int template_id
|
||||
+int indicator_id
|
||||
+string category
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+float weight
|
||||
+string scoring_method
|
||||
+string scoring_params
|
||||
+int sort_order
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+IndicatorTemplate template
|
||||
+Indicator indicator
|
||||
}
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+boolean is_veto
|
||||
+boolean is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+AssessmentDetail[] assessment_details
|
||||
+TemplateIndicator[] template_relations
|
||||
}
|
||||
IndicatorTemplate "1" --> "many" TemplateIndicator : "包含"
|
||||
TemplateIndicator "many" --> "1" Indicator : "关联"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
|
||||
### 模板创建流程
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始创建模板]) --> Validate["验证模板编码唯一性"]
|
||||
Validate --> Valid{"编码有效?"}
|
||||
Valid --> |否| Error["返回错误:编码已存在"]
|
||||
Valid --> |是| CreateTemplate["创建模板记录"]
|
||||
CreateTemplate --> AddIndicators["批量添加模板指标"]
|
||||
AddIndicators --> SetSortOrder["设置排序序号"]
|
||||
SetSortOrder --> Commit["提交事务"]
|
||||
Commit --> Success["创建成功"]
|
||||
Error --> End([结束])
|
||||
Success --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L129-L143)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L92-L128)
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L129-L143)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L92-L128)
|
||||
|
||||
### 模板指标管理流程
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([模板指标管理]) --> LoadTemplate["加载模板详情"]
|
||||
LoadTemplate --> ShowIndicators["显示模板指标列表"]
|
||||
ShowIndicators --> AddIndicator["添加指标"]
|
||||
ShowIndicators --> EditIndicator["编辑指标"]
|
||||
ShowIndicators --> RemoveIndicator["移除指标"]
|
||||
AddIndicator --> CheckExists["检查指标是否已存在"]
|
||||
CheckExists --> Exists{"已存在?"}
|
||||
Exists --> |是| ShowError["显示错误:指标已存在"]
|
||||
Exists --> |否| InsertIndicator["插入新指标记录"]
|
||||
InsertIndicator --> RefreshTemplate["刷新模板详情"]
|
||||
EditIndicator --> UpdateIndicator["更新指标记录"]
|
||||
UpdateIndicator --> RefreshTemplate
|
||||
RemoveIndicator --> DeleteIndicator["删除指标记录"]
|
||||
DeleteIndicator --> RefreshTemplate
|
||||
RefreshTemplate --> ShowIndicators
|
||||
ShowError --> ShowIndicators
|
||||
RefreshTemplate --> End([结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L174-L272)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L160-L253)
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L174-L272)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L160-L253)
|
||||
|
||||
### 前端交互流程
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as "用户"
|
||||
participant View as "Templates.vue"
|
||||
participant API as "template.js"
|
||||
participant Backend as "模板API"
|
||||
User->>View : 点击"新增模板"
|
||||
View->>API : 调用createTemplate()
|
||||
API->>Backend : POST /templates
|
||||
Backend-->>API : 返回创建结果
|
||||
API-->>View : 显示成功消息
|
||||
View->>View : 刷新模板列表
|
||||
User->>View : 点击"添加指标"
|
||||
View->>API : 调用addTemplateIndicator()
|
||||
API->>Backend : POST /templates/{id}/indicators
|
||||
Backend-->>API : 返回添加结果
|
||||
API-->>View : 显示成功消息
|
||||
View->>View : 刷新指标列表
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L402-L491)
|
||||
- [template.js](file://frontend/src/api/template.js#L23-L56)
|
||||
|
||||
**章节来源**
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
|
||||
## 依赖关系分析
|
||||
模板系统的关键依赖关系如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据层"
|
||||
IndicatorModel["Indicator模型"]
|
||||
TemplateModel["IndicatorTemplate模型"]
|
||||
TemplateIndicatorModel["TemplateIndicator模型"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
TemplateService["TemplateService"]
|
||||
end
|
||||
subgraph "接口层"
|
||||
TemplateAPI["Template API路由"]
|
||||
end
|
||||
subgraph "前端"
|
||||
TemplatesView["Templates.vue"]
|
||||
TemplateAPIJS["template.js"]
|
||||
end
|
||||
TemplateAPI --> TemplateService
|
||||
TemplateService --> TemplateModel
|
||||
TemplateService --> TemplateIndicatorModel
|
||||
TemplateService --> IndicatorModel
|
||||
TemplatesView --> TemplateAPIJS
|
||||
TemplateAPIJS --> TemplateAPI
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L117-L438)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L10-L17)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L18)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L236-L244)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L117-L438)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L10-L17)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L18)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L236-L244)
|
||||
|
||||
## 性能考虑
|
||||
- 数据库索引:模板表按模板类型和启用状态建立索引,提升查询性能
|
||||
- 关联查询:使用selectinload优化N+1查询问题
|
||||
- 分页查询:API支持分页参数,避免一次性加载大量数据
|
||||
- JSON存储:维度权重以JSON格式存储,便于前端直接解析使用
|
||||
|
||||
## 故障排除指南
|
||||
常见问题及解决方案:
|
||||
- 模板编码重复:创建模板时检查编码唯一性,避免重复
|
||||
- 指标重复添加:添加指标前检查是否已存在于模板中
|
||||
- 权重配置错误:前端提供权重范围校验,确保数值在合理范围内
|
||||
- 数据迁移问题:使用Alembic进行数据库版本管理,确保表结构一致
|
||||
|
||||
**章节来源**
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L136-L142)
|
||||
- [template_service.py](file://backend/app/services/template_service.py#L174-L182)
|
||||
|
||||
## 结论
|
||||
考核指标模板表通过清晰的数据模型设计、完善的API接口、友好的前端界面,实现了灵活的模板管理和指标配置能力。系统支持多种模板类型、维度权重配置、指标组合管理等功能,能够满足不同科室的考核需求。建议在实际使用中遵循最佳实践,定期维护模板数据,确保考核体系的有效性和准确性。
|
||||
|
||||
## 附录
|
||||
|
||||
### 模板初始化数据
|
||||
系统提供了预设的模板数据,包括通用模板和各类科室专用模板,涵盖平衡计分卡的四个维度和相应的指标组合。
|
||||
|
||||
**章节来源**
|
||||
- [init_templates.py](file://backend/app/scripts/init_templates.py#L82-L186)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L11-L371)
|
||||
|
||||
### 数据库迁移
|
||||
使用Alembic进行数据库版本管理,确保模板表结构的一致性和可追溯性。
|
||||
|
||||
**章节来源**
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
- [database.md](file://docs/database.md#L272-L286)
|
||||
421
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/考核指标表.md
Normal file
421
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/考核指标表.md
Normal file
@@ -0,0 +1,421 @@
|
||||
# 考核指标表
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py)
|
||||
- [migrate_indicators.py](file://backend/migrate_indicators.py)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue)
|
||||
- [indicator.js](file://frontend/src/api/indicator.js)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“考核指标表(indicators)”的完整文档化需求,涵盖字段定义、枚举类型、业务规则(计算方法、考核方法、扣分标准)、适用科室类型配置、一票否决机制、激活状态管理,以及创建/修改/删除的最佳实践与数据验证规则。文档同时结合后端模型、服务层、API 层与前端界面,形成从数据模型到用户界面的闭环说明。
|
||||
|
||||
## 项目结构
|
||||
- 后端采用 FastAPI + SQLAlchemy 异步 ORM,指标模型位于数据模型层,API 路由与服务层分别提供查询、创建、更新、删除能力,并支持模板导入。
|
||||
- 前端提供指标列表展示、搜索筛选、新增/编辑/删除、状态切换等交互。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
FE["前端界面<br/>Indicators.vue"] --> API["API 路由<br/>indicators.py"]
|
||||
API --> SVC["服务层<br/>indicator_service.py"]
|
||||
SVC --> DB["数据库模型<br/>models.py 中的 Indicator 表"]
|
||||
FE --> APIClient["API 客户端<br/>indicator.js"]
|
||||
DB --> Alembic["迁移脚本<br/>migrate_indicators.py / 001_initial.py"]
|
||||
DB --> Templates["模板初始化<br/>init_indicator_templates.py"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L1-L296)
|
||||
- [indicator.js](file://frontend/src/api/indicator.js#L1-L32)
|
||||
- [migrate_indicators.py](file://backend/migrate_indicators.py#L1-L46)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L66-L85)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L1-L375)
|
||||
|
||||
章节来源
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L1-L296)
|
||||
- [indicator.js](file://frontend/src/api/indicator.js#L1-L32)
|
||||
- [migrate_indicators.py](file://backend/migrate_indicators.py#L1-L46)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L66-L85)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L1-L375)
|
||||
|
||||
## 核心组件
|
||||
- 指标实体(Indicator):承载指标的全部元数据与业务规则字段。
|
||||
- 枚举类型:
|
||||
- 指标类型(IndicatorType):质量、数量、效率、服务、成本。
|
||||
- 平衡计分卡维度(BSCDimension):财务、客户、内部流程、学习与成长。
|
||||
- 科室类型(DeptType):用于限制指标适用范围。
|
||||
- API 层:提供列表、详情、创建、更新、删除、模板导入等接口。
|
||||
- 服务层:封装查询、创建、更新、删除、模板导入逻辑。
|
||||
- 前端界面:提供指标列表、搜索、新增/编辑/删除、状态切换。
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [models.py](file://backend/app/models/models.py#L29-L35)
|
||||
- [models.py](file://backend/app/models/models.py#L16-L27)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L39-L44)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L22)
|
||||
|
||||
## 架构概览
|
||||
指标系统围绕“指标模型 + API + 服务 + 前端”的分层架构运行,支持通过模板批量导入指标,支持按科室类型过滤适用指标,支持一票否决与激活状态控制。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant FE as "前端界面"
|
||||
participant API as "API 路由"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库模型"
|
||||
U->>FE : 打开指标页面
|
||||
FE->>API : GET /indicators?...分页/筛选
|
||||
API->>SVC : 查询指标列表
|
||||
SVC->>DB : 构造查询类型/维度/状态
|
||||
DB-->>SVC : 返回指标数据
|
||||
SVC-->>API : 返回结果
|
||||
API-->>FE : 渲染表格
|
||||
U->>FE : 新增/编辑指标
|
||||
FE->>API : POST/PUT /indicators
|
||||
API->>SVC : 创建/更新指标
|
||||
SVC->>DB : 写入/更新指标
|
||||
DB-->>SVC : 提交成功
|
||||
SVC-->>API : 返回结果
|
||||
API-->>FE : 刷新列表
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L20-L112)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L16-L93)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 指标实体与字段定义
|
||||
- 字段清单与含义
|
||||
- id:主键自增
|
||||
- name:指标名称(必填)
|
||||
- code:指标编码(唯一、必填)
|
||||
- indicator_type:指标类型(必填,枚举)
|
||||
- bs_dimension:平衡计分卡维度(必填,枚举)
|
||||
- weight:权重(>0,数值型)
|
||||
- max_score:最高分值(默认100)
|
||||
- target_value:目标值(可选)
|
||||
- target_unit:目标值单位(可选)
|
||||
- calculation_method:计算方法/公式(可选)
|
||||
- assessment_method:考核方法(可选)
|
||||
- deduction_standard:扣分标准(可选)
|
||||
- data_source:数据来源(可选)
|
||||
- applicable_dept_types:适用科室类型(JSON数组字符串,可选)
|
||||
- is_veto:是否一票否决(布尔)
|
||||
- is_active:是否启用(布尔,默认启用)
|
||||
- created_at/updated_at:时间戳
|
||||
|
||||
- 约束与索引
|
||||
- 唯一约束:code
|
||||
- 约束:weight > 0
|
||||
- 索引:indicator_type
|
||||
|
||||
- 关系
|
||||
- 与考核明细(AssessmentDetail)一对多
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L66-L85)
|
||||
|
||||
### 枚举类型与适用场景
|
||||
- 指标类型(IndicatorType)
|
||||
- 质量(quality):关注结果与过程质量,如病历合格率、院感达标率
|
||||
- 数量(quantity):关注产出数量,如门诊/住院人次
|
||||
- 效率(efficiency):关注资源利用效率,如报告及时率
|
||||
- 服务(service):关注服务体验与满意度,如患者满意度
|
||||
- 成本(cost):关注成本控制,如药品比例、医保扣款
|
||||
|
||||
- 平衡计分卡维度(BSCDimension)
|
||||
- 财务(financial):收入增长、成本控制、资产效率
|
||||
- 客户(customer):患者满意度、投诉管理、服务可及性
|
||||
- 内部流程(internal_process):医疗质量、安全、合规、流程执行率
|
||||
- 学习与成长(learning_growth):培训参与、继续教育、科研教学
|
||||
|
||||
- 科室类型(DeptType)
|
||||
- 临床手术、非手术有病房、非手术无病房、医技、医疗辅助、护理、行政、财务、后勤等
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [models.py](file://backend/app/models/models.py#L29-L35)
|
||||
- [models.py](file://backend/app/models/models.py#L16-L27)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L39-L44)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L22)
|
||||
|
||||
### 业务规则与计算方法
|
||||
- 计算方法(calculation_method):用于定义指标的实际计算公式或口径,例如“(本期收入 - 同期收入)/ 同期收入 × 100%”
|
||||
- 考核方法(assessment_method):用于说明数据采集与评估方式,例如“统计报表”、“问卷调查”、“系统统计”
|
||||
- 扣分标准(deduction_standard):用于明确未达标时的扣分规则,例如“每降低1%扣2分”、“每例未处理扣5分”
|
||||
|
||||
- 适用科室类型配置(applicable_dept_types)
|
||||
- 以 JSON 数组字符串形式存储,用于限制指标在特定科室类型下的生效范围
|
||||
- 模板导入时会自动写入对应科室类型的 dept_type
|
||||
|
||||
- 一票否决(is_veto)
|
||||
- 当某指标被标记为一票否决时,在考核过程中若该项未达标,将直接判定为不通过
|
||||
- 示例:院感控制达标率(示例来自模板数据)
|
||||
|
||||
- 激活状态管理(is_active)
|
||||
- 控制指标是否参与当前考核周期
|
||||
- 前端提供开关式状态变更入口
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L129-L135)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L22-L232)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L309-L362)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L31-L35)
|
||||
|
||||
### API 与服务层行为
|
||||
- 列表查询
|
||||
- 支持按指标类型、BSC 维度、是否启用进行筛选
|
||||
- 支持分页与总数统计
|
||||
- 详情查询
|
||||
- 根据 ID 获取指标详情
|
||||
- 创建/更新/删除
|
||||
- 创建前校验编码唯一性
|
||||
- 更新支持部分字段更新
|
||||
- 删除返回布尔结果
|
||||
- 模板导入
|
||||
- 支持按模板类型批量导入指标
|
||||
- 支持覆盖策略(overwrite)
|
||||
|
||||
章节来源
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L20-L142)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L16-L154)
|
||||
|
||||
### 前端交互与数据验证
|
||||
- 列表展示
|
||||
- 支持按指标类型筛选、关键词搜索(名称/编码)
|
||||
- 展示编码、名称、类型、权重、最高分值、目标值、单位、状态等
|
||||
- 新增/编辑
|
||||
- 必填字段:编码、名称、指标类型
|
||||
- 权重范围:≥0.1,支持一位小数
|
||||
- 最高分值范围:≥0,最大1000
|
||||
- 目标值:数值型,保留两位小数
|
||||
- 计算方法与描述:文本域输入
|
||||
- 状态切换
|
||||
- 通过开关直接更新 is_active
|
||||
|
||||
章节来源
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L1-L296)
|
||||
- [indicator.js](file://frontend/src/api/indicator.js#L1-L32)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L153-L192)
|
||||
|
||||
### 模板与迁移
|
||||
- 模板初始化
|
||||
- 提供多类科室模板(手术临床、非手术有病房、非手术无病房、医技、行政、后勤等)
|
||||
- 模板中包含指标名称、编码、类型、维度、权重、目标值、计算方法、考核方法、扣分标准、数据来源、适用科室类型、是否一票否决、是否启用等
|
||||
- 迁移脚本
|
||||
- 为历史表添加 bs_dimension、target_unit、assessment_method、deduction_standard、data_source、applicable_dept_types、is_veto 等列
|
||||
|
||||
章节来源
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L1-L375)
|
||||
- [migrate_indicators.py](file://backend/migrate_indicators.py#L1-L46)
|
||||
|
||||
## 依赖关系分析
|
||||
- 指标实体依赖枚举类型(IndicatorType、BSCDimension、DeptType)
|
||||
- API 层依赖服务层;服务层依赖模型层;模型层依赖数据库
|
||||
- 前端通过 API 客户端调用后端接口
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
}
|
||||
class IndicatorService {
|
||||
+get_list(...)
|
||||
+get_by_id(...)
|
||||
+get_active_indicators(...)
|
||||
+create(...)
|
||||
+update(...)
|
||||
+delete(...)
|
||||
+import_template(...)
|
||||
+get_templates()
|
||||
}
|
||||
class API_Indicators {
|
||||
+get_indicators(...)
|
||||
+get_active_indicators(...)
|
||||
+get_indicator(...)
|
||||
+create_indicator(...)
|
||||
+update_indicator(...)
|
||||
+delete_indicator(...)
|
||||
+get_indicator_templates(...)
|
||||
+import_indicator_template(...)
|
||||
}
|
||||
API_Indicators --> IndicatorService : "调用"
|
||||
IndicatorService --> Indicator : "读写"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L13-L197)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 列表查询支持按类型、维度、状态过滤,建议在高频查询上保持索引有效
|
||||
- 分页查询避免一次性加载过多数据
|
||||
- 数据一致性
|
||||
- 编码唯一性约束确保指标识别稳定
|
||||
- 权重大于0的约束保证权重语义正确
|
||||
- 模板导入
|
||||
- 批量导入时建议开启事务,减少多次往返
|
||||
- 覆盖策略需谨慎使用,避免误更新
|
||||
|
||||
[本节为通用指导,无需特定文件来源]
|
||||
|
||||
## 故障排查指南
|
||||
- 创建失败:指标编码重复
|
||||
- 现象:创建接口返回错误
|
||||
- 处理:更换唯一编码后重试
|
||||
- 更新失败:指标不存在
|
||||
- 现象:更新接口返回404
|
||||
- 处理:确认指标ID是否存在
|
||||
- 权重异常:权重≤0
|
||||
- 现象:数据库约束报错
|
||||
- 处理:调整权重至>0
|
||||
- 模板导入未生效
|
||||
- 现象:导入后指标未出现或未覆盖
|
||||
- 处理:检查 overwrite 参数、dept_type 是否匹配、数据库迁移是否完成
|
||||
|
||||
章节来源
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L78-L81)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L95-L98)
|
||||
- [models.py](file://backend/app/models/models.py#L145)
|
||||
- [migrate_indicators.py](file://backend/migrate_indicators.py#L9-L41)
|
||||
|
||||
## 结论
|
||||
考核指标表通过清晰的字段定义、严谨的枚举约束与完善的业务规则,实现了对不同科室类型的差异化考核。配合模板导入与前端交互,能够高效地完成指标的创建、维护与应用。建议在实际使用中严格遵循数据验证规则与最佳实践,确保指标体系的稳定性与可扩展性。
|
||||
|
||||
[本节为总结性内容,无需特定文件来源]
|
||||
|
||||
## 附录
|
||||
|
||||
### 字段与规则对照表
|
||||
- 字段名:name
|
||||
- 类型:字符串
|
||||
- 必填:是
|
||||
- 用途:指标名称
|
||||
- 字段名:code
|
||||
- 类型:字符串
|
||||
- 必填:是
|
||||
- 唯一性:是
|
||||
- 用途:指标唯一标识
|
||||
- 字段名:indicator_type
|
||||
- 类型:枚举(质量/数量/效率/服务/成本)
|
||||
- 必填:是
|
||||
- 用途:区分指标类别
|
||||
- 字段名:bs_dimension
|
||||
- 类型:枚举(财务/客户/内部流程/学习与成长)
|
||||
- 必填:是
|
||||
- 用途:平衡计分卡维度归属
|
||||
- 字段名:weight
|
||||
- 类型:数值
|
||||
- 必填:是
|
||||
- 约束:>0
|
||||
- 用途:权重,影响加权得分
|
||||
- 字段名:max_score
|
||||
- 类型:数值
|
||||
- 默认值:100
|
||||
- 用途:指标最高分值
|
||||
- 字段名:target_value
|
||||
- 类型:数值
|
||||
- 可选:是
|
||||
- 用途:目标值
|
||||
- 字段名:target_unit
|
||||
- 类型:字符串
|
||||
- 可选:是
|
||||
- 用途:目标值单位
|
||||
- 字段名:calculation_method
|
||||
- 类型:文本
|
||||
- 可选:是
|
||||
- 用途:计算方法/公式
|
||||
- 字段名:assessment_method
|
||||
- 类型:文本
|
||||
- 可选:是
|
||||
- 用途:考核方法
|
||||
- 字段名:deduction_standard
|
||||
- 类型:文本
|
||||
- 可选:是
|
||||
- 用途:扣分标准
|
||||
- 字段名:data_source
|
||||
- 类型:字符串
|
||||
- 可选:是
|
||||
- 用途:数据来源
|
||||
- 字段名:applicable_dept_types
|
||||
- 类型:JSON数组字符串
|
||||
- 可选:是
|
||||
- 用途:适用科室类型
|
||||
- 字段名:is_veto
|
||||
- 类型:布尔
|
||||
- 默认值:false
|
||||
- 用途:一票否决标志
|
||||
- 字段名:is_active
|
||||
- 类型:布尔
|
||||
- 默认值:true
|
||||
- 用途:启用/禁用控制
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L153-L192)
|
||||
|
||||
### 最佳实践与数据验证规则
|
||||
- 创建/修改
|
||||
- 编码必须唯一且必填
|
||||
- 指标类型与平衡计分卡维度必须选择
|
||||
- 权重必须大于0
|
||||
- 最高分值建议合理设置(如100),避免过大或过小
|
||||
- 目标值与单位应配套填写
|
||||
- 计算方法、考核方法、扣分标准应明确可执行
|
||||
- 适用科室类型应与模板一致,避免跨科室误用
|
||||
- 激活状态
|
||||
- 新建指标默认启用;停用时需谨慎评估影响范围
|
||||
- 一票否决
|
||||
- 仅在关键质量/安全指标上启用,避免滥用
|
||||
- 模板导入
|
||||
- 导入前确认 dept_type 与模板类型一致
|
||||
- 使用覆盖模式时注意备份与审计
|
||||
|
||||
[本节为通用指导,无需特定文件来源]
|
||||
357
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/计划指标关联表.md
Normal file
357
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/计划指标关联表.md
Normal file
@@ -0,0 +1,357 @@
|
||||
# 计划指标关联表
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [create_plan_tables.py](file://backend/create_plan_tables.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
|
||||
计划指标关联表(plan_kpi_relations)是医院绩效管理系统中的核心数据表,用于建立绩效计划与考核指标之间的多对多关联关系。该表实现了计划层面的指标配置功能,支持权重分配、目标值设定、评分方法配置等关键业务需求。
|
||||
|
||||
本表采用多对多关联设计,通过外键约束确保数据完整性,支持灵活的指标组合配置,为不同层级、不同类型的绩效计划提供个性化的指标体系。
|
||||
|
||||
## 项目结构
|
||||
|
||||
基于代码库分析,计划指标关联表涉及以下核心模块:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端架构"
|
||||
API[API层<br/>performance_plans.py]
|
||||
Service[服务层<br/>performance_plan_service.py]
|
||||
Model[模型层<br/>models.py]
|
||||
Schema[Schema层<br/>schemas.py]
|
||||
end
|
||||
subgraph "数据库层"
|
||||
PlanKpi[plan_kpi_relations<br/>关联表]
|
||||
PerformancePlan[performance_plans<br/>计划表]
|
||||
Indicator[indicators<br/>指标表]
|
||||
end
|
||||
subgraph "前端界面"
|
||||
PlanUI[计划管理界面]
|
||||
KPIConfig[KPI配置组件]
|
||||
end
|
||||
API --> Service
|
||||
Service --> Model
|
||||
Model --> PlanKpi
|
||||
PlanKpi --> PerformancePlan
|
||||
PlanKpi --> Indicator
|
||||
PlanUI --> API
|
||||
KPIConfig --> API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L260-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L195-L249)
|
||||
- [models.py](file://backend/app/models/models.py#L314-L338)
|
||||
|
||||
**章节来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L260-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L195-L249)
|
||||
- [models.py](file://backend/app/models/models.py#L314-L338)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 数据表结构定义
|
||||
|
||||
计划指标关联表采用完整的字段定义,支持全面的业务配置需求:
|
||||
|
||||
| 字段名 | 数据类型 | 约束条件 | 说明 |
|
||||
|--------|----------|----------|------|
|
||||
| id | Integer | 主键, 自增 | 关联关系唯一标识 |
|
||||
| plan_id | Integer | 外键, 非空 | 关联的绩效计划ID |
|
||||
| indicator_id | Integer | 外键, 非空 | 关联的指标ID |
|
||||
| target_value | Numeric(10,2) | 可空 | 指标的计划目标值 |
|
||||
| target_unit | String(50) | 可空 | 目标值计量单位 |
|
||||
| weight | Numeric(5,2) | 默认1.0 | 指标权重值 |
|
||||
| scoring_method | String(50) | 可空 | 评分方法类型 |
|
||||
| scoring_params | Text | 可空 | 评分参数(JSON格式) |
|
||||
| remark | Text | 可空 | 备注说明 |
|
||||
| created_at | DateTime | 默认当前时间 | 记录创建时间 |
|
||||
| updated_at | DateTime | 默认当前时间, 更新时自动更新 | 记录最后更新时间 |
|
||||
|
||||
### 索引与约束
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "索引设计"
|
||||
IDX1[idx_relation_plan<br/>plan_id索引]
|
||||
IDX2[idx_relation_indicator<br/>indicator_id索引]
|
||||
IDX3[idx_relation_unique<br/>plan_id+indicator_id唯一索引]
|
||||
end
|
||||
subgraph "约束设计"
|
||||
FK1[FK_performance_plans<br/>plan_id → performance_plans.id]
|
||||
FK2[FK_indicators<br/>indicator_id → indicators.id]
|
||||
CK1[CK_weight_range<br/>weight ∈ [0,100]]
|
||||
end
|
||||
IDX1 --> FK1
|
||||
IDX2 --> FK2
|
||||
IDX3 --> Unique[唯一约束]
|
||||
CK1 --> Weight[权重检查]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L334-L338)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L314-L338)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构设计,实现清晰的职责分离:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API接口
|
||||
participant Service as 服务层
|
||||
participant DB as 数据库
|
||||
Client->>API : 添加KPI关联请求
|
||||
API->>Service : add_kpi_relation()
|
||||
Service->>DB : 查询计划是否存在
|
||||
DB-->>Service : 计划存在
|
||||
Service->>DB : 创建PlanKpiRelation记录
|
||||
DB-->>Service : 返回新记录
|
||||
Service-->>API : 返回关联关系
|
||||
API-->>Client : 返回结果
|
||||
Note over Client,DB : 数据一致性通过外键约束保证
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L260-L275)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L195-L213)
|
||||
|
||||
**章节来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L260-L275)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L195-L213)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 数据模型设计
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
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
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+plan : PerformancePlan
|
||||
+indicator : Indicator
|
||||
}
|
||||
class PerformancePlan {
|
||||
+int id
|
||||
+string plan_name
|
||||
+string plan_code
|
||||
+int plan_year
|
||||
+string plan_level
|
||||
+kpi_relations : List[PlanKpiRelation]
|
||||
}
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+float weight
|
||||
+plan_relations : List[PlanKpiRelation]
|
||||
}
|
||||
PlanKpiRelation --> PerformancePlan : "多对一"
|
||||
PlanKpiRelation --> Indicator : "多对一"
|
||||
PerformancePlan --> PlanKpiRelation : "一对多"
|
||||
Indicator --> PlanKpiRelation : "一对多"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L314-L332)
|
||||
|
||||
### API接口设计
|
||||
|
||||
系统提供完整的CRUD操作接口:
|
||||
|
||||
| 接口方法 | URL路径 | 功能描述 | 权限要求 |
|
||||
|----------|---------|----------|----------|
|
||||
| POST | /plans/{plan_id}/kpi-relations | 添加计划指标关联 | 管理员/经理 |
|
||||
| PUT | /plans/kpi-relations/{relation_id} | 更新计划指标关联 | 管理员/经理 |
|
||||
| DELETE | /plans/kpi-relations/{relation_id} | 删除计划指标关联 | 管理员/经理 |
|
||||
|
||||
### 业务逻辑处理
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> ValidatePlan["验证计划存在性"]
|
||||
ValidatePlan --> PlanExists{"计划存在?"}
|
||||
PlanExists --> |否| ReturnError["返回错误"]
|
||||
PlanExists --> |是| CreateRelation["创建关联关系"]
|
||||
CreateRelation --> SaveToDB["保存到数据库"]
|
||||
SaveToDB --> RefreshData["刷新数据"]
|
||||
RefreshData --> Success["返回成功"]
|
||||
ReturnError --> End([结束])
|
||||
Success --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L195-L213)
|
||||
|
||||
**章节来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L260-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L195-L249)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 外部依赖
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "核心依赖"
|
||||
SQLAlchemy[SQLAlchemy ORM]
|
||||
FastAPI[FastAPI框架]
|
||||
Pydantic[Pydantic验证]
|
||||
end
|
||||
subgraph "数据库依赖"
|
||||
PostgreSQL[PostgreSQL引擎]
|
||||
Alembic[数据库迁移]
|
||||
end
|
||||
subgraph "前端依赖"
|
||||
Vue3[Vue3框架]
|
||||
ElementPlus[ElementPlus组件库]
|
||||
end
|
||||
SQLAlchemy --> Alembic
|
||||
FastAPI --> Pydantic
|
||||
Vue3 --> ElementPlus
|
||||
```
|
||||
|
||||
### 内部模块依赖
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
API --> Service
|
||||
Service --> Model
|
||||
Model --> Schema
|
||||
Model --> Database
|
||||
Service --> Database
|
||||
API --> Database
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L20)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L20)
|
||||
|
||||
**章节来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L20)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L20)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
1. **索引优化**
|
||||
- plan_id索引:加速按计划查询关联关系
|
||||
- indicator_id索引:加速按指标查询关联关系
|
||||
- 唯一索引:防止重复的计划-指标关联
|
||||
|
||||
2. **连接查询优化**
|
||||
- 使用selectinload优化N+1查询问题
|
||||
- 合理使用join减少查询次数
|
||||
|
||||
3. **缓存策略**
|
||||
- 对常用查询结果进行缓存
|
||||
- 利用数据库连接池提高并发性能
|
||||
|
||||
### 数据一致性保证
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Draft : 创建关联
|
||||
Draft --> Active : 提交/激活
|
||||
Active --> Completed : 完成计划
|
||||
Active --> Cancelled : 取消关联
|
||||
Completed --> [*]
|
||||
Cancelled --> [*]
|
||||
note right of Active
|
||||
数据一致性通过
|
||||
外键约束和事务保证
|
||||
end note
|
||||
```
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
1. **关联关系创建失败**
|
||||
- 检查计划ID是否存在
|
||||
- 验证指标ID的有效性
|
||||
- 确认唯一性约束未被违反
|
||||
|
||||
2. **更新操作异常**
|
||||
- 确认关联关系ID正确
|
||||
- 检查字段范围限制(权重0-100)
|
||||
- 验证JSON参数格式
|
||||
|
||||
3. **删除操作失败**
|
||||
- 确认关联关系存在
|
||||
- 检查是否有依赖关系
|
||||
|
||||
**章节来源**
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L215-L249)
|
||||
|
||||
## 结论
|
||||
|
||||
计划指标关联表作为医院绩效管理系统的核心组件,通过精心设计的数据模型和完善的业务逻辑,实现了灵活的指标配置功能。系统采用分层架构设计,确保了良好的可维护性和扩展性。
|
||||
|
||||
关键优势包括:
|
||||
- 完整的多对多关联支持
|
||||
- 灵活的权重和评分配置
|
||||
- 强大的数据一致性保证
|
||||
- 清晰的权限控制机制
|
||||
|
||||
## 附录
|
||||
|
||||
### 数据库迁移历史
|
||||
|
||||
系统通过Alembic进行数据库版本管理,支持指标模板相关字段的添加和维护。
|
||||
|
||||
**章节来源**
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
- [create_plan_tables.py](file://backend/create_plan_tables.py#L1-L20)
|
||||
|
||||
### 最佳实践建议
|
||||
|
||||
1. **配置管理**
|
||||
- 建立标准化的指标配置流程
|
||||
- 定期审查和优化权重分配
|
||||
- 维护评分方法的一致性
|
||||
|
||||
2. **数据维护**
|
||||
- 定期清理无效的关联关系
|
||||
- 监控数据完整性
|
||||
- 建立备份和恢复机制
|
||||
|
||||
3. **性能优化**
|
||||
- 合理使用索引
|
||||
- 优化查询语句
|
||||
- 监控数据库性能指标
|
||||
700
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/配置管理表.md
Normal file
700
.qoder/repowiki/zh/content/数据库设计/表结构设计/配置管理表/配置管理表.md
Normal file
@@ -0,0 +1,700 @@
|
||||
# 配置管理表
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [security.py](file://backend/app/core/security.py)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [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)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py)
|
||||
- [template_service.py](file://backend/app/services/template_service.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档详细介绍了医院绩效考核管理系统的配置管理表结构,重点关注以下核心配置表:
|
||||
|
||||
- 考核指标表(indicators)
|
||||
- 系统用户表(users)
|
||||
- 绩效计划表(performance_plans)
|
||||
- 计划指标关联表(plan_kpi_relations)
|
||||
- 系统菜单表(menus)
|
||||
- 考核指标模板表(indicator_templates)
|
||||
|
||||
该系统采用现代化的后端架构,使用FastAPI框架、SQLAlchemy ORM、PostgreSQL数据库,并实现了完整的权限控制和模板化管理机制。
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统采用分层架构设计,主要分为以下几个层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
API[API路由层]
|
||||
Frontend[前端界面]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
Services[服务层]
|
||||
Schemas[数据模式层]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
Models[ORM模型层]
|
||||
Database[数据库层]
|
||||
end
|
||||
subgraph "基础设施层"
|
||||
Security[安全认证]
|
||||
Config[配置管理]
|
||||
end
|
||||
Frontend --> API
|
||||
API --> Services
|
||||
Services --> Models
|
||||
Models --> Database
|
||||
API --> Schemas
|
||||
Services --> Schemas
|
||||
Security --> API
|
||||
Config --> Database
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [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)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 枚举类型系统
|
||||
|
||||
系统实现了完整的枚举类型体系,确保数据的一致性和完整性:
|
||||
|
||||
#### 指标类型枚举
|
||||
- 质量指标(quality)
|
||||
- 数量指标(quantity)
|
||||
- 效率指标(efficiency)
|
||||
- 服务指标(service)
|
||||
- 成本指标(cost)
|
||||
|
||||
#### 平衡计分卡维度
|
||||
- 财务维度(financial)
|
||||
- 客户维度(customer)
|
||||
- 内部流程维度(internal_process)
|
||||
- 学习与成长维度(learning_growth)
|
||||
|
||||
#### 用户权限级别
|
||||
- 普通员工(staff)
|
||||
- 部门经理(manager)
|
||||
- 系统管理员(admin)
|
||||
|
||||
#### 计划状态管理
|
||||
- 草稿(draft)
|
||||
- 待审批(pending)
|
||||
- 已批准(approved)
|
||||
- 已驳回(rejected)
|
||||
- 执行中(active)
|
||||
- 已完成(completed)
|
||||
- 已取消(cancelled)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L16-L61)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L39-L44)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L24-L28)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L470-L479)
|
||||
|
||||
### 数据模型架构
|
||||
|
||||
系统采用SQLAlchemy ORM进行数据库建模,所有配置表都遵循统一的设计规范:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class User {
|
||||
+int id
|
||||
+string username
|
||||
+string password_hash
|
||||
+int staff_id
|
||||
+string role
|
||||
+bool is_active
|
||||
+datetime last_login
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class PerformancePlan {
|
||||
+int id
|
||||
+string plan_name
|
||||
+string plan_code
|
||||
+PlanLevel plan_level
|
||||
+int plan_year
|
||||
+int plan_month
|
||||
+string plan_type
|
||||
+int department_id
|
||||
+int staff_id
|
||||
+int parent_plan_id
|
||||
+string description
|
||||
+string strategic_goals
|
||||
+string key_initiatives
|
||||
+PlanStatus status
|
||||
+int submitter_id
|
||||
+datetime submit_time
|
||||
+int approver_id
|
||||
+datetime approve_time
|
||||
+string approve_remark
|
||||
+int version
|
||||
+bool is_active
|
||||
+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
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class Menu {
|
||||
+int id
|
||||
+int parent_id
|
||||
+MenuType menu_type
|
||||
+string menu_name
|
||||
+string menu_icon
|
||||
+string path
|
||||
+string component
|
||||
+string permission
|
||||
+int sort_order
|
||||
+bool is_visible
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class IndicatorTemplate {
|
||||
+int id
|
||||
+string template_name
|
||||
+string template_code
|
||||
+TemplateType template_type
|
||||
+string description
|
||||
+string dimension_weights
|
||||
+string assessment_cycle
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class TemplateIndicator {
|
||||
+int id
|
||||
+int template_id
|
||||
+int indicator_id
|
||||
+string category
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+float weight
|
||||
+string scoring_method
|
||||
+string scoring_params
|
||||
+int sort_order
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
IndicatorTemplate "1" -- "many" TemplateIndicator : "has"
|
||||
PerformancePlan "1" -- "many" PlanKpiRelation : "contains"
|
||||
Indicator "many" -- "many" PlanKpiRelation : "related_to"
|
||||
User "1" -- "many" PerformancePlan : "submits"
|
||||
Menu "1" -- "many" Menu : "parent_child"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [models.py](file://backend/app/models/models.py#L270-L312)
|
||||
- [models.py](file://backend/app/models/models.py#L314-L339)
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [models.py](file://backend/app/models/models.py#L387-L409)
|
||||
- [models.py](file://backend/app/models/models.py#L411-L438)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L117-L438)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用RESTful API架构,所有配置管理操作都通过标准化的HTTP接口进行:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "API路由层"
|
||||
participant Service as "服务层"
|
||||
participant Model as "ORM模型层"
|
||||
participant DB as "数据库"
|
||||
Client->>API : HTTP请求
|
||||
API->>Service : 调用业务逻辑
|
||||
Service->>Model : 数据模型操作
|
||||
Model->>DB : SQL查询/更新
|
||||
DB-->>Model : 查询结果
|
||||
Model-->>Service : 处理后的数据
|
||||
Service-->>API : 业务结果
|
||||
API-->>Client : JSON响应
|
||||
Note over Client,DB : 完整的CRUD操作流程
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
**章节来源**
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 考核指标表(indicators)
|
||||
|
||||
#### 字段定义
|
||||
|
||||
| 字段名 | 类型 | 约束 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键, 自增 | 指标唯一标识符 |
|
||||
| name | String(100) | 非空 | 指标名称 |
|
||||
| code | String(20) | 唯一, 非空 | 指标编码 |
|
||||
| indicator_type | Enum | 非空 | 指标类型(质量/数量/效率/服务/成本) |
|
||||
| bs_dimension | Enum | 非空 | 平衡计分卡维度 |
|
||||
| weight | Numeric(5,2) | 默认1.0, >0 | 权重 |
|
||||
| max_score | Numeric(5,2) | 默认100.0 | 最高分值 |
|
||||
| target_value | Numeric(10,2) | 可选 | 目标值 |
|
||||
| target_unit | String(50) | 可选 | 目标值单位 |
|
||||
| calculation_method | Text | 可选 | 计算方法/公式 |
|
||||
| assessment_method | Text | 可选 | 考核方法 |
|
||||
| deduction_standard | Text | 可选 | 扣分标准 |
|
||||
| data_source | String(100) | 可选 | 数据来源 |
|
||||
| applicable_dept_types | Text | 可选 | 适用科室类型(JSON数组) |
|
||||
| is_veto | Boolean | 默认False | 是否一票否决指标 |
|
||||
| is_active | Boolean | 默认True | 是否启用 |
|
||||
| created_at | DateTime | 默认当前时间 | 创建时间 |
|
||||
| updated_at | DateTime | 更新时自动更新 | 更新时间 |
|
||||
|
||||
#### 业务规则
|
||||
|
||||
1. **权重约束**:权重必须大于0,通过数据库检查约束保证
|
||||
2. **适用科室**:支持JSON格式存储适用科室类型数组
|
||||
3. **模板集成**:与指标模板系统无缝集成
|
||||
4. **状态管理**:支持启用/停用控制
|
||||
|
||||
#### 数据一致性保证
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([创建指标]) --> Validate["验证输入参数"]
|
||||
Validate --> CheckCode{"检查编码唯一性"}
|
||||
CheckCode --> |重复| Error["返回错误"]
|
||||
CheckCode --> |唯一| Create["创建指标记录"]
|
||||
Create --> SetDefaults["设置默认值"]
|
||||
SetDefaults --> Save["保存到数据库"]
|
||||
Save --> Success["创建成功"]
|
||||
Error --> End([结束])
|
||||
Success --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L71-L85)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
|
||||
### 系统用户表(users)
|
||||
|
||||
#### 字段定义
|
||||
|
||||
| 字段名 | 类型 | 约束 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键, 自增 | 用户唯一标识符 |
|
||||
| username | String(50) | 唯一, 非空 | 用户名 |
|
||||
| password_hash | String(255) | 非空 | 密码哈希值 |
|
||||
| staff_id | Integer | 外键, 可选 | 关联员工ID |
|
||||
| role | String(20) | 默认"staff" | 角色权限 |
|
||||
| is_active | Boolean | 默认True | 是否启用 |
|
||||
| last_login | DateTime | 可选 | 最后登录时间 |
|
||||
| created_at | DateTime | 默认当前时间 | 创建时间 |
|
||||
| updated_at | DateTime | 更新时自动更新 | 更新时间 |
|
||||
|
||||
#### 权限控制机制
|
||||
|
||||
系统实现了多层级权限控制:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "权限层级"
|
||||
Admin[系统管理员<br/>拥有所有权限]
|
||||
Manager[部门经理<br/>管理权限]
|
||||
Staff[普通员工<br/>查看权限]
|
||||
end
|
||||
subgraph "受保护操作"
|
||||
Create[创建操作]
|
||||
Update[更新操作]
|
||||
Delete[删除操作]
|
||||
Approve[审批操作]
|
||||
end
|
||||
Admin --> Create
|
||||
Admin --> Update
|
||||
Admin --> Delete
|
||||
Admin --> Approve
|
||||
Manager --> Create
|
||||
Manager --> Update
|
||||
Manager --> Approve
|
||||
Staff -.-> Create
|
||||
Staff -.-> Update
|
||||
Staff -.-> Delete
|
||||
Staff -.-> Approve
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [security.py](file://backend/app/core/security.py#L94-L110)
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L244-L261)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
|
||||
### 绩效计划表(performance_plans)
|
||||
|
||||
#### 字段定义
|
||||
|
||||
| 字段名 | 类型 | 约束 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键, 自增 | 计划唯一标识符 |
|
||||
| plan_name | String(200) | 非空 | 计划名称 |
|
||||
| plan_code | String(50) | 唯一, 非空 | 计划编码 |
|
||||
| plan_level | Enum | 非空 | 计划层级(医院/科室/个人) |
|
||||
| plan_year | Integer | 非空 | 计划年度 |
|
||||
| plan_month | Integer | 可选 | 计划月份(月度计划) |
|
||||
| plan_type | String(20) | 默认"annual" | 计划类型(annual/monthly) |
|
||||
| department_id | Integer | 外键, 可选 | 所属科室ID |
|
||||
| staff_id | Integer | 外键, 可选 | 责任人ID |
|
||||
| parent_plan_id | Integer | 外键, 可选 | 上级计划ID |
|
||||
| description | Text | 可选 | 计划描述 |
|
||||
| strategic_goals | Text | 可选 | 战略目标 |
|
||||
| key_initiatives | Text | 可选 | 关键举措 |
|
||||
| status | Enum | 默认"DRAFT" | 状态(草稿/待审批/已批准/执行中/完成/取消) |
|
||||
| submitter_id | Integer | 外键, 可选 | 提交人ID |
|
||||
| submit_time | DateTime | 可选 | 提交时间 |
|
||||
| approver_id | Integer | 外键, 可选 | 审批人ID |
|
||||
| approve_time | DateTime | 可选 | 审批时间 |
|
||||
| approve_remark | Text | 可选 | 审批意见 |
|
||||
| version | Integer | 默认1 | 版本号 |
|
||||
| is_active | Boolean | 默认True | 是否启用 |
|
||||
| created_at | DateTime | 默认当前时间 | 创建时间 |
|
||||
| updated_at | DateTime | 更新时自动更新 | 更新时间 |
|
||||
|
||||
#### 计划状态流转
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 待审批 : "提交申请"
|
||||
待审批 --> 已批准 : "审批通过"
|
||||
待审批 --> 已驳回 : "审批驳回"
|
||||
已批准 --> 执行中 : "激活计划"
|
||||
执行中 --> 已完成 : "计划完成"
|
||||
执行中 --> 已取消 : "取消计划"
|
||||
已完成 --> [*]
|
||||
已取消 --> [*]
|
||||
已驳回 --> 草稿 : "修改后重新提交"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L270-L312)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L470-L479)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L270-L312)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
|
||||
### 计划指标关联表(plan_kpi_relations)
|
||||
|
||||
#### 字段定义
|
||||
|
||||
| 字段名 | 类型 | 约束 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键, 自增 | 关联唯一标识符 |
|
||||
| plan_id | Integer | 外键, 非空 | 计划ID |
|
||||
| indicator_id | Integer | 外键, 非空 | 指标ID |
|
||||
| target_value | Numeric(10,2) | 可选 | 目标值 |
|
||||
| target_unit | String(50) | 可选 | 目标值单位 |
|
||||
| weight | Numeric(5,2) | 默认1.0 | 权重 |
|
||||
| scoring_method | String(50) | 可选 | 评分方法 |
|
||||
| scoring_params | Text | 可选 | 评分参数(JSON) |
|
||||
| remark | Text | 可选 | 备注 |
|
||||
| created_at | DateTime | 默认当前时间 | 创建时间 |
|
||||
| updated_at | DateTime | 更新时自动更新 | 更新时间 |
|
||||
|
||||
#### 关联关系特性
|
||||
|
||||
1. **唯一性约束**:同一计划下的指标只能关联一次
|
||||
2. **权重管理**:支持为每个关联设置独立权重
|
||||
3. **评分定制**:支持为特定关联配置评分方法和参数
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L314-L339)
|
||||
|
||||
### 系统菜单表(menus)
|
||||
|
||||
#### 字段定义
|
||||
|
||||
| 字段名 | 类型 | 约束 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键, 自增 | 菜单唯一标识符 |
|
||||
| parent_id | Integer | 外键, 可选 | 父菜单ID |
|
||||
| menu_type | Enum | 默认"menu" | 菜单类型(菜单/按钮) |
|
||||
| menu_name | String(100) | 非空 | 菜单名称 |
|
||||
| menu_icon | String(50) | 可选 | 菜单图标 |
|
||||
| path | String(200) | 非空 | 路由路径 |
|
||||
| component | String(200) | 可选 | 组件路径 |
|
||||
| permission | String(100) | 可选 | 权限标识 |
|
||||
| sort_order | Integer | 默认0 | 排序 |
|
||||
| is_visible | Boolean | 默认True | 是否可见 |
|
||||
| is_active | Boolean | 默认True | 是否启用 |
|
||||
| created_at | DateTime | 默认当前时间 | 创建时间 |
|
||||
| updated_at | DateTime | 更新时自动更新 | 更新时间 |
|
||||
|
||||
#### 菜单树形结构
|
||||
|
||||
系统支持无限级菜单嵌套,通过parent_id字段实现父子关系:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
Root[根菜单] --> Parent1[一级菜单1]
|
||||
Root --> Parent2[一级菜单2]
|
||||
Parent1 --> Child11[二级菜单1-1]
|
||||
Parent1 --> Child12[二级菜单1-2]
|
||||
Parent2 --> Child21[二级菜单2-1]
|
||||
Child11 --> GrandChild111[三级菜单1-1-1]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
|
||||
### 考核指标模板表(indicator_templates)
|
||||
|
||||
#### 字段定义
|
||||
|
||||
| 字段名 | 类型 | 约束 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键, 自增 | 模板唯一标识符 |
|
||||
| template_name | String(200) | 非空 | 模板名称 |
|
||||
| template_code | String(50) | 唯一, 非空 | 模板编码 |
|
||||
| template_type | Enum | 非空 | 模板类型(通用/手术/非手术/医技/护理/行政/后勤) |
|
||||
| description | Text | 可选 | 模板描述 |
|
||||
| dimension_weights | Text | 可选 | 维度权重(JSON) |
|
||||
| assessment_cycle | String(20) | 默认"monthly" | 考核周期 |
|
||||
| is_active | Boolean | 默认True | 是否启用 |
|
||||
| created_at | DateTime | 默认当前时间 | 创建时间 |
|
||||
| updated_at | DateTime | 更新时自动更新 | 更新时间 |
|
||||
|
||||
#### 模板类型体系
|
||||
|
||||
| 模板类型 | 适用科室 | 描述 |
|
||||
|----------|----------|------|
|
||||
| general | 通用 | 适用于所有科室的基础模板 |
|
||||
| surgical | 手术临床科室 | 适用于外科系统各手术科室 |
|
||||
| nonsurgical_ward | 非手术有病房科室 | 适用于内科系统等有病房科室 |
|
||||
| nonsurgical_noward | 非手术无病房科室 | 适用于门诊科室 |
|
||||
| medical_tech | 医技科室 | 适用于检验科、放射科等医技科室 |
|
||||
| nursing | 护理单元 | 适用于各护理单元 |
|
||||
| admin | 行政科室 | 适用于党办、财务科、医保办等行政科室 |
|
||||
| logistics | 后勤保障科室 | 适用于总务科、采购科、基建科 |
|
||||
|
||||
#### 模板指标关联表(template_indicators)
|
||||
|
||||
| 字段名 | 类型 | 约束 | 描述 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键, 自增 | 关联唯一标识符 |
|
||||
| template_id | Integer | 外键, 非空 | 模板ID |
|
||||
| indicator_id | Integer | 外键, 非空 | 指标ID |
|
||||
| category | String(100) | 可选 | 指标分类(二级指标) |
|
||||
| target_value | Numeric(10,2) | 可选 | 目标值 |
|
||||
| target_unit | String(50) | 可选 | 目标值单位 |
|
||||
| weight | Numeric(5,2) | 默认1.0 | 权重 |
|
||||
| scoring_method | String(50) | 可选 | 评分方法 |
|
||||
| scoring_params | Text | 可选 | 评分参数(JSON) |
|
||||
| sort_order | Integer | 默认0 | 排序 |
|
||||
| remark | Text | 可选 | 备注 |
|
||||
| created_at | DateTime | 默认当前时间 | 创建时间 |
|
||||
| updated_at | DateTime | 更新时自动更新 | 更新时间 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 数据库迁移历史
|
||||
|
||||
系统通过Alembic进行数据库版本管理,主要迁移包括:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Initial[初始版本] --> Template[模板版本]
|
||||
Initial["初始版本<br/>- 创建科室表<br/>- 创建员工表<br/>- 创建指标表<br/>- 创建考核记录表<br/>- 创建考核明细表<br/>- 创建工资记录表<br/>- 创建用户表"]
|
||||
Template["模板版本<br/>- 创建指标模板表<br/>- 创建模板指标关联表<br/>- 为指标表添加BSC维度字段"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
### 外部依赖关系
|
||||
|
||||
系统依赖的关键外部组件:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "核心依赖"
|
||||
FastAPI[FastAPI Web框架]
|
||||
SQLAlchemy[SQLAlchemy ORM]
|
||||
Postgres[PostgreSQL数据库]
|
||||
Alembic[数据库迁移工具]
|
||||
end
|
||||
subgraph "安全依赖"
|
||||
JWT[JWT令牌]
|
||||
Bcrypt[密码加密]
|
||||
OAuth2[OAuth2密码模式]
|
||||
end
|
||||
subgraph "配置依赖"
|
||||
Pydantic[数据验证]
|
||||
Settings[环境配置]
|
||||
end
|
||||
FastAPI --> SQLAlchemy
|
||||
SQLAlchemy --> Postgres
|
||||
FastAPI --> JWT
|
||||
JWT --> Bcrypt
|
||||
FastAPI --> Pydantic
|
||||
Pydantic --> Settings
|
||||
Alembic --> SQLAlchemy
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
**章节来源**
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库索引优化
|
||||
|
||||
系统为关键查询字段建立了适当的索引:
|
||||
|
||||
- **indicators表**:按指标类型建立索引,支持快速筛选
|
||||
- **users表**:按用户名建立唯一索引,确保用户唯一性
|
||||
- **performance_plans表**:按计划层级、年度、状态建立复合索引
|
||||
- **menus表**:按父节点、类型、可见性建立索引
|
||||
- **plan_kpi_relations表**:按计划ID、指标ID建立唯一索引
|
||||
|
||||
### 缓存策略
|
||||
|
||||
建议实现的缓存策略:
|
||||
|
||||
1. **枚举类型缓存**:缓存所有枚举定义,避免重复查询
|
||||
2. **模板数据缓存**:缓存常用模板数据,减少数据库访问
|
||||
3. **用户权限缓存**:缓存用户权限信息,提高权限检查效率
|
||||
|
||||
### 异步处理
|
||||
|
||||
系统采用异步数据库连接,支持高并发场景:
|
||||
|
||||
- 使用SQLAlchemy AsyncEngine进行异步数据库操作
|
||||
- 通过AsyncSession管理数据库会话
|
||||
- 支持异步API路由处理
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 数据库连接问题
|
||||
- **症状**:应用启动时报数据库连接错误
|
||||
- **原因**:DATABASE_URL配置不正确
|
||||
- **解决**:检查.env文件中的数据库连接字符串
|
||||
|
||||
#### 权限验证失败
|
||||
- **症状**:API调用返回401或403错误
|
||||
- **原因**:JWT令牌无效或用户权限不足
|
||||
- **解决**:重新登录获取有效令牌,检查用户角色配置
|
||||
|
||||
#### 数据唯一性冲突
|
||||
- **症状**:创建记录时报唯一约束冲突
|
||||
- **原因**:重复的编码或用户名
|
||||
- **解决**:检查输入数据的唯一性约束
|
||||
|
||||
#### 模板导入失败
|
||||
- **症状**:指标模板导入过程中断
|
||||
- **原因**:模板数据格式不正确或依赖关系缺失
|
||||
- **解决**:验证模板JSON格式,确保指标已存在
|
||||
|
||||
**章节来源**
|
||||
- [security.py](file://backend/app/core/security.py#L55-L83)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L78-L84)
|
||||
|
||||
## 结论
|
||||
|
||||
本配置管理表系统通过精心设计的数据模型和完善的权限控制机制,为医院绩效考核管理提供了强大的基础支撑。系统的主要优势包括:
|
||||
|
||||
1. **完整的配置管理**:涵盖指标、计划、模板、菜单等核心配置
|
||||
2. **灵活的权限控制**:多层级权限体系满足不同角色需求
|
||||
3. **模板化管理**:支持指标模板的创建、管理和复用
|
||||
4. **数据一致性**:通过外键约束和检查约束保证数据完整性
|
||||
5. **扩展性强**:模块化设计便于功能扩展和维护
|
||||
|
||||
建议在实际部署中重点关注数据库性能优化、缓存策略实施和监控告警机制建设,以确保系统的稳定运行和高性能表现。
|
||||
493
.qoder/repowiki/zh/content/数据模型详解/关系映射说明.md
Normal file
493
.qoder/repowiki/zh/content/数据模型详解/关系映射说明.md
Normal file
@@ -0,0 +1,493 @@
|
||||
# 关系映射说明
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [database.py](file://backend/app/core/database.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)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [department_service.py](file://backend/app/services/department_service.py)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [backend.md](file://docs/backend.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件详细说明医院绩效管理系统的数据模型关系映射设计。系统采用SQLAlchemy ORM实现,涵盖科室层级结构、员工与科室关系、考核记录与明细关系等复杂业务场景。重点解释一对一、一对多、多对多关系的实现方式,包括外键约束、级联删除、反向关系和懒加载机制。
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统采用分层架构,核心模型位于`backend/app/models/`目录,数据库配置在`backend/app/core/`目录,服务层在`backend/app/services/`目录,API路由在`backend/app/api/v1/`目录。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据模型层"
|
||||
A[models.py<br/>核心业务模型]
|
||||
B[finance.py<br/>财务模型]
|
||||
C[__init__.py<br/>模型导出]
|
||||
end
|
||||
subgraph "核心配置层"
|
||||
D[database.py<br/>数据库连接]
|
||||
E[config.py<br/>系统配置]
|
||||
end
|
||||
subgraph "服务层"
|
||||
F[staff_service.py<br/>员工服务]
|
||||
G[assessment_service.py<br/>考核服务]
|
||||
H[department_service.py<br/>科室服务]
|
||||
end
|
||||
subgraph "API层"
|
||||
I[departments.py<br/>科室API]
|
||||
J[assessments.py<br/>考核API]
|
||||
end
|
||||
A --> D
|
||||
B --> D
|
||||
F --> A
|
||||
G --> A
|
||||
H --> A
|
||||
I --> H
|
||||
J --> G
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 核心组件
|
||||
|
||||
系统包含以下核心数据模型:
|
||||
|
||||
### 基础模型
|
||||
- **Base**: SQLAlchemy DeclarativeBase基类
|
||||
- **异步数据库引擎**: 基于asyncpg的异步连接
|
||||
- **会话管理**: 自动事务管理和连接池配置
|
||||
|
||||
### 业务模型
|
||||
- **Department**: 科室信息,支持自关联
|
||||
- **Staff**: 员工信息,一对多关联科室
|
||||
- **Assessment**: 考核记录,一对多关联员工
|
||||
- **AssessmentDetail**: 考核明细,多对多中间表
|
||||
- **Indicator**: 考核指标,支持BSC维度
|
||||
- **SalaryRecord**: 工资核算记录
|
||||
- **User**: 系统用户,关联员工
|
||||
- **PerformancePlan**: 绩效计划,支持层级结构
|
||||
- **PlanKpiRelation**: 计划指标关联
|
||||
- **IndicatorTemplate**: 指标模板
|
||||
- **TemplateIndicator**: 模板指标关联
|
||||
- **DepartmentFinance**: 科室财务记录
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用经典的三层架构模式,通过ORM模型实现业务逻辑与数据持久化的分离。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS ||--o{ STAFF : "一对多"
|
||||
STAFF ||--o{ ASSESSMENTS : "一对多"
|
||||
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "一对多"
|
||||
INDICATORS ||--o{ ASSESSMENT_DETAILS : "一对多"
|
||||
STAFF ||--o{ SALARY_RECORDS : "一对多"
|
||||
DEPARTMENTS ||--o{ DEPARTMENT_FINANCES : "一对多"
|
||||
USERS ||--|| STAFF : "一对一"
|
||||
PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : "一对多"
|
||||
INDICATORS ||--o{ PLAN_KPI_RELATIONS : "一对多"
|
||||
INDICATOR_TEMPLATES ||--o{ TEMPLATE_INDICATORS : "一对多"
|
||||
INDICATORS ||--o{ TEMPLATE_INDICATORS : "一对多"
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
boolean is_active
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
float base_salary
|
||||
float performance_ratio
|
||||
enum status
|
||||
}
|
||||
ASSESSMENTS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
enum status
|
||||
float total_score
|
||||
float weighted_score
|
||||
}
|
||||
ASSESSMENT_DETAILS {
|
||||
int id PK
|
||||
int assessment_id FK
|
||||
int indicator_id FK
|
||||
float actual_value
|
||||
float score
|
||||
}
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string code UK
|
||||
enum indicator_type
|
||||
enum bs_dimension
|
||||
float weight
|
||||
float max_score
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L183)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 科室层级结构关系
|
||||
|
||||
科室模型实现了完整的自关联关系,支持多层级的组织架构。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Department {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+DeptType dept_type
|
||||
+int parent_id
|
||||
+int level
|
||||
+int sort_order
|
||||
+boolean is_active
|
||||
+Department parent
|
||||
+Department[] children
|
||||
+Staff[] staff
|
||||
}
|
||||
Department "1" <-- "0..*" Department : "parent"
|
||||
Department "1" --> "0..*" Department : "children"
|
||||
Department "1" --> "0..*" Staff : "staff"
|
||||
```
|
||||
|
||||
**实现特点**:
|
||||
- 使用`remote_side`参数解决自关联的歧义性
|
||||
- 通过`backref="children"`实现反向关系
|
||||
- 支持多层级嵌套结构
|
||||
- 通过`level`字段维护层级深度
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
|
||||
### 员工与科室关系
|
||||
|
||||
员工与科室之间是一对多的关系,通过外键约束保证数据完整性。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "部门API"
|
||||
participant Service as "DepartmentService"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /api/v1/departments/tree
|
||||
API->>Service : get_tree(dept_type)
|
||||
Service->>DB : SELECT * FROM departments ORDER BY sort_order, id
|
||||
DB-->>Service : 部门列表
|
||||
Service->>Service : 构建树形结构
|
||||
Service-->>API : 树形结构数据
|
||||
API-->>Client : 返回科室树
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L43-L51)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L113-L126)
|
||||
|
||||
**实现特点**:
|
||||
- 使用`selectinload`优化N+1查询问题
|
||||
- 支持按科室类型过滤
|
||||
- 手动构建树形结构避免懒加载问题
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L113-L126)
|
||||
|
||||
### 考核记录与明细关系
|
||||
|
||||
考核系统采用主从结构,支持复杂的多对多关系。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+AssessmentStatus status
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentDetail[] details
|
||||
+Staff staff
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+Indicator indicator
|
||||
+Assessment assessment
|
||||
}
|
||||
class Indicator {
|
||||
+int id
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+float weight
|
||||
+AssessmentDetail[] assessment_details
|
||||
}
|
||||
Assessment "1" --> "0..*" AssessmentDetail : "details"
|
||||
AssessmentDetail "1" --> "1" Staff : "staff"
|
||||
AssessmentDetail "1" --> "1" Indicator : "indicator"
|
||||
Indicator "1" --> "0..*" AssessmentDetail : "assessment_details"
|
||||
```
|
||||
|
||||
**实现特点**:
|
||||
- 使用`cascade="all, delete-orphan"`实现级联删除
|
||||
- 通过`foreign_keys`参数区分多重外键关系
|
||||
- 支持复杂的统计计算(总分、加权得分)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L202)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
|
||||
### 财务核算关系
|
||||
|
||||
财务模块与科室建立了清晰的一对多关系。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([财务记录创建]) --> Validate["验证科室存在性"]
|
||||
Validate --> CreateRecord["创建财务记录"]
|
||||
CreateRecord --> Save["保存到数据库"]
|
||||
Save --> LoadDept["加载科室信息"]
|
||||
LoadDept --> Return["返回完整记录"]
|
||||
Validate --> |验证失败| Error["返回错误"]
|
||||
Error --> End([结束])
|
||||
Return --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
**实现特点**:
|
||||
- 使用`backref="finances"`简化反向访问
|
||||
- 通过枚举类型管理财务类别
|
||||
- 实现金额正数约束
|
||||
|
||||
**章节来源**
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L79)
|
||||
|
||||
### 指标模板关系
|
||||
|
||||
指标模板系统支持复杂的多对多关系。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
INDICATOR_TEMPLATES ||--o{ TEMPLATE_INDICATORS : "一对多"
|
||||
INDICATORS ||--o{ TEMPLATE_INDICATORS : "一对多"
|
||||
INDICATOR_TEMPLATES {
|
||||
int id PK
|
||||
string template_code UK
|
||||
enum template_type
|
||||
boolean is_active
|
||||
}
|
||||
TEMPLATE_INDICATORS {
|
||||
int id PK
|
||||
int template_id FK
|
||||
int indicator_id FK
|
||||
float weight
|
||||
int sort_order
|
||||
}
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string code UK
|
||||
enum indicator_type
|
||||
enum bs_dimension
|
||||
float weight
|
||||
}
|
||||
```
|
||||
|
||||
**实现特点**:
|
||||
- 使用复合唯一索引防止重复关联
|
||||
- 支持模板级别的权重管理
|
||||
- 提供排序字段支持显示顺序
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
|
||||
## 依赖分析
|
||||
|
||||
系统采用模块化设计,各层之间依赖关系清晰。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "外部依赖"
|
||||
A[SQLAlchemy]
|
||||
B[FastAPI]
|
||||
C[Alembic]
|
||||
D[asyncpg]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
E[database.py]
|
||||
F[models.py]
|
||||
G[finance.py]
|
||||
end
|
||||
subgraph "业务模块"
|
||||
H[staff_service.py]
|
||||
I[assessment_service.py]
|
||||
J[department_service.py]
|
||||
end
|
||||
subgraph "接口模块"
|
||||
K[departments.py]
|
||||
L[assessments.py]
|
||||
end
|
||||
A --> E
|
||||
B --> K
|
||||
B --> L
|
||||
C --> F
|
||||
D --> E
|
||||
E --> F
|
||||
E --> G
|
||||
F --> H
|
||||
F --> I
|
||||
F --> J
|
||||
H --> K
|
||||
I --> L
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L11)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L11)
|
||||
|
||||
**依赖特性**:
|
||||
- 异步数据库连接支持高并发
|
||||
- 模块化导入避免循环依赖
|
||||
- 明确的层次边界确保代码可维护性
|
||||
|
||||
**章节来源**
|
||||
- [config.py](file://backend/app/core/config.py#L18-L26)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
1. **懒加载与急加载选择**
|
||||
- 使用`selectinload`避免N+1查询问题
|
||||
- 在API层根据需要选择性加载关联数据
|
||||
|
||||
2. **索引优化**
|
||||
- 为常用查询字段建立索引
|
||||
- 使用复合索引支持多条件查询
|
||||
|
||||
3. **连接池配置**
|
||||
- 配置合适的连接池大小
|
||||
- 设置超时和重试机制
|
||||
|
||||
### 关系查询最佳实践
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始查询]) --> Choose["选择查询策略"]
|
||||
Choose --> |简单查询| Lazy["使用懒加载"]
|
||||
Choose --> |复杂查询| Eager["使用急加载"]
|
||||
Lazy --> Check["检查N+1问题"]
|
||||
Check --> |存在| Fix["修复为急加载"]
|
||||
Check --> |不存在| Optimize["优化查询"]
|
||||
Eager --> Selective["选择性加载"]
|
||||
Selective --> Filter["应用过滤条件"]
|
||||
Filter --> Result["返回结果"]
|
||||
Optimize --> Result
|
||||
Fix --> Result
|
||||
```
|
||||
|
||||
**优化建议**:
|
||||
- 对于API响应,优先使用急加载确保一次性获取所需数据
|
||||
- 对于后台任务,使用懒加载减少内存占用
|
||||
- 合理使用索引提高查询性能
|
||||
- 避免不必要的关联查询
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见关系问题
|
||||
|
||||
1. **循环依赖问题**
|
||||
```python
|
||||
# 解决方案:延迟导入
|
||||
from app.models.models import Department # 在文件末尾导入
|
||||
```
|
||||
|
||||
2. **自关联关系冲突**
|
||||
```python
|
||||
# 解决方案:使用remote_side参数
|
||||
parent: Mapped[Optional["Department"]] = relationship("Department", remote_side=[id], backref="children")
|
||||
```
|
||||
|
||||
3. **多重外键关系**
|
||||
```python
|
||||
# 解决方案:明确指定foreign_keys
|
||||
assessor: Mapped[Optional["Staff"]] = relationship("Staff", foreign_keys=[assessor_id])
|
||||
reviewer: Mapped[Optional["Staff"]] = relationship("Staff", foreign_keys=[reviewer_id])
|
||||
```
|
||||
|
||||
### 数据一致性保证
|
||||
|
||||
1. **外键约束检查**
|
||||
- 确保引用的记录存在
|
||||
- 验证级联删除行为
|
||||
|
||||
2. **事务管理**
|
||||
- 使用异步事务确保原子性
|
||||
- 合理的回滚策略
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L169-L173)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L117-L118)
|
||||
|
||||
## 结论
|
||||
|
||||
本系统通过精心设计的数据模型关系映射,成功实现了复杂的医院绩效管理业务需求。主要特点包括:
|
||||
|
||||
1. **清晰的关系设计**:通过一对一、一对多、多对多关系准确反映业务实体间的联系
|
||||
2. **完善的约束机制**:外键约束、检查约束确保数据完整性
|
||||
3. **灵活的查询策略**:结合懒加载和急加载满足不同场景需求
|
||||
4. **可扩展的架构**:模块化设计支持功能扩展和维护
|
||||
|
||||
系统在保证数据一致性的前提下,提供了良好的性能表现和可维护性,为医院绩效管理提供了坚实的技术基础。
|
||||
576
.qoder/repowiki/zh/content/数据模型详解/数据库约束设计.md
Normal file
576
.qoder/repowiki/zh/content/数据模型详解/数据库约束设计.md
Normal file
@@ -0,0 +1,576 @@
|
||||
# 数据库约束设计
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [main.py](file://backend/app/main.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件详细阐述了医院绩效管理系统的数据库约束设计,涵盖唯一性约束、检查约束、索引设计和外键约束的实现原理与业务意义。通过对系统中各个数据表的约束策略进行深入分析,帮助开发者和运维人员理解数据完整性保障机制,并提供针对约束冲突的处理策略和优化建议。
|
||||
|
||||
## 项目结构
|
||||
|
||||
该系统采用基于 SQLAlchemy 的 ORM 设计,数据库约束主要通过以下方式实现:
|
||||
- 数据模型层定义:在模型类中直接声明约束和索引
|
||||
- 迁移脚本层:通过 Alembic 版本化管理数据库结构变更
|
||||
- 配置层:数据库连接和会话管理
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据模型层"
|
||||
Models[ORM 模型定义]
|
||||
Constraints[约束声明]
|
||||
Indexes[索引定义]
|
||||
end
|
||||
subgraph "迁移管理层"
|
||||
Alembic[Alembic 迁移]
|
||||
Initial[初始版本]
|
||||
Template[模板版本]
|
||||
end
|
||||
subgraph "配置层"
|
||||
Config[数据库配置]
|
||||
Engine[异步引擎]
|
||||
Session[会话管理]
|
||||
end
|
||||
Models --> Alembic
|
||||
Constraints --> Alembic
|
||||
Indexes --> Alembic
|
||||
Alembic --> Initial
|
||||
Alembic --> Template
|
||||
Config --> Engine
|
||||
Engine --> Session
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L84)
|
||||
- [database.py](file://backend/app/core/database.py#L10-L20)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L50)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L20)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 核心组件
|
||||
|
||||
系统的核心数据模型包括科室、员工、考核指标、考核记录、工资记录等关键实体。每个实体都配备了相应的约束策略以确保数据完整性。
|
||||
|
||||
### 主要数据实体
|
||||
|
||||
| 实体名称 | 主键字段 | 唯一约束 | 外键约束 | 检查约束 |
|
||||
|---------|---------|---------|---------|---------|
|
||||
| departments | id | code | 无 | 无 |
|
||||
| staff | id | employee_id | department_id | 无 |
|
||||
| indicators | id | code | 无 | weight > 0 |
|
||||
| assessments | id | 无 | staff_id, assessor_id, reviewer_id | 无 |
|
||||
| assessment_details | id | 无 | assessment_id, indicator_id | 无 |
|
||||
| salary_records | id | 无 | staff_id | 无 |
|
||||
| users | id | username | staff_id | 无 |
|
||||
| performance_plans | id | plan_code | department_id, staff_id, parent_plan_id, submitter_id, approver_id | 无 |
|
||||
| plan_kpi_relations | id | (plan_id, indicator_id) 唯一 | plan_id, indicator_id | 无 |
|
||||
| indicator_templates | id | template_code | 无 | 无 |
|
||||
| template_indicators | id | (template_id, indicator_id) 唯一 | template_id, indicator_id | 无 |
|
||||
| department_finances | id | 无 | department_id | amount >= 0 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L437)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用三层约束设计架构:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "约束层次"
|
||||
Layer1[业务层约束<br/>模型定义]
|
||||
Layer2[持久层约束<br/>数据库层面]
|
||||
Layer3[应用层约束<br/>应用程序逻辑]
|
||||
end
|
||||
subgraph "约束类型"
|
||||
Unique[唯一性约束]
|
||||
Check[检查约束]
|
||||
FK[外键约束]
|
||||
Index[索引约束]
|
||||
end
|
||||
subgraph "应用场景"
|
||||
Business[业务规则]
|
||||
DataIntegrity[数据完整性]
|
||||
QueryOptimization[查询优化]
|
||||
Referential[参照完整性]
|
||||
end
|
||||
Layer1 --> Unique
|
||||
Layer1 --> Check
|
||||
Layer1 --> FK
|
||||
Layer1 --> Index
|
||||
Unique --> Business
|
||||
Check --> DataIntegrity
|
||||
FK --> Referential
|
||||
Index --> QueryOptimization
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L68-L68)
|
||||
- [models.py](file://backend/app/models/models.py#L145-L145)
|
||||
- [finance.py](file://backend/app/models/finance.py#L73-L73)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 唯一性约束设计
|
||||
|
||||
唯一性约束是确保数据唯一性的基础机制,系统在多个关键字段上实施了唯一性约束。
|
||||
|
||||
#### 唯一性约束实现
|
||||
|
||||
| 表名 | 唯一字段 | 约束目的 | 业务意义 |
|
||||
|------|---------|---------|---------|
|
||||
| departments | code | 科室编码唯一性 | 防止重复科室标识,便于精确识别 |
|
||||
| staff | employee_id | 员工工号唯一性 | 确保员工身份唯一标识,避免重复录入 |
|
||||
| users | username | 用户名唯一性 | 保证系统用户身份唯一,防止登录冲突 |
|
||||
| indicators | code | 指标编码唯一性 | 确保考核指标的唯一标识,便于管理和查询 |
|
||||
| performance_plans | plan_code | 计划编码唯一性 | 防止重复计划标识,维护计划体系完整性 |
|
||||
| indicator_templates | template_code | 模板编码唯一性 | 确保模板的唯一标识,便于模板管理和复用 |
|
||||
| plan_kpi_relations | (plan_id, indicator_id) | 关联关系唯一性 | 防止重复关联,确保计划-指标关系的准确性 |
|
||||
| template_indicators | (template_id, indicator_id) | 关联关系唯一性 | 防止重复关联,确保模板-指标关系的准确性 |
|
||||
|
||||
#### 唯一性约束触发条件
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([数据插入/更新]) --> CheckUnique["检查唯一性约束"]
|
||||
CheckUnique --> UniqueExists{"是否存在重复值?"}
|
||||
UniqueExists --> |是| RaiseError["抛出唯一性约束异常"]
|
||||
UniqueExists --> |否| Continue["继续执行操作"]
|
||||
RaiseError --> HandleConflict["处理冲突"]
|
||||
HandleConflict --> Rollback["回滚事务"]
|
||||
Continue --> Commit["提交事务"]
|
||||
Rollback --> End([结束])
|
||||
Commit --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L37-L37)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L61-L61)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L36-L36)
|
||||
|
||||
**章节来源**
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L27-L28)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L46-L47)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L160-L160)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L27-L28)
|
||||
|
||||
### 检查约束设计
|
||||
|
||||
检查约束用于强制执行复杂的业务规则,确保数据符合预定义的条件。
|
||||
|
||||
#### 检查约束实现
|
||||
|
||||
| 表名 | 约束条件 | 约束名称 | 业务含义 |
|
||||
|------|---------|---------|---------|
|
||||
| indicators | weight > 0 | ck_indicator_weight | 确保指标权重必须为正数,保证计算逻辑正确性 |
|
||||
| department_finances | amount >= 0 | ck_finance_amount | 确保财务金额不能为负数,维护财务数据准确性 |
|
||||
|
||||
#### 检查约束验证流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant DB as 数据库
|
||||
participant Trigger as 检查约束触发器
|
||||
Client->>DB : INSERT/UPDATE 操作
|
||||
DB->>Trigger : 验证检查约束
|
||||
Trigger->>Trigger : 计算约束条件
|
||||
Trigger->>Trigger : 判断条件是否满足
|
||||
alt 条件满足
|
||||
Trigger->>DB : 允许操作
|
||||
DB-->>Client : 操作成功
|
||||
else 条件不满足
|
||||
Trigger->>DB : 拒绝操作
|
||||
DB-->>Client : 抛出检查约束异常
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L145-L145)
|
||||
- [finance.py](file://backend/app/models/finance.py#L73-L73)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L143-L146)
|
||||
- [finance.py](file://backend/app/models/finance.py#L68-L74)
|
||||
|
||||
### 外键约束设计
|
||||
|
||||
外键约束确保参照完整性,防止出现孤立记录和无效引用。
|
||||
|
||||
#### 外键约束实现
|
||||
|
||||
| 表名 | 外键字段 | 引用表 | 约束类型 | 业务意义 |
|
||||
|------|---------|--------|---------|---------|
|
||||
| staff | department_id | departments | 必须引用有效科室 | 确保员工属于存在的科室 |
|
||||
| assessments | staff_id | staff | 必须引用有效员工 | 确保考核记录对应有效员工 |
|
||||
| assessments | assessor_id | staff | 可选引用有效员工 | 确保考核人存在且有效 |
|
||||
| assessments | reviewer_id | staff | 可选引用有效员工 | 确保审核人存在且有效 |
|
||||
| assessment_details | assessment_id | assessments | 必须引用有效考核记录 | 确保明细对应有效考核 |
|
||||
| assessment_details | indicator_id | indicators | 必须引用有效指标 | 确保明细对应有效指标 |
|
||||
| salary_records | staff_id | staff | 必须引用有效员工 | 确保工资记录对应有效员工 |
|
||||
| users | staff_id | staff | 可选引用有效员工 | 确保用户关联有效员工 |
|
||||
| performance_plans | department_id | departments | 可选引用有效科室 | 确保计划关联有效科室 |
|
||||
| performance_plans | staff_id | staff | 可选引用有效员工 | 确保计划关联有效员工 |
|
||||
| performance_plans | parent_plan_id | performance_plans | 自引用 | 确保计划层级关系正确 |
|
||||
| performance_plans | submitter_id | users | 可选引用有效用户 | 确保提交人存在且有效 |
|
||||
| performance_plans | approver_id | users | 可选引用有效用户 | 确保审批人存在且有效 |
|
||||
| plan_kpi_relations | plan_id | performance_plans | 必须引用有效计划 | 确保关联关系有效 |
|
||||
| plan_kpi_relations | indicator_id | indicators | 必须引用有效指标 | 确保关联关系有效 |
|
||||
| template_indicators | template_id | indicator_templates | 必须引用有效模板 | 确保关联关系有效 |
|
||||
| template_indicators | indicator_id | indicators | 必须引用有效指标 | 确保关联关系有效 |
|
||||
| department_finances | department_id | departments | 必须引用有效科室 | 确保财务记录对应有效科室 |
|
||||
|
||||
#### 外键约束级联行为
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Department {
|
||||
+id : int
|
||||
+name : str
|
||||
+code : str
|
||||
+children : Department[]
|
||||
}
|
||||
class Staff {
|
||||
+id : int
|
||||
+employee_id : str
|
||||
+department_id : int
|
||||
+department : Department
|
||||
}
|
||||
class Assessment {
|
||||
+id : int
|
||||
+staff_id : int
|
||||
+staff : Staff
|
||||
+assessor_id : int
|
||||
+reviewer_id : int
|
||||
}
|
||||
class PerformancePlan {
|
||||
+id : int
|
||||
+department_id : int
|
||||
+staff_id : int
|
||||
+parent_plan_id : int
|
||||
+submitter_id : int
|
||||
+approver_id : int
|
||||
+parent_plan : PerformancePlan
|
||||
}
|
||||
Department --> Staff : "1 : N"
|
||||
Staff --> Assessment : "1 : N"
|
||||
PerformancePlan --> PerformancePlan : "self-ref"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L70-L70)
|
||||
- [models.py](file://backend/app/models/models.py#L154-L154)
|
||||
- [models.py](file://backend/app/models/models.py#L283-L283)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L95-L95)
|
||||
- [models.py](file://backend/app/models/models.py#L154-L154)
|
||||
- [models.py](file://backend/app/models/models.py#L281-L281)
|
||||
|
||||
### 索引设计策略
|
||||
|
||||
索引设计直接影响查询性能和数据检索效率,系统针对高频查询场景建立了多维索引。
|
||||
|
||||
#### 单列索引设计
|
||||
|
||||
| 表名 | 索引字段 | 索引名称 | 查询场景 | 性能收益 |
|
||||
|------|---------|---------|---------|---------|
|
||||
| departments | dept_type | idx_dept_type | 按科室类型查询 | 快速筛选特定类型科室 |
|
||||
| departments | parent_id | idx_dept_parent | 按上级科室查询 | 快速获取子科室层级 |
|
||||
| staff | department_id | idx_staff_dept | 按科室查询员工 | 快速定位科室员工 |
|
||||
| staff | status | idx_staff_status | 按状态查询员工 | 快速筛选特定状态员工 |
|
||||
| indicators | indicator_type | idx_indicator_type | 按指标类型查询 | 快速筛选指标类型 |
|
||||
| assessments | staff_id | idx_assessment_staff | 按员工查询考核记录 | 快速获取员工考核历史 |
|
||||
| assessments | period_year, period_month | idx_assessment_period | 按时间段查询考核记录 | 快速定位特定期间记录 |
|
||||
| assessments | status | idx_assessment_status | 按状态查询考核记录 | 快速筛选特定状态记录 |
|
||||
| assessment_details | assessment_id | idx_detail_assessment | 按考核记录查询明细 | 快速获取考核明细 |
|
||||
| assessment_details | indicator_id | idx_detail_indicator | 按指标查询明细 | 快速获取指标相关明细 |
|
||||
| salary_records | staff_id | idx_salary_staff | 按员工查询工资记录 | 快速获取员工工资历史 |
|
||||
| salary_records | period_year, period_month | idx_salary_period | 按时间段查询工资记录 | 快速定位特定期间工资 |
|
||||
| users | username | idx_user_username | 按用户名查询用户 | 快速定位用户账户 |
|
||||
| performance_plans | plan_level | idx_plan_level | 按计划层级查询 | 快速筛选特定层级计划 |
|
||||
| performance_plans | plan_year | idx_plan_year | 按年度查询计划 | 快速定位年度计划 |
|
||||
| performance_plans | department_id | idx_plan_department | 按科室查询计划 | 快速获取科室计划 |
|
||||
| performance_plans | status | idx_plan_status | 按状态查询计划 | 快速筛选特定状态计划 |
|
||||
| indicator_templates | template_type | idx_template_type | 按模板类型查询 | 快速筛选模板类型 |
|
||||
| indicator_templates | is_active | idx_template_active | 按启用状态查询 | 快速筛选有效模板 |
|
||||
| plan_kpi_relations | plan_id | idx_relation_plan | 按计划查询关联 | 快速获取计划关联指标 |
|
||||
| plan_kpi_relations | indicator_id | idx_relation_indicator | 按指标查询关联 | 快速获取指标关联计划 |
|
||||
| template_indicators | template_id | idx_ti_template | 按模板查询关联 | 快速获取模板关联指标 |
|
||||
| template_indicators | indicator_id | idx_ti_indicator | 按指标查询关联 | 快速获取指标关联模板 |
|
||||
| department_finances | department_id | idx_finance_dept | 按科室查询财务记录 | 快速获取科室财务数据 |
|
||||
| department_finances | period_year, period_month | idx_finance_period | 按时间段查询财务记录 | 快速定位特定期间财务 |
|
||||
| department_finances | finance_type | idx_finance_type | 按财务类型查询 | 快速筛选收支类型 |
|
||||
| department_finances | category | idx_finance_category | 按类别查询财务记录 | 快速筛选特定类别 |
|
||||
|
||||
#### 复合索引设计思路
|
||||
|
||||
复合索引通过组合多个字段来优化特定查询模式:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
QueryPattern[查询模式分析] --> IdentifyFields["识别查询字段"]
|
||||
IdentifyFields --> Selectivity["评估选择性"]
|
||||
Selectivity --> OrderFields["确定字段顺序"]
|
||||
OrderFields --> TestPerformance["测试查询性能"]
|
||||
TestPerformance --> CreateIndex["创建复合索引"]
|
||||
CreateIndex --> MonitorUsage["监控索引使用"]
|
||||
MonitorUsage --> OptimizeIndex["优化索引设计"]
|
||||
subgraph "复合索引示例"
|
||||
PeriodIndex["idx_assessment_period<br/>(year, month)"]
|
||||
RelationIndex["idx_ti_unique<br/>(template_id, indicator_id)"]
|
||||
PlanIndex["idx_plan_department<br/>(department_id, status)"]
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L176-L176)
|
||||
- [models.py](file://backend/app/models/models.py#L436-L436)
|
||||
- [models.py](file://backend/app/models/models.py#L309-L309)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L82-L85)
|
||||
- [models.py](file://backend/app/models/models.py#L111-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L174-L178)
|
||||
- [models.py](file://backend/app/models/models.py#L227-L230)
|
||||
- [models.py](file://backend/app/models/models.py#L258-L260)
|
||||
- [models.py](file://backend/app/models/models.py#L306-L311)
|
||||
- [models.py](file://backend/app/models/models.py#L433-L437)
|
||||
|
||||
### 约束冲突处理策略
|
||||
|
||||
当数据库约束被违反时,系统需要有一套完善的冲突处理机制。
|
||||
|
||||
#### 错误处理流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant App as 应用程序
|
||||
participant DB as 数据库
|
||||
participant Handler as 错误处理器
|
||||
App->>DB : 执行数据库操作
|
||||
DB->>DB : 验证所有约束
|
||||
alt 约束验证失败
|
||||
DB->>Handler : 抛出约束异常
|
||||
Handler->>Handler : 分析异常类型
|
||||
Handler->>Handler : 生成用户友好错误消息
|
||||
Handler->>App : 返回错误响应
|
||||
else 约束验证成功
|
||||
DB->>App : 返回成功响应
|
||||
end
|
||||
```
|
||||
|
||||
#### 约束冲突类型及处理
|
||||
|
||||
| 冲突类型 | 触发条件 | 处理策略 | 用户反馈 |
|
||||
|---------|---------|---------|---------|
|
||||
| 唯一性冲突 | 插入重复唯一值 | 提示用户修改唯一字段值 | "该[字段]已存在,请使用其他值" |
|
||||
| 外键冲突 | 引用不存在的外键值 | 提示用户选择有效引用值 | "请选择有效的[关联实体]" |
|
||||
| 检查约束冲突 | 数据不符合检查条件 | 提示用户修正数据格式 | "[字段]必须满足[条件说明]" |
|
||||
| 级联删除冲突 | 尝试删除有子记录的父记录 | 提示用户先删除子记录或调整级联策略 | "请先删除子记录或调整关联关系" |
|
||||
|
||||
**章节来源**
|
||||
- [main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统约束设计涉及多个层面的依赖关系,形成了完整的数据完整性保障体系。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "模型层依赖"
|
||||
ModelBase[Base Model]
|
||||
ConstraintMixin[Constraint Mixin]
|
||||
IndexMixin[Index Mixin]
|
||||
end
|
||||
subgraph "约束实现"
|
||||
UniqueConstraint[Unique Constraint]
|
||||
CheckConstraint[Check Constraint]
|
||||
ForeignKeyConstraint[Foreign Key Constraint]
|
||||
IndexConstraint[Index Constraint]
|
||||
end
|
||||
subgraph "迁移层依赖"
|
||||
AlembicOps[Alembic Operations]
|
||||
MigrationScripts[Migration Scripts]
|
||||
end
|
||||
subgraph "配置层依赖"
|
||||
DatabaseConfig[Database Configuration]
|
||||
AsyncEngine[Async Engine]
|
||||
SessionManager[Session Manager]
|
||||
end
|
||||
ModelBase --> ConstraintMixin
|
||||
ModelBase --> IndexMixin
|
||||
ConstraintMixin --> UniqueConstraint
|
||||
ConstraintMixin --> CheckConstraint
|
||||
IndexMixin --> IndexConstraint
|
||||
AlembicOps --> MigrationScripts
|
||||
DatabaseConfig --> AsyncEngine
|
||||
AsyncEngine --> SessionManager
|
||||
MigrationScripts --> UniqueConstraint
|
||||
MigrationScripts --> CheckConstraint
|
||||
MigrationScripts --> ForeignKeyConstraint
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L23-L25)
|
||||
- [database.py](file://backend/app/core/database.py#L10-L20)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L21)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L18-L21)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
合理的约束设计不仅保证数据完整性,还能显著提升系统性能。
|
||||
|
||||
### 索引性能优化
|
||||
|
||||
#### 查询性能分析
|
||||
|
||||
| 查询类型 | 索引使用情况 | 性能影响 | 优化建议 |
|
||||
|---------|---------|---------|---------|
|
||||
| 等值查询 | 使用精确匹配索引 | 高性能 | 确保查询条件包含索引字段 |
|
||||
| 范围查询 | 使用范围扫描索引 | 中等性能 | 优化查询条件,减少扫描范围 |
|
||||
| 复合查询 | 使用复合索引 | 高性能 | 确保查询条件覆盖索引前缀 |
|
||||
| 排序查询 | 使用排序索引 | 高性能 | 确保ORDER BY字段包含在索引中 |
|
||||
| 连接查询 | 使用连接索引 | 高性能 | 确保JOIN字段建立索引 |
|
||||
|
||||
#### 索引维护策略
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Monitor[监控索引使用] --> AnalyzeUsage["分析索引使用率"]
|
||||
AnalyzeUsage --> IdentifyUnused["识别未使用索引"]
|
||||
IdentifyUnused --> DropUnused["删除无用索引"]
|
||||
AnalyzeUsage --> IdentifyMissing["识别缺失索引"]
|
||||
IdentifyMissing --> CreateIndex["创建必要索引"]
|
||||
CreateIndex --> Monitor
|
||||
DropUnused --> Monitor
|
||||
Monitor --> RebuildIndex["重建碎片索引"]
|
||||
RebuildIndex --> Monitor
|
||||
```
|
||||
|
||||
### 约束对性能的影响
|
||||
|
||||
| 约束类型 | 正面影响 | 负面影响 | 性能平衡点 |
|
||||
|---------|---------|---------|---------|
|
||||
| 唯一性约束 | 数据一致性保证 | 插入/更新时额外检查 | 在高频写入场景下适度放宽 |
|
||||
| 检查约束 | 业务规则强制执行 | 数据验证开销 | 复杂检查约束需要谨慎使用 |
|
||||
| 外键约束 | 参照完整性保障 | 关联查询性能影响 | 对频繁关联查询考虑性能权衡 |
|
||||
| 索引约束 | 查询性能提升 | 写入性能下降 | 基于查询模式优化索引设计 |
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见约束问题诊断
|
||||
|
||||
#### 唯一性约束冲突
|
||||
|
||||
**问题症状**:插入或更新数据时报唯一性约束错误
|
||||
|
||||
**诊断步骤**:
|
||||
1. 检查冲突的具体字段和值
|
||||
2. 验证是否存在重复数据
|
||||
3. 确认业务逻辑是否允许重复
|
||||
4. 检查数据清理流程
|
||||
|
||||
**解决方案**:
|
||||
- 修改唯一字段值
|
||||
- 清理重复数据
|
||||
- 调整业务逻辑
|
||||
- 重新设计唯一性策略
|
||||
|
||||
#### 外键约束冲突
|
||||
|
||||
**问题症状**:引用不存在的数据时报外键约束错误
|
||||
|
||||
**诊断步骤**:
|
||||
1. 确认被引用表中是否存在对应记录
|
||||
2. 检查关联字段的数据类型和格式
|
||||
3. 验证数据插入顺序
|
||||
4. 检查是否有级联删除策略
|
||||
|
||||
**解决方案**:
|
||||
- 先插入父记录再插入子记录
|
||||
- 使用正确的关联值
|
||||
- 调整级联删除策略
|
||||
- 实施数据预校验
|
||||
|
||||
#### 检查约束冲突
|
||||
|
||||
**问题症状**:数据不符合检查条件时报错
|
||||
|
||||
**诊断步骤**:
|
||||
1. 检查具体违反的约束条件
|
||||
2. 验证数据格式和范围
|
||||
3. 确认业务规则合理性
|
||||
4. 检查数据转换逻辑
|
||||
|
||||
**解决方案**:
|
||||
- 修正数据格式
|
||||
- 调整业务规则
|
||||
- 实施数据验证
|
||||
- 优化约束条件
|
||||
|
||||
### 数据库迁移问题
|
||||
|
||||
#### 迁移失败处理
|
||||
|
||||
**常见问题**:
|
||||
- 字段已存在导致迁移失败
|
||||
- 索引创建冲突
|
||||
- 外键约束依赖问题
|
||||
|
||||
**处理策略**:
|
||||
1. 检查当前数据库状态
|
||||
2. 手动执行必要的DDL操作
|
||||
3. 调整迁移脚本顺序
|
||||
4. 实施回滚和重试机制
|
||||
|
||||
**章节来源**
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L67-L90)
|
||||
|
||||
## 结论
|
||||
|
||||
本系统的数据库约束设计体现了多层次、全方位的数据完整性保障机制。通过合理运用唯一性约束、检查约束、外键约束和索引约束,系统在保证数据准确性和一致性的前提下,实现了高效的查询性能和良好的扩展性。
|
||||
|
||||
### 设计亮点
|
||||
|
||||
1. **层次化约束设计**:从模型层到数据库层的完整约束覆盖
|
||||
2. **业务导向的约束策略**:每个约束都有明确的业务意义和触发条件
|
||||
3. **性能优化的索引设计**:针对高频查询场景的复合索引策略
|
||||
4. **完善的冲突处理机制**:从技术层面到用户体验的全面考虑
|
||||
|
||||
### 持续改进建议
|
||||
|
||||
1. **监控和分析**:建立约束使用情况的监控机制
|
||||
2. **定期优化**:根据查询模式变化调整索引策略
|
||||
3. **文档完善**:持续更新约束设计文档和最佳实践
|
||||
4. **性能测试**:定期进行约束对性能影响的评估测试
|
||||
|
||||
通过这套完整的约束设计体系,系统能够可靠地支撑医院绩效管理的各项业务需求,为医疗质量管理提供坚实的数据基础。
|
||||
471
.qoder/repowiki/zh/content/数据模型详解/数据模型详解.md
Normal file
471
.qoder/repowiki/zh/content/数据模型详解/数据模型详解.md
Normal file
@@ -0,0 +1,471 @@
|
||||
# 数据模型详解
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [config.py](file://backend/app/core/config.py)
|
||||
- [init_db.py](file://backend/init_db.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向医院绩效系统的核心数据模型,系统化阐述 Department、Staff、Assessment、AssessmentDetail、SalaryRecord 等关键实体的设计理念、字段定义、数据类型与约束条件,并深入解析模型间的关系映射、级联操作与数据完整性保障机制。同时,结合服务层业务逻辑,给出数据验证规则、业务规则实现、性能优化策略、模型扩展指南以及版本兼容与迁移策略,帮助开发者与运维人员高效理解与维护该数据模型。
|
||||
|
||||
## 项目结构
|
||||
后端采用 SQLAlchemy ORM + Alembic 迁移的架构,模型集中于 models 模块,配合 Pydantic 的数据模式(schemas)进行输入输出校验;数据库连接通过异步引擎与会话工厂实现;迁移脚本确保数据库结构演进的可控性。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "模型层"
|
||||
M1["models.py<br/>核心业务模型"]
|
||||
M2["finance.py<br/>财务核算模型"]
|
||||
end
|
||||
subgraph "数据模式层"
|
||||
S1["schemas.py<br/>Pydantic模式"]
|
||||
end
|
||||
subgraph "基础设施层"
|
||||
C1["config.py<br/>配置"]
|
||||
D1["database.py<br/>数据库连接"]
|
||||
end
|
||||
subgraph "迁移层"
|
||||
V1["001_initial.py<br/>初始版本"]
|
||||
V2["002_template.py<br/>模板版本"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
A1["assessment_service.py"]
|
||||
S2["salary_service.py"]
|
||||
ST1["staff_service.py"]
|
||||
I1["indicator_service.py"]
|
||||
end
|
||||
M1 --> S1
|
||||
M2 --> S1
|
||||
C1 --> D1
|
||||
V1 --> M1
|
||||
V2 --> M1
|
||||
A1 --> M1
|
||||
S2 --> M1
|
||||
ST1 --> M1
|
||||
I1 --> M1
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L230)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L9-L47)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [config.py](file://backend/app/core/config.py#L1-L47)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L1-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
|
||||
## 核心组件
|
||||
本节聚焦五个关键模型的字段定义、数据类型、约束条件与业务含义。
|
||||
|
||||
- Department(科室信息)
|
||||
- 字段与类型:自增主键、字符串名称与编码(唯一)、枚举类型、层级、排序、启用状态、描述、时间戳
|
||||
- 约束:编码唯一;索引覆盖类型与父级
|
||||
- 关系:自关联父子关系;一对多到 Staff
|
||||
- 业务意义:支撑组织架构与层级管理
|
||||
|
||||
- Staff(员工信息)
|
||||
- 字段与类型:唯一工号、姓名、所属科室外键、职位、职称、联系方式、基本工资、绩效系数、状态、入职日期、时间戳
|
||||
- 约束:工号唯一;索引覆盖科室与状态
|
||||
- 关系:多对一到 Department;一对多到 Assessment、SalaryRecord
|
||||
- 业务意义:员工档案与薪酬基础数据
|
||||
|
||||
- Assessment(考核记录)
|
||||
- 字段与类型:员工外键、考核年月、周期类型、总分、加权得分、状态、考核人/审核人外键、时间戳、备注
|
||||
- 约束:复合索引覆盖员工、年月、状态;级联删除明细
|
||||
- 关系:多对一到 Staff;一对多到 AssessmentDetail
|
||||
- 业务意义:记录单次考核的聚合结果与流转状态
|
||||
|
||||
- AssessmentDetail(考核明细)
|
||||
- 字段与类型:考核记录外键、指标外键、实际值、得分、佐证材料、备注、时间戳
|
||||
- 约束:明细索引覆盖考核与指标
|
||||
- 关系:多对一到 Assessment、Indicator
|
||||
- 业务意义:承载具体指标的得分与证据
|
||||
|
||||
- SalaryRecord(工资核算记录)
|
||||
- 字段与类型:员工外键、年月、基本工资、绩效得分、绩效奖金、扣款、补贴、应发工资、状态、备注、时间戳
|
||||
- 约束:索引覆盖员工与年月
|
||||
- 关系:多对一到 Staff
|
||||
- 业务意义:工资发放依据与统计入口
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L230)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L64-L311)
|
||||
|
||||
## 架构概览
|
||||
数据模型围绕“员工-科室-考核-工资”主线展开,通过外键与关系映射实现强一致的数据完整性;服务层负责业务规则与流程控制,如考核状态机、工资计算与生成、模板导入等。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Department {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+enum dept_type
|
||||
+int level
|
||||
+int sort_order
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+children : Department[]
|
||||
+staff : Staff[]
|
||||
}
|
||||
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
|
||||
+enum status
|
||||
+datetime hire_date
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+department : Department
|
||||
+assessments : Assessment[]
|
||||
+salary_records : SalaryRecord[]
|
||||
}
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+string period_type
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+enum status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
+datetime submit_time
|
||||
+datetime review_time
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+staff : Staff
|
||||
+assessor : Staff
|
||||
+reviewer : Staff
|
||||
+details : AssessmentDetail[]
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+string evidence
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+assessment : Assessment
|
||||
+indicator : Indicator
|
||||
}
|
||||
class SalaryRecord {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float base_salary
|
||||
+float performance_score
|
||||
+float performance_bonus
|
||||
+float deduction
|
||||
+float allowance
|
||||
+float total_salary
|
||||
+string status
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+staff : Staff
|
||||
}
|
||||
Department "1" <-- "many" Staff : "外键"
|
||||
Staff "1" <-- "many" Assessment : "外键"
|
||||
Staff "1" <-- "many" SalaryRecord : "外键"
|
||||
Assessment "1" <-- "many" AssessmentDetail : "级联删除"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L230)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Department(科室信息)
|
||||
- 设计要点
|
||||
- 使用自关联实现层级树结构,支持多级科室组织
|
||||
- 通过枚举限定科室类型,便于筛选与模板匹配
|
||||
- 索引提升按类型与父子关系查询效率
|
||||
- 业务规则
|
||||
- 启用/停用控制科室参与统计与流程
|
||||
- 层级与排序用于前端树形展示与权限控制
|
||||
- 外键与关系
|
||||
- Department.parent → Department.children(自关联)
|
||||
- Department.staff → Staff(一对多)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L41)
|
||||
|
||||
### Staff(员工信息)
|
||||
- 设计要点
|
||||
- 唯一工号确保跨系统识别一致性
|
||||
- 绩效系数与基本工资构成工资基础
|
||||
- 状态枚举支持在职、休假、离职、退休等生命周期
|
||||
- 业务规则
|
||||
- 仅在职员工参与考核与工资生成
|
||||
- 基本工资与绩效系数影响最终绩效奖金
|
||||
- 外键与关系
|
||||
- Staff.department → Department
|
||||
- Staff.assessments → Assessment
|
||||
- Staff.salary_records → SalaryRecord
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
- [init_db.py](file://backend/init_db.py#L42-L53)
|
||||
|
||||
### Assessment(考核记录)
|
||||
- 设计要点
|
||||
- 年、月、周期类型组合唯一性避免重复
|
||||
- 总分与加权得分分离,加权由明细权重累积
|
||||
- 状态机驱动流程:草稿→提交→审核→确认/驳回
|
||||
- 业务规则
|
||||
- 仅草稿或驳回状态允许修改
|
||||
- 提交后进入审核流程,审核通过方可确认
|
||||
- 外键与关系
|
||||
- Assessment.staff → Staff
|
||||
- Assessment.assessor/reviewer → Staff
|
||||
- Assessment.details → AssessmentDetail(级联删除)
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 已提交 : "提交"
|
||||
已提交 --> 已审核 : "审核通过"
|
||||
已提交 --> 已驳回 : "审核驳回"
|
||||
已审核 --> 已确认 : "确认"
|
||||
已确认 --> [*]
|
||||
已驳回 --> 草稿 : "修改后重新提交"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L159-L205)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L79-L262)
|
||||
|
||||
### AssessmentDetail(考核明细)
|
||||
- 设计要点
|
||||
- 明细与指标绑定,支持不同指标的权重与计算
|
||||
- 实际值与得分可独立记录,便于审计与复核
|
||||
- 业务规则
|
||||
- 加权得分来源于指标权重与得分乘积之和
|
||||
- 外键与关系
|
||||
- AssessmentDetail.assessment → Assessment
|
||||
- AssessmentDetail.indicator → Indicator
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L79-L108)
|
||||
|
||||
### SalaryRecord(工资核算记录)
|
||||
- 设计要点
|
||||
- 应发工资 = 基本工资 + 绩效奖金 + 补贴 - 扣款
|
||||
- 绩效奖金 = 绩效基数 × (绩效得分/100) × 绩效系数
|
||||
- 年月唯一,避免重复发薪
|
||||
- 业务规则
|
||||
- 仅当考核处于“已确认”状态才可生成工资记录
|
||||
- 工资记录状态默认“待处理”,支持后续调整
|
||||
- 外键与关系
|
||||
- SalaryRecord.staff → Staff
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> GetAssessment["获取已确认考核记录"]
|
||||
GetAssessment --> Exists{"是否存在?"}
|
||||
Exists --> |否| End(["结束"])
|
||||
Exists --> |是| CalcBonus["计算绩效奖金"]
|
||||
CalcBonus --> SumTotal["计算应发工资"]
|
||||
SumTotal --> CreateRecord["创建工资记录"]
|
||||
CreateRecord --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L70-L199)
|
||||
|
||||
### 财务核算模型(DepartmentFinance)
|
||||
- 设计要点
|
||||
- 收入/支出两类,按类别细分(检查费、检验费、床位费、材料费、人员支出等)
|
||||
- 金额非负约束,确保财务数据正确性
|
||||
- 按科室与年月索引,支持财务统计
|
||||
- 业务规则
|
||||
- 金额必须≥0
|
||||
- 与科室关联,支持按科室维度的收支结余分析
|
||||
|
||||
**章节来源**
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
## 依赖分析
|
||||
- 模型依赖
|
||||
- Assessment 依赖 Staff、AssessmentDetail
|
||||
- AssessmentDetail 依赖 Assessment、Indicator
|
||||
- SalaryRecord 依赖 Staff
|
||||
- Department 依赖 Staff(自关联)
|
||||
- 服务层依赖
|
||||
- AssessmentService 依赖 Assessment、AssessmentDetail、Indicator
|
||||
- SalaryService 依赖 Staff、Assessment、SalaryRecord
|
||||
- 其他服务(StaffService、IndicatorService)分别依赖对应模型
|
||||
- 数据库与配置
|
||||
- 异步引擎与会话工厂统一管理连接与事务
|
||||
- Alembic 迁移脚本确保表结构演进
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A["AssessmentService"] --> AM["Assessment"]
|
||||
A --> ADM["AssessmentDetail"]
|
||||
A --> IM["Indicator"]
|
||||
S["SalaryService"] --> SM["Staff"]
|
||||
S --> AS["Assessment"]
|
||||
S --> SRM["SalaryRecord"]
|
||||
ST["StaffService"] --> STM["Staff"]
|
||||
I["IndicatorService"] --> IM
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L79-L262)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L77-L199)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L16-L112)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L16-L197)
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L262)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L199)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
|
||||
## 性能考虑
|
||||
- 索引策略
|
||||
- 员工:按部门与状态建立索引,加速筛选与分页
|
||||
- 考核:按员工、年月、状态建立复合索引,支持快速定位与统计
|
||||
- 工资:按员工与年月建立索引,提升查询效率
|
||||
- 科室:按类型与父级建立索引,优化树形查询
|
||||
- 查询优化
|
||||
- 使用 selectinload 预加载关联对象,减少 N+1 查询
|
||||
- 分页查询配合 COUNT 子查询,避免全表扫描
|
||||
- 异步与连接池
|
||||
- 异步引擎与连接池配置,提升并发吞吐
|
||||
- 数据类型
|
||||
- 使用 Numeric 精确存储金额与分数,避免浮点误差
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L82-L85)
|
||||
- [models.py](file://backend/app/models/models.py#L111-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L174-L178)
|
||||
- [models.py](file://backend/app/models/models.py#L227-L230)
|
||||
- [config.py](file://backend/app/core/config.py#L18-L22)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L20)
|
||||
|
||||
## 故障排除指南
|
||||
- 常见问题
|
||||
- 无法更新考核:仅草稿或驳回状态允许修改
|
||||
- 无法生成工资:需先完成“已确认”的考核记录
|
||||
- 重复工资:同一年月同员工只允许一条工资记录
|
||||
- 财务异常:金额必须≥0,否则触发约束错误
|
||||
- 排查步骤
|
||||
- 检查 Assessment 状态与时间戳
|
||||
- 核对 Staff 的基本工资与绩效系数
|
||||
- 确认 SalaryRecord 的年月与员工唯一性
|
||||
- 校验 DepartmentFinance 的金额与类别
|
||||
- 日志与调试
|
||||
- 开启数据库回滚与关闭,确保异常时数据一致性
|
||||
- 使用分页与索引优化查询,避免超时
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L111-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [finance.py](file://backend/app/models/finance.py#L73-L74)
|
||||
- [database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 结论
|
||||
本数据模型以清晰的实体边界、严谨的外键关系与完善的索引策略为基础,结合服务层的状态机与计算逻辑,实现了从“员工-科室-考核-工资”的闭环管理。通过 Alembic 迁移与 Pydantic 模式,系统具备良好的可演进性与可维护性。建议在扩展新功能时遵循现有命名规范、索引策略与事务处理模式,确保数据一致性与性能表现。
|
||||
|
||||
## 附录
|
||||
|
||||
### 字段定义与约束对照表
|
||||
- Department
|
||||
- 字段:id、name、code(唯一)、dept_type、parent_id、level、sort_order、is_active、description、created_at、updated_at
|
||||
- 约束:唯一索引(code),普通索引(dept_type、parent_id)
|
||||
- Staff
|
||||
- 字段:id、employee_id(唯一)、name、department_id、position、title、phone、email、base_salary、performance_ratio、status、hire_date、created_at、updated_at
|
||||
- 约束:唯一索引(employee_id),普通索引(department_id、status)
|
||||
- Assessment
|
||||
- 字段:id、staff_id、period_year、period_month、period_type、total_score、weighted_score、status、assessor_id、reviewer_id、submit_time、review_time、remark、created_at、updated_at
|
||||
- 约束:普通索引(staff_id、period_year、period_month、status),级联删除明细
|
||||
- AssessmentDetail
|
||||
- 字段:id、assessment_id、indicator_id、actual_value、score、evidence、remark、created_at、updated_at
|
||||
- 约束:普通索引(assessment_id、indicator_id)
|
||||
- SalaryRecord
|
||||
- 字段:id、staff_id、period_year、period_month、base_salary、performance_score、performance_bonus、deduction、allowance、total_salary、status、remark、created_at、updated_at
|
||||
- 约束:普通索引(staff_id、period_year、period_month)
|
||||
- DepartmentFinance
|
||||
- 字段:id、department_id、period_year、period_month、finance_type、category、amount(≥0)、source、remark、created_at、updated_at
|
||||
- 约束:普通索引(department_id、period_year、period_month、finance_type、category),check(amount ≥ 0)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L230)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
### 版本兼容与迁移策略
|
||||
- 初始版本(001_initial.py)
|
||||
- 创建 departments、staff、indicators、assessments、assessment_details、salary_records、users 表
|
||||
- 建立基础索引与外键约束
|
||||
- 模板版本(002_template.py)
|
||||
- 新增 indicator_templates、template_indicators 表
|
||||
- 为 indicators 表动态添加 BSC 维度、目标单位、考核方法、扣分标准、数据来源、适用科室类型、是否 veto 等列
|
||||
- 迁移建议
|
||||
- 新增字段采用条件判断(如字段存在性检查),避免重复执行报错
|
||||
- 对历史数据进行补全(如适用科室类型 JSON 数组),确保业务可用
|
||||
- 升级前备份数据库,升级后验证索引与约束生效
|
||||
|
||||
**章节来源**
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L21-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
462
.qoder/repowiki/zh/content/数据模型详解/枚举类型定义.md
Normal file
462
.qoder/repowiki/zh/content/数据模型详解/枚举类型定义.md
Normal file
@@ -0,0 +1,462 @@
|
||||
# 枚举类型定义
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [IMPLEMENTATION_SUMMARY.md](file://IMPLEMENTATION_SUMMARY.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心枚举类型](#核心枚举类型)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档详细介绍了医院绩效管理系统中的所有自定义枚举类型。这些枚举类型是系统的核心数据结构,用于定义和约束业务实体的状态和分类。系统包含五个主要的枚举类型:科室类型(DeptType)、平衡计分卡维度(BSCDimension)、员工状态(StaffStatus)、考核状态(AssessmentStatus)和指标类型(IndicatorType)。
|
||||
|
||||
这些枚举类型不仅在数据库模型中使用,还在API接口、服务层逻辑、统计分析和前端展示等多个层面发挥重要作用,确保了整个系统的数据一致性和业务规则的正确执行。
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统采用典型的三层架构设计,枚举类型分布在不同的层次中:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据访问层"
|
||||
Models[models.py<br/>数据库模型]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
Services[services/<br/>服务层]
|
||||
StatsService[stats_service.py<br/>统计服务]
|
||||
AssessmentService[assessment_service.py<br/>考核服务]
|
||||
end
|
||||
subgraph "表示层"
|
||||
API[api/v1/<br/>API接口]
|
||||
IndicatorsAPI[indicators.py<br/>指标API]
|
||||
StatsAPI[stats.py<br/>统计API]
|
||||
Schemas[schemas.py<br/>数据模式]
|
||||
end
|
||||
subgraph "初始化数据"
|
||||
InitTemplates[init_indicator_templates.py<br/>指标模板]
|
||||
end
|
||||
Models --> Services
|
||||
Services --> API
|
||||
Schemas --> API
|
||||
InitTemplates --> Models
|
||||
StatsService --> Models
|
||||
AssessmentService --> Models
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L15-L61)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L44)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L16-L218)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L160-L263)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 核心枚举类型
|
||||
|
||||
### 科室类型(DeptType)
|
||||
|
||||
科室类型枚举定义了医院中各种类型的科室分类,从最初的5种扩展到了9种现代医院组织结构。
|
||||
|
||||
| 枚举值 | 值 | 描述 | 适用场景 |
|
||||
|--------|-----|------|----------|
|
||||
| CLINICAL_SURGICAL | clinical_surgical | 手术临床科室 | 外科、骨科、心胸外科等需要手术治疗的科室 |
|
||||
| CLINICAL_NONSURGICAL_WARD | clinical_nonsurgical_ward | 非手术有病房科室 | 内科、儿科、神经内科等有病床的临床科室 |
|
||||
| CLINICAL_NONSURGICAL_NOWARD | clinical_nonsurgical_noward | 非手术无病房科室 | 急诊科、门诊部等无病床的临床科室 |
|
||||
| MEDICAL_TECH | medical_tech | 医技科室 | 检验科、放射科、超声科等医学技术科室 |
|
||||
| MEDICAL_AUXILIARY | medical_auxiliary | 医辅科室 | 病理科、输血科等辅助医疗科室 |
|
||||
| NURSING | nursing | 护理单元 | 各病区护理单元 |
|
||||
| ADMIN | admin | 行政科室 | 人事科、财务科、办公室等行政部门 |
|
||||
| FINANCE | finance | 财务科室 | 财务科、审计科等财务管理部门 |
|
||||
| LOGISTICS | logistics | 后勤保障科室 | 设备科、总务科、保卫科等后勤部门 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L16-L27)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L22)
|
||||
|
||||
### 平衡计分卡维度(BSCDimension)
|
||||
|
||||
平衡计分卡维度枚举提供了四个关键的绩效评估维度,支持全面的组织绩效管理。
|
||||
|
||||
| 枚举值 | 值 | 描述 | 业务意义 |
|
||||
|--------|-----|------|----------|
|
||||
| FINANCIAL | financial | 财务维度 | 关注财务表现和经济效益,如收入增长、成本控制 |
|
||||
| CUSTOMER | customer | 客户维度 | 关注患者满意度和服务质量,如服务态度、治疗效果 |
|
||||
| INTERNAL_PROCESS | internal_process | 内部流程维度 | 关注运营效率和质量控制,如流程标准化、安全指标 |
|
||||
| LEARNING_GROWTH | learning_growth | 学习与成长维度 | 关注员工发展和组织能力提升,如培训参与、技术创新 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L29-L35)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L98-L104)
|
||||
|
||||
### 员工状态(StaffStatus)
|
||||
|
||||
员工状态枚举定义了员工在组织中的不同状态,支持完整的人力资源管理。
|
||||
|
||||
| 枚举值 | 值 | 描述 | 业务规则 |
|
||||
|--------|-----|------|----------|
|
||||
| ACTIVE | active | 在职 | 可参与考核、享受绩效奖金 |
|
||||
| LEAVE | leave | 休假 | 暂停考核,保留绩效记录 |
|
||||
| RESIGNED | resigned | 离职 | 不再参与考核,绩效记录归档 |
|
||||
| RETIRED | retired | 退休 | 不再参与考核,仅保留历史记录 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L37-L43)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L24-L29)
|
||||
|
||||
### 考核状态(AssessmentStatus)
|
||||
|
||||
考核状态枚举实现了完整的考核流程管理,支持多级审核和状态追踪。
|
||||
|
||||
| 枚举值 | 值 | 描述 | 流程作用 |
|
||||
|--------|-----|------|----------|
|
||||
| DRAFT | draft | 草稿 | 初始状态,允许修改和补充 |
|
||||
| SUBMITTED | submitted | 已提交 | 完成填写,等待审核 |
|
||||
| REVIEWED | reviewed | 已审核 | 审核通过,等待最终确认 |
|
||||
| FINALIZED | finalized | 已确认 | 最终状态,生成正式结果 |
|
||||
| REJECTED | rejected | 已驳回 | 审核不通过,需要重新提交 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L45-L52)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L31-L37)
|
||||
|
||||
### 指标类型(IndicatorType)
|
||||
|
||||
指标类型枚举从5种扩展到8种,支持更全面的绩效管理需求。
|
||||
|
||||
| 枚举值 | 值 | 描述 | 适用场景 |
|
||||
|--------|-----|------|----------|
|
||||
| QUALITY | quality | 质量指标 | 关注工作质量和标准达成度 |
|
||||
| QUANTITY | quantity | 数量指标 | 关注工作量和产出数量 |
|
||||
| EFFICIENCY | efficiency | 效率指标 | 关注工作效率和资源利用 |
|
||||
| SERVICE | service | 服务指标 | 关注服务质量和服务水平 |
|
||||
| COST | cost | 成本指标 | 关注成本控制和费用管理 |
|
||||
| SAFETY | safety | 安全指标 | 关注医疗安全和风险管理 |
|
||||
| LEARNING | learning | 学习成长指标 | 关注员工培训和发展 |
|
||||
| COMPLIANCE | compliance | 合规指标 | 关注规章制度执行 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L39-L44)
|
||||
|
||||
## 架构概览
|
||||
|
||||
枚举类型在整个系统中的应用架构如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据模型层"
|
||||
DeptTypeModel[DeptType<br/>科室类型模型]
|
||||
BSCDimensionModel[BSCDimension<br/>平衡计分卡维度]
|
||||
StaffStatusModel[StaffStatus<br/>员工状态模型]
|
||||
AssessmentStatusModel[AssessmentStatus<br/>考核状态模型]
|
||||
IndicatorTypeModel[IndicatorType<br/>指标类型模型]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
AssessmentService[AssessmentService<br/>考核服务]
|
||||
StatsService[StatsService<br/>统计服务]
|
||||
IndicatorService[IndicatorService<br/>指标服务]
|
||||
end
|
||||
subgraph "API接口层"
|
||||
AssessmentAPI[AssessmentAPI<br/>考核API]
|
||||
StatsAPI[StatsAPI<br/>统计API]
|
||||
IndicatorAPI[IndicatorAPI<br/>指标API]
|
||||
end
|
||||
subgraph "数据传输层"
|
||||
PydanticSchemas[Pydantic Schemas<br/>数据验证]
|
||||
end
|
||||
DeptTypeModel --> AssessmentService
|
||||
BSCDimensionModel --> StatsService
|
||||
StaffStatusModel --> AssessmentService
|
||||
AssessmentStatusModel --> AssessmentService
|
||||
IndicatorTypeModel --> IndicatorService
|
||||
AssessmentService --> AssessmentAPI
|
||||
StatsService --> StatsAPI
|
||||
IndicatorService --> IndicatorAPI
|
||||
AssessmentAPI --> PydanticSchemas
|
||||
StatsAPI --> PydanticSchemas
|
||||
IndicatorAPI --> PydanticSchemas
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L15-L61)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L44)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L16-L218)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L160-L263)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 数据模型中的枚举使用
|
||||
|
||||
在数据模型中,枚举类型被用作SQLAlchemy列类型,确保数据库存储的一致性:
|
||||
|
||||
```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
|
||||
}
|
||||
class Staff {
|
||||
+int id
|
||||
+string employee_id
|
||||
+string name
|
||||
+int department_id
|
||||
+string position
|
||||
+string title
|
||||
+string phone
|
||||
+string email
|
||||
+float base_salary
|
||||
+float performance_ratio
|
||||
+StaffStatus status
|
||||
+datetime hire_date
|
||||
}
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+string period_type
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentStatus status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
+datetime submit_time
|
||||
+datetime review_time
|
||||
+string remark
|
||||
}
|
||||
Department --> DeptType : uses
|
||||
Staff --> StaffStatus : uses
|
||||
Assessment --> AssessmentStatus : uses
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L178)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L178)
|
||||
|
||||
### 服务层中的枚举应用
|
||||
|
||||
服务层通过枚举类型实现业务逻辑控制:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant API as API接口
|
||||
participant Service as 服务层
|
||||
participant Model as 数据模型
|
||||
participant DB as 数据库
|
||||
API->>Service : 提交考核请求
|
||||
Service->>Model : 获取考核记录
|
||||
Model->>DB : 查询数据库
|
||||
DB-->>Model : 返回考核数据
|
||||
Model-->>Service : 返回Assessment对象
|
||||
Service->>Service : 检查AssessmentStatus
|
||||
alt 状态为DRAFT
|
||||
Service->>Service : 设置状态为SUBMITTED
|
||||
Service->>DB : 更新数据库
|
||||
DB-->>Service : 更新成功
|
||||
Service-->>API : 返回更新后的考核
|
||||
else 状态不正确
|
||||
Service-->>API : 返回错误
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L160-L205)
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L160-L205)
|
||||
|
||||
### 统计分析中的枚举使用
|
||||
|
||||
统计服务利用枚举类型进行数据分析:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始统计]) --> GetParams[获取查询参数]
|
||||
GetParams --> FilterStatus[过滤已确认状态]
|
||||
FilterStatus --> GroupByDim[按BSC维度分组]
|
||||
GroupByDim --> CalcScore[计算维度得分]
|
||||
CalcScore --> CalcWeight[计算权重和指标数量]
|
||||
CalcWeight --> FormatResult[格式化结果]
|
||||
FormatResult --> End([返回统计结果])
|
||||
FilterStatus --> |使用AssessmentStatus.FINALIZED| FilterStatus
|
||||
GroupByDim --> |使用BSCDimension枚举| GroupByDim
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L20-L72)
|
||||
|
||||
**章节来源**
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L20-L72)
|
||||
|
||||
### API接口中的枚举应用
|
||||
|
||||
API接口层通过Pydantic模式使用枚举类型:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "API请求"
|
||||
Request[HTTP请求]
|
||||
Params[查询参数]
|
||||
end
|
||||
subgraph "Pydantic验证"
|
||||
IndicatorSchema[IndicatorSchema]
|
||||
DeptTypeEnum[DeptType枚举]
|
||||
IndicatorTypeEnum[IndicatorType枚举]
|
||||
end
|
||||
subgraph "业务处理"
|
||||
Service[服务层]
|
||||
DB[数据库操作]
|
||||
end
|
||||
Request --> IndicatorSchema
|
||||
Params --> IndicatorSchema
|
||||
IndicatorSchema --> DeptTypeEnum
|
||||
IndicatorSchema --> IndicatorTypeEnum
|
||||
IndicatorSchema --> Service
|
||||
Service --> DB
|
||||
DB --> Service
|
||||
Service --> IndicatorSchema
|
||||
IndicatorSchema --> Response[HTTP响应]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L153-L192)
|
||||
|
||||
**章节来源**
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L153-L192)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
枚举类型之间的依赖关系和使用模式:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "核心枚举"
|
||||
DeptType[DeptType]
|
||||
BSCDimension[BSCDimension]
|
||||
StaffStatus[StaffStatus]
|
||||
AssessmentStatus[AssessmentStatus]
|
||||
IndicatorType[IndicatorType]
|
||||
end
|
||||
subgraph "数据模型"
|
||||
Department[Department模型]
|
||||
Staff[Staff模型]
|
||||
Assessment[Assessment模型]
|
||||
Indicator[Indicator模型]
|
||||
end
|
||||
subgraph "服务层"
|
||||
AssessmentService[AssessmentService]
|
||||
StatsService[StatsService]
|
||||
IndicatorService[IndicatorService]
|
||||
end
|
||||
subgraph "API层"
|
||||
AssessmentAPI[AssessmentAPI]
|
||||
StatsAPI[StatsAPI]
|
||||
IndicatorAPI[IndicatorAPI]
|
||||
end
|
||||
DeptType --> Department
|
||||
StaffStatus --> Staff
|
||||
AssessmentStatus --> Assessment
|
||||
BSCDimension --> Indicator
|
||||
IndicatorType --> Indicator
|
||||
Department --> AssessmentService
|
||||
Staff --> AssessmentService
|
||||
Assessment --> AssessmentService
|
||||
Indicator --> IndicatorService
|
||||
AssessmentService --> AssessmentAPI
|
||||
StatsService --> StatsAPI
|
||||
IndicatorService --> IndicatorAPI
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L178)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L44)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L178)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L44)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
枚举类型在系统中的性能优势:
|
||||
|
||||
1. **内存效率**:枚举值在内存中只存储一次,避免重复字符串存储
|
||||
2. **类型安全**:编译时检查,减少运行时错误
|
||||
3. **数据库优化**:使用SQLAlchemy Enum类型,数据库层面的约束和索引优化
|
||||
4. **序列化效率**:字符串枚举值在网络传输中占用更少空间
|
||||
|
||||
最佳实践建议:
|
||||
- 在数据库查询中使用枚举值进行WHERE条件过滤
|
||||
- 在API响应中使用字符串形式的枚举值便于前端处理
|
||||
- 在服务层逻辑中使用枚举类型进行状态判断和流程控制
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
常见问题和解决方案:
|
||||
|
||||
### 枚举值不匹配问题
|
||||
**问题**:API请求中的枚举值与数据库存储不一致
|
||||
**解决方案**:
|
||||
- 确保API层使用正确的枚举类型
|
||||
- 在数据验证阶段添加枚举值检查
|
||||
- 使用统一的枚举转换函数
|
||||
|
||||
### 状态流转异常
|
||||
**问题**:考核状态无法正常流转
|
||||
**解决方案**:
|
||||
- 检查AssessmentStatus的流转顺序
|
||||
- 验证当前状态与预期状态的匹配
|
||||
- 添加状态检查和错误处理逻辑
|
||||
|
||||
### 维度统计错误
|
||||
**问题**:BSC维度统计结果不正确
|
||||
**解决方案**:
|
||||
- 验证BSCDimension枚举值的使用
|
||||
- 检查数据库中指标的维度设置
|
||||
- 确认统计查询的JOIN条件和WHERE条件
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L160-L205)
|
||||
- [stats_service.py](file://backend/app/services/stats_service.py#L20-L72)
|
||||
|
||||
## 结论
|
||||
|
||||
枚举类型是医院绩效管理系统的核心基础设施,它们提供了:
|
||||
|
||||
1. **业务一致性**:确保不同模块间使用相同的业务概念和规则
|
||||
2. **类型安全**:在编译时发现潜在的类型错误
|
||||
3. **维护便利**:集中管理业务规则,便于后续扩展和修改
|
||||
4. **性能优化**:减少字符串比较,提高系统运行效率
|
||||
|
||||
通过合理设计和使用这些枚举类型,系统能够支持复杂的医院绩效管理需求,包括多维度的平衡计分卡分析、完整的考核流程管理和全面的统计报表功能。这些枚举类型为系统的稳定性和可维护性奠定了坚实的基础。
|
||||
|
||||
随着系统的持续发展,这些枚举类型将继续发挥重要作用,支持新的业务需求和功能扩展。
|
||||
476
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/员工信息模型.md
Normal file
476
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/员工信息模型.md
Normal file
@@ -0,0 +1,476 @@
|
||||
# 员工信息模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
员工信息模型是医院绩效管理系统的核心数据模型之一,负责管理医院全体员工的基础信息、状态管理和薪资相关信息。该模型采用现代化的ORM设计,结合枚举类型、关系映射和约束机制,确保数据的完整性和一致性。
|
||||
|
||||
本模型不仅存储员工的基本信息,还通过复杂的业务逻辑处理员工状态变化对系统其他模块的影响,包括与科室的多对一关系、与考核记录的一对多关系、以及与工资记录的一对多关系。
|
||||
|
||||
## 项目结构
|
||||
|
||||
基于仓库的实际结构,员工信息模型主要分布在以下文件中:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端架构"
|
||||
A[models.py<br/>数据模型定义]
|
||||
B[schemas.py<br/>数据验证模式]
|
||||
C[staff.py<br/>API路由]
|
||||
D[staff_service.py<br/>业务服务层]
|
||||
E[salary_service.py<br/>工资服务层]
|
||||
end
|
||||
subgraph "数据库层"
|
||||
F[database.md<br/>数据库设计文档]
|
||||
G[001_initial.py<br/>数据库迁移脚本]
|
||||
end
|
||||
A --> B
|
||||
A --> C
|
||||
A --> D
|
||||
A --> E
|
||||
C --> D
|
||||
D --> A
|
||||
E --> A
|
||||
F --> A
|
||||
G --> A
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 员工状态枚举 (StaffStatus)
|
||||
|
||||
员工状态枚举定义了四种核心状态,每种状态都有明确的业务含义:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StaffStatus {
|
||||
<<enumeration>>
|
||||
+ACTIVE
|
||||
+LEAVE
|
||||
+RESIGNED
|
||||
+RETIRED
|
||||
}
|
||||
note for StaffStatus : "员工状态枚举\n- ACTIVE : 在职\n- LEAVE : 休假\n- RESIGNED : 离职\n- RETIRED : 退休"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L37-L43)
|
||||
|
||||
### 员工实体模型
|
||||
|
||||
员工实体模型包含了完整的员工信息结构:
|
||||
|
||||
```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 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
|
||||
}
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+string period_type
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentStatus status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
+datetime submit_time
|
||||
+datetime review_time
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class SalaryRecord {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float base_salary
|
||||
+float performance_score
|
||||
+float performance_bonus
|
||||
+float deduction
|
||||
+float allowance
|
||||
+float total_salary
|
||||
+string status
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
Staff --> Department : "多对一"
|
||||
Staff --> Assessment : "一对多"
|
||||
Staff --> SalaryRecord : "一对多"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [models.py](file://backend/app/models/models.py#L62-L80)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
|
||||
## 架构概览
|
||||
|
||||
员工信息模型在整个系统架构中扮演着核心角色,连接着多个业务模块:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
A[前端界面]
|
||||
B[API网关]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
C[员工管理API]
|
||||
D[员工服务层]
|
||||
E[工资服务层]
|
||||
F[统计服务层]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
G[员工模型]
|
||||
H[科室模型]
|
||||
I[考核模型]
|
||||
J[工资模型]
|
||||
end
|
||||
subgraph "数据存储"
|
||||
K[员工表]
|
||||
L[科室表]
|
||||
M[考核表]
|
||||
N[工资记录表]
|
||||
end
|
||||
A --> B
|
||||
B --> C
|
||||
C --> D
|
||||
C --> E
|
||||
C --> F
|
||||
D --> G
|
||||
D --> H
|
||||
E --> G
|
||||
E --> I
|
||||
E --> J
|
||||
G --> K
|
||||
H --> L
|
||||
I --> M
|
||||
J --> N
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 员工状态管理
|
||||
|
||||
员工状态管理是系统中最复杂的业务逻辑之一,不同状态对系统行为产生不同的影响:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 在职
|
||||
在职 --> 休假 : "LEAVE"
|
||||
在职 --> 离职 : "RESIGNED"
|
||||
在职 --> 退休 : "RETIRED"
|
||||
休假 --> 在职 : "恢复工作"
|
||||
休假 --> 离职 : "转为离职"
|
||||
休假 --> 退休 : "转为退休"
|
||||
离职 --> [*]
|
||||
退休 --> [*]
|
||||
note right of 在职 : "可参与考核\n可生成工资记录\n可进行系统操作"
|
||||
note right of 休假 : "暂停考核\n暂停工资计算\n但仍可查看信息"
|
||||
note right of 离职 : "完全停止系统访问\n历史数据保留"
|
||||
note right of 退休 : "特殊权限限制\n历史数据可查看"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L37-L43)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L104-L112)
|
||||
|
||||
#### 状态变更对系统的影响
|
||||
|
||||
1. **考核模块影响**:
|
||||
- 休假员工:暂停考核流程,但可查看历史考核记录
|
||||
- 离职/退休员工:无法参与新的考核,仅能查看历史记录
|
||||
|
||||
2. **工资模块影响**:
|
||||
- 休假员工:暂停工资计算,但可查看历史工资记录
|
||||
- 离职/退休员工:不再生成新的工资记录
|
||||
|
||||
3. **权限控制影响**:
|
||||
- 离职/退休员工:系统访问权限被限制
|
||||
- 休假员工:部分功能受限
|
||||
|
||||
**章节来源**
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L104-L112)
|
||||
|
||||
### 工号唯一性设计
|
||||
|
||||
工号作为员工的唯一标识符,在系统中具有极高的重要性:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[员工创建请求] --> B{检查工号是否存在}
|
||||
B --> |是| C[返回错误: 工号已存在]
|
||||
B --> |否| D[验证工号格式]
|
||||
D --> E{格式验证通过?}
|
||||
E --> |否| F[返回错误: 工号格式不正确]
|
||||
E --> |是| G[创建员工记录]
|
||||
G --> H[返回成功响应]
|
||||
I[员工更新请求] --> J{检查工号是否被其他员工使用}
|
||||
J --> |是| K[返回错误: 工号已被使用]
|
||||
J --> |否| L[更新员工记录]
|
||||
L --> M[返回成功响应]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L75-L78)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L62-L67)
|
||||
|
||||
### 薪资系数设计
|
||||
|
||||
薪资系数是绩效工资计算的核心参数,直接影响最终的绩效奖金:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[绩效奖金计算] --> B[获取员工绩效系数]
|
||||
B --> C[获取考核加权得分]
|
||||
B --> D[获取绩效基数]
|
||||
C --> E[计算公式]
|
||||
D --> E
|
||||
D --> F[绩效奖金 = 绩效基数 × (加权得分/100) × 绩效系数]
|
||||
E --> F
|
||||
F --> G[生成工资记录]
|
||||
H[默认系数] --> I[1.0]
|
||||
J[最小系数] --> K[0.0]
|
||||
L[最大系数] --> M[5.0]
|
||||
note right of F : "示例: 基础工资8000元\n绩效系数1.2\n加权得分85分\n绩效奖金 = 3000 × (85/100) × 1.2 = 3060元"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L167-L170)
|
||||
|
||||
**章节来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L17-L18)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
|
||||
### 联系方式维护
|
||||
|
||||
员工联系方式的维护遵循严格的验证规则:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class ContactInfo {
|
||||
+string phone
|
||||
+string email
|
||||
+validatePhone(phone) bool
|
||||
+validateEmail(email) bool
|
||||
+formatPhone(phone) string
|
||||
+formatEmail(email) string
|
||||
}
|
||||
note for ContactInfo : "联系方式验证规则\n- 电话 : 最多20位数字\n- 邮箱 : 符合标准邮箱格式\n- 支持空值"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L126-L136)
|
||||
|
||||
### 职位职称管理
|
||||
|
||||
职位和职称信息用于区分员工的专业水平和职责范围:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class PositionManagement {
|
||||
+string position
|
||||
+string title
|
||||
+validatePosition(position) bool
|
||||
+validateTitle(title) bool
|
||||
+getPositionLevel(position) int
|
||||
+getTitleRank(title) int
|
||||
}
|
||||
note for PositionManagement : "职位管理\n- position : 职位名称\n- title : 职称等级\n- 支持空值\n- 用于权限和薪酬分级"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L96-L98)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L112-L117)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
员工信息模型与其他模块的依赖关系如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "核心依赖"
|
||||
A[Staff模型] --> B[Department模型]
|
||||
A --> C[Assessment模型]
|
||||
A --> D[SalaryRecord模型]
|
||||
end
|
||||
subgraph "服务层依赖"
|
||||
E[StaffService] --> A
|
||||
E --> B
|
||||
F[SalaryService] --> A
|
||||
F --> C
|
||||
F --> D
|
||||
end
|
||||
subgraph "API层依赖"
|
||||
G[StaffAPI] --> E
|
||||
H[SalaryAPI] --> F
|
||||
end
|
||||
subgraph "数据验证"
|
||||
I[StaffCreate] --> A
|
||||
J[StaffUpdate] --> A
|
||||
K[StaffResponse] --> A
|
||||
end
|
||||
A -.-> L[StaffStatus枚举]
|
||||
B -.-> M[DeptType枚举]
|
||||
C -.-> N[AssessmentStatus枚举]
|
||||
D -.-> O[SalaryStatus枚举]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L9-L10)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L10-L11)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
1. **索引设计**:
|
||||
- 员工表:`idx_staff_dept`(科室ID)、`idx_staff_status`(状态)
|
||||
- 考核表:`idx_assessment_staff`(员工ID)、`idx_assessment_period`(考核周期)
|
||||
- 工资表:`idx_salary_staff`(员工ID)、`idx_salary_period`(考核周期)
|
||||
|
||||
2. **查询优化**:
|
||||
- 使用`selectinload`进行关联查询优化
|
||||
- 实现分页查询避免大数据量加载
|
||||
- 缓存常用查询结果
|
||||
|
||||
### 数据完整性保证
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[数据操作] --> B[输入验证]
|
||||
B --> C[业务规则检查]
|
||||
C --> D[数据库约束验证]
|
||||
D --> E[事务处理]
|
||||
E --> F[数据持久化]
|
||||
G[输入验证] --> H[字段长度验证]
|
||||
G --> I[格式验证]
|
||||
G --> J[范围验证]
|
||||
K[业务规则检查] --> L[工号唯一性]
|
||||
K --> M[状态有效性]
|
||||
K --> N[关联关系验证]
|
||||
O[数据库约束验证] --> P[唯一约束]
|
||||
O --> Q[外键约束]
|
||||
O --> R[检查约束]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L136)
|
||||
- [models.py](file://backend/app/models/models.py#L93-L114)
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
1. **工号重复错误**
|
||||
- 症状:创建员工时返回"工号已存在"
|
||||
- 解决:检查现有员工列表,使用唯一工号
|
||||
|
||||
2. **状态变更异常**
|
||||
- 症状:员工状态无法正常切换
|
||||
- 解决:检查状态枚举值的有效性,确认业务流程
|
||||
|
||||
3. **薪资计算错误**
|
||||
- 症状:绩效奖金计算结果不符合预期
|
||||
- 解决:验证绩效系数范围(0-5),检查考核得分
|
||||
|
||||
4. **关联查询性能问题**
|
||||
- 症状:员工列表加载缓慢
|
||||
- 解决:添加适当的索引,优化查询条件
|
||||
|
||||
**章节来源**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L75-L78)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L104-L112)
|
||||
|
||||
## 结论
|
||||
|
||||
员工信息模型通过精心设计的数据结构和业务逻辑,为医院绩效管理系统提供了坚实的基础。该模型不仅满足了基本的员工信息管理需求,更重要的是通过完善的枚举类型、关系映射和约束机制,确保了数据的完整性和业务逻辑的正确性。
|
||||
|
||||
模型的关键优势包括:
|
||||
|
||||
1. **清晰的状态管理**:通过枚举类型明确员工状态,便于业务逻辑处理
|
||||
2. **灵活的薪资计算**:支持可调节的绩效系数,适应不同岗位的薪酬体系
|
||||
3. **完善的关联关系**:与科室、考核、工资等模块形成完整的业务闭环
|
||||
4. **严格的数据验证**:通过多种验证机制确保数据质量
|
||||
5. **良好的扩展性**:模块化设计便于后续功能扩展
|
||||
|
||||
该模型为整个系统的稳定运行奠定了坚实基础,是医院绩效管理不可或缺的重要组成部分。
|
||||
407
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/工资核算模型.md
Normal file
407
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/工资核算模型.md
Normal file
@@ -0,0 +1,407 @@
|
||||
# 工资核算模型
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [frontend/src/views/salary/Salary.vue](file://frontend/src/views/salary/Salary.vue)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js)
|
||||
- [docs/database.md](file://docs/database.md)
|
||||
- [docs/详细设计文档.md](file://docs/详细设计文档.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文档深入解析医院绩效系统中的工资核算模型,重点围绕SalaryRecord模型的设计理念、实现细节以及与考核系统的集成关系。文档涵盖以下关键内容:
|
||||
- 基本工资、绩效得分、绩效奖金、扣款补贴的计算逻辑
|
||||
- 工资核算的时间周期与状态管理(待处理、已确认)
|
||||
- 应发工资的计算公式与字段约束
|
||||
- 绩效奖金与绩效得分的关系、扣款与补贴的设置规则
|
||||
- 与员工的多对一关系、历史记录的版本控制
|
||||
- 批量核算的性能优化策略
|
||||
- 工资计算示例、异常处理机制与数据准确性验证方法
|
||||
|
||||
## 项目结构
|
||||
后端采用FastAPI + SQLAlchemy异步ORM架构,工资核算功能位于以下模块:
|
||||
- 模型层:定义SalaryRecord、Staff、Assessment等实体及其关系
|
||||
- 服务层:实现工资计算、生成、确认、批量处理等业务逻辑
|
||||
- API层:提供REST接口,支持按考核生成工资、批量生成与确认
|
||||
- 前端:提供工资记录查询、编辑、确认等界面
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_View["Salary.vue<br/>视图组件"]
|
||||
FE_API["salary.js<br/>API封装"]
|
||||
end
|
||||
subgraph "后端"
|
||||
API["salary.py<br/>API路由"]
|
||||
Service["salary_service.py<br/>服务层"]
|
||||
Model["models.py<br/>数据模型"]
|
||||
Schema["schemas.py<br/>数据模式"]
|
||||
DB["数据库<br/>salary_records表"]
|
||||
end
|
||||
FE_View --> FE_API
|
||||
FE_API --> API
|
||||
API --> Service
|
||||
Service --> Model
|
||||
Model --> DB
|
||||
Schema --> API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [frontend/src/views/salary/Salary.vue](file://frontend/src/views/salary/Salary.vue#L33-L245)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [frontend/src/views/salary/Salary.vue](file://frontend/src/views/salary/Salary.vue#L33-L245)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
|
||||
|
||||
## 核心组件
|
||||
- SalaryRecord模型:存储工资核算结果,包含基本工资、绩效得分、绩效奖金、扣款、补贴、应发工资与状态
|
||||
- Staff模型:员工基本信息与绩效系数,用于绩效奖金计算
|
||||
- Assessment模型:考核记录,提供加权得分作为绩效奖金依据
|
||||
- SalaryService服务:实现工资计算、生成、确认、批量处理等核心逻辑
|
||||
- API路由:提供查询、创建、更新、按考核生成、批量生成与确认等接口
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L179)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
|
||||
## 架构概览
|
||||
工资核算从考核结果出发,通过服务层计算绩效奖金并生成工资记录;前端提供查询与确认操作,后端通过权限控制确保只有管理员或经理可以进行关键操作。
|
||||
|
||||
```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(staff_id, year, month)
|
||||
Service->>DB : 查询员工信息(Staff)
|
||||
Service->>DB : 查询已确认考核(Assessment.status='finalized')
|
||||
Service->>Service : calculate_performance_bonus(weighted_score, performance_ratio)
|
||||
Service->>DB : 插入SalaryRecord(状态=pending)
|
||||
DB-->>Service : 返回新记录
|
||||
Service-->>API : 返回记录ID
|
||||
API-->>Client : {code,message,data : id}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [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#L96-L111)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### SalaryRecord模型设计
|
||||
- 字段定义
|
||||
- 基本工资:base_salary,数值型,精度10位小数2位
|
||||
- 绩效得分:performance_score,数值型,精度5位小数2位
|
||||
- 绩效奖金:performance_bonus,数值型,精度10位小数2位
|
||||
- 扣款:deduction,数值型,精度10位小数2位
|
||||
- 补贴:allowance,数值型,精度10位小数2位
|
||||
- 应发工资:total_salary,数值型,精度10位小数2位
|
||||
- 状态:status,默认"pending"
|
||||
- 时间周期:period_year、period_month
|
||||
- 外键:staff_id,关联员工表
|
||||
- 约束与索引
|
||||
- 外键约束:staff_id -> staff.id
|
||||
- 索引:staff_id、(period_year, period_month)
|
||||
- 关系
|
||||
- 与Staff为多对一关系,支持反向访问salary_records
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Staff {
|
||||
+int id
|
||||
+string employee_id
|
||||
+string name
|
||||
+int department_id
|
||||
+string position
|
||||
+string title
|
||||
+float base_salary
|
||||
+float performance_ratio
|
||||
+string status
|
||||
+datetime hire_date
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+Assessment[] assessments
|
||||
+SalaryRecord[] salary_records
|
||||
}
|
||||
class SalaryRecord {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float base_salary
|
||||
+float performance_score
|
||||
+float performance_bonus
|
||||
+float deduction
|
||||
+float allowance
|
||||
+float total_salary
|
||||
+string status
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
Staff "1" o-- "*" SalaryRecord : "多对一"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
- [docs/database.md](file://docs/database.md#L197-L216)
|
||||
- [docs/详细设计文档.md](file://docs/详细设计文档.md#L642-L662)
|
||||
|
||||
### 计算逻辑与公式
|
||||
- 绩效奖金计算
|
||||
- 公式:绩效奖金 = 绩效基数 × (绩效得分/100) × 绩效系数
|
||||
- 绩效基数:固定常量,服务层中定义
|
||||
- 绩效系数:来自员工表的performance_ratio
|
||||
- 应发工资计算
|
||||
- 公式:应发工资 = 基本工资 + 绩效奖金 + 补贴 - 扣款
|
||||
- 该公式在创建与更新工资记录时均会重新计算并持久化
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> LoadStaff["加载员工信息<br/>获取base_salary, performance_ratio"]
|
||||
LoadStaff --> LoadAssessment["加载已确认考核<br/>获取weighted_score"]
|
||||
LoadAssessment --> CheckExisting{"是否存在同周期工资记录?"}
|
||||
CheckExisting --> |是| ReturnNone["返回空不重复生成"]
|
||||
CheckExisting --> |否| CalcBonus["计算绩效奖金<br/>bonus = 基数 × (score/100) × ratio"]
|
||||
CalcBonus --> CalcTotal["计算应发工资<br/>total = base + bonus + allowance - deduction"]
|
||||
CalcTotal --> CreateRecord["创建SalaryRecord<br/>状态=pending"]
|
||||
CreateRecord --> End(["结束"])
|
||||
ReturnNone --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L85-L91)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
|
||||
### 时间周期与状态管理
|
||||
- 时间周期
|
||||
- 由period_year与period_month共同构成,用于唯一标识某员工的某月工资记录
|
||||
- 数据库层面在salary_records上建立了复合索引(idx_salary_period),提升查询效率
|
||||
- 状态管理
|
||||
- 待处理:pending(默认状态)
|
||||
- 已确认:confirmed(管理员/经理确认后变更)
|
||||
- 已发放:paid(当前服务层未实现,但模型预留字段)
|
||||
- 状态变更流程
|
||||
- 单条确认:调用确认接口,仅当状态为pending时允许变更
|
||||
- 批量确认:按年月筛选pending状态记录,可选择按科室过滤
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 待处理
|
||||
待处理 --> 已确认 : "确认工资"
|
||||
已确认 --> 已发放 : "发放工资"
|
||||
已发放 --> [*]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L222-L231)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L234-L259)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L218-L219)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L222-L231)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L234-L259)
|
||||
|
||||
### 与员工的多对一关系与历史版本控制
|
||||
- 多对一关系
|
||||
- SalaryRecord.staff_id -> Staff.id,每个工资记录对应唯一员工
|
||||
- Staff.salary_records反向关系,支持按员工查询其历史工资记录
|
||||
- 历史版本控制
|
||||
- 当前版本未实现SalaryRecord的版本号字段;如需版本控制,可在模型中增加version字段并在更新时递增
|
||||
- 绩效计划的版本控制已在其他模型中实现(PerformancePlan.version),可借鉴其模式
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L108-L110)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L293-L293)
|
||||
|
||||
### 批量核算的性能优化
|
||||
- 批量生成
|
||||
- 服务层先查询指定科室下所有已确认的考核记录,再逐条生成工资记录
|
||||
- 建议在大规模数据场景下:
|
||||
- 使用分批处理(分页查询考核记录)
|
||||
- 异步并发插入(注意数据库连接池与事务边界)
|
||||
- 增加数据库索引覆盖查询条件
|
||||
- 批量确认
|
||||
- 通过SQL查询一次性筛选出待确认记录,减少多次往返
|
||||
- 支持按科室过滤,缩小确认范围
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L192-L219)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L234-L259)
|
||||
|
||||
### 扣款与补贴的设置规则
|
||||
- 扣款与补贴均为数值型字段,支持在创建或更新时设置
|
||||
- 服务层在创建与更新时均会重新计算应发工资:total_salary = base_salary + performance_bonus + allowance - deduction
|
||||
- 建议在业务层增加校验规则:
|
||||
- 扣款与补贴必须非负
|
||||
- 应发工资计算后可进行合理性校验(如不得为负)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L85-L91)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L114-L120)
|
||||
|
||||
### 绩效奖金与绩效得分的关系
|
||||
- 绩效奖金 = 绩效基数 × (绩效得分/100) × 绩效系数
|
||||
- 绩效得分来自Assessment.weighted_score,状态必须为"finalized"
|
||||
- 绩效系数来自Staff.performance_ratio,不同岗位/级别可设置不同系数
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L143-L153)
|
||||
|
||||
### API与前端交互
|
||||
- API接口
|
||||
- 列表查询:支持按员工、科室、年份、月份、状态筛选
|
||||
- 详情查询:返回带员工与科室名称的完整信息
|
||||
- 创建/更新:仅允许在待处理状态下更新
|
||||
- 按考核生成:基于已确认考核自动生成工资记录
|
||||
- 批量生成/确认:支持按科室批量生成与批量确认
|
||||
- 前端展示
|
||||
- 列表显示基本工资、绩效得分、绩效奖金、补贴、扣款、应发工资等字段
|
||||
- 提供编辑弹窗,支持更新扣款、补贴、备注等
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
- [frontend/src/views/salary/Salary.vue](file://frontend/src/views/salary/Salary.vue#L33-L245)
|
||||
- [frontend/src/api/salary.js](file://frontend/src/api/salary.js#L1-L42)
|
||||
|
||||
## 依赖分析
|
||||
- 模型依赖
|
||||
- SalaryRecord依赖Staff(外键)
|
||||
- Assessment与SalaryRecord通过staff_id间接关联
|
||||
- 服务层依赖
|
||||
- 依赖Staff、Assessment模型进行数据查询与计算
|
||||
- 依赖Pydantic模式进行请求/响应数据校验
|
||||
- API层依赖
|
||||
- 依赖Security中间件进行权限控制(管理员/经理)
|
||||
- 依赖数据库会话进行异步操作
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
SalaryRecord["SalaryRecord模型"] --> Staff["Staff模型"]
|
||||
SalaryService["SalaryService"] --> SalaryRecord
|
||||
SalaryService --> Staff
|
||||
SalaryService --> Assessment["Assessment模型"]
|
||||
API["salary.py"] --> SalaryService
|
||||
API --> Schema["schemas.py"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L179)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L10-L11)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L14-L15)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L179)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L10-L11)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L14-L15)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- salary_records表已建立索引:staff_id、(period_year, period_month)
|
||||
- API层使用selectinload预加载关联对象,避免N+1查询
|
||||
- 批量处理
|
||||
- 批量生成与确认采用SQL查询一次性筛选,减少循环调用
|
||||
- 建议在高并发场景下增加数据库连接池配置与事务隔离级别
|
||||
- 数据类型
|
||||
- 使用Numeric类型保证金额精度,避免浮点误差累积
|
||||
|
||||
[本节为通用性能建议,无需特定文件来源]
|
||||
|
||||
## 故障排除指南
|
||||
- 无法生成工资
|
||||
- 检查是否存在已确认的考核记录且状态为"finalized"
|
||||
- 检查是否已存在同周期的工资记录(防止重复生成)
|
||||
- 无法确认工资
|
||||
- 确认记录状态必须为"pending"
|
||||
- 检查权限:仅管理员或经理可执行确认操作
|
||||
- 数据不一致
|
||||
- 更新扣款/补贴后需重新计算应发工资
|
||||
- 核对数据库索引是否生效,避免查询性能问题
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L155-L164)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L224-L226)
|
||||
- [backend/app/api/v1/salary.py](file://backend/app/api/v1/salary.py#L132-L142)
|
||||
|
||||
## 结论
|
||||
SalaryRecord模型通过清晰的字段设计与严格的计算逻辑,实现了从考核到工资的自动化流转。服务层提供了完善的生成、确认与批量处理能力,并通过索引与预加载优化了查询性能。未来可在版本控制、状态扩展(如已发放)与更细粒度的扣款/补贴规则方面进一步增强。
|
||||
|
||||
[本节为总结性内容,无需特定文件来源]
|
||||
|
||||
## 附录
|
||||
|
||||
### 工资计算示例
|
||||
- 输入
|
||||
- 员工:基本工资=10000,绩效系数=1.2
|
||||
- 考核:加权得分=95
|
||||
- 扣款=0,补贴=500
|
||||
- 计算过程
|
||||
- 绩效奖金 = 固定基数 × (95/100) × 1.2
|
||||
- 应发工资 = 10000 + 绩效奖金 + 500 - 0
|
||||
- 输出
|
||||
- 工资记录状态=pending,等待确认
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L71-L74)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L172-L173)
|
||||
|
||||
### 数据准确性验证方法
|
||||
- 金额精度:使用Numeric类型,避免浮点误差
|
||||
- 业务规则:在服务层增加校验(扣款/补贴非负、应发工资合理)
|
||||
- 索引验证:确认salary_records索引生效,提升查询性能
|
||||
- 测试覆盖:编写单元测试验证计算逻辑与状态变更流程
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/versions/001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
- [backend/app/services/salary_service.py](file://backend/app/services/salary_service.py#L85-L91)
|
||||
545
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/核心数据模型.md
Normal file
545
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/核心数据模型.md
Normal file
@@ -0,0 +1,545 @@
|
||||
# 核心数据模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [finance.py](file://backend/app/models/finance.py)
|
||||
- [database.py](file://backend/app/core/database.py)
|
||||
- [init_db.py](file://backend/app/core/init_db.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件详细阐述医院绩效系统的核心数据模型设计,重点涵盖Department(科室)、Staff(员工)、Assessment(考核记录)、AssessmentDetail(考核明细)、SalaryRecord(工资核算记录)等核心业务模型。文档从设计理念、实现细节、字段定义、数据类型、约束条件、业务规则、模型关联关系、索引设计、性能优化策略等多个维度进行全面解析,并提供使用示例和最佳实践指导。
|
||||
|
||||
## 项目结构
|
||||
|
||||
该系统采用分层架构,核心模型位于 `backend/app/models/` 目录,数据库连接通过 `backend/app/core/database.py` 管理,初始化逻辑在 `backend/app/core/init_db.py` 中实现。数据验证通过 Pydantic 模式在 `backend/app/schemas/schemas.py` 中定义,服务层负责业务逻辑处理。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "模型层"
|
||||
M1[models.py<br/>核心业务模型]
|
||||
M2[finance.py<br/>财务核算模型]
|
||||
end
|
||||
subgraph "核心配置"
|
||||
C1[database.py<br/>数据库连接]
|
||||
C2[init_db.py<br/>数据库初始化]
|
||||
end
|
||||
subgraph "数据验证"
|
||||
S1[schemas.py<br/>Pydantic模式]
|
||||
end
|
||||
subgraph "服务层"
|
||||
SV1[staff_service.py]
|
||||
SV2[assessment_service.py]
|
||||
SV3[salary_service.py]
|
||||
end
|
||||
M1 --> C1
|
||||
M2 --> C1
|
||||
C2 --> M1
|
||||
S1 --> SV1
|
||||
S1 --> SV2
|
||||
S1 --> SV3
|
||||
SV1 --> M1
|
||||
SV2 --> M1
|
||||
SV3 --> M1
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L231)
|
||||
- [finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [database.py](file://backend/app/core/database.py#L9-L25)
|
||||
- [init_db.py](file://backend/app/core/init_db.py#L1-L115)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [init_db.py](file://backend/app/core/init_db.py#L1-L115)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 核心组件
|
||||
|
||||
本节概述五个核心业务模型的设计理念和实现要点:
|
||||
|
||||
### Department(科室)
|
||||
- 设计理念:支持多层级组织架构,通过自关联实现父子关系
|
||||
- 关键特性:科室类型枚举、层级管理、排序机制、激活状态控制
|
||||
- 外键关系:自关联 parent_id 指向自身,children 反向关系
|
||||
- 索引设计:按科室类型和父级ID建立索引
|
||||
|
||||
### Staff(员工)
|
||||
- 设计理念:员工与科室的一对多关系,支持多种状态管理
|
||||
- 关键特性:工号唯一性、基本工资和绩效系数、状态枚举
|
||||
- 外键关系:department_id 指向 Department,一对多关系
|
||||
- 索引设计:按科室ID和状态建立复合索引
|
||||
|
||||
### Assessment(考核记录)
|
||||
- 设计理念:支持多周期、多状态的考核流程管理
|
||||
- 关键特性:总分和加权得分计算、多角色参与(考核人、审核人)
|
||||
- 外键关系:staff_id 指向 Staff,assessor_id 和 reviewer_id 自关联
|
||||
- 索引设计:按员工ID、考核周期、状态建立复合索引
|
||||
|
||||
### AssessmentDetail(考核明细)
|
||||
- 设计理念:一对一关联 Assessment,支持多指标明细记录
|
||||
- 关键特性:实际值和得分记录、佐证材料管理
|
||||
- 外键关系:assessment_id 和 indicator_id 的双向关联
|
||||
- 索引设计:按考核记录ID和指标ID建立索引
|
||||
|
||||
### SalaryRecord(工资核算记录)
|
||||
- 设计理念:基于考核结果的自动化工资核算
|
||||
- 关键特性:基本工资、绩效奖金、扣款、补贴的统一管理
|
||||
- 外键关系:staff_id 指向 Staff
|
||||
- 索引设计:按员工ID和考核周期建立复合索引
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L231)
|
||||
- [database.md](file://docs/database.md#L99-L216)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构,核心数据模型通过 SQLAlchemy ORM 映射到数据库表,配合 Pydantic 模式进行数据验证,服务层封装业务逻辑。
|
||||
|
||||
```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
|
||||
+children : List[Department]
|
||||
+staff : List[Staff]
|
||||
}
|
||||
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
|
||||
+assessments : List[Assessment]
|
||||
+salary_records : List[SalaryRecord]
|
||||
}
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+string period_type
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentStatus status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
+datetime submit_time
|
||||
+datetime review_time
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+staff : Staff
|
||||
+assessor : Staff
|
||||
+reviewer : Staff
|
||||
+details : List[AssessmentDetail]
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+string evidence
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+assessment : Assessment
|
||||
+indicator : Indicator
|
||||
}
|
||||
class SalaryRecord {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float base_salary
|
||||
+float performance_score
|
||||
+float performance_bonus
|
||||
+float deduction
|
||||
+float allowance
|
||||
+float total_salary
|
||||
+string status
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+staff : Staff
|
||||
}
|
||||
Department "1" <-- "N" Staff : "一对多"
|
||||
Staff "1" <-- "N" Assessment : "一对多"
|
||||
Assessment "1" <-- "N" AssessmentDetail : "一对多"
|
||||
Staff "1" <-- "N" SalaryRecord : "一对多"
|
||||
Assessment "N" --> "1" Staff : "多对一"
|
||||
AssessmentDetail "N" --> "1" Assessment : "多对一"
|
||||
AssessmentDetail "N" --> "1" Indicator : "多对一"
|
||||
SalaryRecord "N" --> "1" Staff : "多对一"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L231)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Department(科室)模型
|
||||
|
||||
#### 字段定义与数据类型
|
||||
- id: 主键,整数类型,自动递增
|
||||
- name: 科室名称,字符串类型,最大长度100,必填
|
||||
- code: 科室编码,字符串类型,最大长度20,唯一且必填
|
||||
- dept_type: 科室类型枚举,支持临床、医技、医辅、行政、后勤等类型
|
||||
- parent_id: 上级科室ID,整数类型,自关联外键
|
||||
- level: 层级,整数类型,默认1,范围1-5
|
||||
- sort_order: 排序,整数类型,默认0
|
||||
- is_active: 是否启用,布尔类型,默认True
|
||||
- description: 描述信息,文本类型
|
||||
- created_at/updated_at: 时间戳,自动维护
|
||||
|
||||
#### 约束条件与业务规则
|
||||
- 唯一性约束:code 字段唯一
|
||||
- 枚举约束:dept_type 必须属于预定义类型集合
|
||||
- 自关联约束:parent_id 引用自身主键
|
||||
- 层级限制:level 范围1-5
|
||||
|
||||
#### 关联关系
|
||||
- 一对多:Department → Staff(children)
|
||||
- 自关联:parent_id → Department(parent)
|
||||
|
||||
#### 索引设计
|
||||
- idx_dept_type:按科室类型查询优化
|
||||
- idx_dept_parent:按父级科室查询优化
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
- [database.md](file://docs/database.md#L99-L115)
|
||||
|
||||
### Staff(员工)模型
|
||||
|
||||
#### 字段定义与数据类型
|
||||
- id: 主键,整数类型,自动递增
|
||||
- employee_id: 工号,字符串类型,最大长度20,唯一且必填
|
||||
- name: 姓名,字符串类型,最大长度50,必填
|
||||
- department_id: 所属科室ID,整数类型,外键约束
|
||||
- position: 职位,字符串类型,最大长度50,必填
|
||||
- title: 职称,字符串类型,最大长度50
|
||||
- phone/email: 联系方式,字符串类型
|
||||
- base_salary: 基本工资,数值类型,精度10,2,默认0
|
||||
- performance_ratio: 绩效系数,数值类型,精度5,2,默认1.0,范围0-5
|
||||
- status: 员工状态枚举,默认active
|
||||
- hire_date: 入职日期,日期时间类型
|
||||
- created_at/updated_at: 时间戳
|
||||
|
||||
#### 约束条件与业务规则
|
||||
- 唯一性约束:employee_id 唯一
|
||||
- 数值范围约束:performance_ratio 范围0-5
|
||||
- 外键约束:department_id 引用 Department.id
|
||||
- 状态枚举:仅允许预定义状态值
|
||||
|
||||
#### 关联关系
|
||||
- 多对一:Staff → Department(department)
|
||||
- 一对多:Department → Staff(staff)
|
||||
- 一对多:Staff → Assessment(assessments)
|
||||
- 一对多:Staff → SalaryRecord(salary_records)
|
||||
|
||||
#### 索引设计
|
||||
- idx_staff_dept:按科室ID查询优化
|
||||
- idx_staff_status:按状态查询优化
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [database.md](file://docs/database.md#L117-L136)
|
||||
|
||||
### Assessment(考核记录)模型
|
||||
|
||||
#### 字段定义与数据类型
|
||||
- id: 主键,整数类型,自动递增
|
||||
- staff_id: 员工ID,整数类型,外键约束
|
||||
- period_year: 考核年度,整数类型,必填
|
||||
- period_month: 考核月份,整数类型,必填
|
||||
- period_type: 考核周期类型,字符串类型,默认monthly
|
||||
- total_score: 总分,数值类型,精度5,2,默认0
|
||||
- weighted_score: 加权得分,数值类型,精度5,2,默认0
|
||||
- status: 考核状态枚举,默认draft
|
||||
- assessor_id/reviewer_id: 考核人/审核人ID,整数类型,自关联外键
|
||||
- submit_time/review_time: 提交/审核时间,日期时间类型
|
||||
- remark: 备注,文本类型
|
||||
- created_at/updated_at: 时间戳
|
||||
|
||||
#### 约束条件与业务规则
|
||||
- 外键约束:staff_id 引用 Staff.id
|
||||
- 自关联约束:assessor_id/reviewer_id 引用 Staff.id
|
||||
- 状态枚举:支持草稿、提交、审核、确认、驳回等状态
|
||||
- 计算规则:total_score 为明细得分之和,weighted_score 为按指标权重加权
|
||||
|
||||
#### 关联关系
|
||||
- 多对一:Assessment → Staff(staff)
|
||||
- 多对一:Assessment → Staff(assessor)
|
||||
- 多对一:Assessment → Staff(reviewer)
|
||||
- 一对多:Assessment → AssessmentDetail(details)
|
||||
- 级联删除:details 支持级联删除
|
||||
|
||||
#### 索引设计
|
||||
- idx_assessment_staff:按员工ID查询优化
|
||||
- idx_assessment_period:按考核周期查询优化
|
||||
- idx_assessment_status:按状态查询优化
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [database.md](file://docs/database.md#L159-L179)
|
||||
|
||||
### AssessmentDetail(考核明细)模型
|
||||
|
||||
#### 字段定义与数据类型
|
||||
- id: 主键,整数类型,自动递增
|
||||
- assessment_id: 考核记录ID,整数类型,外键约束
|
||||
- indicator_id: 指标ID,整数类型,外键约束
|
||||
- actual_value: 实际值,数值类型,精度10,2
|
||||
- score: 得分,数值类型,精度5,2,默认0
|
||||
- evidence: 佐证材料,文本类型
|
||||
- remark: 备注,文本类型
|
||||
- created_at/updated_at: 时间戳
|
||||
|
||||
#### 约束条件与业务规则
|
||||
- 外键约束:assessment_id 引用 Assessment.id,indicator_id 引用 Indicator.id
|
||||
- 计算规则:Assessment.total_score = Σ(AssessmentDetail.score)
|
||||
|
||||
#### 关联关系
|
||||
- 多对一:AssessmentDetail → Assessment(assessment)
|
||||
- 多对一:AssessmentDetail → Indicator(indicator)
|
||||
|
||||
#### 索引设计
|
||||
- idx_detail_assessment:按考核记录ID查询优化
|
||||
- idx_detail_indicator:按指标ID查询优化
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [database.md](file://docs/database.md#L181-L195)
|
||||
|
||||
### SalaryRecord(工资核算记录)模型
|
||||
|
||||
#### 字段定义与数据类型
|
||||
- id: 主键,整数类型,自动递增
|
||||
- staff_id: 员工ID,整数类型,外键约束
|
||||
- period_year: 年度,整数类型,必填
|
||||
- period_month: 月份,整数类型,必填
|
||||
- base_salary: 基本工资,数值类型,精度10,2,默认0
|
||||
- performance_score: 绩效得分,数值类型,精度5,2,默认0
|
||||
- performance_bonus: 绩效奖金,数值类型,精度10,2,默认0
|
||||
- deduction: 扣款,数值类型,精度10,2,默认0
|
||||
- allowance: 补贴,数值类型,精度10,2,默认0
|
||||
- total_salary: 应发工资,数值类型,精度10,2,默认0
|
||||
- status: 状态,默认pending
|
||||
- remark: 备注,文本类型
|
||||
- created_at/updated_at: 时间戳
|
||||
|
||||
#### 约束条件与业务规则
|
||||
- 外键约束:staff_id 引用 Staff.id
|
||||
- 计算规则:total_salary = base_salary + performance_bonus + allowance - deduction
|
||||
- 状态管理:支持pending、confirmed、paid等状态
|
||||
|
||||
#### 关联关系
|
||||
- 多对一:SalaryRecord → Staff(staff)
|
||||
|
||||
#### 索引设计
|
||||
- idx_salary_staff:按员工ID查询优化
|
||||
- idx_salary_period:按考核周期查询优化
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [database.md](file://docs/database.md#L197-L216)
|
||||
|
||||
### 数据验证规则
|
||||
|
||||
系统采用 Pydantic 模式进行数据验证,确保输入数据的完整性和正确性:
|
||||
|
||||
#### 员工数据验证
|
||||
- employee_id: 长度不超过20字符,必填
|
||||
- base_salary: 非负数,最小值0
|
||||
- performance_ratio: 范围0-5
|
||||
- name/position/title: 长度限制和必填约束
|
||||
|
||||
#### 考核数据验证
|
||||
- period_year: 范围2020-2100
|
||||
- period_month: 范围1-12
|
||||
- score: 非负数,最小值0
|
||||
|
||||
#### 工资数据验证
|
||||
- 所有金额字段:非负数约束
|
||||
- 计算字段:自动计算,不允许直接修改
|
||||
|
||||
**章节来源**
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L220-L271)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L274-L311)
|
||||
|
||||
## 依赖分析
|
||||
|
||||
系统模型间存在清晰的依赖关系,遵循数据库规范化原则:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[Department] --> B[Staff]
|
||||
B --> C[Assessment]
|
||||
C --> D[AssessmentDetail]
|
||||
B --> E[SalaryRecord]
|
||||
C -.-> F[Indicator]
|
||||
G[Assessment] -.自关联.-> B
|
||||
H[AssessmentDetail] -.多对一.-> F
|
||||
subgraph "索引优化"
|
||||
I[idx_dept_type]
|
||||
J[idx_staff_dept]
|
||||
K[idx_assessment_staff]
|
||||
L[idx_detail_assessment]
|
||||
M[idx_salary_staff]
|
||||
end
|
||||
A -.-> I
|
||||
B -.-> J
|
||||
C -.-> K
|
||||
D -.-> L
|
||||
E -.-> M
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L231)
|
||||
- [database.md](file://docs/database.md#L99-L216)
|
||||
|
||||
### 外键约束与级联操作
|
||||
|
||||
- Assessment → AssessmentDetail: 级联删除(delete-orphan)
|
||||
- Department → Staff: 一对多关系
|
||||
- Staff → Assessment: 一对多关系
|
||||
- Staff → SalaryRecord: 一对多关系
|
||||
|
||||
### 性能优化策略
|
||||
|
||||
#### 查询优化
|
||||
- 使用复合索引优化常用查询条件
|
||||
- 通过 selectinload 减少 N+1 查询问题
|
||||
- 分页查询避免大数据集加载
|
||||
|
||||
#### 数据库连接
|
||||
- 异步数据库连接提高并发性能
|
||||
- 连接池管理优化资源使用
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L173-L173)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L26-L49)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L29-L55)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L32-L58)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 索引策略
|
||||
- 单列索引:按枚举类型、状态、激活状态快速过滤
|
||||
- 复合索引:按员工ID+状态、考核周期、科室ID+状态等组合查询优化
|
||||
|
||||
### 查询优化
|
||||
- 使用 selectinload 预加载关联数据
|
||||
- 分页查询限制结果集大小
|
||||
- 条件查询精确匹配减少扫描范围
|
||||
|
||||
### 缓存策略
|
||||
- 频繁访问的枚举类型缓存
|
||||
- 常用查询结果短期缓存
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题与解决方案
|
||||
|
||||
#### 数据重复错误
|
||||
- 症状:插入重复的工号或科室编码
|
||||
- 解决:检查唯一性约束,使用去重逻辑
|
||||
|
||||
#### 外键约束错误
|
||||
- 症状:插入不存在的员工或科室ID
|
||||
- 解决:先创建关联实体,再创建子实体
|
||||
|
||||
#### 数据验证失败
|
||||
- 症状:字段超出范围或格式不正确
|
||||
- 解决:检查 Pydantic 模式的验证规则
|
||||
|
||||
#### 性能问题
|
||||
- 症状:查询响应缓慢
|
||||
- 解决:检查索引使用情况,优化查询条件
|
||||
|
||||
**章节来源**
|
||||
- [init_db.py](file://backend/app/core/init_db.py#L12-L115)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L107-L149)
|
||||
|
||||
## 结论
|
||||
|
||||
本核心数据模型设计充分体现了医院绩效管理的业务需求,通过清晰的实体关系、严格的约束条件、完善的索引策略和合理的性能优化,为系统的稳定运行提供了坚实基础。模型间的层次化设计支持复杂的组织架构,灵活的状态管理适应不同的业务流程,而完善的验证机制确保了数据质量。
|
||||
|
||||
## 附录
|
||||
|
||||
### 模型使用示例
|
||||
|
||||
#### 创建员工
|
||||
```python
|
||||
# 通过服务层创建员工
|
||||
staff = await StaffService.create(db, staff_data)
|
||||
```
|
||||
|
||||
#### 创建考核记录
|
||||
```python
|
||||
# 通过服务层创建考核
|
||||
assessment = await AssessmentService.create(db, assessment_data)
|
||||
```
|
||||
|
||||
#### 生成工资记录
|
||||
```python
|
||||
# 基于考核结果生成工资
|
||||
salary_record = await SalaryService.generate_from_assessment(db, staff_id, year, month)
|
||||
```
|
||||
|
||||
### 最佳实践
|
||||
|
||||
1. **数据完整性**:始终使用 Pydantic 模式进行数据验证
|
||||
2. **事务管理**:在复杂操作中使用数据库事务保证一致性
|
||||
3. **索引优化**:根据查询模式合理创建索引
|
||||
4. **错误处理**:完善异常处理和回滚机制
|
||||
5. **性能监控**:定期分析慢查询日志优化性能
|
||||
|
||||
**章节来源**
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L70-L91)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
453
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/科室信息模型.md
Normal file
453
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/科室信息模型.md
Normal file
@@ -0,0 +1,453 @@
|
||||
# 科室信息模型
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [department_service.py](file://backend/app/services/department_service.py)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue)
|
||||
- [department.js](file://frontend/src/api/department.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文档系统化阐述“科室信息模型”的设计理念与实现细节,围绕 Department 模型展开,涵盖:
|
||||
- 科室类型枚举(DeptType)及其业务分类
|
||||
- 树形层级结构与父子关系设计
|
||||
- 字段语义、数据类型、约束条件与业务规则
|
||||
- 科室编码唯一性、层级计算逻辑、排序机制与状态管理
|
||||
- 科室类型分类的应用场景与最佳实践
|
||||
- 数据操作示例、层级查询方法与常见问题排查
|
||||
|
||||
## 项目结构
|
||||
后端采用分层架构:API 层负责请求处理与鉴权,Service 层封装业务逻辑,Model 层定义数据模型与数据库映射;前端通过 API 模块调用后端接口,实现科室数据的增删改查与树形展示。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_Dialog["Departments.vue<br/>新增/编辑/删除/树形选择"]
|
||||
FE_API["department.js<br/>HTTP 请求封装"]
|
||||
end
|
||||
subgraph "后端"
|
||||
API["departments.py<br/>FastAPI 路由"]
|
||||
SVC["department_service.py<br/>业务逻辑"]
|
||||
MODEL["models.py<br/>Department 模型与 DeptType 枚举"]
|
||||
end
|
||||
FE_Dialog --> FE_API
|
||||
FE_API --> API
|
||||
API --> SVC
|
||||
SVC --> MODEL
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L103-L272)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L64-L103)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
## 核心组件
|
||||
- Department 模型:定义科室实体的字段、索引与关系
|
||||
- DeptType 枚举:标准化科室类型,支持多类业务场景
|
||||
- DepartmentService:封装 CRUD、层级树构建与校验逻辑
|
||||
- FastAPI 路由:提供列表、树形、详情、创建、更新、删除等接口
|
||||
- 前端视图与 API:提供交互界面与 HTTP 请求封装
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L16-L26)
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L13-L149)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L20-L107)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L64-L103)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L103-L272)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
## 架构概览
|
||||
后端采用 ORM 映射,Department 通过外键维护自引用的父子关系;Service 层在创建时自动计算层级,API 层提供树形结构查询与分页列表查询。
|
||||
|
||||
```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
|
||||
+parent : Department?
|
||||
+children : Department[]
|
||||
+staff : Staff[]
|
||||
}
|
||||
class DepartmentService {
|
||||
+get_list(...)
|
||||
+get_by_id(...)
|
||||
+get_by_code(...)
|
||||
+create(...)
|
||||
+update(...)
|
||||
+delete(...)
|
||||
+get_tree(...)
|
||||
}
|
||||
class DeptType {
|
||||
<<enumeration>>
|
||||
+CLINICAL_SURGICAL
|
||||
+CLINICAL_NONSURGICAL_WARD
|
||||
+CLINICAL_NONSURGICAL_NOWARD
|
||||
+MEDICAL_TECH
|
||||
+MEDICAL_AUXILIARY
|
||||
+NURSING
|
||||
+ADMIN
|
||||
+FINANCE
|
||||
+LOGISTICS
|
||||
}
|
||||
DepartmentService --> Department : "操作"
|
||||
Department --> DeptType : "使用"
|
||||
Department --> Department : "自引用父子关系"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L16-L26)
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L13-L149)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Department 模型与字段规范
|
||||
- 主键与标识
|
||||
- id:整型,自增主键
|
||||
- code:字符串,长度限制,唯一约束,用于业务识别与去重
|
||||
- 基础信息
|
||||
- name:字符串,长度限制,必填
|
||||
- description:文本,可空
|
||||
- 组织结构
|
||||
- parent_id:外键指向同表 id,支持树形层级
|
||||
- level:整型,默认 1,表示层级深度
|
||||
- sort_order:整型,默认 0,用于排序
|
||||
- 类型与状态
|
||||
- dept_type:枚举 DeptType,必填
|
||||
- is_active:布尔,默认启用
|
||||
- 时间戳
|
||||
- created_at、updated_at:自动维护
|
||||
- 索引与关系
|
||||
- 索引:按类型、父节点
|
||||
- 关系:parent(反向 children)、staff(一对多)
|
||||
|
||||
字段约束与业务规则
|
||||
- 唯一性:code 唯一,API 层在创建前进行重复校验
|
||||
- 层级计算:创建时若指定 parent_id,则 level = 父级 level + 1;否则默认 1
|
||||
- 排序:列表与树形查询均按 sort_order 与 id 排序
|
||||
- 状态:is_active 控制启用/停用,影响列表过滤与前端显示
|
||||
- 父子关系:支持任意层级的树形组织,删除时需确保无子节点
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L62-L78)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L74-L77)
|
||||
|
||||
### 科室类型枚举(DeptType)
|
||||
- 分类与含义
|
||||
- 手术临床:clinical_surgical
|
||||
- 非手术有病房:clinical_nonsurgical_ward
|
||||
- 非手术无病房:clinical_nonsurgical_noward
|
||||
- 医技:medical_tech
|
||||
- 医辅:medical_auxiliary
|
||||
- 护理:nursing
|
||||
- 行政:admin
|
||||
- 财务:finance
|
||||
- 后勤:logistics
|
||||
- 应用场景
|
||||
- 指标模板匹配:不同类型科室适用不同指标集合
|
||||
- 权限与菜单:类型决定可访问的功能范围
|
||||
- 报表与统计:按类型聚合绩效、财务等数据
|
||||
- 计划与考核:类型驱动 KPI 设定与权重分配
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L16-L26)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L12-L21)
|
||||
|
||||
### 树形层级结构与父子关系
|
||||
- 自引用关系
|
||||
- Department.parent_id 外键指向 Department.id
|
||||
- 通过 relationship 建立 parent 与 children 的双向关系
|
||||
- 层级计算
|
||||
- 创建时根据 parent_id 查询父级 level 并 +1
|
||||
- 支持多级嵌套,level 从 1 开始
|
||||
- 树形构建
|
||||
- Service 层一次性查询所有科室,按 sort_order 与 id 排序
|
||||
- 使用字典映射与父子映射构建树根集
|
||||
- 避免懒加载导致的循环依赖与性能问题
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> LoadDepts["查询所有科室<br/>按 sort_order,id 排序"]
|
||||
LoadDepts --> BuildMap["构建 id->节点 映射"]
|
||||
BuildMap --> Iterate["遍历科室列表"]
|
||||
Iterate --> HasParent{"存在 parent_id 且父节点在映射中?"}
|
||||
HasParent --> |是| AppendChild["将当前节点加入父节点 children"]
|
||||
HasParent --> |否| AddRoot["加入根节点集"]
|
||||
AppendChild --> Next["下一个科室"]
|
||||
AddRoot --> Next
|
||||
Next --> Done(["返回根节点树"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L78-L80)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
### 数据操作流程与最佳实践
|
||||
|
||||
#### 列表查询
|
||||
- 参数:dept_type(可选)、is_active(可选)、page、page_size
|
||||
- 排序:sort_order → id
|
||||
- 返回:分页结果与总数
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "departments.py"
|
||||
participant SVC as "department_service.py"
|
||||
participant DB as "数据库"
|
||||
FE->>API : GET /departments?page=&page_size=&dept_type=&is_active=
|
||||
API->>SVC : get_list(dept_type,is_active,page,page_size)
|
||||
SVC->>DB : select(department) + where + order_by + limit/offset
|
||||
DB-->>SVC : 列表数据
|
||||
SVC->>DB : count(*) 子查询
|
||||
DB-->>SVC : 总数
|
||||
SVC-->>API : (列表,总数)
|
||||
API-->>FE : JSON 响应
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L20-L40)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L17-L43)
|
||||
|
||||
章节来源
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L20-L40)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L17-L43)
|
||||
|
||||
#### 树形查询
|
||||
- 参数:dept_type(可选)
|
||||
- 排序:sort_order → id
|
||||
- 返回:根节点树,支持前端树形选择器
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "departments.py"
|
||||
participant SVC as "department_service.py"
|
||||
participant DB as "数据库"
|
||||
FE->>API : GET /departments/tree?dept_type=
|
||||
API->>SVC : get_tree(dept_type)
|
||||
SVC->>DB : select(department) + order_by(sort_order,id)
|
||||
DB-->>SVC : 所有科室
|
||||
SVC->>SVC : 构建 id->节点 映射
|
||||
SVC->>SVC : 追加到父节点 children 或根集
|
||||
SVC-->>API : 根节点树
|
||||
API-->>FE : JSON 响应
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L43-L51)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
章节来源
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L43-L51)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
#### 创建科室
|
||||
- 前端校验:必填项(编码、名称、类型)
|
||||
- 服务端校验:编码唯一性
|
||||
- 层级计算:若 parent_id 存在则 level = 父级 level + 1
|
||||
- 返回:完整 Department 对象
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "departments.py"
|
||||
participant SVC as "department_service.py"
|
||||
participant DB as "数据库"
|
||||
FE->>API : POST /departments
|
||||
API->>SVC : get_by_code(code)
|
||||
SVC->>DB : select(code)
|
||||
DB-->>SVC : 结果
|
||||
SVC-->>API : 若存在则抛错
|
||||
API->>SVC : create(dept_data)
|
||||
SVC->>SVC : 计算 level(parent.level+1)
|
||||
SVC->>DB : insert(department)
|
||||
DB-->>SVC : 新记录
|
||||
SVC-->>API : 返回新建对象
|
||||
API-->>FE : JSON 响应
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L67-L80)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L62-L78)
|
||||
|
||||
章节来源
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L67-L80)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L62-L78)
|
||||
|
||||
#### 更新与删除
|
||||
- 更新:支持修改名称、类型、父级、排序、状态、描述
|
||||
- 删除:若存在子节点则拒绝删除,避免破坏树形结构
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
UStart(["更新入口"]) --> GetByID["根据 id 查询科室"]
|
||||
GetByID --> Exists{"是否存在?"}
|
||||
Exists --> |否| NotFound["返回 404"]
|
||||
Exists --> |是| Apply["应用变更字段"]
|
||||
Apply --> Flush["flush/refresh"]
|
||||
Flush --> UEnd(["结束"])
|
||||
DStart(["删除入口"]) --> DGet["根据 id 查询科室"]
|
||||
DGet --> DExists{"是否存在?"}
|
||||
DExists --> |否| DNotFound["返回 404"]
|
||||
DExists --> |是| CheckChildren["检查是否存在子节点"]
|
||||
CheckChildren --> HasChild{"有子节点?"}
|
||||
HasChild --> |是| Block["返回错误(不可删除)"]
|
||||
HasChild --> |否| Delete["删除并返回成功"]
|
||||
Delete --> DEnd(["结束"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L80-L110)
|
||||
|
||||
章节来源
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L80-L110)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L83-L107)
|
||||
|
||||
### 前端集成与使用示例
|
||||
- 列表页面:支持按关键字(名称/编码)、类型筛选,分页展示
|
||||
- 树形选择:上级科室使用树形选择器,便于层级配置
|
||||
- 新增/编辑:表单校验必填字段,提交后刷新列表与树
|
||||
- 删除:二次确认,防止误删
|
||||
|
||||
章节来源
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L103-L272)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
## 依赖关系分析
|
||||
- 模型层依赖数据库引擎与枚举类型,定义了 Department 的结构与约束
|
||||
- 服务层依赖模型层,提供业务逻辑与数据处理
|
||||
- API 层依赖服务层与安全中间件,提供对外接口
|
||||
- 前端依赖 API 封装,调用后端接口完成用户交互
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE["前端 Views/API"] --> API["FastAPI 路由"]
|
||||
API --> SVC["Service 业务层"]
|
||||
SVC --> MODEL["ORM 模型层"]
|
||||
MODEL --> DB["数据库"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L13-L149)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L103-L272)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
## 性能考量
|
||||
- 查询优化
|
||||
- 列表与树形查询均按 sort_order 与 id 排序,保证稳定顺序
|
||||
- 服务层一次性加载所有科室,避免 N+1 查询
|
||||
- 索引策略
|
||||
- 按类型与父节点建立索引,提升过滤与层级查询效率
|
||||
- 缓存建议
|
||||
- 树形结构可考虑缓存热点数据,减少重复构建
|
||||
- 分页与并发
|
||||
- 列表查询支持分页,避免一次性加载过多数据
|
||||
- 删除前检查子节点,避免事务回滚与锁竞争
|
||||
|
||||
## 故障排除指南
|
||||
- 创建失败:编码重复
|
||||
- 现象:创建接口返回错误
|
||||
- 处理:检查是否存在相同编码,修改后重试
|
||||
- 删除失败:存在子节点
|
||||
- 现象:删除接口返回错误
|
||||
- 处理:先删除子节点或调整层级后再删除
|
||||
- 树形不正确:层级或排序异常
|
||||
- 现象:树形选择器显示层级混乱
|
||||
- 处理:检查 parent_id 与 sort_order 设置,重新保存
|
||||
- 前端显示异常:类型标签或状态开关无效
|
||||
- 现象:类型标签颜色/文案不一致,状态切换无效
|
||||
- 处理:确认枚举值与前端映射一致,检查事件绑定
|
||||
|
||||
章节来源
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L74-L77)
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L102-L107)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L143-L161)
|
||||
|
||||
## 结论
|
||||
Department 模型通过清晰的字段设计、严格的约束与完善的层级计算,为医院绩效系统的组织管理提供了可靠的数据基础。结合 DeptType 的分类与树形结构,能够灵活支撑各类科室的差异化需求,并通过前后端协同实现高效、稳定的科室信息管理。
|
||||
|
||||
## 附录
|
||||
|
||||
### 字段与约束对照表
|
||||
- 字段名:name
|
||||
- 类型:字符串
|
||||
- 约束:必填,长度 ≤ 100
|
||||
- 用途:显示与检索
|
||||
- 字段名:code
|
||||
- 类型:字符串
|
||||
- 约束:必填,唯一,长度 ≤ 20
|
||||
- 用途:业务识别与去重
|
||||
- 字段名:dept_type
|
||||
- 类型:枚举
|
||||
- 约束:必填
|
||||
- 用途:类型分类与模板匹配
|
||||
- 字段名:parent_id
|
||||
- 类型:整型
|
||||
- 约束:可空,外键指向自身 id
|
||||
- 用途:树形层级
|
||||
- 字段名:level
|
||||
- 类型:整型
|
||||
- 约束:默认 1,创建时根据父级 +1
|
||||
- 用途:层级深度
|
||||
- 字段名:sort_order
|
||||
- 类型:整型
|
||||
- 约束:默认 0
|
||||
- 用途:排序与展示顺序
|
||||
- 字段名:is_active
|
||||
- 类型:布尔
|
||||
- 约束:默认启用
|
||||
- 用途:启用/停用控制
|
||||
- 字段名:description
|
||||
- 类型:文本
|
||||
- 约束:可空
|
||||
- 用途:补充说明
|
||||
- 字段名:created_at/updated_at
|
||||
- 类型:时间戳
|
||||
- 约束:自动维护
|
||||
- 用途:审计与追踪
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L66-L76)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L64-L72)
|
||||
452
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/系统基础模型.md
Normal file
452
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/系统基础模型.md
Normal file
@@ -0,0 +1,452 @@
|
||||
# 系统基础模型
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [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/auth.py](file://backend/app/api/v1/auth.py)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [docs/详细设计.md](file://docs/详细设计.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件聚焦系统基础模型,围绕以下核心实体展开:用户(User)、菜单(Menu)、指标模板(IndicatorTemplate)、模板指标(TemplateIndicator)。文档将深入解释这些模型的设计理念、实现细节与相互关系,涵盖用户认证与授权、菜单权限管理、指标模板系统、模板与指标的关联关系、用户角色管理、菜单层级结构、模板类型分类、模板指标权重与排序机制、用户与员工的关联关系、菜单父子层级、模板激活状态管理等主题。同时提供系统配置示例、权限控制机制与模板管理最佳实践。
|
||||
|
||||
## 项目结构
|
||||
后端采用 FastAPI + SQLAlchemy 2.0 异步 ORM 的分层架构:
|
||||
- models 层:定义数据库模型与枚举类型
|
||||
- schemas 层:定义 Pydantic 数据模式(输入/输出)
|
||||
- api 层:定义路由与权限依赖
|
||||
- services 层:封装业务逻辑
|
||||
- core 层:安全、配置、数据库连接等基础设施
|
||||
- main:应用入口与中间件注册
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "应用层"
|
||||
API_AUTH["API: /api/v1/auth"]
|
||||
API_MENUS["API: /api/v1/menus"]
|
||||
API_TEMPLATES["API: /api/v1/templates"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
S_AUTH["Security 模块"]
|
||||
S_MENU["MenuService"]
|
||||
S_TEMPLATE["TemplateService"]
|
||||
end
|
||||
subgraph "模型层"
|
||||
M_USER["User"]
|
||||
M_MENU["Menu"]
|
||||
M_INDICATOR["Indicator"]
|
||||
M_TEMPLATE["IndicatorTemplate"]
|
||||
M_TINDICATOR["TemplateIndicator"]
|
||||
end
|
||||
API_AUTH --> S_AUTH
|
||||
API_MENUS --> S_MENU
|
||||
API_TEMPLATES --> S_TEMPLATE
|
||||
S_AUTH --> M_USER
|
||||
S_MENU --> M_MENU
|
||||
S_TEMPLATE --> M_TEMPLATE
|
||||
S_TEMPLATE --> M_TINDICATOR
|
||||
S_TEMPLATE --> M_INDICATOR
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L438)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L1-L92)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L1-L47)
|
||||
|
||||
## 核心组件
|
||||
本节对 User、Menu、IndicatorTemplate、TemplateIndicator 四个核心模型进行系统性解析,包括字段含义、约束、关系与索引策略。
|
||||
|
||||
- User(系统用户)
|
||||
- 关键点:用户名唯一、密码哈希存储、关联员工(可选)、角色(字符串)、启用状态、最后登录时间
|
||||
- 关系:与 Staff 为一对一(外键关联)
|
||||
- 权限:通过角色字段区分 admin/manager/staff;安全中间件提供获取当前用户、激活用户、管理员/经理权限校验
|
||||
- Menu(系统菜单)
|
||||
- 关键点:父子自引用(parent_id → menus.id)、菜单类型(菜单/按钮)、排序、可见性、启用状态
|
||||
- 关系:自关联 parent/children;支持树形结构查询
|
||||
- 权限:菜单权限标识(permission)用于前端路由鉴权
|
||||
- IndicatorTemplate(指标模板)
|
||||
- 关键点:模板类型(TemplateType)、维度权重(JSON 字符串)、考核周期、启用状态
|
||||
- 关系:一对多到 TemplateIndicator
|
||||
- TemplateIndicator(模板指标)
|
||||
- 关键点:与 Indicator 多对一、分类(category)、目标值/单位、权重、评分方法/参数、排序、备注
|
||||
- 关系:与 Indicator 一对一(反向为多对一)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L313-L346)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L582-L639)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L698-L743)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L654-L696)
|
||||
|
||||
## 架构总览
|
||||
系统采用前后端分离,后端提供 REST API,前端通过权限标识与菜单树渲染导航。认证采用 JWT,菜单树仅返回可见且启用项,模板管理支持按类型与启用状态筛选。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端"
|
||||
participant API as "API 路由"
|
||||
participant SEC as "安全模块"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库"
|
||||
FE->>API : 登录请求
|
||||
API->>SEC : 校验用户名/密码
|
||||
SEC->>DB : 查询用户
|
||||
DB-->>SEC : 用户记录
|
||||
SEC-->>API : 生成访问令牌
|
||||
API-->>FE : 返回令牌
|
||||
FE->>API : 获取菜单树
|
||||
API->>SEC : 获取当前激活用户
|
||||
SEC-->>API : 当前用户
|
||||
API->>SVC : 查询菜单树
|
||||
SVC->>DB : 查询根菜单可见且启用
|
||||
DB-->>SVC : 菜单集合
|
||||
SVC-->>API : 菜单树
|
||||
API-->>FE : 返回菜单树
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L38)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L17-L29)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L91)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 用户与认证授权
|
||||
- 认证流程
|
||||
- 登录:OAuth2Password 请求表单,校验密码哈希,检查用户启用状态,签发访问令牌
|
||||
- 注册:检查用户名唯一性,生成密码哈希,创建用户记录
|
||||
- 当前用户:从 JWT 提取用户 ID,查询用户并校验启用状态
|
||||
- 权限:管理员(admin)与经理(manager)具备更高操作权限
|
||||
- 角色与权限
|
||||
- User.role 控制资源访问范围
|
||||
- 路由层通过依赖注入校验当前用户角色与状态
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant AuthAPI as "Auth API"
|
||||
participant Security as "Security"
|
||||
participant DB as "数据库"
|
||||
Client->>AuthAPI : POST /api/v1/auth/login
|
||||
AuthAPI->>DB : 查询用户
|
||||
DB-->>AuthAPI : 用户(含密码哈希)
|
||||
AuthAPI->>Security : 验证密码
|
||||
Security-->>AuthAPI : 校验结果
|
||||
AuthAPI->>Security : 生成访问令牌
|
||||
AuthAPI-->>Client : {access_token, token_type}
|
||||
Client->>AuthAPI : GET /api/v1/auth/me
|
||||
AuthAPI->>Security : 获取当前激活用户
|
||||
Security->>DB : 查询用户
|
||||
DB-->>Security : 用户
|
||||
Security-->>AuthAPI : 当前用户
|
||||
AuthAPI-->>Client : 用户信息
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L24-L91)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L1-L110)
|
||||
|
||||
### 菜单与权限管理
|
||||
- 菜单模型
|
||||
- 支持菜单/按钮两类,父子自引用,排序与可见性控制
|
||||
- 菜单树查询:仅返回顶层、可见且启用的菜单,并递归加载子节点
|
||||
- 权限控制
|
||||
- 菜单权限标识(permission)用于前端路由鉴权
|
||||
- 菜单管理 API 通过角色依赖限制创建/更新/删除操作
|
||||
- 初始化
|
||||
- 支持初始化默认菜单,避免重复初始化
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["获取菜单树"]) --> BuildQuery["构建查询: 顶层菜单<br/>可见且启用"]
|
||||
BuildQuery --> LoadChildren["加载子节点关系"]
|
||||
LoadChildren --> OrderBy["按排序与ID排序"]
|
||||
OrderBy --> ToDict["_menu_to_dict 递归转字典"]
|
||||
ToDict --> End(["返回菜单树"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L101-L109)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
|
||||
### 指标模板系统
|
||||
- 模板类型
|
||||
- 通用模板、手术临床、非手术有病房、非手术无病房、医技、护理、行政、后勤
|
||||
- 维度权重
|
||||
- 模板可配置 BSC 四维度权重(JSON 字符串),用于汇总计算
|
||||
- 考核周期
|
||||
- 支持月度/年度等周期配置
|
||||
- 列表与详情
|
||||
- 支持按类型与启用状态筛选,返回模板指标数量
|
||||
- 详情包含模板基本信息与完整指标列表(含指标名称、编码、类型、维度、权重、排序等)
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class IndicatorTemplate {
|
||||
+template_name
|
||||
+template_code
|
||||
+template_type
|
||||
+dimension_weights
|
||||
+assessment_cycle
|
||||
+is_active
|
||||
+indicators[]
|
||||
}
|
||||
class TemplateIndicator {
|
||||
+indicator_id
|
||||
+category
|
||||
+target_value
|
||||
+target_unit
|
||||
+weight
|
||||
+scoring_method
|
||||
+scoring_params
|
||||
+sort_order
|
||||
+remark
|
||||
+indicator
|
||||
}
|
||||
class Indicator {
|
||||
+name
|
||||
+code
|
||||
+indicator_type
|
||||
+bs_dimension
|
||||
+weight
|
||||
+max_score
|
||||
}
|
||||
IndicatorTemplate "1" --> "many" TemplateIndicator : "包含"
|
||||
TemplateIndicator "many" --> "1" Indicator : "关联"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L698-L743)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L654-L696)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L375-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L640-L743)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
|
||||
### 模板与指标的关联关系
|
||||
- 关联表 TemplateIndicator
|
||||
- 唯一约束:同一模板下指标唯一
|
||||
- 排序字段 sort_order 决定展示顺序
|
||||
- 支持批量添加,自动补齐排序
|
||||
- 权重与排序机制
|
||||
- 模板层与指标层均支持权重配置
|
||||
- 汇总时需遵循维度权重与指标权重的乘积规则(由上层业务逻辑决定)
|
||||
- 激活状态管理
|
||||
- 模板与指标均可启用/停用,影响使用范围与计算
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L411-L438)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L160-L207)
|
||||
|
||||
### 用户与员工的关联关系
|
||||
- User 与 Staff
|
||||
- User.staff_id 外键关联 Staff.id,表示系统用户与员工的绑定关系
|
||||
- 便于登录后获取员工信息与权限边界
|
||||
- 员工状态与部门
|
||||
- Staff.status 与 Department.parent_id/level 等字段共同构成组织与人员管理基础
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L244-L261)
|
||||
|
||||
### 菜单层级结构
|
||||
- 自引用关系
|
||||
- Menu.parent_id → Menu.id,支持任意层级
|
||||
- 服务层通过 selectinload 预加载 children,避免 N+1 查询
|
||||
- 树形渲染
|
||||
- 顶层查询(parent_id IS NULL),按 sort_order 与 id 排序
|
||||
- 递归转换为字典树,供前端渲染
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L347-L373)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
|
||||
### 模板类型分类逻辑
|
||||
- TemplateType 枚举覆盖全院主要科室类型,便于按类型匹配模板
|
||||
- 服务层提供类型标签映射,便于前端展示
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L375-L385)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L270-L283)
|
||||
|
||||
### 权重与排序机制
|
||||
- 指标层权重
|
||||
- Indicator.weight 与 TemplateIndicator.weight 双层权重
|
||||
- 数据库层对指标权重设置正数约束
|
||||
- 排序
|
||||
- TemplateIndicator.sort_order 决定模板内指标顺序
|
||||
- 批量添加时可按传入顺序补齐排序
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L124-L146)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L421-L427)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L256-L267)
|
||||
|
||||
### 激活状态管理
|
||||
- 模板与菜单均提供 is_active 字段
|
||||
- 菜单树查询默认仅返回启用项
|
||||
- 模板列表支持按 is_active 过滤
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L398-L398)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L360-L360)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L16-L21)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L42)
|
||||
|
||||
## 依赖分析
|
||||
- 模型依赖
|
||||
- User ←→ Staff(一对一外键)
|
||||
- Menu ←→ Menu(自引用)
|
||||
- IndicatorTemplate → TemplateIndicator → Indicator(多对一)
|
||||
- 服务依赖
|
||||
- MenuService 依赖 Menu 模型
|
||||
- TemplateService 依赖 IndicatorTemplate、TemplateIndicator、Indicator 模型
|
||||
- API 依赖
|
||||
- auth 路由依赖 Security 与 User 模型
|
||||
- menus 路由依赖 MenuService 与 Menu 模型
|
||||
- templates 路由依赖 TemplateService 与模板相关 Schema
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A["User"] <- --> B["Staff"]
|
||||
C["Menu"] --自引用 --> C
|
||||
D["IndicatorTemplate"] --> E["TemplateIndicator"]
|
||||
E --> F["Indicator"]
|
||||
G["MenuService"] --> C
|
||||
H["TemplateService"] --> D
|
||||
H --> E
|
||||
H --> F
|
||||
I["Auth API"] --> G
|
||||
J["Menus API"] --> G
|
||||
K["Templates API"] --> H
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L438)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L1-L137)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L1-L74)
|
||||
- [backend/app/api/v1/menus.py](file://backend/app/api/v1/menus.py#L1-L164)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 使用 selectinload 预加载关系,减少 N+1 查询
|
||||
- 菜单树查询限定顶层、可见与启用条件
|
||||
- 索引策略
|
||||
- 模型层为常用过滤字段建立索引(如模板类型、菜单可见性、指标权重约束)
|
||||
- 分页与排序
|
||||
- 模板列表支持分页与排序,避免一次性加载过多数据
|
||||
- 缓存与并发
|
||||
- 配置层提供数据库连接池参数,建议在生产环境按负载调优
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L82-L85)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L368-L372)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L143-L146)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L16-L29)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L42)
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L18-L22)
|
||||
|
||||
## 故障排查指南
|
||||
- 登录失败
|
||||
- 检查用户名是否存在、密码是否正确、用户是否启用
|
||||
- 查看安全模块的凭据验证与令牌生成流程
|
||||
- 菜单不可见
|
||||
- 确认菜单 is_visible 与 is_active 状态
|
||||
- 检查菜单树查询是否仅返回可见启用项
|
||||
- 模板操作失败
|
||||
- 检查模板编码唯一性、模板与指标是否存在、唯一约束冲突
|
||||
- 确认排序字段是否正确传递
|
||||
- 权限不足
|
||||
- 确认当前用户角色(admin/manager/staff)
|
||||
- 检查路由依赖是否正确应用
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/auth.py](file://backend/app/api/v1/auth.py#L17-L38)
|
||||
- [backend/app/services/menu_service.py](file://backend/app/services/menu_service.py#L86-L98)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L136-L140)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L167-L182)
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L94-L109)
|
||||
|
||||
## 结论
|
||||
本系统基础模型围绕 User、Menu、IndicatorTemplate、TemplateIndicator 构建,通过清晰的枚举与约束、合理的索引与查询策略、严格的权限控制与安全中间件,实现了用户认证授权、菜单权限管理、指标模板体系与模板-指标关联的完整闭环。模板类型覆盖全院主要科室,权重与排序机制满足多维度汇总需求,激活状态管理确保系统灵活性。配合服务层与 API 层的职责分离,系统具备良好的扩展性与可维护性。
|
||||
|
||||
## 附录
|
||||
|
||||
### 系统配置示例
|
||||
- JWT 配置
|
||||
- SECRET_KEY、ALGORITHM、ACCESS_TOKEN_EXPIRE_MINUTES
|
||||
- 数据库连接
|
||||
- DATABASE_URL、DATABASE_POOL_SIZE、DATABASE_MAX_OVERFLOW
|
||||
- 跨域与分页
|
||||
- CORS_ORIGINS、DEFAULT_PAGE_SIZE、MAX_PAGE_SIZE
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/config.py](file://backend/app/core/config.py#L9-L47)
|
||||
|
||||
### 权限控制机制
|
||||
- 当前用户获取与校验
|
||||
- 从 JWT 解析用户 ID,查询用户并校验启用状态
|
||||
- 角色权限
|
||||
- 管理员(admin):最高权限
|
||||
- 经理(manager):部分管理操作
|
||||
- 普通员工(staff):受限操作
|
||||
|
||||
章节来源
|
||||
- [backend/app/core/security.py](file://backend/app/core/security.py#L55-L109)
|
||||
|
||||
### 模板管理最佳实践
|
||||
- 模板类型选择
|
||||
- 根据科室类型选择对应模板,避免跨类型混用
|
||||
- 维度权重设计
|
||||
- 明确财务/客户/内部流程/学习与成长的权重范围与合计
|
||||
- 指标权重与排序
|
||||
- 指标层权重与模板层权重协同,排序字段保持连续与稳定
|
||||
- 激活状态
|
||||
- 新建模板先启用少量指标进行测试,逐步放开
|
||||
|
||||
章节来源
|
||||
- [docs/详细设计.md](file://docs/详细设计.md#L69-L95)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L63-L74)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L270-L283)
|
||||
587
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/绩效计划模型.md
Normal file
587
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/绩效计划模型.md
Normal file
@@ -0,0 +1,587 @@
|
||||
# 绩效计划模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [performance_plan.js](file://frontend/src/api/performance_plan.js)
|
||||
- [create_plan_tables.py](file://backend/create_plan_tables.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件详细阐述了医院绩效系统的绩效计划模型设计与实现。该模型支持多层级、多维度的绩效管理需求,涵盖从医院级到个人级的完整计划体系,提供完善的审批流程、版本控制和执行跟踪功能。系统采用现代化的前后端分离架构,后端基于FastAPI和SQLAlchemy,前端使用Vue.js框架。
|
||||
|
||||
## 项目结构
|
||||
|
||||
绩效计划模型位于后端应用的核心模块中,采用清晰的分层架构设计:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端架构"
|
||||
API[API层<br/>performance_plans.py]
|
||||
Service[服务层<br/>performance_plan_service.py]
|
||||
Model[模型层<br/>models.py]
|
||||
Schema[数据模式<br/>schemas.py]
|
||||
DB[(数据库)]
|
||||
end
|
||||
subgraph "前端架构"
|
||||
Frontend[前端应用<br/>Vue.js]
|
||||
APIClient[API客户端<br/>performance_plan.js]
|
||||
end
|
||||
Frontend --> APIClient
|
||||
APIClient --> API
|
||||
API --> Service
|
||||
Service --> Model
|
||||
Model --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [models.py](file://backend/app/models/models.py#L270-L342)
|
||||
|
||||
**章节来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
- [models.py](file://backend/app/models/models.py#L270-L342)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 计划层级枚举(PlanLevel)
|
||||
|
||||
系统定义了三个层级的计划结构,支持从宏观到微观的逐级分解:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class PlanLevel {
|
||||
<<enumeration>>
|
||||
+hospital
|
||||
+department
|
||||
+individual
|
||||
}
|
||||
class PerformancePlan {
|
||||
+int id
|
||||
+string plan_name
|
||||
+string plan_code
|
||||
+PlanLevel plan_level
|
||||
+int plan_year
|
||||
+int plan_month
|
||||
+string plan_type
|
||||
+int department_id
|
||||
+int staff_id
|
||||
+int parent_plan_id
|
||||
+string description
|
||||
+string strategic_goals
|
||||
+string key_initiatives
|
||||
+PlanStatus status
|
||||
+int submitter_id
|
||||
+datetime submit_time
|
||||
+int approver_id
|
||||
+datetime approve_time
|
||||
+string approve_remark
|
||||
+int version
|
||||
+bool is_active
|
||||
}
|
||||
PerformancePlan --> PlanLevel : uses
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L263-L268)
|
||||
- [models.py](file://backend/app/models/models.py#L270-L312)
|
||||
|
||||
### 计划状态枚举(PlanStatus)
|
||||
|
||||
状态管理贯穿整个计划生命周期,确保流程的规范性和可追溯性:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 待审批 : 提交
|
||||
待审批 --> 已批准 : 审批通过
|
||||
待审批 --> 已驳回 : 审批驳回
|
||||
已批准 --> 执行中 : 激活
|
||||
已批准 --> 已完成 : 结束
|
||||
执行中 --> 已完成 : 结束
|
||||
已完成 --> 取消 : 取消
|
||||
草稿 --> 取消 : 删除
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L233-L242)
|
||||
|
||||
### 时间维度管理
|
||||
|
||||
系统支持年度和月度两种时间维度,满足不同层级的计划管理需求:
|
||||
|
||||
| 时间维度 | 字段 | 用途 | 限制 |
|
||||
|---------|------|------|------|
|
||||
| 年度计划 | plan_year | 计划年度 | 必填 |
|
||||
| 月度计划 | plan_year, plan_month | 计划年度和月份 | 月度计划时必填 |
|
||||
| 计划类型 | plan_type | annual/monthly | 默认年度 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L277-L280)
|
||||
|
||||
## 架构概览
|
||||
|
||||
### 数据模型关系图
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
PERFORMANCE_PLANS {
|
||||
int id PK
|
||||
string plan_name
|
||||
string plan_code UK
|
||||
enum plan_level
|
||||
int plan_year
|
||||
int plan_month
|
||||
string plan_type
|
||||
int department_id FK
|
||||
int staff_id FK
|
||||
int parent_plan_id FK
|
||||
text strategic_goals
|
||||
text key_initiatives
|
||||
enum status
|
||||
int submitter_id FK
|
||||
datetime submit_time
|
||||
int approver_id FK
|
||||
datetime approve_time
|
||||
text approve_remark
|
||||
int version
|
||||
bool is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
PLAN_KPI_RELATIONS {
|
||||
int id PK
|
||||
int plan_id FK
|
||||
int indicator_id FK
|
||||
float target_value
|
||||
string target_unit
|
||||
float weight
|
||||
string scoring_method
|
||||
text scoring_params
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
bool is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
numeric base_salary
|
||||
numeric performance_ratio
|
||||
enum status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
USERS {
|
||||
int id PK
|
||||
string username UK
|
||||
string password_hash
|
||||
int staff_id FK
|
||||
string role
|
||||
bool is_active
|
||||
datetime last_login
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum indicator_type
|
||||
enum bs_dimension
|
||||
numeric weight
|
||||
numeric max_score
|
||||
numeric target_value
|
||||
string target_unit
|
||||
text calculation_method
|
||||
text assessment_method
|
||||
text deduction_standard
|
||||
string data_source
|
||||
text applicable_dept_types
|
||||
bool is_veto
|
||||
bool is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : contains
|
||||
PLAN_KPI_RELATIONS }o--|| INDICATORS : links_to
|
||||
PERFORMANCE_PLANS }o--|| DEPARTMENTS : belongs_to
|
||||
PERFORMANCE_PLANS }o--|| STAFF : responsible_for
|
||||
PERFORMANCE_PLANS }o--|| USERS : submitted_by
|
||||
PERFORMANCE_PLANS }o--|| USERS : approved_by
|
||||
DEPARTMENTS ||--o{ PERFORMANCE_PLANS : hosts
|
||||
STAFF ||--o{ PERFORMANCE_PLANS : creates
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
|
||||
### API接口架构
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 前端客户端
|
||||
participant API as API层
|
||||
participant Service as 服务层
|
||||
participant DB as 数据库
|
||||
Client->>API : GET /plans
|
||||
API->>Service : get_list()
|
||||
Service->>DB : 查询计划列表
|
||||
DB-->>Service : 返回结果集
|
||||
Service-->>API : 计划列表
|
||||
API-->>Client : JSON响应
|
||||
Client->>API : POST /plans
|
||||
API->>Service : create()
|
||||
Service->>DB : 插入新计划
|
||||
DB-->>Service : 返回新ID
|
||||
Service-->>API : 完整计划对象
|
||||
API-->>Client : 创建成功
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L21-L66)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L76-L102)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L270-L342)
|
||||
- [performance_plans.py](file://backend/app/api/v1/performance_plans.py#L1-L310)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L1-L342)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### PerformancePlan模型详解
|
||||
|
||||
PerformancePlan是整个绩效计划系统的核心实体,承载着完整的计划信息和业务逻辑:
|
||||
|
||||
#### 核心属性设计
|
||||
|
||||
| 属性名 | 类型 | 必填 | 描述 | 约束 |
|
||||
|--------|------|------|------|------|
|
||||
| plan_name | string | 是 | 计划名称 | 最大长度200 |
|
||||
| plan_code | string | 是 | 计划编码 | 唯一约束,最大长度50 |
|
||||
| plan_level | PlanLevel | 是 | 计划层级 | 枚举值:hospital/department/individual |
|
||||
| plan_year | int | 是 | 计划年度 | 必填 |
|
||||
| plan_month | int | 否 | 计划月份 | 月度计划时必填 |
|
||||
| plan_type | string | 否 | 计划类型 | 默认annual,可选monthly |
|
||||
| department_id | int | 否 | 所属科室ID | 外键约束 |
|
||||
| staff_id | int | 否 | 责任人ID | 外键约束 |
|
||||
| parent_plan_id | int | 否 | 上级计划ID | 自引用外键 |
|
||||
| strategic_goals | text | 否 | 战略目标 | 文本内容 |
|
||||
| key_initiatives | text | 否 | 关键举措 | 文本内容 |
|
||||
| version | int | 否 | 版本号 | 默认1,自增 |
|
||||
| is_active | bool | 否 | 是否启用 | 默认true |
|
||||
|
||||
#### 关系映射
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class PerformancePlan {
|
||||
+Department department
|
||||
+Staff staff
|
||||
+PerformancePlan parent_plan
|
||||
+PlanKpiRelation[] kpi_relations
|
||||
+User submitter
|
||||
+User approver
|
||||
+PerformancePlan[] child_plans
|
||||
}
|
||||
class PlanKpiRelation {
|
||||
+PerformancePlan plan
|
||||
+Indicator indicator
|
||||
}
|
||||
class Department {
|
||||
+PerformancePlan[] performance_plans
|
||||
}
|
||||
class Staff {
|
||||
+PerformancePlan[] performance_plans
|
||||
}
|
||||
PerformancePlan --> Department : belongs_to
|
||||
PerformancePlan --> Staff : responsible_for
|
||||
PerformancePlan --> PlanKpiRelation : contains
|
||||
PlanKpiRelation --> Indicator : links_to
|
||||
PerformancePlan --> PerformancePlan : parent_child
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L298-L304)
|
||||
- [models.py](file://backend/app/models/models.py#L314-L338)
|
||||
|
||||
### 计划层级业务含义
|
||||
|
||||
#### 医院级计划(Hospital)
|
||||
- **覆盖范围**:整个医院层面的战略规划
|
||||
- **制定主体**:医院管理层
|
||||
- **关注重点**:医院整体发展战略、资源配置、重大决策
|
||||
- **典型内容**:医院发展规划、重大投资计划、体制改革方案
|
||||
|
||||
#### 科室级计划(Department)
|
||||
- **覆盖范围**:特定临床或医技科室
|
||||
- **制定主体**:科室负责人
|
||||
- **关注重点**:科室业务发展、质量改进、效率提升
|
||||
- **典型内容**:学科建设、人才培养、技术创新
|
||||
|
||||
#### 个人级计划(Individual)
|
||||
- **覆盖范围**:具体员工个人
|
||||
- **制定主体**:员工本人或直接上级
|
||||
- **关注重点**:个人能力发展、工作目标达成
|
||||
- **典型内容**:技能培训、绩效目标、职业发展规划
|
||||
|
||||
### 多级审批流程
|
||||
|
||||
系统实现了严格的多级审批机制,确保计划的合规性和权威性:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> Create["创建草稿计划"]
|
||||
Create --> Submit["提交审批"]
|
||||
Submit --> Review{"审批状态"}
|
||||
Review --> |通过| Approve["审批通过"]
|
||||
Review --> |驳回| Reject["审批驳回"]
|
||||
Approve --> Activate["激活执行"]
|
||||
Reject --> Edit["修改后重新提交"]
|
||||
Activate --> Execute["执行中"]
|
||||
Execute --> Complete["完成"]
|
||||
Edit --> Submit
|
||||
Complete --> Cancel["取消"]
|
||||
Cancel --> End([结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L131-L182)
|
||||
|
||||
### 计划与指标关联关系
|
||||
|
||||
PlanKpiRelation表建立了计划与指标之间的多对多关联:
|
||||
|
||||
#### 关联属性设计
|
||||
|
||||
| 属性名 | 类型 | 必填 | 描述 | 约束 |
|
||||
|--------|------|------|------|------|
|
||||
| target_value | float | 否 | 目标值 | 数值类型 |
|
||||
| target_unit | string | 否 | 目标值单位 | 最大长度50 |
|
||||
| weight | float | 否 | 权重 | 默认1.0 |
|
||||
| scoring_method | string | 否 | 评分方法 | 最大长度50 |
|
||||
| scoring_params | text | 否 | 评分参数 | JSON格式 |
|
||||
| remark | text | 否 | 备注 | 文本内容 |
|
||||
|
||||
#### 关联规则
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
PERFORMANCE_PLANS ||--o{ PLAN_KPI_RELATIONS : contains
|
||||
PLAN_KPI_RELATIONS }o--|| INDICATORS : links_to
|
||||
PLAN_KPI_RELATIONS {
|
||||
unique(plan_id, indicator_id)
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L314-L338)
|
||||
|
||||
### 版本控制机制
|
||||
|
||||
系统内置版本控制功能,支持计划的迭代更新:
|
||||
|
||||
#### 版本管理策略
|
||||
|
||||
1. **初始版本**:新建计划时自动设置为1
|
||||
2. **版本递增**:每次更新操作时版本号+1
|
||||
3. **历史追踪**:通过版本号区分不同版本的计划
|
||||
4. **冲突处理**:并发更新时通过版本号避免数据覆盖
|
||||
|
||||
#### 版本控制API
|
||||
|
||||
| 接口 | 方法 | 功能 | 权限要求 |
|
||||
|------|------|------|----------|
|
||||
| /plans | POST | 创建新计划 | 普通用户 |
|
||||
| /plans/{id} | PUT | 更新计划 | 管理员/经理 |
|
||||
| /plans/{id}/submit | POST | 提交审批 | 普通用户 |
|
||||
| /plans/{id}/approve | POST | 审批计划 | 管理员/经理 |
|
||||
| /plans/{id}/activate | POST | 激活计划 | 管理员/经理 |
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L293)
|
||||
- [performance_plan_service.py](file://backend/app/services/performance_plan_service.py#L105-L128)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 数据库依赖关系
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "核心表"
|
||||
PP[performance_plans]
|
||||
PKR[plan_kpi_relations]
|
||||
IND[indicators]
|
||||
DEPT[departments]
|
||||
STAFF[staff]
|
||||
USR[users]
|
||||
end
|
||||
PP --> DEPT
|
||||
PP --> STAFF
|
||||
PP --> USR
|
||||
PP --> PP
|
||||
PKR --> PP
|
||||
PKR --> IND
|
||||
DEPT --> DEPT
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L22-L183)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
### 前后端交互依赖
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as 前端
|
||||
participant API as 后端API
|
||||
participant SVC as 服务层
|
||||
participant DB as 数据库
|
||||
FE->>API : 发起HTTP请求
|
||||
API->>SVC : 调用业务逻辑
|
||||
SVC->>DB : 执行数据库操作
|
||||
DB-->>SVC : 返回查询结果
|
||||
SVC-->>API : 返回业务数据
|
||||
API-->>FE : 返回JSON响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [performance_plan.js](file://frontend/src/api/performance_plan.js#L1-L67)
|
||||
|
||||
### 外部依赖
|
||||
|
||||
- **FastAPI**:Web框架和API开发
|
||||
- **SQLAlchemy**:ORM框架和数据库抽象
|
||||
- **Alembic**:数据库迁移工具
|
||||
- **Vue.js**:前端框架
|
||||
- **PostgreSQL**:数据库引擎
|
||||
|
||||
**章节来源**
|
||||
- [performance_plan.js](file://frontend/src/api/performance_plan.js#L1-L67)
|
||||
- [create_plan_tables.py](file://backend/create_plan_tables.py#L1-L19)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 数据库性能优化
|
||||
|
||||
1. **索引策略**
|
||||
- 计划层级索引:`idx_plan_level`
|
||||
- 计划年度索引:`idx_plan_year`
|
||||
- 状态索引:`idx_plan_status`
|
||||
- 部门索引:`idx_plan_department`
|
||||
|
||||
2. **查询优化**
|
||||
- 使用`selectinload`进行关联查询
|
||||
- 实现分页查询避免大数据量加载
|
||||
- 缓存常用查询结果
|
||||
|
||||
3. **连接池管理**
|
||||
- 异步数据库连接
|
||||
- 连接池大小合理配置
|
||||
- 连接超时和重试机制
|
||||
|
||||
### 前端性能优化
|
||||
|
||||
1. **API调用优化**
|
||||
- 批量数据请求
|
||||
- 请求去重和缓存
|
||||
- 错误重试机制
|
||||
|
||||
2. **界面渲染优化**
|
||||
- 组件懒加载
|
||||
- 虚拟滚动处理大量数据
|
||||
- 图表组件按需渲染
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 计划创建失败
|
||||
**问题**:创建计划时报错
|
||||
**可能原因**:
|
||||
- 计划编码重复
|
||||
- 必填字段缺失
|
||||
- 外键约束错误
|
||||
|
||||
**解决步骤**:
|
||||
1. 检查计划编码是否唯一
|
||||
2. 验证所有必填字段
|
||||
3. 确认关联实体存在
|
||||
|
||||
#### 审批流程异常
|
||||
**问题**:审批状态无法正常流转
|
||||
**可能原因**:
|
||||
- 当前状态不正确
|
||||
- 权限不足
|
||||
- 数据库事务未提交
|
||||
|
||||
**解决步骤**:
|
||||
1. 检查当前计划状态
|
||||
2. 验证用户权限
|
||||
3. 查看数据库事务日志
|
||||
|
||||
#### 性能问题
|
||||
**问题**:查询响应缓慢
|
||||
**可能原因**:
|
||||
- 缺少必要索引
|
||||
- 查询条件不当
|
||||
- 数据量过大
|
||||
|
||||
**解决步骤**:
|
||||
1. 添加缺失索引
|
||||
2. 优化查询条件
|
||||
3. 实施分页查询
|
||||
|
||||
**章节来源**
|
||||
- [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#L194-L225)
|
||||
|
||||
## 结论
|
||||
|
||||
绩效计划模型通过精心设计的数据结构和严谨的业务流程,为医院提供了完整的绩效管理体系。系统的主要优势包括:
|
||||
|
||||
1. **层次化设计**:支持从医院级到个人级的多层级计划管理
|
||||
2. **流程规范化**:完善的审批流程确保计划的合规性
|
||||
3. **扩展性强**:灵活的指标关联机制支持个性化配置
|
||||
4. **版本控制**:内置版本管理支持计划的迭代演进
|
||||
5. **前后端分离**:现代化的技术栈提供良好的开发体验
|
||||
|
||||
该模型为医院的绩效管理提供了坚实的技术基础,能够有效支撑医院的战略实施和日常运营管理工作。
|
||||
428
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/考核指标模型.md
Normal file
428
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/考核指标模型.md
Normal file
@@ -0,0 +1,428 @@
|
||||
# 考核指标模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py)
|
||||
- [详细设计文档.md](file://docs/详细设计文档.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文件详细阐述了医院绩效系统中的考核指标模型设计与实现。该模型基于平衡计分卡理论,支持财务、客户、内部流程、学习与成长四个维度,涵盖质量、数量、效率、服务、成本等多种指标类型。系统通过明确的权重管理、评分规则和数据源管理,实现了科学、规范的绩效考核体系。
|
||||
|
||||
## 项目结构
|
||||
|
||||
后端采用分层架构设计,主要包含以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
API[API路由层]
|
||||
end
|
||||
subgraph "服务层"
|
||||
IndicatorService[指标服务层]
|
||||
AssessmentService[考核服务层]
|
||||
end
|
||||
subgraph "模型层"
|
||||
Indicator[指标模型]
|
||||
Assessment[考核记录模型]
|
||||
AssessmentDetail[考核明细模型]
|
||||
IndicatorTemplate[指标模板模型]
|
||||
TemplateIndicator[模板指标关联模型]
|
||||
end
|
||||
subgraph "数据层"
|
||||
Database[(数据库)]
|
||||
end
|
||||
API --> IndicatorService
|
||||
API --> AssessmentService
|
||||
IndicatorService --> Indicator
|
||||
AssessmentService --> Assessment
|
||||
AssessmentService --> AssessmentDetail
|
||||
Indicator --> AssessmentDetail
|
||||
IndicatorTemplate --> TemplateIndicator
|
||||
Indicator --> Database
|
||||
Assessment --> Database
|
||||
AssessmentDetail --> Database
|
||||
IndicatorTemplate --> Database
|
||||
TemplateIndicator --> Database
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 指标类型枚举 (IndicatorType)
|
||||
|
||||
系统定义了五种核心指标类型,每种类型都有明确的业务含义和适用场景:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class IndicatorType {
|
||||
<<enumeration>>
|
||||
+quality
|
||||
+quantity
|
||||
+efficiency
|
||||
+service
|
||||
+cost
|
||||
}
|
||||
class BSCDimension {
|
||||
<<enumeration>>
|
||||
+financial
|
||||
+customer
|
||||
+internal_process
|
||||
+learning_growth
|
||||
}
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
}
|
||||
Indicator --> IndicatorType : uses
|
||||
Indicator --> BSCDimension : uses
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [models.py](file://backend/app/models/models.py#L29-L35)
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
|
||||
### 权重管理机制
|
||||
|
||||
权重是指标体系的核心要素,系统通过以下机制确保权重的合理分配:
|
||||
|
||||
1. **权重范围约束**:权重必须大于0,确保每个指标都有实际意义
|
||||
2. **加权得分计算**:在考核过程中,加权得分 = 指标得分 × 指标权重
|
||||
3. **模板权重继承**:从指标模板中继承权重设置,支持批量配置
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L126-L127)
|
||||
- [models.py](file://backend/app/models/models.py#L144-L145)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L76-L84)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用MVC架构模式,通过清晰的职责分离实现高效的数据处理:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API路由
|
||||
participant Service as 服务层
|
||||
participant Model as 模型层
|
||||
participant DB as 数据库
|
||||
Client->>API : GET /indicators
|
||||
API->>Service : get_list()
|
||||
Service->>Model : 查询指标列表
|
||||
Model->>DB : 执行SQL查询
|
||||
DB-->>Model : 返回查询结果
|
||||
Model-->>Service : 返回指标对象
|
||||
Service-->>API : 返回指标数据
|
||||
API-->>Client : JSON响应
|
||||
Note over Client,DB : 数据持久化通过ORM映射
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L17-L46)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 指标模型设计
|
||||
|
||||
指标模型是整个系统的核心,包含了完整的考核指标定义:
|
||||
|
||||
#### 核心字段设计
|
||||
|
||||
| 字段名 | 类型 | 描述 | 约束条件 |
|
||||
|--------|------|------|----------|
|
||||
| id | Integer | 主键标识 | 自增 |
|
||||
| name | String | 指标名称 | 非空,最大100字符 |
|
||||
| code | String | 指标编码 | 唯一,非空,最大20字符 |
|
||||
| indicator_type | Enum | 指标类型 | 非空,枚举类型 |
|
||||
| bs_dimension | Enum | BSC维度 | 非空,枚举类型 |
|
||||
| weight | Numeric | 权重 | 默认1.0,>0 |
|
||||
| max_score | Numeric | 最高分值 | 默认100.0 |
|
||||
| target_value | Numeric | 目标值 | 可选 |
|
||||
| target_unit | String | 目标值单位 | 可选,最大50字符 |
|
||||
| calculation_method | Text | 计算方法 | 可选 |
|
||||
| assessment_method | Text | 考核方法 | 可选 |
|
||||
| deduction_standard | Text | 扣分标准 | 可选 |
|
||||
| data_source | String | 数据来源 | 可选,最大100字符 |
|
||||
| applicable_dept_types | Text | 适用科室类型 | JSON数组 |
|
||||
| is_veto | Boolean | 一票否决标志 | 默认False |
|
||||
| is_active | Boolean | 启用状态 | 默认True |
|
||||
|
||||
#### 适用科室类型过滤
|
||||
|
||||
系统通过JSON格式存储适用科室类型,支持灵活的科室匹配:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始筛选]) --> GetDeptTypes["获取指标适用科室类型<br/>JSON数组"]
|
||||
GetDeptTypes --> ParseJSON["解析JSON字符串"]
|
||||
ParseJSON --> CompareDept{"匹配当前科室类型?"}
|
||||
CompareDept --> |是| Include["包含在适用范围内"]
|
||||
CompareDept --> |否| Exclude["排除在适用范围外"]
|
||||
Include --> End([结束])
|
||||
Exclude --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L134)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py#L112-L154)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L121-L138)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L153-L163)
|
||||
|
||||
### 一票否决指标处理
|
||||
|
||||
一票否决是系统的重要风控机制,具有以下特点:
|
||||
|
||||
#### 特殊处理逻辑
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始处理指标]) --> CheckVeto{"是否为一票否决指标?"}
|
||||
CheckVeto --> |否| NormalCalc["正常评分计算"]
|
||||
CheckVeto --> |是| VetoCheck["检查否决条件"]
|
||||
VetoCheck --> VetoTrigger{"否决条件触发?"}
|
||||
VetoTrigger --> |是| ZeroScore["直接得分为0分"]
|
||||
VetoTrigger --> |否| NormalCalc
|
||||
NormalCalc --> End([结束])
|
||||
ZeroScore --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L135)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L194-L195)
|
||||
|
||||
#### 实际应用场景
|
||||
|
||||
在临床手术科室的院感控制指标中,系统设置了"院感控制达标率"作为一票否决指标,确保医疗安全底线。
|
||||
|
||||
**章节来源**
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L180-L196)
|
||||
|
||||
### 计算方法与考核方法的区别
|
||||
|
||||
系统明确区分了两种不同的指标处理方式:
|
||||
|
||||
#### 计算方法 (Calculation Method)
|
||||
- **定义**:用于计算实际值的具体公式或方法
|
||||
- **用途**:从原始数据中提取和计算指标的实际数值
|
||||
- **示例**:`(本期收入 - 同期收入)/同期收入 × 100%`
|
||||
|
||||
#### 考核方法 (Assessment Method)
|
||||
- **定义**:用于验证和确认指标结果的检查方法
|
||||
- **用途**:提供数据验证和审计依据
|
||||
- **示例**:统计报表、现场核查、问卷调查
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L130-L131)
|
||||
|
||||
### 指标与模板的关系
|
||||
|
||||
系统实现了指标与模板的多对多关系,支持灵活的指标配置:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string code UK
|
||||
string name
|
||||
enum indicator_type
|
||||
enum bs_dimension
|
||||
numeric weight
|
||||
numeric max_score
|
||||
bool is_active
|
||||
}
|
||||
INDICATOR_TEMPLATES {
|
||||
int id PK
|
||||
string template_code UK
|
||||
string template_name
|
||||
enum template_type
|
||||
bool is_active
|
||||
}
|
||||
TEMPLATE_INDICATORS {
|
||||
int id PK
|
||||
int template_id FK
|
||||
int indicator_id FK
|
||||
string category
|
||||
numeric target_value
|
||||
string target_unit
|
||||
numeric weight
|
||||
string scoring_method
|
||||
text scoring_params
|
||||
int sort_order
|
||||
}
|
||||
INDICATORS ||--o{ TEMPLATE_INDICATORS : "被包含"
|
||||
INDICATOR_TEMPLATES ||--o{ TEMPLATE_INDICATORS : "包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
- [002_template.py](file://backend/alembic/versions/002_template.py#L65-L95)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L411-L437)
|
||||
- [init_indicator_templates.py](file://backend/init_indicator_templates.py#L23-L200)
|
||||
|
||||
### 指标与考核明细的一对多关系
|
||||
|
||||
每个指标可以对应多个考核记录,形成完整的历史追踪:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Indicator {
|
||||
+int id
|
||||
+string code
|
||||
+string name
|
||||
+AssessmentDetail[] assessment_details
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+string evidence
|
||||
+string remark
|
||||
}
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentDetail[] details
|
||||
}
|
||||
Indicator "1" --> "0..*" AssessmentDetail : "被考核"
|
||||
Assessment "1" --> "0..*" AssessmentDetail : "包含"
|
||||
AssessmentDetail --> Indicator : "关联"
|
||||
AssessmentDetail --> Assessment : "属于"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [models.py](file://backend/app/models/models.py#L181-L202)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L140-L141)
|
||||
- [models.py](file://backend/app/models/models.py#L195-L197)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统通过清晰的依赖关系实现模块化设计:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "外部依赖"
|
||||
SQLAlchemy[SQLAlchemy ORM]
|
||||
FastAPI[FastAPI框架]
|
||||
Pydantic[Pydantic验证]
|
||||
end
|
||||
subgraph "内部模块"
|
||||
Models[数据模型]
|
||||
Schemas[数据模式]
|
||||
Services[业务服务]
|
||||
API[API路由]
|
||||
end
|
||||
SQLAlchemy --> Models
|
||||
FastAPI --> API
|
||||
Pydantic --> Schemas
|
||||
Models --> Services
|
||||
Schemas --> Services
|
||||
Services --> API
|
||||
Models --> API
|
||||
Schemas --> API
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L8)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
系统在设计时充分考虑了性能优化:
|
||||
|
||||
### 数据库索引策略
|
||||
- 指标类型索引:加速指标类型的查询和筛选
|
||||
- 权重约束:确保数据完整性的同时维护性能
|
||||
- 多字段复合索引:优化复杂查询场景
|
||||
|
||||
### 缓存策略
|
||||
- 指标列表缓存:减少频繁的数据库查询
|
||||
- 模板数据缓存:提升模板导入和使用的响应速度
|
||||
|
||||
### 异步处理
|
||||
- 使用异步数据库连接:提高并发处理能力
|
||||
- 异步服务调用:避免阻塞操作影响整体性能
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 指标编码重复错误
|
||||
**问题描述**:创建指标时提示编码已存在
|
||||
**解决方法**:检查指标编码的唯一性,确保每个编码在整个系统中唯一
|
||||
|
||||
#### 权重值异常
|
||||
**问题描述**:权重值小于等于0导致计算异常
|
||||
**解决方法**:确保权重值大于0,系统已通过数据库约束保证数据完整性
|
||||
|
||||
#### 一票否决触发
|
||||
**问题描述**:某些情况下指标得分为0分
|
||||
**解决方法**:检查一票否决条件的触发逻辑,确认是否符合预设的标准
|
||||
|
||||
**章节来源**
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L78-L81)
|
||||
- [models.py](file://backend/app/models/models.py#L144-L145)
|
||||
|
||||
## 结论
|
||||
|
||||
考核指标模型通过精心设计的架构和完善的约束机制,为医院绩效管理提供了坚实的技术基础。系统不仅支持灵活的指标配置和权重管理,还通过一票否决机制确保关键指标的严格执行。多对多关系的设计使得指标模板能够灵活复用,而清晰的计算方法与考核方法区分则保证了数据处理的准确性。
|
||||
|
||||
该模型的成功实施将有助于医院建立科学、公正、透明的绩效考核体系,为提升医疗质量和患者满意度提供有力支撑。
|
||||
470
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/考核明细模型.md
Normal file
470
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/考核明细模型.md
Normal file
@@ -0,0 +1,470 @@
|
||||
# 考核明细模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue)
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
|
||||
- [assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
|
||||
考核明细模型是医院绩效考核管理系统的核心数据结构,负责记录每个考核周期内员工各项指标的具体表现和得分情况。该模型实现了完整的考核数据管理功能,包括实际值记录、得分计算、佐证材料管理和多对一关系约束。
|
||||
|
||||
本系统采用现代化的技术栈,后端基于FastAPI和SQLAlchemy 2.0异步ORM,前端使用Vue 3 Composition API和Element Plus组件库,实现了完整的绩效考核流程管理。
|
||||
|
||||
## 项目结构
|
||||
|
||||
系统采用分层架构设计,主要包含以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端层"
|
||||
FE1[Assessments.vue<br/>考核列表页面]
|
||||
FE2[AssessmentDetail.vue<br/>考核详情页面]
|
||||
FE3[assessment.js<br/>API请求封装]
|
||||
end
|
||||
subgraph "后端层"
|
||||
BE1[assessments.py<br/>API路由]
|
||||
BE2[assessment_service.py<br/>业务服务层]
|
||||
BE3[schemas.py<br/>数据模式定义]
|
||||
end
|
||||
subgraph "数据层"
|
||||
DB1[models.py<br/>数据模型]
|
||||
DB2[001_initial.py<br/>数据库迁移]
|
||||
end
|
||||
FE1 --> FE3
|
||||
FE2 --> FE3
|
||||
FE3 --> BE1
|
||||
BE1 --> BE2
|
||||
BE2 --> BE3
|
||||
BE3 --> DB1
|
||||
DB1 --> DB2
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [models.py](file://backend/app/models/models.py#L181-L203)
|
||||
|
||||
**章节来源**
|
||||
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L257)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### AssessmentDetail模型设计
|
||||
|
||||
AssessmentDetail模型是考核明细的核心数据结构,具有以下关键特性:
|
||||
|
||||
**数据字段设计**:
|
||||
- `assessment_id`: 考核记录ID(外键关联)
|
||||
- `indicator_id`: 指标ID(外键关联)
|
||||
- `actual_value`: 实际值(数值型,支持小数)
|
||||
- `score`: 得分(数值型,默认0)
|
||||
- `evidence`: 佐证材料(文本型)
|
||||
- `remark`: 备注(文本型)
|
||||
|
||||
**关系映射**:
|
||||
- 与Assessment模型建立多对一关系
|
||||
- 与Indicator模型建立多对一关系
|
||||
- 支持级联删除和级联刷新
|
||||
|
||||
**索引优化**:
|
||||
- 为assessment_id和indicator_id建立复合索引
|
||||
- 提升查询性能和数据完整性
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L181-L203)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L114-L132)
|
||||
|
||||
### 考核流程集成
|
||||
|
||||
系统实现了完整的考核流程,AssessmentDetail模型在整个流程中发挥关键作用:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as 用户
|
||||
participant Frontend as 前端界面
|
||||
participant API as API接口
|
||||
participant Service as 服务层
|
||||
participant DB as 数据库
|
||||
User->>Frontend : 输入实际值和得分
|
||||
Frontend->>API : 提交更新请求
|
||||
API->>Service : 调用更新方法
|
||||
Service->>DB : 更新AssessmentDetail记录
|
||||
DB-->>Service : 返回更新结果
|
||||
Service->>DB : 计算总分和加权得分
|
||||
DB-->>Service : 返回计算结果
|
||||
Service-->>API : 返回更新后的考核记录
|
||||
API-->>Frontend : 显示更新结果
|
||||
Frontend-->>User : 展示最新的考核明细
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L160-L175)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L111-L156)
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L160-L175)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用MVC架构模式,AssessmentDetail模型位于数据访问层,向上提供业务服务,向下连接数据库存储。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
UI1[Assessments.vue<br/>列表展示]
|
||||
UI2[AssessmentDetail.vue<br/>详情编辑]
|
||||
end
|
||||
subgraph "控制器层"
|
||||
API1[assessments.py<br/>路由处理]
|
||||
API2[authentication<br/>权限控制]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
SVC1[AssessmentService<br/>考核业务处理]
|
||||
SVC2[IndicatorService<br/>指标业务处理]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
MODEL1[Assessment模型]
|
||||
MODEL2[AssessmentDetail模型]
|
||||
MODEL3[Indicator模型]
|
||||
MODEL4[Staff模型]
|
||||
end
|
||||
subgraph "数据存储"
|
||||
DB1[PostgreSQL数据库]
|
||||
DB2[SQLAlchemy ORM]
|
||||
end
|
||||
UI1 --> API1
|
||||
UI2 --> API1
|
||||
API1 --> SVC1
|
||||
API1 --> SVC2
|
||||
SVC1 --> MODEL1
|
||||
SVC1 --> MODEL2
|
||||
SVC2 --> MODEL3
|
||||
MODEL1 --> DB2
|
||||
MODEL2 --> DB2
|
||||
MODEL3 --> DB2
|
||||
MODEL4 --> DB2
|
||||
DB2 --> DB1
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L203)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### AssessmentDetail模型类图
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+string evidence
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+assessment Assessment
|
||||
+indicator Indicator
|
||||
}
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+string period_type
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+string status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
+datetime submit_time
|
||||
+datetime review_time
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
+details AssessmentDetail[]
|
||||
}
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+string indicator_type
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
+details AssessmentDetail[]
|
||||
}
|
||||
AssessmentDetail --> Assessment : "多对一"
|
||||
AssessmentDetail --> Indicator : "多对一"
|
||||
Assessment "1" --> "*" AssessmentDetail : "一对多"
|
||||
Indicator "1" --> "*" AssessmentDetail : "一对多"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L203)
|
||||
|
||||
### 数据完整性约束
|
||||
|
||||
系统通过多种机制确保数据完整性:
|
||||
|
||||
**数据库层面约束**:
|
||||
- 主键约束:确保每条明细记录的唯一性
|
||||
- 外键约束:维护Assessment和Indicator的引用完整性
|
||||
- 检查约束:限制权重值必须大于0
|
||||
- 索引优化:提升查询性能
|
||||
|
||||
**业务层面约束**:
|
||||
- 状态机控制:严格的流程状态转换
|
||||
- 权限控制:不同角色的操作权限
|
||||
- 数据验证:输入数据的格式和范围检查
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L144-L146)
|
||||
- [models.py](file://backend/app/models/models.py#L199-L202)
|
||||
|
||||
### 得分计算算法
|
||||
|
||||
系统实现了灵活的得分计算机制:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始计算]) --> LoadDetails["加载考核明细"]
|
||||
LoadDetails --> CalcTotal["计算总分<br/>sum(score)"]
|
||||
CalcTotal --> CalcWeighted["计算加权得分<br/>sum(score × indicator.weight)"]
|
||||
CalcWeighted --> ValidateRange["验证分数范围<br/>0 ≤ score ≤ max_score"]
|
||||
ValidateRange --> CheckVeto{"检查一票否决"}
|
||||
CheckVeto --> |是| ApplyVeto["应用一票否决规则"]
|
||||
CheckVeto --> |否| CheckExceptions["检查异常值"]
|
||||
CheckVeto --> UpdateAssessment["更新考核记录"]
|
||||
ApplyVeto --> UpdateAssessment
|
||||
CheckExceptions --> UpdateAssessment
|
||||
UpdateAssessment --> End([计算完成])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L74-L84)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L129-L149)
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L111-L156)
|
||||
|
||||
### 佐证材料管理
|
||||
|
||||
系统提供了完整的佐证材料管理功能:
|
||||
|
||||
**存储机制**:
|
||||
- 佐证材料以文本形式存储
|
||||
- 支持URL链接和文件路径
|
||||
- 可扩展为文件上传功能
|
||||
|
||||
**使用场景**:
|
||||
- 质量指标的证明材料
|
||||
- 数量指标的数据支撑
|
||||
- 效率指标的计算依据
|
||||
- 服务指标的客户反馈
|
||||
|
||||
**章节来源**
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L71-L82)
|
||||
- [models.py](file://backend/app/models/models.py#L190-L190)
|
||||
|
||||
### 时间戳跟踪机制
|
||||
|
||||
系统实现了全面的时间戳跟踪:
|
||||
|
||||
**创建时间**:记录AssessmentDetail的创建时刻
|
||||
**更新时间**:自动更新记录的修改时间
|
||||
**流程时间**:记录考核流程各阶段的时间戳
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 已提交 : 提交审核
|
||||
已提交 --> 已审核 : 审核通过
|
||||
已提交 --> 已驳回 : 审核驳回
|
||||
已审核 --> 已确认 : 确认考核
|
||||
已确认 --> [*]
|
||||
state 已提交 {
|
||||
[*] --> 提交时间记录
|
||||
}
|
||||
state 已审核 {
|
||||
[*] --> 审核时间记录
|
||||
}
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L163-L164)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L159-L170)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L163-L167)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L159-L192)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统各组件之间的依赖关系如下:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "外部依赖"
|
||||
A[FastAPI]
|
||||
B[SQLAlchemy 2.0]
|
||||
C[PostgreSQL]
|
||||
D[Vue 3]
|
||||
E[Element Plus]
|
||||
end
|
||||
subgraph "内部模块"
|
||||
F[models.py]
|
||||
G[assessment_service.py]
|
||||
H[assessments.py]
|
||||
I[schemas.py]
|
||||
J[AssessmentDetail.vue]
|
||||
K[Assessments.vue]
|
||||
end
|
||||
A --> H
|
||||
H --> G
|
||||
G --> F
|
||||
F --> C
|
||||
B --> F
|
||||
D --> J
|
||||
D --> K
|
||||
E --> J
|
||||
E --> K
|
||||
J --> I
|
||||
K --> I
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L12)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L16)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L12)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
**索引设计**:
|
||||
- 为assessment_id和indicator_id建立复合索引
|
||||
- 为常用查询条件建立单独索引
|
||||
- 使用覆盖索引减少查询开销
|
||||
|
||||
**查询优化**:
|
||||
- 使用selectinload进行关联查询
|
||||
- 避免N+1查询问题
|
||||
- 实施分页查询机制
|
||||
|
||||
### 缓存策略
|
||||
|
||||
**数据缓存**:
|
||||
- 指标配置信息缓存
|
||||
- 员工基本信息缓存
|
||||
- 科室层级结构缓存
|
||||
|
||||
**查询结果缓存**:
|
||||
- 统计报表结果缓存
|
||||
- 常用查询结果缓存
|
||||
- 配置信息缓存
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
**数据同步问题**:
|
||||
- 确保Assessment和AssessmentDetail的事务一致性
|
||||
- 检查外键约束是否正确设置
|
||||
- 验证数据类型和精度匹配
|
||||
|
||||
**性能问题**:
|
||||
- 分析慢查询日志
|
||||
- 检查索引使用情况
|
||||
- 优化复杂查询语句
|
||||
|
||||
**权限问题**:
|
||||
- 验证用户角色和权限
|
||||
- 检查API访问控制
|
||||
- 确认数据访问范围
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L117-L118)
|
||||
- [models.py](file://backend/app/models/models.py#L199-L202)
|
||||
|
||||
## 结论
|
||||
|
||||
考核明细模型作为医院绩效考核管理系统的核心组件,实现了完整的数据管理功能。通过合理的数据结构设计、严格的数据完整性约束和高效的性能优化策略,系统能够满足医院复杂的绩效考核需求。
|
||||
|
||||
该模型不仅支持基本的考核数据记录,还提供了灵活的扩展能力,可以适应不同科室和岗位的考核要求。同时,系统的权限控制和审计功能确保了数据的安全性和可追溯性。
|
||||
|
||||
## 附录
|
||||
|
||||
### 数据录入示例
|
||||
|
||||
**单个明细录入**:
|
||||
1. 选择考核周期(年、月)
|
||||
2. 选择员工和指标
|
||||
3. 录入实际值和得分
|
||||
4. 添加佐证材料
|
||||
5. 保存并提交审核
|
||||
|
||||
**批量处理方法**:
|
||||
1. 通过批量创建功能生成默认明细
|
||||
2. 批量导入实际值数据
|
||||
3. 统一审核和确认流程
|
||||
4. 生成批量统计报告
|
||||
|
||||
### 数据质量保证措施
|
||||
|
||||
**数据验证规则**:
|
||||
- 分数范围验证(0-max_score)
|
||||
- 权重有效性检查
|
||||
- 指标类型匹配验证
|
||||
- 时间范围合理性检查
|
||||
|
||||
**异常值处理**:
|
||||
- 设置合理的阈值范围
|
||||
- 异常值标记和提醒
|
||||
- 自动化异常检测机制
|
||||
- 人工复核流程
|
||||
|
||||
**章节来源**
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L196-L218)
|
||||
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L47-L68)
|
||||
504
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/考核记录模型.md
Normal file
504
.qoder/repowiki/zh/content/数据模型详解/核心数据模型/考核记录模型.md
Normal file
@@ -0,0 +1,504 @@
|
||||
# 考核记录模型
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [assessment.js](file://frontend/src/api/assessment.js)
|
||||
- [database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
考核记录模型是医院绩效管理系统的核心数据结构,负责管理员工的绩效考核过程。该模型实现了完整的多级审批流程,支持草稿→提交→审核→确认→驳回的状态流转,并提供了灵活的考核周期管理和数据一致性保证机制。
|
||||
|
||||
## 项目结构
|
||||
|
||||
后端采用典型的三层架构设计,主要包含以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
API[API路由层]
|
||||
Frontend[前端接口]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
Service[服务层]
|
||||
Schema[数据模式层]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
Model[模型层]
|
||||
DB[(数据库)]
|
||||
end
|
||||
Frontend --> API
|
||||
API --> Service
|
||||
Service --> Model
|
||||
Model --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L14-L263)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 考核状态枚举
|
||||
|
||||
考核状态枚举定义了完整的审批流程状态:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 草稿
|
||||
草稿 --> 已提交 : 提交考核
|
||||
已提交 --> 已审核 : 审核通过
|
||||
已提交 --> 已驳回 : 审核驳回
|
||||
已审核 --> 已确认 : 确认完成
|
||||
已确认 --> [*]
|
||||
已驳回 --> 草稿 : 修改后重新提交
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L45-L51)
|
||||
|
||||
### 主要数据模型
|
||||
|
||||
系统包含四个核心数据模型,形成了完整的考核数据结构:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
ASSESSMENTS {
|
||||
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_DETAILS {
|
||||
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
|
||||
}
|
||||
STAFF {
|
||||
int id PK
|
||||
int employee_id UK
|
||||
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
|
||||
}
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
string indicator_type
|
||||
float weight
|
||||
float max_score
|
||||
float target_value
|
||||
string target_unit
|
||||
text calculation_method
|
||||
text assessment_method
|
||||
text deduction_standard
|
||||
string data_source
|
||||
string applicable_dept_types
|
||||
boolean is_veto
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : contains
|
||||
STAFF ||--o{ ASSESSMENTS : evaluates
|
||||
INDICATORS ||--o{ ASSESSMENT_DETAILS : measures
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L203)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L203)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用RESTful API设计,实现了完整的CRUD操作和业务流程控制:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant API as API层
|
||||
participant Service as 服务层
|
||||
participant DB as 数据库
|
||||
Client->>API : 创建考核请求
|
||||
API->>Service : create_assessment()
|
||||
Service->>DB : 插入Assessment记录
|
||||
Service->>DB : 插入AssessmentDetail记录
|
||||
DB-->>Service : 返回新记录ID
|
||||
Service-->>API : 返回创建结果
|
||||
API-->>Client : 返回创建成功
|
||||
Client->>API : 提交考核请求
|
||||
API->>Service : submit_assessment()
|
||||
Service->>DB : 更新状态为SUBMITTED
|
||||
DB-->>Service : 确认更新
|
||||
Service-->>API : 返回提交结果
|
||||
API-->>Client : 返回提交成功
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L80-L115)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Assessment模型详解
|
||||
|
||||
Assessment模型是整个考核系统的核心,包含了完整的考核信息和审批状态:
|
||||
|
||||
#### 字段设计
|
||||
|
||||
| 字段名 | 类型 | 描述 | 约束 |
|
||||
|--------|------|------|------|
|
||||
| id | Integer | 主键ID | 自增 |
|
||||
| staff_id | Integer | 员工ID | 外键,必填 |
|
||||
| period_year | Integer | 考核年度 | 必填,范围2020-2100 |
|
||||
| period_month | Integer | 考核月份 | 必填,范围1-12 |
|
||||
| period_type | String | 考核周期类型 | 默认monthly |
|
||||
| total_score | Float | 总分 | 默认0 |
|
||||
| weighted_score | Float | 加权得分 | 默认0 |
|
||||
| status | Enum | 考核状态 | 默认DRAFT |
|
||||
| assessor_id | Integer | 考核人ID | 外键,可选 |
|
||||
| reviewer_id | Integer | 审核人ID | 外键,可选 |
|
||||
| submit_time | DateTime | 提交时间 | 可选 |
|
||||
| review_time | DateTime | 审核时间 | 可选 |
|
||||
| remark | Text | 备注 | 可选 |
|
||||
|
||||
#### 关系映射
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+AssessmentStatus status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
+datetime submit_time
|
||||
+datetime review_time
|
||||
+string remark
|
||||
+staff : Staff
|
||||
+assessor : Staff
|
||||
+reviewer : Staff
|
||||
+details : AssessmentDetail[]
|
||||
}
|
||||
class Staff {
|
||||
+int id
|
||||
+string employee_id
|
||||
+string name
|
||||
+int department_id
|
||||
+string position
|
||||
+assessments : Assessment[]
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+assessment : Assessment
|
||||
+indicator : Indicator
|
||||
}
|
||||
Assessment --> Staff : belongs_to
|
||||
Assessment --> Staff : evaluated_by
|
||||
Assessment --> Staff : reviewed_by
|
||||
Assessment --> AssessmentDetail : has_many
|
||||
AssessmentDetail --> Indicator : measures
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L149-L173)
|
||||
|
||||
#### 状态流转机制
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始]) --> Draft["草稿状态<br/>DRAFT"]
|
||||
Draft --> Submit["提交状态<br/>SUBMITTED"]
|
||||
Submit --> Review["审核状态<br/>REVIEWED"]
|
||||
Submit --> Reject["驳回状态<br/>REJECTED"]
|
||||
Review --> Finalize["确认状态<br/>FINALIZED"]
|
||||
Reject --> Draft2["返回草稿<br/>DRAFT"]
|
||||
Finalize --> End([结束])
|
||||
Draft2 --> Submit
|
||||
style Draft fill:#e1f5fe
|
||||
style Submit fill:#f3e5f5
|
||||
style Review fill:#e8f5e8
|
||||
style Reject fill:#ffebee
|
||||
style Finalize fill:#fff3e0
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L159-L205)
|
||||
|
||||
### 计算逻辑实现
|
||||
|
||||
#### 总分计算
|
||||
|
||||
总分计算逻辑简单直接,将所有考核明细的得分相加:
|
||||
|
||||
```python
|
||||
# 总分 = Σ(明细得分)
|
||||
total_score = sum(d.score for d in assessment_data.details)
|
||||
```
|
||||
|
||||
#### 加权得分计算
|
||||
|
||||
加权得分考虑了指标权重的影响:
|
||||
|
||||
```python
|
||||
# 加权得分 = Σ(明细得分 × 指标权重)
|
||||
weighted_score = 0.0
|
||||
for detail in assessment_data.details:
|
||||
indicator = await db.execute(
|
||||
select(Indicator).where(Indicator.id == detail.indicator_id)
|
||||
)
|
||||
ind = indicator.scalar_one_or_none()
|
||||
if ind:
|
||||
weighted_score += detail.score * float(ind.weight)
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L71-L108)
|
||||
|
||||
### API接口设计
|
||||
|
||||
系统提供了完整的RESTful 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 | 批量创建考核 | 管理员/经理 |
|
||||
|
||||
**章节来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
|
||||
### 数据一致性保证
|
||||
|
||||
#### 级联删除机制
|
||||
|
||||
Assessment模型使用了级联删除策略,确保当主记录被删除时,相关的明细记录也会自动清理:
|
||||
|
||||
```python
|
||||
details: Mapped[List["AssessmentDetail"]] = relationship(
|
||||
"AssessmentDetail",
|
||||
back_populates="assessment",
|
||||
cascade="all, delete-orphan"
|
||||
)
|
||||
```
|
||||
|
||||
#### 索引优化
|
||||
|
||||
数据库层面建立了多个索引以提升查询性能:
|
||||
|
||||
- `idx_assessment_staff`: 员工ID索引
|
||||
- `idx_assessment_period`: 年度+月份复合索引
|
||||
- `idx_assessment_status`: 状态索引
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L174-L178)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
### 模块间依赖
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "外部依赖"
|
||||
SQLAlchemy[SQLAlchemy ORM]
|
||||
FastAPI[FastAPI框架]
|
||||
Pydantic[Pydantic验证]
|
||||
end
|
||||
subgraph "内部模块"
|
||||
Models[数据模型]
|
||||
Services[业务服务]
|
||||
API[API路由]
|
||||
Schemas[数据模式]
|
||||
end
|
||||
SQLAlchemy --> Models
|
||||
FastAPI --> API
|
||||
Pydantic --> Schemas
|
||||
API --> Services
|
||||
Services --> Models
|
||||
API --> Schemas
|
||||
Services --> Schemas
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L11)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L15)
|
||||
|
||||
### 数据流依赖
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Request[HTTP请求] --> Validation[数据验证]
|
||||
Validation --> ServiceCall[服务调用]
|
||||
ServiceCall --> DBQuery[数据库查询]
|
||||
DBQuery --> BusinessLogic[业务逻辑处理]
|
||||
BusinessLogic --> DBUpdate[数据库更新]
|
||||
DBUpdate --> Response[响应生成]
|
||||
Response --> Client[客户端]
|
||||
Validation --> |Schema验证| ServiceCall
|
||||
BusinessLogic --> |状态检查| DBUpdate
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L220-L237)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L111-L156)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化
|
||||
|
||||
1. **索引策略**: 为常用查询字段建立索引,包括员工ID、考核周期、状态等
|
||||
2. **延迟加载**: 使用selectinload优化N+1查询问题
|
||||
3. **分页处理**: 支持大数据集的分页查询
|
||||
|
||||
### 缓存策略
|
||||
|
||||
虽然当前实现没有内置缓存,但可以考虑:
|
||||
- 考核状态的热点数据缓存
|
||||
- 指标权重的静态数据缓存
|
||||
- 员工基本信息的短期缓存
|
||||
|
||||
### 批量操作
|
||||
|
||||
系统支持批量创建考核记录,适用于月末批量处理场景:
|
||||
|
||||
```python
|
||||
# 批量创建逻辑
|
||||
for staff in staff_list:
|
||||
assessment = Assessment(staff_id=staff.id, ...)
|
||||
db.add(assessment)
|
||||
# 为每个指标创建明细
|
||||
for indicator_id in indicators:
|
||||
detail = AssessmentDetail(indicator_id=indicator_id, ...)
|
||||
db.add(detail)
|
||||
```
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 状态流转错误
|
||||
|
||||
**问题**: 无法从草稿状态提交
|
||||
**原因**: 考核记录状态不是DRAFT
|
||||
**解决方案**: 检查当前状态是否为DRAFT
|
||||
|
||||
#### 权限不足
|
||||
|
||||
**问题**: 审核或确认接口返回400错误
|
||||
**原因**: 当前用户权限不足
|
||||
**解决方案**: 确保用户具有管理员或经理权限
|
||||
|
||||
#### 数据重复
|
||||
|
||||
**问题**: 批量创建时出现重复记录
|
||||
**原因**: 同一员工在同一考核周期已存在记录
|
||||
**解决方案**: 系统会自动跳过已存在的记录
|
||||
|
||||
### 异常处理机制
|
||||
|
||||
系统采用统一的异常处理模式:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Try[业务操作] --> Success{操作成功?}
|
||||
Success --> |是| ReturnOK[返回成功响应]
|
||||
Success --> |否| CheckError{检查错误类型}
|
||||
CheckError --> |业务错误| Return400[返回400错误]
|
||||
CheckError --> |权限错误| Return403[返回403错误]
|
||||
CheckError --> |数据库错误| Return500[返回500错误]
|
||||
CheckError --> |其他错误| ReturnError[返回通用错误]
|
||||
Return400 --> Catch[异常捕获]
|
||||
Return403 --> Catch
|
||||
Return500 --> Catch
|
||||
ReturnError --> Catch
|
||||
Catch --> Log[记录日志]
|
||||
Log --> ReturnError
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L105-L132)
|
||||
|
||||
**章节来源**
|
||||
- [assessments.py](file://backend/app/api/v1/assessments.py#L105-L132)
|
||||
|
||||
## 结论
|
||||
|
||||
考核记录模型设计合理,实现了以下关键特性:
|
||||
|
||||
1. **完整的审批流程**: 支持多级审批的完整生命周期管理
|
||||
2. **灵活的数据模型**: 支持多种考核周期和指标类型
|
||||
3. **强一致性的数据结构**: 通过外键约束和级联删除保证数据完整性
|
||||
4. **良好的扩展性**: 模块化设计便于功能扩展和维护
|
||||
5. **完善的API接口**: 提供RESTful风格的完整接口集合
|
||||
|
||||
该模型为医院绩效管理系统的稳定运行奠定了坚实的数据基础,能够有效支撑复杂的绩效考核业务需求。
|
||||
403
.qoder/repowiki/zh/content/数据模型详解/模型验证规则.md
Normal file
403
.qoder/repowiki/zh/content/数据模型详解/模型验证规则.md
Normal file
@@ -0,0 +1,403 @@
|
||||
# 模型验证规则
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [backend/app/api/v1/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/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/assessment_service.py](file://backend/app/services/assessment_service.py)
|
||||
- [backend/app/main.py](file://backend/app/main.py)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文件系统性梳理了医院绩效系统中的模型验证规则,涵盖数据模型的验证机制,包括字段类型验证、范围限制、格式检查和业务规则验证。文档重点解释了以下三个层面的验证实现:
|
||||
- Pydantic 模型验证:通过 Pydantic 的 Field 参数与类型注解实现请求体与响应体的数据校验。
|
||||
- SQLAlchemy 约束验证:通过数据库层的列类型、索引与 CheckConstraint 实现数据完整性约束。
|
||||
- 业务逻辑验证:通过服务层与 API 层的业务规则检查,确保数据在业务语义上的正确性。
|
||||
|
||||
同时,文档阐述了验证错误的处理方式与用户友好的错误信息设计,并提供验证规则的扩展方法与自定义验证器的实现建议。
|
||||
|
||||
## 项目结构
|
||||
后端采用 FastAPI + SQLAlchemy 异步 ORM 的架构,数据模型位于 models 目录,Pydantic 数据模式位于 schemas 目录,API 路由位于 api/v1 目录,业务逻辑位于 services 目录,异常处理与全局配置位于 main.py。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "API 层"
|
||||
A1["staff.py"]
|
||||
A2["indicators.py"]
|
||||
A3["assessments.py"]
|
||||
end
|
||||
subgraph "服务层"
|
||||
S1["staff_service.py"]
|
||||
S2["indicator_service.py"]
|
||||
S3["assessment_service.py"]
|
||||
end
|
||||
subgraph "模式层"
|
||||
P1["schemas.py"]
|
||||
end
|
||||
subgraph "模型层"
|
||||
M1["models.py"]
|
||||
M2["finance.py"]
|
||||
end
|
||||
subgraph "核心"
|
||||
C1["main.py"]
|
||||
C2["requirements.txt"]
|
||||
end
|
||||
A1 --> S1
|
||||
A2 --> S2
|
||||
A3 --> S3
|
||||
S1 --> M1
|
||||
S2 --> M1
|
||||
S3 --> M1
|
||||
A1 --> P1
|
||||
A2 --> P1
|
||||
A3 --> P1
|
||||
M1 --> C2
|
||||
M2 --> C2
|
||||
P1 --> C2
|
||||
C1 --> A1
|
||||
C1 --> A2
|
||||
C1 --> A3
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [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/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [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/assessment_service.py](file://backend/app/services/assessment_service.py#L114-L262)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L50-L91)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L16)
|
||||
|
||||
**章节来源**
|
||||
- [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/assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
|
||||
- [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/assessment_service.py](file://backend/app/services/assessment_service.py#L114-L262)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L1-L79)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L50-L91)
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L16)
|
||||
|
||||
## 核心组件
|
||||
- Pydantic 数据模式:通过 Field 的类型、长度、数值范围、正则表达式等参数实现字段级验证;通过枚举类型保证取值域的正确性;通过 model_config 的 from_attributes 控制 ORM 对象到 Pydantic 模式的转换。
|
||||
- SQLAlchemy 模型:通过列类型(String、Integer、Numeric、Boolean、DateTime、Enum)、索引与 CheckConstraint 实现数据库层约束;通过外键关系与级联策略保证参照完整性。
|
||||
- API 层:在路由函数中接收 Pydantic 模式作为请求体,自动触发 Pydantic 验证;在业务逻辑允许范围内进行额外的业务规则检查,并抛出 HTTP 异常。
|
||||
- 服务层:封装 CRUD 与业务逻辑,负责数据一致性与业务规则的执行;在必要时进行跨实体的约束检查。
|
||||
- 异常处理:全局注册异常处理器,捕获并记录验证错误与业务异常,返回统一的错误信息。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L49-L60)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L81)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L69-L91)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
## 架构概览
|
||||
下图展示了从 API 请求到数据库写入的完整验证链路,包括 Pydantic 验证、业务规则检查与数据库约束验证。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "API 路由"
|
||||
participant Pyd as "Pydantic 模式"
|
||||
participant Svc as "服务层"
|
||||
participant DB as "SQLAlchemy 模型"
|
||||
participant SQL as "数据库"
|
||||
Client->>API : "POST /staff"
|
||||
API->>Pyd : "StaffCreate 验证"
|
||||
Pyd-->>API : "验证通过/错误"
|
||||
API->>Svc : "调用业务逻辑"
|
||||
Svc->>DB : "构造模型实例"
|
||||
DB->>SQL : "执行插入/更新"
|
||||
SQL-->>DB : "约束检查结果"
|
||||
DB-->>Svc : "返回持久化结果"
|
||||
Svc-->>API : "返回业务结果"
|
||||
API-->>Client : "统一响应"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L81)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L107-L124)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L69-L76)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L88-L114)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Pydantic 模型验证
|
||||
- 字段类型与长度验证:通过 Field 的类型注解与 max_length/min_length 限制字符串长度;例如员工工号、姓名、职位、电话、邮箱等字段均设置了长度限制。
|
||||
- 数值范围验证:通过 ge(大于等于)、le(小于等于)、gt(大于)等参数限制数值范围;例如基本工资、绩效系数、权重、最高分值、年份、月份等。
|
||||
- 枚举验证:通过 str + Enum 的组合确保取值域的正确性;例如科室类型、员工状态、指标类型、考核状态等。
|
||||
- 正则表达式验证:通过 pattern 参数对字符串格式进行约束;例如用户角色字段使用正则限制合法取值。
|
||||
- 响应模式转换:通过 model_config(from_attributes=True) 将 ORM 对象直接转换为 Pydantic 模式,避免重复映射。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StaffBase {
|
||||
+employee_id : str
|
||||
+name : str
|
||||
+department_id : int
|
||||
+position : str
|
||||
+title : Optional[str]
|
||||
+phone : Optional[str]
|
||||
+email : Optional[str]
|
||||
+base_salary : float
|
||||
+performance_ratio : float
|
||||
}
|
||||
class StaffCreate {
|
||||
+status : StaffStatus
|
||||
+hire_date : Optional[datetime]
|
||||
}
|
||||
class StaffResponse {
|
||||
+id : int
|
||||
+status : StaffStatus
|
||||
+hire_date : Optional[datetime]
|
||||
+created_at : datetime
|
||||
+updated_at : datetime
|
||||
+department_name : Optional[str]
|
||||
}
|
||||
StaffCreate --|> StaffBase
|
||||
StaffResponse --|> StaffBase
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L107-L150)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L64-L98)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L107-L150)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L315-L345)
|
||||
|
||||
### SQLAlchemy 约束验证
|
||||
- 列类型与默认值:通过 String、Integer、Numeric、Boolean、DateTime、Enum 等类型定义字段属性与默认值;例如 Numeric(10,2) 用于金额与分数的精确存储。
|
||||
- 索引优化:为常用查询字段添加索引,提升查询性能;例如科室类型、状态、年月组合等。
|
||||
- CheckConstraint:通过 CheckConstraint 在数据库层强制业务约束;例如指标权重必须大于 0,财务金额必须大于等于 0。
|
||||
- 外键关系:通过 ForeignKey 建立实体间的参照关系,配合级联策略保证数据一致性。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
numeric base_salary
|
||||
numeric performance_ratio
|
||||
enum status
|
||||
date hire_date
|
||||
}
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
boolean is_active
|
||||
}
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum indicator_type
|
||||
enum bs_dimension
|
||||
numeric weight
|
||||
numeric max_score
|
||||
numeric target_value
|
||||
string target_unit
|
||||
text calculation_method
|
||||
text assessment_method
|
||||
text deduction_standard
|
||||
text data_source
|
||||
string applicable_dept_types
|
||||
boolean is_veto
|
||||
boolean is_active
|
||||
}
|
||||
ASSESSMENTS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
string period_type
|
||||
numeric total_score
|
||||
numeric weighted_score
|
||||
enum status
|
||||
int assessor_id FK
|
||||
int reviewer_id FK
|
||||
datetime submit_time
|
||||
datetime review_time
|
||||
text remark
|
||||
}
|
||||
ASSESSMENT_DETAILS {
|
||||
int id PK
|
||||
int assessment_id FK
|
||||
int indicator_id FK
|
||||
numeric actual_value
|
||||
numeric score
|
||||
text evidence
|
||||
text remark
|
||||
}
|
||||
SALARY_RECORDS {
|
||||
int id PK
|
||||
int staff_id FK
|
||||
int period_year
|
||||
int period_month
|
||||
numeric base_salary
|
||||
numeric performance_score
|
||||
numeric performance_bonus
|
||||
numeric deduction
|
||||
numeric allowance
|
||||
numeric total_salary
|
||||
string status
|
||||
text remark
|
||||
}
|
||||
DEPARTMENTS ||--o{ STAFF : "拥有"
|
||||
STAFF ||--o{ ASSESSMENTS : "被考核"
|
||||
ASSESSMENTS ||--o{ ASSESSMENT_DETAILS : "包含"
|
||||
INDICATORS ||--o{ ASSESSMENT_DETAILS : "被评分"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L114)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L146)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L149-L178)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L181-L202)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L205-L230)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L45-L74)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L143-L146)
|
||||
- [backend/app/models/finance.py](file://backend/app/models/finance.py#L68-L74)
|
||||
|
||||
### 业务逻辑验证
|
||||
- API 层业务规则:在创建与更新接口中,先进行 Pydantic 验证,再进行业务规则检查;例如创建员工前检查工号唯一性,创建指标前检查编码唯一性。
|
||||
- 服务层业务规则:在服务层进行更复杂的业务一致性检查;例如更新考核记录时,仅允许在草稿或已驳回状态下进行修改,并重新计算总分与加权分。
|
||||
- 统一错误处理:通过 HTTPException 抛出业务错误,结合全局异常处理器记录日志并返回统一的错误响应。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> ValidatePyd["Pydantic 验证"]
|
||||
ValidatePyd --> PydanticOK{"验证通过?"}
|
||||
PydanticOK --> |否| ReturnError["返回验证错误"]
|
||||
PydanticOK --> |是| BusinessCheck["业务规则检查"]
|
||||
BusinessCheck --> BusinessOK{"业务规则通过?"}
|
||||
BusinessOK --> |否| RaiseHTTP["抛出 HTTP 异常"]
|
||||
BusinessOK --> |是| Persist["持久化到数据库"]
|
||||
Persist --> Done(["结束"])
|
||||
ReturnError --> Done
|
||||
RaiseHTTP --> Done
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L75-L78)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L78-L81)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L114-L151)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L68-L95)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L71-L98)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L114-L151)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
### 验证错误处理与用户友好信息
|
||||
- HTTP 异常:在业务规则不满足时,使用 HTTPException 返回明确的状态码与错误信息,如“员工不存在”、“工号已存在”、“指标不存在”等。
|
||||
- 统一响应结构:API 返回统一的响应结构,包含状态码、消息、数据、分页信息等,便于前端展示与调试。
|
||||
- 全局异常处理:注册 RequestValidationError 与 StarletteHTTPException 的处理器,记录错误日志并向上抛出,确保错误信息一致且可追踪。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L60-L61)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L66-L67)
|
||||
- [backend/app/api/v1/assessments.py](file://backend/app/api/v1/assessments.py#L99-L101)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
|
||||
### 验证规则扩展与自定义验证器
|
||||
- 扩展 Pydantic 验证:可在现有 Field 参数基础上增加更多约束,如自定义正则表达式、长度范围、数值边界等;对于复杂字段(如 JSON),可使用 Json 类型与自定义解析器。
|
||||
- 自定义验证器:可通过 Pydantic 的 field_validator 或 root_validator 实现跨字段验证与复杂业务规则;例如在创建考核时,验证明细中的指标权重与总分计算的一致性。
|
||||
- 数据库约束增强:在模型层新增 CheckConstraint 或复合索引,以强化数据完整性;例如为“员工工号+部门”的唯一性约束添加复合索引。
|
||||
- 业务规则扩展:在服务层增加新的业务规则检查点,如在创建考核时检查指标是否适用于当前科室类型、是否启用等。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L153-L192)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L143-L146)
|
||||
- [backend/app/services/assessment_service.py](file://backend/app/services/assessment_service.py#L114-L151)
|
||||
|
||||
## 依赖关系分析
|
||||
- 版本要求:项目使用 FastAPI、SQLAlchemy、Pydantic 等核心依赖,版本在 requirements.txt 中声明,确保验证与 ORM 功能的稳定性。
|
||||
- 模块间耦合:API 层依赖 Pydantic 模式与服务层;服务层依赖 SQLAlchemy 模型;模型层依赖数据库驱动与 Alembic 迁移工具。
|
||||
- 异常处理:全局异常处理器统一处理验证与业务异常,减少重复代码并提升用户体验。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
Req["requirements.txt"] --> FastAPI["FastAPI"]
|
||||
Req --> SQLAlchemy["SQLAlchemy"]
|
||||
Req --> Pydantic["Pydantic"]
|
||||
API["API 路由"] --> PydanticSchema["Pydantic 模式"]
|
||||
API --> Service["服务层"]
|
||||
Service --> Model["SQLAlchemy 模型"]
|
||||
Model --> DB["数据库"]
|
||||
Main["main.py"] --> API
|
||||
Main --> Service
|
||||
Main --> Model
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L16)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L10-L15)
|
||||
- [backend/app/services/staff_service.py](file://backend/app/services/staff_service.py#L9-L10)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L13-L13)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L50-L77)
|
||||
|
||||
**章节来源**
|
||||
- [backend/requirements.txt](file://backend/requirements.txt#L1-L16)
|
||||
- [backend/app/main.py](file://backend/app/main.py#L50-L77)
|
||||
|
||||
## 性能考虑
|
||||
- 索引优化:为高频查询字段(如科室类型、状态、年月组合)建立索引,降低查询成本。
|
||||
- 数值精度:使用 Numeric 类型存储金额与分数,避免浮点误差;合理设置精度与小数位数。
|
||||
- 查询优化:在服务层使用 selectinload 等策略预加载关联对象,减少 N+1 查询问题。
|
||||
- 异步 I/O:利用 SQLAlchemy 异步引擎与 FastAPI 的异步特性,提升并发处理能力。
|
||||
|
||||
## 故障排除指南
|
||||
- Pydantic 验证失败:检查请求体字段类型、长度与范围是否符合模式定义;查看响应中的错误字段与原因。
|
||||
- 业务规则失败:确认业务状态是否允许当前操作(如仅草稿或已驳回状态可更新);检查唯一性约束冲突(如工号、指标编码)。
|
||||
- 数据库约束失败:检查 CheckConstraint 与索引是否满足;确认外键关系是否正确。
|
||||
- 异常处理:查看全局异常处理器的日志输出,定位具体错误位置与堆栈信息。
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/main.py](file://backend/app/main.py#L58-L74)
|
||||
- [backend/app/api/v1/staff.py](file://backend/app/api/v1/staff.py#L75-L78)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L143-L146)
|
||||
|
||||
## 结论
|
||||
本系统通过“Pydantic 模式验证 + SQLAlchemy 数据库约束 + 服务层业务规则”的三层验证机制,确保了数据在进入业务流程前后的完整性与一致性。API 层负责输入验证与业务规则检查,服务层负责复杂业务逻辑与数据一致性,模型层负责数据结构与约束定义。配合统一的异常处理与日志记录,系统在保证功能正确的同时,也具备良好的可维护性与可扩展性。未来可在 Pydantic 中引入自定义验证器与复杂字段解析,在模型层增加更多数据库约束,并在服务层扩展业务规则检查点,进一步完善验证体系。
|
||||
338
.qoder/repowiki/zh/content/核心功能模块/基础数据管理/员工管理.md
Normal file
338
.qoder/repowiki/zh/content/核心功能模块/基础数据管理/员工管理.md
Normal file
@@ -0,0 +1,338 @@
|
||||
# 员工管理
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [staff_service.py](file://backend/app/services/staff_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)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue)
|
||||
- [staff.js](file://frontend/src/api/staff.js)
|
||||
- [request.js](file://frontend/src/api/request.js)
|
||||
- [department.js](file://frontend/src/api/department.js)
|
||||
- [api.md](file://docs/api.md)
|
||||
- [database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向医院绩效系统的“员工管理”功能,系统化梳理员工信息的完整生命周期管理:从基本信息录入(姓名、性别、身份证号、联系方式)、职位与职称配置、基本工资与绩效系数设置,到所属科室关联、状态管理(在职、休假、离职、退休),以及部门调动、岗位变更等业务场景。同时覆盖员工档案维护、列表展示、搜索筛选、分页加载、数据同步、权限控制与数据验证规则,并给出批量导入导出、数据校验与异常处理建议。
|
||||
|
||||
## 项目结构
|
||||
后端采用 FastAPI + SQLAlchemy 异步 ORM,前端采用 Vue 3 + Element Plus,通过 Axios 封装的请求模块统一访问后端 API。员工管理涉及以下关键模块:
|
||||
- 后端 API 路由:负责接收请求、鉴权与返回标准化响应
|
||||
- 服务层:封装业务逻辑,处理查询、分页、过滤与数据组装
|
||||
- 数据模型:定义员工表结构、枚举类型与索引约束
|
||||
- 数据模式:定义请求/响应的数据结构与字段校验
|
||||
- 安全模块:提供 JWT 认证、权限校验(管理员/经理)
|
||||
- 前端页面:员工列表、搜索筛选、分页、弹窗表单、增删改操作
|
||||
- 前端 API 封装:统一请求与响应拦截、错误处理
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
FE["前端页面<br/>Staff.vue"] --> API["后端API<br/>staff.py"]
|
||||
API --> SVC["服务层<br/>staff_service.py"]
|
||||
SVC --> DB["数据库模型<br/>models.py"]
|
||||
API --> SEC["安全模块<br/>security.py"]
|
||||
FE --> FE_API["前端API封装<br/>staff.js / request.js"]
|
||||
FE --> DEPT_API["部门API<br/>department.js"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L105-L149)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L1-L313)
|
||||
- [staff.js](file://frontend/src/api/staff.js#L1-L32)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
章节来源
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L105-L149)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L1-L313)
|
||||
- [staff.js](file://frontend/src/api/staff.js#L1-L32)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
## 核心组件
|
||||
- 员工数据模型:包含工号、姓名、所属科室、职位、职称、联系方式、基本工资、绩效系数、状态、入职日期等字段,并定义了状态枚举与索引
|
||||
- 员工数据模式:定义创建、更新、响应的数据结构与字段范围校验
|
||||
- 员工服务层:提供列表查询、详情查询、按工号查询、创建、更新、删除、按科室查询等功能
|
||||
- 员工 API 路由:提供获取列表、详情、创建、更新、删除、按科室查询接口,并集成权限校验
|
||||
- 前端页面:员工列表、搜索筛选、分页、弹窗表单、增删改操作
|
||||
- 前端 API 封装:统一请求头、Token 注入、错误拦截与提示
|
||||
- 安全模块:JWT 解析、当前用户获取、活跃用户校验、管理员/经理权限校验
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L105-L149)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L17-L124)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L1-L313)
|
||||
- [staff.js](file://frontend/src/api/staff.js#L1-L32)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L110)
|
||||
|
||||
## 架构总览
|
||||
员工管理的端到端流程如下:
|
||||
- 前端发起请求(含 Token),经请求拦截器注入 Authorization
|
||||
- 后端 API 路由解析请求参数,进行权限校验(管理员/经理)
|
||||
- 服务层执行数据库查询/写入,组装响应数据
|
||||
- 返回标准化响应(code/message/data/total/page/page_size)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端页面"
|
||||
participant API as "后端API"
|
||||
participant SEC as "安全模块"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库模型"
|
||||
FE->>API : GET /staff?page&page_size&department_id&status&keyword
|
||||
API->>SEC : 校验当前用户与权限
|
||||
SEC-->>API : 当前用户/权限通过
|
||||
API->>SVC : 查询员工列表(含分页/过滤)
|
||||
SVC->>DB : 执行SQL查询(含count/分页/联表)
|
||||
DB-->>SVC : 结果集
|
||||
SVC-->>API : 组装数据(附加科室名称)
|
||||
API-->>FE : 标准化响应(code,message,data,total,page,page_size)
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L49)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L16-L49)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [request.js](file://frontend/src/api/request.js#L14-L37)
|
||||
|
||||
章节来源
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L49)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L16-L49)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L110)
|
||||
- [request.js](file://frontend/src/api/request.js#L14-L37)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 数据模型与字段设计
|
||||
- 员工表字段覆盖基本信息、职位职称、联系方式、薪资与绩效、状态与时间戳
|
||||
- 状态枚举支持在职、休假、离职、退休;索引覆盖科室与状态,便于查询与筛选
|
||||
- 外键关联科室表,支持联表查询并返回科室名称
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
numeric base_salary
|
||||
numeric performance_ratio
|
||||
enum status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
boolean is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
STAFF }o--|| DEPARTMENTS : "所属科室"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L88-L115)
|
||||
- [models.py](file://backend/app/models/models.py#L62-L86)
|
||||
|
||||
### 数据模式与校验
|
||||
- 员工创建模式:必填字段(工号、姓名、部门、职位),默认状态为在职,基本工资与绩效系数带范围校验
|
||||
- 员工更新模式:允许部分字段更新,数值字段带范围校验
|
||||
- 员工响应模式:包含基础字段与部门名称扩展字段
|
||||
|
||||
章节来源
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L105-L149)
|
||||
|
||||
### 服务层逻辑
|
||||
- 列表查询:支持按科室、状态、关键词(姓名/工号)过滤,分页与总数统计,联表加载科室名称
|
||||
- 详情查询:按ID查询并联表加载科室
|
||||
- 按工号查询:用于唯一性校验
|
||||
- 创建/更新/删除:封装 CRUD 操作,返回实体或布尔结果
|
||||
|
||||
章节来源
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L16-L112)
|
||||
|
||||
### API 路由与权限控制
|
||||
- 获取列表:支持分页、过滤、关键词搜索,返回标准化分页响应
|
||||
- 获取详情:返回员工详情并附加科室名称
|
||||
- 创建/更新/删除:仅管理员或经理可操作,创建前进行工号唯一性校验
|
||||
- 按科室查询:返回指定科室下的在职员工列表
|
||||
|
||||
章节来源
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L20-L124)
|
||||
- [security.py](file://backend/app/core/security.py#L85-L110)
|
||||
|
||||
### 前端页面与交互
|
||||
- 列表展示:支持按关键字(姓名/工号)、科室树选择、状态筛选
|
||||
- 分页加载:支持页码与每页数量切换
|
||||
- 弹窗表单:支持新增/编辑,必填字段校验,数值范围校验
|
||||
- 数据同步:调用后端 API 获取数据并刷新表格
|
||||
|
||||
章节来源
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L1-L313)
|
||||
- [staff.js](file://frontend/src/api/staff.js#L1-L32)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
|
||||
### 数据验证与业务规则
|
||||
- 员工唯一性:工号唯一,创建时进行重复校验
|
||||
- 字段范围:基本工资与绩效系数带最小/最大值限制
|
||||
- 状态枚举:仅允许预定义状态值
|
||||
- 分页范围:每页数量限制在 1~100
|
||||
|
||||
章节来源
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L75-L78)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L116-L117)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L26-L44)
|
||||
|
||||
### 权限控制机制
|
||||
- 当前用户获取:从 JWT 中解析用户ID并查询用户
|
||||
- 活跃用户校验:仅允许激活用户访问
|
||||
- 管理员/经理权限:创建/更新/删除接口要求管理员或经理角色
|
||||
|
||||
章节来源
|
||||
- [security.py](file://backend/app/core/security.py#L55-L110)
|
||||
|
||||
### 员工状态管理与业务场景
|
||||
- 状态枚举:在职、休假、离职、退休
|
||||
- 列表查询:支持按状态过滤
|
||||
- 按科室查询:默认仅返回在职员工
|
||||
- 业务场景建议:
|
||||
- 部门调动:更新员工所属科室字段
|
||||
- 岗位变更:更新职位/职称字段
|
||||
- 状态变更:更新状态字段(如休假/退休)
|
||||
|
||||
章节来源
|
||||
- [models.py](file://backend/app/models/models.py#L37-L43)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L104-L111)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L179-L184)
|
||||
|
||||
### 员工档案维护与数据同步
|
||||
- 前端通过 API 获取员工列表与详情,支持分页与筛选
|
||||
- 表单提交后刷新列表,确保前后端数据一致
|
||||
- 错误拦截:统一处理 401/403/404/500 等状态码并提示
|
||||
|
||||
章节来源
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L194-L207)
|
||||
- [request.js](file://frontend/src/api/request.js#L28-L63)
|
||||
|
||||
### 批量导入导出(建议实现)
|
||||
- 导入:建议提供 Excel 模板,后端解析并批量校验与入库,支持事务回滚与错误行定位
|
||||
- 导出:按筛选条件导出 Excel,包含工号、姓名、科室、职位、职称、基本工资、绩效系数、状态等字段
|
||||
- 注意:导入需严格校验字段格式、唯一性与范围约束,避免破坏现有数据
|
||||
|
||||
(本节为通用实现建议,不直接对应具体源码)
|
||||
|
||||
## 依赖关系分析
|
||||
- 前端依赖后端 API 提供的标准化响应结构
|
||||
- 后端 API 依赖安全模块进行权限校验
|
||||
- 服务层依赖数据模型进行数据库操作
|
||||
- 前端 API 封装统一处理请求头与错误拦截
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE_API["前端API封装"] --> BE_API["后端API"]
|
||||
BE_API --> SEC["安全模块"]
|
||||
BE_API --> SVC["服务层"]
|
||||
SVC --> MODELS["数据模型"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [staff.js](file://frontend/src/api/staff.js#L1-L32)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
章节来源
|
||||
- [staff.js](file://frontend/src/api/staff.js#L1-L32)
|
||||
- [request.js](file://frontend/src/api/request.js#L1-L66)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [security.py](file://backend/app/core/security.py#L1-L110)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L1-L112)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
## 性能考量
|
||||
- 查询优化:列表查询使用联表加载科室名称,注意在大数据量场景下对过滤字段建立索引
|
||||
- 分页策略:每页数量上限为 100,避免一次性返回过多数据
|
||||
- 缓存建议:高频查询(如科室树)可在前端缓存,减少重复请求
|
||||
- 并发与事务:批量导入建议使用事务,失败回滚保证一致性
|
||||
|
||||
(本节为通用性能建议,不直接对应具体源码)
|
||||
|
||||
## 故障排查指南
|
||||
- 登录过期:响应拦截器检测 401 自动跳转登录
|
||||
- 权限不足:403 提示需要管理员或经理权限
|
||||
- 资源不存在:404 提示对象不存在
|
||||
- 服务器错误:500 提示服务器错误
|
||||
- 前端表单校验:必填字段与数值范围校验失败会阻止提交
|
||||
- 后端唯一性冲突:创建时若工号重复会返回错误
|
||||
|
||||
章节来源
|
||||
- [request.js](file://frontend/src/api/request.js#L28-L63)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L75-L78)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L172-L177)
|
||||
|
||||
## 结论
|
||||
员工管理模块在后端提供了完善的 CRUD、权限控制与数据校验,在前端实现了友好的列表展示、搜索筛选与分页体验。结合现有数据模型与服务层能力,可稳定支撑员工信息的全生命周期管理。建议后续补充批量导入导出能力与更丰富的状态流转场景,以进一步提升系统实用性与可维护性。
|
||||
|
||||
## 附录
|
||||
|
||||
### API 规范(摘自文档)
|
||||
- 获取员工列表:支持按科室、状态、关键词过滤,返回分页数据
|
||||
- 创建员工:必填字段与范围校验,工号唯一
|
||||
- 更新/删除:管理员/经理权限
|
||||
- 按科室查询:返回指定科室在职员工
|
||||
|
||||
章节来源
|
||||
- [api.md](file://docs/api.md#L158-L238)
|
||||
|
||||
### 数据库表结构(摘自文档)
|
||||
- 员工表字段与索引:包含工号唯一、基本工资与绩效系数范围、状态枚举、科室外键等
|
||||
- 科室表字段与索引:支持树形结构与类型枚举
|
||||
|
||||
章节来源
|
||||
- [database.md](file://docs/database.md#L117-L136)
|
||||
- [database.md](file://docs/database.md#L99-L116)
|
||||
634
.qoder/repowiki/zh/content/核心功能模块/基础数据管理/基础数据管理.md
Normal file
634
.qoder/repowiki/zh/content/核心功能模块/基础数据管理/基础数据管理.md
Normal file
@@ -0,0 +1,634 @@
|
||||
# 基础数据管理
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py)
|
||||
- [department_service.py](file://backend/app/services/department_service.py)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py)
|
||||
- [indicator_service.py](file://backend/app/services/indicator_service.py)
|
||||
- [template_service.py](file://backend/app/services/template_service.py)
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue)
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue)
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue)
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue)
|
||||
- [department.js](file://frontend/src/api/department.js)
|
||||
- [staff.js](file://frontend/src/api/staff.js)
|
||||
- [indicator.js](file://frontend/src/api/indicator.js)
|
||||
- [template.js](file://frontend/src/api/template.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
基础数据管理模块是医院绩效系统的核心基础功能模块,负责维护医院运营所需的基础数据。该模块涵盖四个主要功能领域:
|
||||
|
||||
- **科室管理**:支持树形结构组织,实现多层级科室管理
|
||||
- **员工信息管理**:维护员工基本信息、职位、职称和薪资数据
|
||||
- **考核指标管理**:管理各类绩效考核指标及其属性
|
||||
- **指标模板管理**:提供标准化的指标模板体系
|
||||
|
||||
该模块采用前后端分离架构,后端使用FastAPI + SQLAlchemy,前端使用Vue.js + Element Plus,实现了完整的CRUD操作、数据验证、权限控制和批量处理功能。
|
||||
|
||||
## 项目结构
|
||||
|
||||
基础数据管理模块遵循典型的三层架构设计:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端层"
|
||||
FE1[Departments.vue<br/>科室管理界面]
|
||||
FE2[Staff.vue<br/>员工管理界面]
|
||||
FE3[Indicators.vue<br/>指标管理界面]
|
||||
FE4[Templates.vue<br/>模板管理界面]
|
||||
FE5[API层<br/>department.js<br/>staff.js<br/>indicator.js<br/>template.js]
|
||||
end
|
||||
subgraph "后端层"
|
||||
BE1[API路由层<br/>departments.py<br/>staff.py<br/>indicators.py<br/>templates.py]
|
||||
BE2[服务层<br/>department_service.py<br/>staff_service.py<br/>indicator_service.py<br/>template_service.py]
|
||||
BE3[数据模型层<br/>models.py]
|
||||
BE4[数据验证层<br/>schemas.py]
|
||||
end
|
||||
subgraph "数据库层"
|
||||
DB[(SQLite数据库)]
|
||||
end
|
||||
FE1 --> FE5
|
||||
FE2 --> FE5
|
||||
FE3 --> FE5
|
||||
FE4 --> FE5
|
||||
FE5 --> BE1
|
||||
BE1 --> BE2
|
||||
BE2 --> BE3
|
||||
BE3 --> BE4
|
||||
BE3 --> DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L743)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 数据模型设计
|
||||
|
||||
系统采用SQLAlchemy ORM设计,建立了完整的数据模型层次:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Department {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+DeptType dept_type
|
||||
+int parent_id
|
||||
+int level
|
||||
+int sort_order
|
||||
+bool is_active
|
||||
+DateTime created_at
|
||||
+DateTime updated_at
|
||||
+Staff[] staff
|
||||
+Department parent
|
||||
+Department[] children
|
||||
}
|
||||
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 Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
+DateTime created_at
|
||||
+DateTime updated_at
|
||||
+AssessmentDetail[] assessment_details
|
||||
}
|
||||
class IndicatorTemplate {
|
||||
+int id
|
||||
+string template_name
|
||||
+string template_code
|
||||
+TemplateType template_type
|
||||
+string description
|
||||
+string dimension_weights
|
||||
+string assessment_cycle
|
||||
+bool is_active
|
||||
+DateTime created_at
|
||||
+DateTime updated_at
|
||||
+TemplateIndicator[] indicators
|
||||
}
|
||||
class TemplateIndicator {
|
||||
+int id
|
||||
+int template_id
|
||||
+int indicator_id
|
||||
+string category
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+float weight
|
||||
+string scoring_method
|
||||
+string scoring_params
|
||||
+int sort_order
|
||||
+string remark
|
||||
+DateTime created_at
|
||||
+DateTime updated_at
|
||||
+IndicatorTemplate template
|
||||
+Indicator indicator
|
||||
}
|
||||
Department "1" <-- "many" Staff : "has"
|
||||
Department "1" <-- "many" Department : "parent"
|
||||
IndicatorTemplate "1" <-- "many" TemplateIndicator : "contains"
|
||||
TemplateIndicator "1" <-- "1" Indicator : "references"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L438)
|
||||
|
||||
### API接口设计
|
||||
|
||||
系统提供了RESTful API接口,支持标准的CRUD操作:
|
||||
|
||||
| 功能模块 | HTTP方法 | 端点 | 描述 |
|
||||
|---------|---------|------|------|
|
||||
| 科室管理 | GET | `/departments` | 获取科室列表 |
|
||||
| 科室管理 | GET | `/departments/tree` | 获取科室树形结构 |
|
||||
| 科室管理 | GET | `/departments/{id}` | 获取科室详情 |
|
||||
| 科室管理 | POST | `/departments` | 创建科室 |
|
||||
| 科室管理 | PUT | `/departments/{id}` | 更新科室 |
|
||||
| 科室管理 | DELETE | `/departments/{id}` | 删除科室 |
|
||||
| 员工管理 | GET | `/staff` | 获取员工列表 |
|
||||
| 员工管理 | GET | `/staff/{id}` | 获取员工详情 |
|
||||
| 员工管理 | POST | `/staff` | 创建员工 |
|
||||
| 员工管理 | PUT | `/staff/{id}` | 更新员工 |
|
||||
| 员工管理 | DELETE | `/staff/{id}` | 删除员工 |
|
||||
| 员工管理 | GET | `/staff/department/{id}` | 获取科室员工 |
|
||||
| 指标管理 | GET | `/indicators` | 获取指标列表 |
|
||||
| 指标管理 | GET | `/indicators/active` | 获取启用指标 |
|
||||
| 指标管理 | GET | `/indicators/{id}` | 获取指标详情 |
|
||||
| 指标管理 | POST | `/indicators` | 创建指标 |
|
||||
| 指标管理 | PUT | `/indicators/{id}` | 更新指标 |
|
||||
| 指标管理 | DELETE | `/indicators/{id}` | 删除指标 |
|
||||
| 模板管理 | GET | `/templates` | 获取模板列表 |
|
||||
| 模板管理 | GET | `/templates/types` | 获取模板类型 |
|
||||
| 模板管理 | GET | `/templates/dimensions` | 获取BSC维度 |
|
||||
| 模板管理 | GET | `/templates/{id}` | 获取模板详情 |
|
||||
| 模板管理 | POST | `/templates` | 创建模板 |
|
||||
| 模板管理 | PUT | `/templates/{id}` | 更新模板 |
|
||||
| 模板管理 | DELETE | `/templates/{id}` | 删除模板 |
|
||||
|
||||
**章节来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构设计,确保了良好的可维护性和扩展性:
|
||||
|
||||
```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 : SQL查询/操作
|
||||
DB-->>Model : 查询结果
|
||||
Model-->>Service : 处理后的数据
|
||||
Service-->>API : 业务结果
|
||||
API-->>Client : JSON响应
|
||||
Note over Client,DB : 请求处理完整流程
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L13-L150)
|
||||
- [staff_service.py](file://backend/app/services/staff_service.py#L13-L112)
|
||||
|
||||
### 权限控制机制
|
||||
|
||||
系统实现了基于角色的权限控制:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[用户访问] --> B{检查权限}
|
||||
B --> |普通用户| C[仅读取权限]
|
||||
B --> |管理员| D[完全权限]
|
||||
B --> |经理| E[部分写权限]
|
||||
C --> F[只允许GET操作]
|
||||
D --> G[允许所有操作]
|
||||
E --> H[允许CRUD操作]
|
||||
F --> I[返回数据]
|
||||
G --> I
|
||||
H --> I
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L67-L107)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L68-L108)
|
||||
- [indicators.py](file://backend/app/api/v1/indicators.py#L71-L111)
|
||||
- [templates.py](file://backend/app/api/v1/templates.py#L129-L169)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 科室管理组件
|
||||
|
||||
#### 数据模型分析
|
||||
|
||||
科室管理采用自引用关系实现树形结构:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
DEPARTMENTS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum dept_type
|
||||
int parent_id FK
|
||||
int level
|
||||
int sort_order
|
||||
bool is_active
|
||||
text description
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS }o--|| DEPARTMENTS : "parent"
|
||||
DEPARTMENTS ||--o{ STAFF : "has"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L62-L85)
|
||||
|
||||
#### 树形结构算法
|
||||
|
||||
系统实现了高效的树形结构构建算法:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[获取所有科室] --> B[构建ID到对象映射]
|
||||
B --> C[遍历科室列表]
|
||||
C --> D{检查是否有父节点}
|
||||
D --> |是| E[将当前节点添加到父节点children]
|
||||
D --> |否| F[添加到根节点列表]
|
||||
E --> G[继续下一个科室]
|
||||
F --> G
|
||||
G --> H[返回根节点树形结构]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [department_service.py](file://backend/app/services/department_service.py#L112-L150)
|
||||
|
||||
#### 前端界面设计
|
||||
|
||||
前端采用Element Plus组件实现:
|
||||
|
||||
- **搜索功能**:支持按名称、编码、类型搜索
|
||||
- **树形选择器**:用于上级科室选择
|
||||
- **状态切换**:支持启用/禁用切换
|
||||
- **分页显示**:支持大数据量分页
|
||||
|
||||
**章节来源**
|
||||
- [Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
### 员工信息管理组件
|
||||
|
||||
#### 数据模型设计
|
||||
|
||||
员工信息管理涵盖了完整的员工档案:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
STAFF {
|
||||
int id PK
|
||||
string employee_id UK
|
||||
string name
|
||||
int department_id FK
|
||||
string position
|
||||
string title
|
||||
string phone
|
||||
string email
|
||||
decimal base_salary
|
||||
decimal performance_ratio
|
||||
enum status
|
||||
datetime hire_date
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
DEPARTMENTS ||--o{ STAFF : "belongs_to"
|
||||
STAFF ||--o{ ASSESSMENTS : "creates"
|
||||
STAFF ||--o{ SALARY_RECORDS : "has"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
|
||||
#### 数据验证规则
|
||||
|
||||
系统实现了严格的数据验证:
|
||||
|
||||
- **工号唯一性**:防止重复工号
|
||||
- **基本工资范围**:0-∞
|
||||
- **绩效系数范围**:0-5
|
||||
- **状态枚举**:只能是预定义值
|
||||
|
||||
**章节来源**
|
||||
- [Staff.vue](file://frontend/src/views/basic/Staff.vue#L1-L313)
|
||||
- [staff.js](file://frontend/src/api/staff.js#L1-L32)
|
||||
|
||||
### 考核指标管理组件
|
||||
|
||||
#### 指标类型体系
|
||||
|
||||
系统支持多种类型的考核指标:
|
||||
|
||||
| 指标类型 | 描述 | 权重范围 | 最高分值范围 |
|
||||
|---------|------|----------|-------------|
|
||||
| 质量指标 | 医疗质量相关 | 0.1-10 | 0-1000 |
|
||||
| 数量指标 | 工作量相关 | 0.1-10 | 0-1000 |
|
||||
| 效率指标 | 工作效率相关 | 0.1-10 | 0-1000 |
|
||||
| 服务指标 | 服务质量相关 | 0.1-10 | 0-1000 |
|
||||
| 成本指标 | 成本控制相关 | 0.1-10 | 0-1000 |
|
||||
|
||||
#### BSC维度设计
|
||||
|
||||
平衡计分卡四个维度:
|
||||
|
||||
- **财务维度**:财务管理 (30%-40%)
|
||||
- **客户维度**:顾客服务 (25%-35%)
|
||||
- **内部流程维度**:内部流程 (20%-30%)
|
||||
- **学习与成长维度**:学习与成长 (5%-15%)
|
||||
|
||||
**章节来源**
|
||||
- [Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L1-L296)
|
||||
- [indicator.js](file://frontend/src/api/indicator.js#L1-L32)
|
||||
|
||||
### 指标模板管理组件
|
||||
|
||||
#### 模板类型体系
|
||||
|
||||
系统提供多种科室类型的标准化模板:
|
||||
|
||||
| 模板类型 | 适用科室 | 特点 |
|
||||
|---------|---------|------|
|
||||
| 通用模板 | 全院通用 | 基础通用指标 |
|
||||
| 手术临床科室 | 外科系统 | 手术相关指标 |
|
||||
| 非手术有病房科室 | 内科系统 | 病房管理指标 |
|
||||
| 非手术无病房科室 | 门诊科室 | 门诊服务指标 |
|
||||
| 医技科室 | 检验、放射等 | 医技服务指标 |
|
||||
| 护理单元 | 护理部门 | 护理质量指标 |
|
||||
| 行政科室 | 后勤、财务等 | 行政管理指标 |
|
||||
| 后勤科室 | 总务、采购等 | 后勤保障指标 |
|
||||
|
||||
#### 模板指标管理
|
||||
|
||||
模板采用多对多关系管理:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
INDICATOR_TEMPLATES {
|
||||
int id PK
|
||||
string template_name
|
||||
string template_code UK
|
||||
enum template_type
|
||||
string description
|
||||
string dimension_weights
|
||||
string assessment_cycle
|
||||
bool is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
TEMPLATE_INDICATORS {
|
||||
int id PK
|
||||
int template_id FK
|
||||
int indicator_id FK
|
||||
string category
|
||||
decimal target_value
|
||||
string target_unit
|
||||
decimal weight
|
||||
string scoring_method
|
||||
text scoring_params
|
||||
int sort_order
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATORS {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum indicator_type
|
||||
enum bs_dimension
|
||||
decimal weight
|
||||
decimal max_score
|
||||
decimal target_value
|
||||
string target_unit
|
||||
text calculation_method
|
||||
text assessment_method
|
||||
text deduction_standard
|
||||
string data_source
|
||||
string applicable_dept_types
|
||||
bool is_veto
|
||||
bool is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATOR_TEMPLATES ||--o{ TEMPLATE_INDICATORS : "contains"
|
||||
INDICATORS ||--o{ TEMPLATE_INDICATORS : "references"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L387-L438)
|
||||
|
||||
**章节来源**
|
||||
- [Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统采用了清晰的依赖层次结构:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "外部依赖"
|
||||
D1[FastAPI]
|
||||
D2[SQLAlchemy]
|
||||
D3[Element Plus]
|
||||
D4[Vue.js]
|
||||
end
|
||||
subgraph "后端核心"
|
||||
C1[models.py]
|
||||
C2[schemas.py]
|
||||
C3[department_service.py]
|
||||
C4[staff_service.py]
|
||||
C5[indicator_service.py]
|
||||
C6[template_service.py]
|
||||
end
|
||||
subgraph "前端核心"
|
||||
F1[Departments.vue]
|
||||
F2[Staff.vue]
|
||||
F3[Indicators.vue]
|
||||
F4[Templates.vue]
|
||||
F5[department.js]
|
||||
F6[staff.js]
|
||||
F7[indicator.js]
|
||||
F8[template.js]
|
||||
end
|
||||
D1 --> C1
|
||||
D2 --> C1
|
||||
D3 --> F1
|
||||
D4 --> F1
|
||||
C1 --> C2
|
||||
C3 --> C1
|
||||
C4 --> C1
|
||||
C5 --> C1
|
||||
C6 --> C1
|
||||
F5 --> D1
|
||||
F6 --> D1
|
||||
F7 --> D1
|
||||
F8 --> D1
|
||||
F1 --> F5
|
||||
F2 --> F6
|
||||
F3 --> F7
|
||||
F4 --> F8
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L1-L13)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L8)
|
||||
|
||||
### 数据一致性保证
|
||||
|
||||
系统通过多种机制确保数据一致性:
|
||||
|
||||
1. **数据库约束**:唯一性约束、外键约束
|
||||
2. **业务逻辑验证**:服务层数据验证
|
||||
3. **事务处理**:关键操作的事务保证
|
||||
4. **级联删除**:模板删除时自动清理关联数据
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L82-L85)
|
||||
- [models.py](file://backend/app/models/models.py#L143-L146)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 查询优化策略
|
||||
|
||||
1. **索引设计**:为常用查询字段建立索引
|
||||
2. **分页查询**:默认每页20条记录
|
||||
3. **批量操作**:支持批量添加模板指标
|
||||
4. **缓存策略**:模板类型和维度数据缓存
|
||||
|
||||
### 前端性能优化
|
||||
|
||||
1. **虚拟滚动**:大量数据时使用虚拟滚动
|
||||
2. **懒加载**:树形组件懒加载
|
||||
3. **防抖搜索**:搜索框输入防抖
|
||||
4. **组件复用**:表单组件复用
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
| 问题类型 | 症状 | 原因 | 解决方案 |
|
||||
|---------|------|------|---------|
|
||||
| 数据重复 | 创建失败,提示已存在 | 唯一性约束冲突 | 检查编码或名称唯一性 |
|
||||
| 权限不足 | 操作被拒绝 | 角色权限限制 | 提升用户角色或联系管理员 |
|
||||
| 外键约束 | 删除失败 | 存在外键引用 | 先删除子数据再删除父数据 |
|
||||
| 数据验证 | 提交失败 | 字段格式不正确 | 检查必填字段和格式要求 |
|
||||
|
||||
### 错误处理机制
|
||||
|
||||
系统实现了完善的错误处理:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[请求到达] --> B{数据验证}
|
||||
B --> |通过| C[业务处理]
|
||||
B --> |失败| D[返回400错误]
|
||||
C --> E{业务逻辑}
|
||||
E --> |成功| F[返回200成功]
|
||||
E --> |失败| G[返回500错误]
|
||||
D --> H[错误详情]
|
||||
F --> I[成功详情]
|
||||
G --> H
|
||||
H --> J[日志记录]
|
||||
I --> J
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L74-L77)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L75-L78)
|
||||
|
||||
**章节来源**
|
||||
- [departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [staff.py](file://backend/app/api/v1/staff.py#L1-L124)
|
||||
|
||||
## 结论
|
||||
|
||||
基础数据管理模块为医院绩效系统提供了坚实的数据基础。通过合理的架构设计、完善的数据模型和严格的权限控制,系统能够有效支撑医院的绩效管理工作。
|
||||
|
||||
### 主要优势
|
||||
|
||||
1. **模块化设计**:清晰的功能划分和职责分离
|
||||
2. **数据完整性**:完善的约束和验证机制
|
||||
3. **用户体验**:直观的界面和流畅的操作体验
|
||||
4. **扩展性强**:灵活的模板系统支持定制化需求
|
||||
5. **性能稳定**:合理的优化策略确保系统稳定性
|
||||
|
||||
### 发展建议
|
||||
|
||||
1. **增加审计日志**:记录所有数据变更历史
|
||||
2. **完善权限粒度**:支持更细粒度的权限控制
|
||||
3. **增强数据导入**:支持Excel批量导入功能
|
||||
4. **优化移动端**:适配移动设备访问需求
|
||||
5. **扩展统计分析**:增加更多维度的统计报表
|
||||
|
||||
该模块的成功实现为整个医院绩效系统的稳定运行奠定了重要基础,为后续功能扩展提供了良好的技术支撑。
|
||||
363
.qoder/repowiki/zh/content/核心功能模块/基础数据管理/模板管理.md
Normal file
363
.qoder/repowiki/zh/content/核心功能模块/基础数据管理/模板管理.md
Normal file
@@ -0,0 +1,363 @@
|
||||
# 模板管理
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [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/scripts/init_templates.py](file://backend/app/scripts/init_templates.py)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考量](#性能考量)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本章节面向“医院绩效系统”的“模板管理”功能,系统化阐述模板的设计与管理流程,覆盖模板类型定义、模板内容配置、模板版本管理、模板应用规则、模板初始化脚本、模板继承机制、模板自定义字段、模板发布流程、模板编辑器、模板预览、模板复制与批量应用、模板与指标体系的关联关系、模板使用统计以及模板更新机制等。
|
||||
|
||||
## 项目结构
|
||||
模板管理功能由后端API路由、服务层、数据模型与前端页面协同实现,配合数据库迁移脚本完成模板相关表结构的演进与初始化数据注入。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_Templates["Templates.vue<br/>模板管理界面"]
|
||||
FE_API["template.js<br/>API封装"]
|
||||
end
|
||||
subgraph "后端"
|
||||
API["templates.py<br/>模板API路由"]
|
||||
SVC["template_service.py<br/>模板服务层"]
|
||||
MODELS["models.py<br/>数据模型"]
|
||||
SCHEMAS["schemas.py<br/>数据模式"]
|
||||
INIT["init_templates.py<br/>模板初始化脚本"]
|
||||
MIG["002_template.py<br/>数据库迁移"]
|
||||
end
|
||||
FE_Templates --> FE_API
|
||||
FE_API --> API
|
||||
API --> SVC
|
||||
SVC --> MODELS
|
||||
SVC --> SCHEMAS
|
||||
INIT --> MODELS
|
||||
MIG --> MODELS
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L375-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L375-L437)
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L1-L276)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L1-L276)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L375-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L375-L437)
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
|
||||
## 核心组件
|
||||
- 模板API路由:提供模板列表、详情、创建、更新、删除、模板指标管理(增删改查、批量导入)等REST接口。
|
||||
- 模板服务层:封装模板与模板指标的CRUD逻辑、分页查询、校验与去重、排序维护等。
|
||||
- 数据模型:定义模板、模板指标关联、BSC维度、模板类型枚举等。
|
||||
- 数据模式:定义请求/响应的数据结构与校验规则。
|
||||
- 初始化脚本:按模板文档生成指标与模板数据,建立模板与指标的初始映射。
|
||||
- 数据库迁移:定义模板表、模板指标关联表及指标表扩展字段。
|
||||
- 前端页面:模板列表、详情、维度权重可视化、指标表格、新增/编辑弹窗、批量导入等。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L170)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L375-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L375-L437)
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L189-L276)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
|
||||
## 架构总览
|
||||
模板管理采用典型的三层架构:前端负责交互与展示;后端API路由处理请求与响应;服务层协调数据访问与业务规则;模型层定义持久化结构;迁移脚本与初始化脚本确保数据库结构与种子数据一致。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
Client["浏览器/移动端"] --> FE["前端页面<br/>Templates.vue"]
|
||||
FE --> API["FastAPI路由<br/>templates.py"]
|
||||
API --> SVC["模板服务层<br/>template_service.py"]
|
||||
SVC --> DB["数据库<br/>SQLAlchemy ORM"]
|
||||
DB --> MODELS["模型定义<br/>models.py"]
|
||||
INIT["初始化脚本<br/>init_templates.py"] --> DB
|
||||
MIG["迁移脚本<br/>002_template.py"] --> DB
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L375-L438)
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L189-L276)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L96)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 模板类型与维度
|
||||
- 模板类型:通用模板、手术临床科室、非手术有病房科室、非手术无病房科室、医技科室、护理单元、行政科室、后勤科室。
|
||||
- BSC维度:财务管理、顾客服务、内部流程、学习与成长,配套维度权重范围用于指导权重分配。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L45-L74)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L269-L293)
|
||||
|
||||
### 模板内容配置
|
||||
- 模板基础信息:模板名称、模板编码、模板类型、描述、维度权重(JSON)、考核周期、启用状态。
|
||||
- 模板指标:指标ID、分类、目标值/单位、权重、评分方法、评分参数、排序、备注。
|
||||
- 前端支持:维度权重可视化、指标表格、评分方法枚举、目标值/单位输入、排序维护。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L77-L126)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L375-L437)
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L61-L118)
|
||||
|
||||
### 模板版本管理
|
||||
- 版本字段存在于“绩效计划”模型中,用于计划层面的版本控制;模板本身未显式版本字段。
|
||||
- 建议在模板模型中增加版本字段与版本号递增策略,以支持模板演进与审计。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L293-L296)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L520-L570)
|
||||
|
||||
### 模板应用规则
|
||||
- 模板与指标通过“模板指标关联表”建立多对多关系,支持按模板类型匹配适用科室。
|
||||
- 指标表扩展字段包含适用科室类型(JSON数组)、BSC维度、目标值单位、考核方法、扣分标准、数据来源、是否一票否决等,便于模板应用时的规则匹配与评分。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L411-L437)
|
||||
|
||||
### 模板初始化脚本
|
||||
- 初始化脚本按模板文档生成指标与模板数据,自动建立模板与指标的映射关系,并写入维度权重、排序等。
|
||||
- 通过异步引擎连接数据库,避免重复创建,保证幂等性。
|
||||
|
||||
章节来源
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L189-L276)
|
||||
|
||||
### 模板继承机制
|
||||
- 当前代码未实现模板继承;模板间复用主要通过“批量添加模板指标”与“复制模板”实现。
|
||||
- 建议引入模板继承字段(如父模板ID),在读取模板详情时合并父模板指标,以降低重复配置成本。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L252-L271)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L160-L206)
|
||||
|
||||
### 模板自定义字段
|
||||
- 模板指标支持自定义字段:分类、目标值/单位、权重、评分方法、评分参数、排序、备注。
|
||||
- 指标表扩展字段支持适用科室类型、BSC维度、目标值单位、考核方法、扣分标准、数据来源、是否一票否决等。
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L411-L437)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
|
||||
### 模板发布流程
|
||||
- 发布即启用模板(is_active),前端提供开关切换;后端在更新模板时仅允许管理员或经理权限。
|
||||
- 建议增加“发布/撤销发布”状态流转与审批流程,以满足正式发布的合规要求。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L145-L169)
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L25-L29)
|
||||
|
||||
### 模板编辑器功能
|
||||
- 前端提供模板编辑弹窗,支持维度权重输入、描述编辑、考核周期选择。
|
||||
- 提供指标编辑弹窗,支持分类、目标值/单位、权重、评分方法、评分参数、备注等字段编辑。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L122-L172)
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L174-L232)
|
||||
|
||||
### 模板预览
|
||||
- 前端在模板详情卡片中展示维度权重进度条、指标列表、评分方法标签等,便于快速预览模板构成。
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L69-L118)
|
||||
|
||||
### 模板复制与批量应用
|
||||
- 批量添加模板指标:支持传入指标列表,自动维护排序,提升批量应用效率。
|
||||
- 复制模板:建议在后端提供“复制模板”接口,克隆模板与指标映射,减少重复配置。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L252-L271)
|
||||
|
||||
### 模板与指标体系的关联关系
|
||||
- 模板与指标通过“模板指标关联表”建立一对一映射(同一模板下同一指标仅出现一次),并支持排序与自定义权重。
|
||||
- 指标表扩展字段支持适用科室类型、BSC维度等,便于模板按科室类型筛选适用指标。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
INDICATOR_TEMPLATE {
|
||||
int id PK
|
||||
string template_name
|
||||
string template_code UK
|
||||
enum template_type
|
||||
text description
|
||||
text dimension_weights
|
||||
string assessment_cycle
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
TEMPLATE_INDICATOR {
|
||||
int id PK
|
||||
int template_id FK
|
||||
int indicator_id FK
|
||||
string category
|
||||
numeric target_value
|
||||
string target_unit
|
||||
numeric weight
|
||||
string scoring_method
|
||||
text scoring_params
|
||||
int sort_order
|
||||
text remark
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATOR {
|
||||
int id PK
|
||||
string name
|
||||
string code UK
|
||||
enum indicator_type
|
||||
enum bs_dimension
|
||||
numeric weight
|
||||
numeric max_score
|
||||
numeric target_value
|
||||
string target_unit
|
||||
text calculation_method
|
||||
text assessment_method
|
||||
text deduction_standard
|
||||
string data_source
|
||||
text applicable_dept_types
|
||||
boolean is_veto
|
||||
boolean is_active
|
||||
datetime created_at
|
||||
datetime updated_at
|
||||
}
|
||||
INDICATOR_TEMPLATE ||--o{ TEMPLATE_INDICATOR : "包含"
|
||||
INDICATOR ||--o{ TEMPLATE_INDICATOR : "被包含"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L437)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L437)
|
||||
|
||||
### 模板使用统计与模板更新机制
|
||||
- 使用统计:可在服务层扩展统计逻辑,统计各模板被应用次数、指标数量、维度权重分布等。
|
||||
- 更新机制:当前通过更新模板接口进行,建议增加变更记录与版本对比,便于审计与回滚。
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L30-L71)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L145-L156)
|
||||
|
||||
## 依赖关系分析
|
||||
模板管理涉及前后端与数据库的多层依赖,需关注以下耦合点:
|
||||
- 前端与后端API:通过统一的HTTP接口交互,前端依赖模板与指标的增删改查接口。
|
||||
- 后端服务层与模型层:服务层依赖模型层的ORM定义与索引约束。
|
||||
- 迁移脚本与初始化脚本:共同决定数据库结构与初始数据,需保持一致性。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE["Templates.vue"] --> API["templates.py"]
|
||||
API --> SVC["template_service.py"]
|
||||
SVC --> MODELS["models.py"]
|
||||
SVC --> SCHEMAS["schemas.py"]
|
||||
INIT["init_templates.py"] --> MODELS
|
||||
MIG["002_template.py"] --> MODELS
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L375-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L375-L437)
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L1-L276)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L1-L293)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L375-L438)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L375-L437)
|
||||
- [backend/app/scripts/init_templates.py](file://backend/app/scripts/init_templates.py#L1-L276)
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
|
||||
## 性能考量
|
||||
- 查询性能:模板列表与详情查询已使用索引(模板类型、启用状态、模板指标唯一索引),建议在高频查询场景下增加复合索引与缓存。
|
||||
- 写入性能:批量添加模板指标时逐条插入,建议在服务层使用批量插入优化。
|
||||
- 前端渲染:指标列表较多时建议虚拟滚动与懒加载,减少DOM压力。
|
||||
|
||||
## 故障排查指南
|
||||
- 模板不存在:当更新或删除模板时若返回“模板不存在”,请检查模板ID与权限。
|
||||
- 指标已存在:添加模板指标时若返回失败,请确认同一模板下指标不重复。
|
||||
- 编码冲突:创建模板时若提示“模板编码已存在”,请更换唯一编码。
|
||||
- 权限不足:模板管理接口需要管理员或经理权限,请确认当前用户角色。
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L136-L142)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L153-L156)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L217-L220)
|
||||
|
||||
## 结论
|
||||
模板管理功能围绕“模板—指标”关系展开,通过API路由、服务层与前端页面形成闭环。当前实现覆盖了模板类型、维度权重、指标配置、批量导入与前端可视化等关键能力。为进一步增强可维护性与合规性,建议补充模板版本管理、模板继承、发布审批流程与使用统计分析。
|
||||
|
||||
## 附录
|
||||
|
||||
### 模板API调用序列
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端页面"
|
||||
participant API as "模板API路由"
|
||||
participant SVC as "模板服务层"
|
||||
participant DB as "数据库"
|
||||
FE->>API : GET /templates
|
||||
API->>SVC : get_list()
|
||||
SVC->>DB : 查询模板列表与总数
|
||||
DB-->>SVC : 返回结果
|
||||
SVC-->>API : 模板列表与总数
|
||||
API-->>FE : 分页响应
|
||||
FE->>API : GET /templates/{id}
|
||||
API->>SVC : get_by_id()
|
||||
SVC->>DB : 加载模板与指标
|
||||
DB-->>SVC : 返回模板详情
|
||||
SVC-->>API : 模板详情
|
||||
API-->>FE : 详情响应
|
||||
FE->>API : POST /templates
|
||||
API->>SVC : create()
|
||||
SVC->>DB : 插入模板与指标
|
||||
DB-->>SVC : 提交成功
|
||||
SVC-->>API : 返回模板ID
|
||||
API-->>FE : 创建成功
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L3-L36)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L170)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L92-L128)
|
||||
400
.qoder/repowiki/zh/content/核心功能模块/基础数据管理/科室管理.md
Normal file
400
.qoder/repowiki/zh/content/核心功能模块/基础数据管理/科室管理.md
Normal file
@@ -0,0 +1,400 @@
|
||||
# 科室管理
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_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/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue)
|
||||
- [docs/database.md](file://docs/database.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本章节面向“医院绩效系统”的“科室管理”功能,系统化阐述后端API、数据库模型、前端组件与服务层之间的协作关系,覆盖以下能力:
|
||||
- 科室信息的增删改查(CRUD)
|
||||
- 科室类型分类(手术临床、非手术有病房、非手术无病房、医技、医辅、护理单元、行政、财务、后勤保障)
|
||||
- 树形层级结构管理(父子关系、层级level、排序sort_order)
|
||||
- 科室状态控制(启用/禁用)
|
||||
- 搜索过滤与分页
|
||||
- 编码唯一性约束与上级科室关联校验
|
||||
- 前端树形选择器、状态切换开关、搜索过滤与分页展示
|
||||
|
||||
## 项目结构
|
||||
围绕“科室管理”,涉及后端三层(API-Service-Model)与前端单页面组件的协同:
|
||||
- 后端
|
||||
- API路由:负责请求参数解析、鉴权与返回格式化
|
||||
- 服务层:封装业务逻辑(查询、树构建、创建、更新、删除)
|
||||
- 模型层:定义数据库表结构、索引与关系
|
||||
- Schema层:定义请求/响应数据结构与字段校验
|
||||
- 前端
|
||||
- API适配层:封装HTTP请求
|
||||
- 视图组件:表格、分页、对话框、树形选择器、状态开关、搜索过滤
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "后端"
|
||||
API["API路由<br/>departments.py"]
|
||||
SVC["服务层<br/>department_service.py"]
|
||||
MODEL["模型层<br/>models.py"]
|
||||
SCHEMA["Schema层<br/>schemas.py"]
|
||||
end
|
||||
subgraph "前端"
|
||||
FE_API["API适配层<br/>frontend/src/api/department.js"]
|
||||
VIEW["视图组件<br/>frontend/src/views/basic/Departments.vue"]
|
||||
end
|
||||
FE_API --> API
|
||||
VIEW --> FE_API
|
||||
API --> SVC
|
||||
SVC --> MODEL
|
||||
SVC --> SCHEMA
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L62-L103)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L62-L103)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
|
||||
## 核心组件
|
||||
- 后端API路由
|
||||
- 提供科室列表、树形结构、详情、创建、更新、删除等接口
|
||||
- 支持按科室类型与状态过滤,支持分页
|
||||
- 服务层
|
||||
- 列表查询:支持类型与状态过滤、分页、排序
|
||||
- 树形构建:手动构建树,避免懒加载问题
|
||||
- 创建:自动计算层级level,校验编码唯一
|
||||
- 更新:动态更新字段
|
||||
- 删除:检查是否存在子节点,防止误删
|
||||
- 模型层
|
||||
- 科室表包含:编码唯一、类型枚举、父ID自关联、层级、排序、状态、描述、时间戳
|
||||
- 索引:类型、父ID
|
||||
- Schema层
|
||||
- 定义创建、更新、响应、树形结构的数据模型
|
||||
- 前端组件
|
||||
- 表格:显示编码、名称、类型、层级、状态、创建时间、操作
|
||||
- 分页:页码与每页数量
|
||||
- 对话框:新增/编辑,含树形选择器、类型选择、排序输入、描述文本域
|
||||
- 状态开关:启用/禁用
|
||||
- 搜索:关键词(名称/编码)与类型筛选
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L107)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L17-L149)
|
||||
- [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)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L17-L271)
|
||||
|
||||
## 架构概览
|
||||
后端采用FastAPI + SQLAlchemy异步ORM,前端使用Vue3 + Element Plus。数据流从浏览器发起请求,经API路由进入服务层,访问数据库模型并返回标准化响应;前端通过API适配层调用后端接口,并渲染表格、树形选择器与状态开关。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Browser as "浏览器"
|
||||
participant FE as "前端组件<br/>Departments.vue"
|
||||
participant API as "后端API<br/>departments.py"
|
||||
participant SVC as "服务层<br/>department_service.py"
|
||||
participant DB as "数据库模型<br/>models.py"
|
||||
Browser->>FE : 打开页面/点击查询
|
||||
FE->>API : GET /departments?keyword&dept_type&page&page_size
|
||||
API->>SVC : get_list(dept_type, is_active, page, page_size)
|
||||
SVC->>DB : 查询departments并统计总数
|
||||
DB-->>SVC : 列表与总数
|
||||
SVC-->>API : 返回列表与总数
|
||||
API-->>FE : 标准化响应{code,message,data,total,page,page_size}
|
||||
Browser->>FE : 点击树形选择器
|
||||
FE->>API : GET /departments/tree?dept_type
|
||||
API->>SVC : get_tree(dept_type)
|
||||
SVC->>DB : 查询departments并构建树
|
||||
DB-->>SVC : 列表
|
||||
SVC-->>API : 树形结构
|
||||
API-->>FE : 树形数据
|
||||
Browser->>FE : 点击状态开关
|
||||
FE->>API : PUT /departments/{id} {is_active}
|
||||
API->>SVC : update(dept_id, {is_active})
|
||||
SVC->>DB : 更新is_active
|
||||
DB-->>SVC : 更新后的对象
|
||||
SVC-->>API : 返回更新结果
|
||||
API-->>FE : 成功消息
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L107)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L17-L149)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L168-L245)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 后端API路由(departments.py)
|
||||
- 接口清单
|
||||
- GET /departments:列表查询(支持类型、状态、分页)
|
||||
- GET /departments/tree:树形结构(可选按类型过滤)
|
||||
- GET /departments/{id}:详情
|
||||
- POST /departments:创建(需管理员/经理权限,校验编码唯一)
|
||||
- PUT /departments/{id}:更新(需管理员/经理权限)
|
||||
- DELETE /departments/{id}:删除(需管理员/经理权限,禁止删除有子节点的科室)
|
||||
- 权限与安全
|
||||
- 使用依赖注入获取当前用户与权限校验
|
||||
- 返回统一响应结构(code/message/data/total/page/page_size)
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L107)
|
||||
|
||||
### 服务层(department_service.py)
|
||||
- 列表查询
|
||||
- 过滤条件:类型、状态
|
||||
- 排序:先按sort_order,再按id
|
||||
- 分页:offset/limit
|
||||
- 树形构建
|
||||
- 查询所有科室并按sort_order/id排序
|
||||
- 使用映射表构建树节点,处理父子关系
|
||||
- 未找到父节点时作为根节点
|
||||
- 创建
|
||||
- 若存在parent_id,则计算level = parent.level + 1
|
||||
- 写入数据库并刷新
|
||||
- 更新
|
||||
- 动态更新字段,支持部分字段更新
|
||||
- 删除
|
||||
- 检查是否存在子节点,若有则拒绝删除
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> Load["查询所有科室并排序"]
|
||||
Load --> BuildMap["构建ID到节点映射"]
|
||||
BuildMap --> ForEach["遍历每个科室"]
|
||||
ForEach --> HasParent{"存在parent_id且父节点存在?"}
|
||||
HasParent --> |是| AppendChild["将当前节点加入父节点children"]
|
||||
HasParent --> |否| AddRoot["加入根节点列表"]
|
||||
AppendChild --> Next["下一个科室"]
|
||||
AddRoot --> Next
|
||||
Next --> Done{"遍历结束?"}
|
||||
Done --> |否| ForEach
|
||||
Done --> |是| Return["返回根节点集合(树)"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L113-L149)
|
||||
|
||||
章节来源
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L17-L149)
|
||||
|
||||
### 数据模型(models.py)
|
||||
- 科室表字段
|
||||
- 编码唯一(code)
|
||||
- 类型枚举(DeptType)
|
||||
- 自关联父ID(parent_id)
|
||||
- 层级(level,默认1)
|
||||
- 排序(sort_order,默认0)
|
||||
- 状态(is_active,默认true)
|
||||
- 时间戳(created_at/updated_at)
|
||||
- 索引
|
||||
- 类型索引、父ID索引
|
||||
- 关系
|
||||
- 与员工表的反向关系(backref)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [docs/database.md](file://docs/database.md#L99-L116)
|
||||
|
||||
### Schema定义(schemas.py)
|
||||
- 数据模型
|
||||
- DepartmentBase:基础字段
|
||||
- DepartmentCreate:创建用
|
||||
- DepartmentUpdate:更新用(可选字段)
|
||||
- DepartmentResponse:响应用(含id、状态、时间戳)
|
||||
- DepartmentTree:树形结构(children数组)
|
||||
- 字段约束
|
||||
- 类型枚举、长度限制、数值范围、可空性
|
||||
|
||||
章节来源
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L64-L103)
|
||||
|
||||
### 前端组件(Departments.vue)
|
||||
- 功能点
|
||||
- 搜索栏:关键词(名称/编码)、类型选择、查询/重置、新增按钮
|
||||
- 表格:编码、名称、类型、层级、状态、创建时间、操作(编辑/删除)
|
||||
- 分页:页码、每页数量、跳转
|
||||
- 对话框:新增/编辑,含树形选择器、类型选择、排序、描述
|
||||
- 状态开关:启用/禁用
|
||||
- 交互流程
|
||||
- 加载数据:GET /departments
|
||||
- 加载树:GET /departments/tree
|
||||
- 状态切换:PUT /departments/{id} {is_active}
|
||||
- 新增/编辑:POST/PUT /departments
|
||||
- 删除:DELETE /departments/{id}
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant U as "用户"
|
||||
participant V as "Departments.vue"
|
||||
participant A as "API适配层"
|
||||
participant S as "后端API"
|
||||
U->>V : 输入关键词/类型并点击查询
|
||||
V->>A : getDepartments({keyword,dept_type,page,page_size})
|
||||
A->>S : GET /departments
|
||||
S-->>A : 列表+总数
|
||||
A-->>V : 渲染表格
|
||||
U->>V : 点击状态开关
|
||||
V->>A : updateDepartment(id,{is_active})
|
||||
A->>S : PUT /departments/{id}
|
||||
S-->>A : 成功
|
||||
A-->>V : 提示成功
|
||||
U->>V : 点击新增/编辑
|
||||
V->>A : create/update
|
||||
A->>S : POST/PUT /departments
|
||||
S-->>A : 成功
|
||||
A-->>V : 刷新列表与树
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L168-L266)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L4-L31)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L107)
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
|
||||
## 依赖关系分析
|
||||
- 组件耦合
|
||||
- API路由依赖服务层
|
||||
- 服务层依赖模型层与Schema层
|
||||
- 前端组件依赖API适配层
|
||||
- 外部依赖
|
||||
- FastAPI、SQLAlchemy、Element Plus
|
||||
- 潜在循环依赖
|
||||
- 当前结构清晰,无循环导入迹象
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE["前端组件"] --> APIA["API适配层"]
|
||||
APIA --> APIR["API路由"]
|
||||
APIR --> SVCL["服务层"]
|
||||
SVCL --> MDL["模型层"]
|
||||
SVCL --> SCH["Schema层"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L1-L108)
|
||||
- [backend/app/services/department_service.py](file://backend/app/services/department_service.py#L1-L150)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L62-L103)
|
||||
- [frontend/src/api/department.js](file://frontend/src/api/department.js#L1-L32)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L1-L290)
|
||||
|
||||
章节来源
|
||||
- [backend/app/main.py](file://backend/app/main.py#L15-L51)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 列表查询按sort_order与id排序,结合分页,避免全表扫描
|
||||
- 树形构建在内存中完成,减少多次数据库往返
|
||||
- 索引策略
|
||||
- 类型与父ID索引有助于过滤与自关联查询
|
||||
- 前端优化
|
||||
- 树形选择器使用一次性加载,避免频繁请求
|
||||
- 分页与搜索联动,减少无效请求
|
||||
|
||||
## 故障排查指南
|
||||
- 常见错误与处理
|
||||
- 编码重复:创建时校验编码唯一,返回400
|
||||
- 科室不存在:更新/删除时若找不到对象,返回404
|
||||
- 存在子节点:删除时若仍有子节点,返回400
|
||||
- 权限不足:仅管理员/经理可执行创建/更新/删除
|
||||
- 前端提示
|
||||
- 成功/失败消息提示
|
||||
- 删除前二次确认
|
||||
- 表单校验失败时阻止提交
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L74-L77)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L92-L93)
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L105-L106)
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L227-L244)
|
||||
|
||||
## 结论
|
||||
“科室管理”功能通过清晰的后端三层架构与前端组件化实现,提供了完善的增删改查、树形层级、状态控制与搜索分页能力。服务层对树形构建与层级计算进行了重点处理,确保数据一致性与性能表现。前端通过树形选择器、状态开关与搜索过滤提升了用户体验。建议后续可扩展批量操作与导入导出能力,进一步提升管理效率。
|
||||
|
||||
## 附录
|
||||
|
||||
### API接口定义(后端)
|
||||
- 获取科室列表
|
||||
- 方法:GET
|
||||
- 路径:/departments
|
||||
- 查询参数:keyword(名称/编码模糊)、dept_type(类型)、is_active(状态)、page、page_size
|
||||
- 返回:code/message/data(total/page/page_size)
|
||||
- 获取科室树
|
||||
- 方法:GET
|
||||
- 路径:/departments/tree
|
||||
- 查询参数:dept_type(类型)
|
||||
- 返回:code/message/data(树形结构)
|
||||
- 获取科室详情
|
||||
- 方法:GET
|
||||
- 路径:/departments/{id}
|
||||
- 返回:code/message/data
|
||||
- 创建科室
|
||||
- 方法:POST
|
||||
- 路径:/departments
|
||||
- 请求体:DepartmentCreate
|
||||
- 返回:code/message/data
|
||||
- 更新科室
|
||||
- 方法:PUT
|
||||
- 路径:/departments/{id}
|
||||
- 请求体:DepartmentUpdate
|
||||
- 返回:code/message/data
|
||||
- 删除科室
|
||||
- 方法:DELETE
|
||||
- 路径:/departments/{id}
|
||||
- 返回:code/message
|
||||
|
||||
章节来源
|
||||
- [backend/app/api/v1/departments.py](file://backend/app/api/v1/departments.py#L20-L107)
|
||||
|
||||
### 数据模型(关键字段)
|
||||
- 科室表
|
||||
- 字段:id、name、code(唯一)、dept_type、parent_id、level、sort_order、is_active、description、created_at、updated_at
|
||||
- 索引:idx_dept_type、idx_dept_parent
|
||||
- 关系
|
||||
- 科室与员工:一对多(反向backref)
|
||||
|
||||
章节来源
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L62-L85)
|
||||
- [docs/database.md](file://docs/database.md#L99-L116)
|
||||
|
||||
### 前端组件(关键交互)
|
||||
- 搜索与分页
|
||||
- 搜索关键词与类型筛选,分页参数联动
|
||||
- 树形选择器
|
||||
- 使用el-tree-select,check-strictly,绑定name/value
|
||||
- 状态开关
|
||||
- el-switch绑定is_active,触发PUT更新
|
||||
- 表单校验
|
||||
- 必填项校验,提交前验证
|
||||
|
||||
章节来源
|
||||
- [frontend/src/views/basic/Departments.vue](file://frontend/src/views/basic/Departments.vue#L168-L266)
|
||||
547
.qoder/repowiki/zh/content/核心功能模块/基础数据管理/考核指标管理.md
Normal file
547
.qoder/repowiki/zh/content/核心功能模块/基础数据管理/考核指标管理.md
Normal file
@@ -0,0 +1,547 @@
|
||||
# 考核指标管理
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_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/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py)
|
||||
- [frontend/src/views/basic/Indicators.vue](file://frontend/src/views/basic/Indicators.vue)
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue)
|
||||
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档详细介绍医院绩效系统的考核指标管理功能。该系统实现了完整的指标管理体系,包括指标分类(财务、客户、内部流程、学习成长四个维度)、指标层级结构、指标权重配置和计算公式设置。系统提供了指标模板管理、指标值域范围设定、评分标准制定和数据来源配置等功能。
|
||||
|
||||
系统支持指标审核流程、版本控制、批量导入导出和指标关联关系的技术实现,包含指标树形展示、动态计算、实时验证和历史记录追踪等功能。通过前后端分离架构,采用FastAPI作为后端框架,Vue.js作为前端框架,实现了高效、可扩展的绩效考核指标管理解决方案。
|
||||
|
||||
## 项目结构
|
||||
|
||||
该项目采用前后端分离的架构设计,主要分为以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端层"
|
||||
FE1[Vue.js 应用]
|
||||
FE2[Element Plus UI 组件]
|
||||
FE3[API 请求封装]
|
||||
end
|
||||
subgraph "后端层"
|
||||
BE1[FastAPI 框架]
|
||||
BE2[SQLAlchemy ORM]
|
||||
BE3[异步数据库连接]
|
||||
end
|
||||
subgraph "数据层"
|
||||
DB1[SQLite 数据库]
|
||||
DB2[指标表]
|
||||
DB3[模板表]
|
||||
DB4[关联表]
|
||||
end
|
||||
FE1 --> FE2
|
||||
FE2 --> FE3
|
||||
FE3 --> BE1
|
||||
BE1 --> BE2
|
||||
BE2 --> BE3
|
||||
BE3 --> DB1
|
||||
DB1 --> DB2
|
||||
DB1 --> DB3
|
||||
DB1 --> DB4
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/views/basic/Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L1-L296)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/views/basic/Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L1-L296)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 指标管理核心组件
|
||||
|
||||
系统的核心组件围绕指标管理展开,主要包括以下几个方面:
|
||||
|
||||
#### 指标数据模型
|
||||
系统定义了完整的指标数据模型,支持多种指标类型和维度配置:
|
||||
|
||||
- **指标类型**:质量指标、数量指标、效率指标、服务指标、成本指标
|
||||
- **平衡计分卡维度**:财务、客户、内部流程、学习成长
|
||||
- **权重配置**:支持0.1-10的权重范围
|
||||
- **评分配置**:最高分值、目标值、计量单位
|
||||
|
||||
#### 模板管理组件
|
||||
系统提供了灵活的模板管理功能:
|
||||
|
||||
- **模板类型**:通用模板、手术临床科室、非手术有病房科室、非手术无病房科室、医技科室、护理单元、行政科室、后勤科室
|
||||
- **维度权重**:支持BSC四个维度的权重配置
|
||||
- **评分方法**:区间法、目标参照法、扣分法、加分法、一票否决
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L54-L61)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L29-L35)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L152-L192)
|
||||
- [backend/app/schemas/schemas.py](file://backend/app/schemas/schemas.py#L698-L743)
|
||||
|
||||
## 架构概览
|
||||
|
||||
系统采用分层架构设计,确保了良好的可维护性和扩展性:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "表现层"
|
||||
UI1[指标管理界面]
|
||||
UI2[模板管理界面]
|
||||
UI3[统计报表界面]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
BL1[指标服务层]
|
||||
BL2[模板服务层]
|
||||
BL3[统计服务层]
|
||||
end
|
||||
subgraph "数据访问层"
|
||||
DAL1[指标数据访问]
|
||||
DAL2[模板数据访问]
|
||||
DAL3[统计数据访问]
|
||||
end
|
||||
subgraph "数据存储层"
|
||||
DS1[SQLite 数据库]
|
||||
DS2[指标表]
|
||||
DS3[模板表]
|
||||
DS4[关联表]
|
||||
end
|
||||
UI1 --> BL1
|
||||
UI2 --> BL2
|
||||
UI3 --> BL3
|
||||
BL1 --> DAL1
|
||||
BL2 --> DAL2
|
||||
BL3 --> DAL3
|
||||
DAL1 --> DS1
|
||||
DAL2 --> DS1
|
||||
DAL3 --> DS1
|
||||
DS1 --> DS2
|
||||
DS1 --> DS3
|
||||
DS1 --> DS4
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L13-L197)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L20-L293)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L17-L142)
|
||||
|
||||
系统架构的关键特点:
|
||||
|
||||
1. **分层清晰**:表现层、业务逻辑层、数据访问层职责明确
|
||||
2. **异步处理**:使用async/await模式提高并发性能
|
||||
3. **ORM映射**:通过SQLAlchemy实现对象关系映射
|
||||
4. **API设计**:遵循RESTful API规范,提供标准化接口
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L1-L197)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 指标管理组件
|
||||
|
||||
#### 指标数据模型设计
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Indicator {
|
||||
+int id
|
||||
+string name
|
||||
+string code
|
||||
+IndicatorType indicator_type
|
||||
+BSCDimension bs_dimension
|
||||
+float weight
|
||||
+float max_score
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+string calculation_method
|
||||
+string assessment_method
|
||||
+string deduction_standard
|
||||
+string data_source
|
||||
+string applicable_dept_types
|
||||
+bool is_veto
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class IndicatorType {
|
||||
<<enumeration>>
|
||||
QUALITY
|
||||
QUANTITY
|
||||
EFFICIENCY
|
||||
SERVICE
|
||||
COST
|
||||
}
|
||||
class BSCDimension {
|
||||
<<enumeration>>
|
||||
FINANCIAL
|
||||
CUSTOMER
|
||||
INTERNAL_PROCESS
|
||||
LEARNING_GROWTH
|
||||
}
|
||||
class AssessmentDetail {
|
||||
+int id
|
||||
+int assessment_id
|
||||
+int indicator_id
|
||||
+float actual_value
|
||||
+float score
|
||||
+string evidence
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
Indicator --> AssessmentDetail : "被评估"
|
||||
AssessmentDetail --> Indicator : "关联"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L181-L203)
|
||||
|
||||
#### 指标服务层实现
|
||||
|
||||
指标服务层提供了完整的CRUD操作和业务逻辑处理:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "指标API"
|
||||
participant Service as "指标服务"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /indicators
|
||||
API->>Service : get_list()
|
||||
Service->>DB : 查询指标列表
|
||||
DB-->>Service : 返回指标数据
|
||||
Service-->>API : 返回指标列表
|
||||
API-->>Client : 返回JSON响应
|
||||
Client->>API : POST /indicators
|
||||
API->>Service : create()
|
||||
Service->>DB : 插入新指标
|
||||
DB-->>Service : 返回新ID
|
||||
Service-->>API : 返回创建结果
|
||||
API-->>Client : 返回创建成功
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L20-L41)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L46)
|
||||
|
||||
#### 前端界面实现
|
||||
|
||||
前端使用Vue.js和Element Plus构建了直观的用户界面:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([用户访问指标管理页面]) --> LoadData[加载指标数据]
|
||||
LoadData --> DisplayTable[显示指标表格]
|
||||
DisplayTable --> SearchFilter[搜索和筛选]
|
||||
SearchFilter --> AddIndicator[新增指标]
|
||||
SearchFilter --> EditIndicator[编辑指标]
|
||||
SearchFilter --> DeleteIndicator[删除指标]
|
||||
SearchFilter --> StatusToggle[启用/禁用切换]
|
||||
AddIndicator --> FormValidation[表单验证]
|
||||
EditIndicator --> FormValidation
|
||||
FormValidation --> SubmitData[提交数据到后端]
|
||||
SubmitData --> UpdateTable[更新表格显示]
|
||||
UpdateTable --> DisplayTable
|
||||
StatusToggle --> UpdateStatus[更新状态]
|
||||
UpdateStatus --> RefreshData[刷新数据]
|
||||
RefreshData --> DisplayTable
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/views/basic/Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L179-L277)
|
||||
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L117-L147)
|
||||
- [backend/app/services/indicator_service.py](file://backend/app/services/indicator_service.py#L16-L104)
|
||||
- [frontend/src/views/basic/Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L1-L296)
|
||||
|
||||
### 模板管理组件
|
||||
|
||||
#### 模板数据模型设计
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class IndicatorTemplate {
|
||||
+int id
|
||||
+string template_name
|
||||
+string template_code
|
||||
+TemplateType template_type
|
||||
+string description
|
||||
+string dimension_weights
|
||||
+string assessment_cycle
|
||||
+bool is_active
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class TemplateIndicator {
|
||||
+int id
|
||||
+int template_id
|
||||
+int indicator_id
|
||||
+string category
|
||||
+float target_value
|
||||
+string target_unit
|
||||
+float weight
|
||||
+string scoring_method
|
||||
+string scoring_params
|
||||
+int sort_order
|
||||
+string remark
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class TemplateType {
|
||||
<<enumeration>>
|
||||
GENERAL
|
||||
SURGICAL
|
||||
NON_SURGICAL_WARD
|
||||
NON_SURGICAL_NOWARD
|
||||
MEDICAL_TECH
|
||||
NURSING
|
||||
ADMIN
|
||||
LOGISTICS
|
||||
}
|
||||
IndicatorTemplate --> TemplateIndicator : "包含多个"
|
||||
TemplateIndicator --> Indicator : "关联指标"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L404)
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L411-L432)
|
||||
|
||||
#### 模板服务层实现
|
||||
|
||||
模板服务层提供了完整的模板生命周期管理:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "客户端"
|
||||
participant API as "模板API"
|
||||
participant Service as "模板服务"
|
||||
participant DB as "数据库"
|
||||
Client->>API : GET /templates
|
||||
API->>Service : get_list()
|
||||
Service->>DB : 查询模板列表
|
||||
DB-->>Service : 返回模板数据
|
||||
Service-->>API : 返回模板列表
|
||||
API-->>Client : 返回JSON响应
|
||||
Client->>API : POST /templates/{template_id}/indicators
|
||||
API->>Service : add_indicator()
|
||||
Service->>DB : 检查模板存在性
|
||||
Service->>DB : 检查指标重复
|
||||
Service->>DB : 插入模板指标关联
|
||||
DB-->>Service : 返回新ID
|
||||
Service-->>API : 返回添加结果
|
||||
API-->>Client : 返回添加成功
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L22-L42)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L160-L207)
|
||||
|
||||
#### 模板前端界面实现
|
||||
|
||||
前端模板管理界面提供了完整的模板编辑功能:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([用户访问模板管理页面]) --> LoadTemplates[加载模板列表]
|
||||
LoadTemplates --> SelectTemplate[选择模板]
|
||||
SelectTemplate --> LoadTemplateDetails[加载模板详情]
|
||||
LoadTemplateDetails --> DisplayTemplateInfo[显示模板信息]
|
||||
DisplayTemplateInfo --> ManageIndicators[管理模板指标]
|
||||
ManageIndicators --> AddIndicator[添加指标]
|
||||
ManageIndicators --> EditIndicator[编辑指标]
|
||||
ManageIndicators --> RemoveIndicator[移除指标]
|
||||
AddIndicator --> IndicatorForm[指标表单]
|
||||
EditIndicator --> IndicatorForm
|
||||
IndicatorForm --> ValidateForm[验证表单]
|
||||
ValidateForm --> SubmitToAPI[提交到API]
|
||||
SubmitToAPI --> UpdateTemplate[更新模板显示]
|
||||
UpdateTemplate --> ManageIndicators
|
||||
RemoveIndicator --> ConfirmDelete[确认删除]
|
||||
ConfirmDelete --> DeleteFromAPI[从API删除]
|
||||
DeleteFromAPI --> UpdateTemplate
|
||||
UpdateTemplate --> ManageIndicators
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L356-L572)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
|
||||
**章节来源**
|
||||
- [backend/app/models/models.py](file://backend/app/models/models.py#L387-L432)
|
||||
- [backend/app/services/template_service.py](file://backend/app/services/template_service.py#L23-L293)
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L1-L638)
|
||||
|
||||
### 数据库迁移和初始化
|
||||
|
||||
系统通过Alembic进行数据库版本管理,支持指标模板表的创建和字段扩展:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Init([系统初始化]) --> CreateTables[创建基础表]
|
||||
CreateTables --> AddTemplateTable[创建指标模板表]
|
||||
AddTemplateTable --> AddColumns[添加新列]
|
||||
AddColumns --> CheckColumn[检查列是否存在]
|
||||
CheckColumn --> |存在| Skip[跳过]
|
||||
CheckColumn --> |不存在| AddColumn[添加列]
|
||||
AddColumn --> CheckColumn
|
||||
Skip --> CheckColumn
|
||||
CheckColumn --> Done([初始化完成])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L21-L92)
|
||||
|
||||
**章节来源**
|
||||
- [backend/alembic/versions/002_template.py](file://backend/alembic/versions/002_template.py#L1-L96)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
系统各组件之间的依赖关系如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端依赖"
|
||||
FE_API[API封装层]
|
||||
FE_INDICATORS[指标视图]
|
||||
FE_TEMPLATES[模板视图]
|
||||
end
|
||||
subgraph "后端依赖"
|
||||
API_INDICATORS[指标API]
|
||||
API_TEMPLATES[模板API]
|
||||
SERVICE_INDICATORS[指标服务]
|
||||
SERVICE_TEMPLATES[模板服务]
|
||||
MODELS[数据模型]
|
||||
SCHEMAS[数据模式]
|
||||
end
|
||||
subgraph "数据库依赖"
|
||||
DB_INDICATORS[指标表]
|
||||
DB_TEMPLATES[模板表]
|
||||
DB_TEMPLATE_INDICATORS[模板指标关联表]
|
||||
end
|
||||
FE_API --> API_INDICATORS
|
||||
FE_API --> API_TEMPLATES
|
||||
FE_INDICATORS --> FE_API
|
||||
FE_TEMPLATES --> FE_API
|
||||
API_INDICATORS --> SERVICE_INDICATORS
|
||||
API_TEMPLATES --> SERVICE_TEMPLATES
|
||||
SERVICE_INDICATORS --> MODELS
|
||||
SERVICE_TEMPLATES --> MODELS
|
||||
SERVICE_INDICATORS --> SCHEMAS
|
||||
SERVICE_TEMPLATES --> SCHEMAS
|
||||
MODELS --> DB_INDICATORS
|
||||
MODELS --> DB_TEMPLATES
|
||||
MODELS --> DB_TEMPLATE_INDICATORS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
- [backend/app/api/v1/templates.py](file://backend/app/api/v1/templates.py#L1-L272)
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/api/indicator.js](file://frontend/src/api/indicator.js#L1-L32)
|
||||
- [frontend/src/api/template.js](file://frontend/src/api/template.js#L1-L62)
|
||||
- [backend/app/api/v1/indicators.py](file://backend/app/api/v1/indicators.py#L1-L142)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
系统在设计时充分考虑了性能优化:
|
||||
|
||||
### 数据库性能优化
|
||||
- **索引策略**:为常用查询字段建立索引,包括指标类型、模板类型、状态等
|
||||
- **查询优化**:使用分页查询避免大量数据传输
|
||||
- **连接池**:使用异步数据库连接池提高并发性能
|
||||
|
||||
### 前端性能优化
|
||||
- **懒加载**:按需加载组件和数据
|
||||
- **缓存机制**:合理使用浏览器缓存
|
||||
- **虚拟滚动**:大数据量表格使用虚拟滚动技术
|
||||
|
||||
### 异步处理
|
||||
- **异步API调用**:避免阻塞UI线程
|
||||
- **并发请求**:合理组织并发请求提高响应速度
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### API请求失败
|
||||
**问题现象**:前端无法获取指标数据
|
||||
**可能原因**:
|
||||
- 后端服务未启动
|
||||
- 网络连接问题
|
||||
- 认证失败
|
||||
|
||||
**解决步骤**:
|
||||
1. 检查后端服务状态
|
||||
2. 验证API端点可用性
|
||||
3. 确认认证信息正确
|
||||
|
||||
#### 数据库连接问题
|
||||
**问题现象**:系统启动时报数据库连接错误
|
||||
**可能原因**:
|
||||
- 数据库文件损坏
|
||||
- 权限不足
|
||||
- 连接字符串错误
|
||||
|
||||
**解决步骤**:
|
||||
1. 检查数据库文件完整性
|
||||
2. 验证文件权限设置
|
||||
3. 确认数据库配置正确
|
||||
|
||||
#### 前端界面异常
|
||||
**问题现象**:指标管理界面显示异常
|
||||
**可能原因**:
|
||||
- JavaScript错误
|
||||
- CSS样式冲突
|
||||
- 组件状态异常
|
||||
|
||||
**解决步骤**:
|
||||
1. 检查浏览器控制台错误
|
||||
2. 清除浏览器缓存
|
||||
3. 验证组件依赖关系
|
||||
|
||||
**章节来源**
|
||||
- [frontend/src/views/basic/Indicators.vue](file://frontend/src/views/basic/Indicators.vue#L235-L253)
|
||||
- [frontend/src/views/basic/Templates.vue](file://frontend/src/views/basic/Templates.vue#L441-L462)
|
||||
|
||||
## 结论
|
||||
|
||||
医院绩效系统的考核指标管理功能实现了完整的指标管理体系,具有以下特点:
|
||||
|
||||
1. **功能完整**:涵盖了指标创建、编辑、删除、查询等完整生命周期管理
|
||||
2. **架构清晰**:采用分层架构设计,职责明确,易于维护和扩展
|
||||
3. **用户体验良好**:提供直观的图形界面和丰富的交互功能
|
||||
4. **技术先进**:采用现代Web技术栈,支持异步处理和高性能响应
|
||||
5. **数据安全**:完善的权限控制和数据验证机制
|
||||
|
||||
系统通过指标模板管理、BSC维度配置、权重设置等功能,为医院绩效考核提供了强大的技术支持。未来可以进一步扩展功能,如增加指标计算引擎、报表分析工具等,以满足更复杂的绩效管理需求。
|
||||
394
.qoder/repowiki/zh/content/核心功能模块/工资核算管理.md
Normal file
394
.qoder/repowiki/zh/content/核心功能模块/工资核算管理.md
Normal file
@@ -0,0 +1,394 @@
|
||||
# 工资核算管理
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py)
|
||||
- [models.py](file://backend/app/models/models.py)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py)
|
||||
- [salary.js](file://frontend/src/api/salary.js)
|
||||
- [Salary.vue](file://frontend/src/views/salary/Salary.vue)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py)
|
||||
- [database.md](file://docs/database.md)
|
||||
- [详细设计文档.md](file://docs/详细设计文档.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件为医院绩效系统的工资核算管理模块提供完整的技术文档。该模块负责:
|
||||
- 绩效奖金计算算法与参数配置
|
||||
- 工资记录的创建、更新与状态管理
|
||||
- 基于考核结果的批量工资生成
|
||||
- 工资确认与发放前的状态控制
|
||||
- 工资条生成、历史记录查询与统计分析
|
||||
- 数据来源、计算精度与异常处理机制说明
|
||||
|
||||
## 项目结构
|
||||
工资核算管理模块由后端API路由、服务层、数据模型与前端界面组成,采用分层架构设计,确保职责分离与可扩展性。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_API["salary.js<br/>前端API封装"]
|
||||
FE_View["Salary.vue<br/>工资管理视图"]
|
||||
end
|
||||
subgraph "后端"
|
||||
API["salary.py<br/>API路由"]
|
||||
Service["salary_service.py<br/>服务层"]
|
||||
Models["models.py<br/>数据模型"]
|
||||
Schemas["schemas.py<br/>数据模式"]
|
||||
end
|
||||
subgraph "数据库"
|
||||
DB_Schema["001_initial.py<br/>迁移脚本"]
|
||||
ER_Doc["database.md<br/>ER图"]
|
||||
end
|
||||
FE_API --> API
|
||||
FE_View --> FE_API
|
||||
API --> Service
|
||||
Service --> Models
|
||||
Service --> Schemas
|
||||
Models --> DB_Schema
|
||||
ER_Doc --> DB_Schema
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L272-L311)
|
||||
- [salary.js](file://frontend/src/api/salary.js#L1-L42)
|
||||
- [Salary.vue](file://frontend/src/views/salary/Salary.vue#L33-L245)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
- [database.md](file://docs/database.md#L1-L95)
|
||||
|
||||
**章节来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L260)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L272-L311)
|
||||
- [salary.js](file://frontend/src/api/salary.js#L1-L42)
|
||||
- [Salary.vue](file://frontend/src/views/salary/Salary.vue#L33-L245)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
- [database.md](file://docs/database.md#L1-L95)
|
||||
|
||||
## 核心组件
|
||||
- API路由层:提供工资记录查询、详情、创建、更新、按考核生成、批量生成、确认与批量确认等REST接口。
|
||||
- 服务层:实现业务逻辑,包括绩效奖金计算、工资记录生成、状态变更与批量操作。
|
||||
- 数据模型层:定义工资记录、员工、考核等实体及其关系。
|
||||
- 数据模式层:定义请求/响应数据结构,确保前后端数据一致性。
|
||||
- 前端界面:展示工资记录列表、支持筛选与编辑,调用后端API完成操作。
|
||||
|
||||
**章节来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L14-L260)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L272-L311)
|
||||
- [salary.js](file://frontend/src/api/salary.js#L1-L42)
|
||||
- [Salary.vue](file://frontend/src/views/salary/Salary.vue#L33-L245)
|
||||
|
||||
## 架构概览
|
||||
工资核算管理遵循“前端-后端-数据库”的三层架构,通过API路由统一对外提供服务,服务层封装业务规则,数据模型映射数据库表结构。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端界面"
|
||||
participant API as "API路由"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库"
|
||||
FE->>API : 查询工资记录列表
|
||||
API->>SVC : get_list(...)
|
||||
SVC->>DB : 查询salary_records
|
||||
DB-->>SVC : 返回记录集
|
||||
SVC-->>API : 记录列表+总数
|
||||
API-->>FE : JSON响应
|
||||
FE->>API : 根据考核生成工资
|
||||
API->>SVC : generate_from_assessment(...)
|
||||
SVC->>DB : 读取staff/assessments
|
||||
SVC->>SVC : calculate_performance_bonus(...)
|
||||
SVC->>DB : 插入salary_records
|
||||
DB-->>SVC : 提交事务
|
||||
SVC-->>API : 新建记录ID
|
||||
API-->>FE : 成功响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L21-L190)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
|
||||
**章节来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L20-L156)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L21-L190)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 绩效奖金计算算法
|
||||
- 计算公式
|
||||
- 绩效奖金 = 绩效基数 × (绩效得分/100) × 绩效系数
|
||||
- 其中:绩效基数为固定常量;绩效得分来自考核加权得分;绩效系数来自员工配置。
|
||||
- 参数来源
|
||||
- 绩效基数:服务层常量字段
|
||||
- 绩效得分:来自已确认的考核记录的加权得分
|
||||
- 绩效系数:来自员工表的performance_ratio字段
|
||||
- 精度与约束
|
||||
- 绩效基数保留两位小数
|
||||
- 绩效得分与系数保留两位小数
|
||||
- 数据库字段使用Numeric类型保证精度
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> LoadAssessment["加载已确认考核记录"]
|
||||
LoadAssessment --> CheckExist{"是否存在?"}
|
||||
CheckExist --> |否| ReturnNull["返回空"]
|
||||
CheckExist --> |是| LoadStaff["加载员工信息"]
|
||||
LoadStaff --> CalcBonus["计算绩效奖金<br/>基数×(得分/100)×系数"]
|
||||
CalcBonus --> CreateRecord["创建工资记录<br/>合计=基本工资+奖金"]
|
||||
CreateRecord --> Save["持久化到数据库"]
|
||||
Save --> End(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
|
||||
**章节来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L70-L75)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
|
||||
### 工资记录管理
|
||||
- 字段定义
|
||||
- 基本工资、绩效得分、绩效奖金、扣款、补贴、应发工资、状态、备注、创建/更新时间
|
||||
- 状态流转
|
||||
- pending(待确认)→ confirmed(已确认)
|
||||
- 仅pending状态可更新与确认
|
||||
- 计算规则
|
||||
- 应发工资 = 基本工资 + 绩效奖金 + 补贴 - 扣款
|
||||
- 更新时自动重新计算应发工资
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SalaryRecord {
|
||||
+int id
|
||||
+int staff_id
|
||||
+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
|
||||
+datetime created_at
|
||||
+datetime updated_at
|
||||
}
|
||||
class Staff {
|
||||
+int id
|
||||
+string employee_id
|
||||
+string name
|
||||
+int department_id
|
||||
+string position
|
||||
+string title
|
||||
+float base_salary
|
||||
+float performance_ratio
|
||||
+string status
|
||||
+datetime hire_date
|
||||
}
|
||||
class Assessment {
|
||||
+int id
|
||||
+int staff_id
|
||||
+int period_year
|
||||
+int period_month
|
||||
+string period_type
|
||||
+float total_score
|
||||
+float weighted_score
|
||||
+string status
|
||||
+int assessor_id
|
||||
+int reviewer_id
|
||||
+datetime submit_time
|
||||
+datetime review_time
|
||||
+text remark
|
||||
}
|
||||
SalaryRecord --> Staff : "外键"
|
||||
Assessment --> Staff : "外键"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [models.py](file://backend/app/models/models.py#L88-L114)
|
||||
- [models.py](file://backend/app/models/models.py#L149-L179)
|
||||
|
||||
**章节来源**
|
||||
- [models.py](file://backend/app/models/models.py#L205-L231)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L272-L311)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L77-L124)
|
||||
|
||||
### 批量工资生成与发放管理
|
||||
- 单个生成
|
||||
- 根据员工ID与年月,检查是否存在已确认的考核记录且无重复工资记录,然后生成工资记录
|
||||
- 科室批量生成
|
||||
- 遍历指定科室当月已确认考核的所有员工,逐个生成工资记录
|
||||
- 批量确认
|
||||
- 将指定年月(可选科室)下所有pending状态的工资记录批量置为confirmed
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Manager as "管理员/经理"
|
||||
participant API as "API路由"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库"
|
||||
Manager->>API : POST /salary/batch-generate?department_id&period_year&period_month
|
||||
API->>SVC : batch_generate_for_department(...)
|
||||
SVC->>DB : 查询已确认考核员工
|
||||
loop 对每个员工
|
||||
SVC->>SVC : generate_from_assessment(...)
|
||||
SVC->>DB : 插入工资记录
|
||||
end
|
||||
SVC-->>API : 返回生成记录数
|
||||
API-->>Manager : 成功响应
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L113-L129)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L192-L219)
|
||||
|
||||
**章节来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L96-L129)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L192-L259)
|
||||
|
||||
### 工资条生成、历史记录查询与统计分析
|
||||
- 工资条生成
|
||||
- 通过“根据考核生成”或“批量生成”生成工资记录后,可在前端查看与编辑
|
||||
- 历史记录查询
|
||||
- 支持按员工、科室、年月、状态筛选,分页显示
|
||||
- 统计分析
|
||||
- 前端报表页面提供科室统计、排名等展示(与工资记录数据联动)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as "用户"
|
||||
participant FE as "前端界面"
|
||||
participant API as "API路由"
|
||||
participant SVC as "服务层"
|
||||
participant DB as "数据库"
|
||||
User->>FE : 输入筛选条件
|
||||
FE->>API : GET /salary?page&page_size&filters...
|
||||
API->>SVC : get_list(...)
|
||||
SVC->>DB : 查询salary_records
|
||||
DB-->>SVC : 记录集+总数
|
||||
SVC-->>API : 返回数据
|
||||
API-->>FE : 渲染表格
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L20-L51)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L21-L58)
|
||||
- [Salary.vue](file://frontend/src/views/salary/Salary.vue#L190-L207)
|
||||
|
||||
**章节来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L20-L51)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L21-L58)
|
||||
- [Salary.vue](file://frontend/src/views/salary/Salary.vue#L33-L245)
|
||||
|
||||
### 数据来源、计算精度与异常处理
|
||||
- 数据来源
|
||||
- 员工基本信息与绩效系数来自员工表
|
||||
- 考核记录来自考核表,需为已确认状态
|
||||
- 工资记录来自工资记录表
|
||||
- 计算精度
|
||||
- 基本工资、绩效奖金、扣款、补贴、应发工资均使用Numeric(10,2)
|
||||
- 绩效得分使用Numeric(5,2)
|
||||
- 绩效基数为浮点型常量
|
||||
- 异常处理
|
||||
- 未找到记录或状态不允许时返回错误
|
||||
- 重复生成工资记录时拒绝
|
||||
- 更新时仅允许pending状态
|
||||
|
||||
**章节来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L104-L124)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
|
||||
## 依赖关系分析
|
||||
- API路由依赖服务层进行业务处理
|
||||
- 服务层依赖数据模型与数据模式进行数据访问与校验
|
||||
- 数据模型依赖SQLAlchemy ORM映射数据库表
|
||||
- 前端通过API封装调用后端接口
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
FE["前端"] --> API["API路由"]
|
||||
API --> SVC["服务层"]
|
||||
SVC --> MODELS["数据模型"]
|
||||
SVC --> SCHEMAS["数据模式"]
|
||||
MODELS --> DB["数据库"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L17)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L12)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L14)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L8)
|
||||
|
||||
**章节来源**
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L1-L17)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L1-L12)
|
||||
- [models.py](file://backend/app/models/models.py#L1-L14)
|
||||
- [schemas.py](file://backend/app/schemas/schemas.py#L1-L8)
|
||||
|
||||
## 性能考虑
|
||||
- 查询优化
|
||||
- 工资记录表对staff_id与(period_year, period_month)建立索引,提升筛选与分页性能
|
||||
- 批量操作
|
||||
- 批量生成与批量确认采用批量查询与批量更新,减少事务开销
|
||||
- 数据精度
|
||||
- 使用Numeric类型避免浮点运算误差累积
|
||||
- 前端渲染
|
||||
- 列表分页与按需加载,减轻前端渲染压力
|
||||
|
||||
**章节来源**
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L153-L154)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L21-L58)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L234-L259)
|
||||
|
||||
## 故障排除指南
|
||||
- 无法生成工资
|
||||
- 检查是否存在已确认的考核记录
|
||||
- 确认是否已存在同员工、同年月的工资记录
|
||||
- 更新失败
|
||||
- 仅pending状态可更新
|
||||
- 检查字段范围约束(如非负数)
|
||||
- 批量生成无结果
|
||||
- 确认科室当月考核状态是否为已确认
|
||||
- 前端显示异常
|
||||
- 检查筛选条件与分页参数
|
||||
- 确认后端接口返回格式
|
||||
|
||||
**章节来源**
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L127-L190)
|
||||
- [salary_service.py](file://backend/app/services/salary_service.py#L104-L124)
|
||||
- [salary.py](file://backend/app/api/v1/salary.py#L96-L129)
|
||||
|
||||
## 结论
|
||||
工资核算管理模块通过清晰的分层架构与严谨的数据模型,实现了从绩效计算到工资发放的全流程管理。模块具备良好的扩展性与可维护性,能够满足医院绩效工资核算的复杂需求,并为后续的功能增强(如税务处理、多币种支持等)提供了坚实基础。
|
||||
|
||||
## 附录
|
||||
- 数据库ER图与表结构参考
|
||||
- [database.md](file://docs/database.md#L1-L95)
|
||||
- [001_initial.py](file://backend/alembic/versions/001_initial.py#L133-L154)
|
||||
- 详细设计文档
|
||||
- [详细设计文档.md](file://docs/详细设计文档.md#L642-L662)
|
||||
387
.qoder/repowiki/zh/content/核心功能模块/数据分析报表.md
Normal file
387
.qoder/repowiki/zh/content/核心功能模块/数据分析报表.md
Normal file
@@ -0,0 +1,387 @@
|
||||
# 数据分析报表
|
||||
|
||||
<cite>
|
||||
**本文引用的文件**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py)
|
||||
- [前端报表页面 Reports.vue](file://frontend/src/views/reports/Reports.vue)
|
||||
- [前端统计API封装 stats.js](file://frontend/src/api/stats.js)
|
||||
- [数据模型 models.py](file://backend/app/models/models.py)
|
||||
- [数据库连接 database.py](file://backend/app/core/database.py)
|
||||
- [API路由器 __init__.py](file://backend/app/api/v1/__init__.py)
|
||||
- [数据库设计文档 database.md](file://docs/database.md)
|
||||
- [初始化指标模板 init_templates.py](file://backend/app/scripts/init_templates.py)
|
||||
- [初始化指标模板脚本 init_indicator_templates.py](file://backend/init_indicator_templates.py)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构总览](#架构总览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排查指南](#故障排查指南)
|
||||
9. [结论](#结论)
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件面向“医院绩效系统”的数据分析报表模块,系统化阐述BSC维度分析、科室绩效统计、趋势分析、绩效排名、指标完成度等核心功能。文档覆盖数据聚合算法、图表展示组件、报表生成机制、多维度统计分析、数据可视化与导出能力,并解释数据更新机制、缓存策略与性能优化方案。同时提供分析指标定义、计算方法与展示样式说明,帮助开发者与运维人员快速理解并扩展系统能力。
|
||||
|
||||
## 项目结构
|
||||
报表模块由后端FastAPI接口、SQLAlchemy异步ORM服务层、前端Vue组件与ECharts图表构成,遵循前后端分离与职责清晰的设计原则。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "前端"
|
||||
FE_Report["Reports.vue<br/>报表页面"]
|
||||
FE_API["stats.js<br/>API封装"]
|
||||
end
|
||||
subgraph "后端"
|
||||
BE_Router["API路由器<br/>__init__.py"]
|
||||
BE_StatsAPI["统计API<br/>stats.py"]
|
||||
BE_Service["统计服务<br/>stats_service.py"]
|
||||
BE_Models["数据模型<br/>models.py"]
|
||||
BE_DB["数据库连接<br/>database.py"]
|
||||
end
|
||||
FE_Report --> FE_API
|
||||
FE_API --> BE_Router
|
||||
BE_Router --> BE_StatsAPI
|
||||
BE_StatsAPI --> BE_Service
|
||||
BE_Service --> BE_Models
|
||||
BE_Service --> BE_DB
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [API路由器 __init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [数据模型 models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [数据库连接 database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [前端报表页面 Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
- [前端统计API封装 stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
|
||||
**章节来源**
|
||||
- [API路由器 __init__.py](file://backend/app/api/v1/__init__.py#L1-L17)
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [数据模型 models.py](file://backend/app/models/models.py#L1-L438)
|
||||
- [数据库连接 database.py](file://backend/app/core/database.py#L1-L39)
|
||||
- [前端报表页面 Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
- [前端统计API封装 stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
|
||||
## 核心组件
|
||||
- 统计API接口:提供BSC维度分析、科室绩效统计、趋势分析、绩效排名、指标完成度、周期统计、关键指标仪表盘、收支趋势等接口。
|
||||
- 统计服务层:封装复杂聚合逻辑,负责SQL查询、分组统计、跨表联接与结果组装。
|
||||
- 数据模型:定义科室、员工、指标、考核、明细、工资等实体及其关系。
|
||||
- 前端报表页面:集成ECharts图表,支持多视图联动与交互式筛选。
|
||||
- 数据库连接:异步SQLAlchemy引擎与会话管理,确保并发安全与事务一致性。
|
||||
|
||||
**章节来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L17-L242)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L16-L300)
|
||||
- [数据模型 models.py](file://backend/app/models/models.py#L62-L231)
|
||||
- [前端报表页面 Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
- [数据库连接 database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 架构总览
|
||||
后端采用FastAPI + SQLAlchemy异步ORM,前端使用Vue + ECharts,通过REST接口进行数据交互。统计服务层对多表进行联接与聚合,输出标准化数据结构供前端渲染。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant FE as "前端报表页面"
|
||||
participant API as "统计API(stats.py)"
|
||||
participant SVC as "统计服务(stats_service.py)"
|
||||
participant DB as "数据库连接(database.py)"
|
||||
FE->>API : GET /stats/department?year&month
|
||||
API->>SVC : get_department_stats(db, year, month)
|
||||
SVC->>DB : 异步SQL查询(联接 : departments/staff/assessments)
|
||||
DB-->>SVC : 聚合结果集
|
||||
SVC-->>API : 标准化科室统计列表
|
||||
API-->>FE : JSON响应(data : 列表)
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L36-L49)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
- [数据库连接 database.py](file://backend/app/core/database.py#L28-L39)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### BSC维度分析
|
||||
- 功能说明:按财务、客户、内部流程、学习成长四个维度统计得分、权重、指标数量与平均分。
|
||||
- 数据聚合算法:
|
||||
- 过滤条件:仅统计最终确认状态的考核记录;可按年、月、科室过滤。
|
||||
- 聚合逻辑:按维度分组,计算加权总分与总权重,得到平均分。
|
||||
- 展示样式:返回维度字典与统计周期字符串,前端可直接映射到图表或表格。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["开始"]) --> BuildCond["构建过滤条件<br/>状态=FINALIZED<br/>可选: 年/月/科室"]
|
||||
BuildCond --> JoinTables["联接: 指标→明细→考核"]
|
||||
JoinTables --> GroupByDim["按BSC维度分组"]
|
||||
GroupByDim --> CalcAvg["计算: 加权总分/总权重"]
|
||||
CalcAvg --> Output["输出: 维度统计+周期"]
|
||||
Output --> End(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [统计服务 get_bsc_dimension_stats](file://backend/app/services/stats_service.py#L19-L72)
|
||||
|
||||
**章节来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L17-L33)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L19-L72)
|
||||
|
||||
### 科室绩效统计
|
||||
- 功能说明:按科室汇总员工得分,计算平均分、最大/最小分、员工列表,并按平均分降序排列。
|
||||
- 数据聚合算法:
|
||||
- 聚合字段:科室ID、名称、类型、员工数、总分、平均分、最大/最小分、员工明细。
|
||||
- 排序规则:按平均分降序。
|
||||
- 展示样式:前端表格展示科室统计,支持奖金列(若存在)。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
S(["开始"]) --> Filter["过滤: FINALIZED+年+月"]
|
||||
Filter --> Join["联接: 科室→员工→考核"]
|
||||
Join --> Group["按科室分组聚合"]
|
||||
Group --> Compute["计算: 员工数/总分/平均分/最值"]
|
||||
Compute --> Sort["按平均分降序"]
|
||||
Sort --> Out(["输出: 科室统计列表"])
|
||||
Out --> E(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [统计服务 get_department_stats](file://backend/app/services/stats_service.py#L75-L146)
|
||||
|
||||
**章节来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L36-L49)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
|
||||
### 趋势分析(月度)
|
||||
- 功能说明:按月统计平均分与加权平均分,支持指定最近N个月与按科室过滤。
|
||||
- 数据聚合算法:
|
||||
- 时间范围:若指定年份,计算最近months个月(跨年处理)。
|
||||
- 聚合字段:月份、平均分、加权平均分、记录数。
|
||||
- 展示样式:折线/柱状组合图,双轴显示平均分与奖金(若存在)。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
TStart(["开始"]) --> TFilter["过滤: FINALIZED+年/月范围"]
|
||||
TFilter --> TJoin["联接: 员工→考核"]
|
||||
TJoin --> TGroup["按月分组聚合"]
|
||||
TGroup --> TAgg["计算: 平均分/加权平均分/数量"]
|
||||
TAgg --> TSort["按月升序"]
|
||||
TSort --> TOut(["输出: 月度趋势列表"])
|
||||
TOut --> TE(["结束"])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [统计服务 get_trend_stats](file://backend/app/services/stats_service.py#L149-L199)
|
||||
|
||||
**章节来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L52-L70)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L149-L199)
|
||||
|
||||
### 绩效排名
|
||||
- 功能说明:提供员工与科室的绩效排名,支持限制返回条数。
|
||||
- 数据聚合算法:
|
||||
- 员工排名:按加权得分降序取前N名。
|
||||
- 科室排名:先按科室汇总平均分,再整体降序取前N名。
|
||||
- 展示样式:表格排名,突出前三名。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant API as "统计API"
|
||||
participant SVC as "统计服务"
|
||||
participant DB as "数据库"
|
||||
API->>SVC : get_ranking_stats(year, month, limit)
|
||||
SVC->>DB : 查询最终确认的考核记录
|
||||
DB-->>SVC : 结果集(员工ID/姓名/部门/得分)
|
||||
SVC-->>API : 排名列表(含排名序号)
|
||||
API-->>API : 返回JSON
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L210-L224)
|
||||
- [统计服务 get_ranking_stats](file://backend/app/services/stats_service.py#L202-L244)
|
||||
|
||||
**章节来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L186-L207)
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L210-L224)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L202-L244)
|
||||
|
||||
### 指标完成度
|
||||
- 功能说明:按指标统计平均分、最大/最小分、完成率与样本数。
|
||||
- 数据聚合算法:
|
||||
- 过滤条件:最终确认状态;可按年、月、指标过滤。
|
||||
- 计算完成率:平均分/目标值×100%,上限100%。
|
||||
- 展示样式:指标列表卡片,完成率进度条或数值。
|
||||
|
||||
**章节来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L227-L241)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L247-L299)
|
||||
|
||||
### 周期统计与关键指标仪表盘
|
||||
- 周期统计:汇总当期总科室数、总员工数、平均分等。
|
||||
- 关键指标仪表盘:床位使用率、药占比、材料占比、患者满意度等(演示数据)。
|
||||
- 展示样式:概览卡片与仪表盘组件。
|
||||
|
||||
**章节来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L93-L125)
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L128-L153)
|
||||
|
||||
### 收支趋势
|
||||
- 功能说明:按月统计收入、支出、利润趋势。
|
||||
- 展示样式:折线图,支持选择最近6/12个月。
|
||||
|
||||
**章节来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L156-L183)
|
||||
|
||||
### 前端报表页面与图表
|
||||
- 页面组件:筛选器、统计概览卡片、科室对比图、绩效分布饼图、科室统计表、员工排名表。
|
||||
- 图表实现:ECharts初始化、窗口自适应、双轴图表、饼图标签与强调。
|
||||
- 数据加载:并行请求多个接口,统一更新图表。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant View as "Reports.vue"
|
||||
participant API as "stats.js"
|
||||
participant BE as "后端统计API"
|
||||
View->>View : 选择统计周期(年-月)
|
||||
View->>API : 并行调用 : 周期统计/科室统计/员工排名
|
||||
API->>BE : GET /stats/period
|
||||
API->>BE : GET /stats/department
|
||||
API->>BE : GET /stats/ranking
|
||||
BE-->>API : JSON响应
|
||||
API-->>View : 数据对象
|
||||
View->>View : 更新ECharts图表
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [前端报表页面 Reports.vue](file://frontend/src/views/reports/Reports.vue#L134-L171)
|
||||
- [前端统计API封装 stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
|
||||
**章节来源**
|
||||
- [前端报表页面 Reports.vue](file://frontend/src/views/reports/Reports.vue#L1-L367)
|
||||
- [前端统计API封装 stats.js](file://frontend/src/api/stats.js#L1-L43)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StatsAPI {
|
||||
+get_bsc_dimension_stats()
|
||||
+get_department_stats()
|
||||
+get_trend_stats()
|
||||
+get_ranking_stats()
|
||||
+get_completion_stats()
|
||||
+get_period_stats()
|
||||
+get_kpi_gauges()
|
||||
+get_finance_trend()
|
||||
+get_department_ranking()
|
||||
}
|
||||
class StatsService {
|
||||
+get_bsc_dimension_stats()
|
||||
+get_department_stats()
|
||||
+get_trend_stats()
|
||||
+get_ranking_stats()
|
||||
+get_completion_stats()
|
||||
}
|
||||
class Models {
|
||||
+Assessment
|
||||
+AssessmentDetail
|
||||
+Indicator
|
||||
+Department
|
||||
+Staff
|
||||
+BSCDimension
|
||||
+AssessmentStatus
|
||||
}
|
||||
class Database {
|
||||
+AsyncEngine
|
||||
+AsyncSession
|
||||
}
|
||||
StatsAPI --> StatsService : "调用"
|
||||
StatsService --> Models : "查询/联接"
|
||||
StatsService --> Database : "使用会话"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [数据模型 models.py](file://backend/app/models/models.py#L117-L178)
|
||||
- [数据库连接 database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
**章节来源**
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L1-L242)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [数据模型 models.py](file://backend/app/models/models.py#L117-L178)
|
||||
- [数据库连接 database.py](file://backend/app/core/database.py#L1-L39)
|
||||
|
||||
## 性能考虑
|
||||
- 异步ORM:使用SQLAlchemy异步引擎与会话,提升并发吞吐与响应速度。
|
||||
- 索引优化:模型中已为常用查询字段建立索引(如考核记录的年月、状态、员工ID等),建议结合实际查询模式评估是否需要复合索引。
|
||||
- 聚合优化:统计服务对大表联接与分组聚合,建议:
|
||||
- 限定查询时间范围(如最近6/12个月)。
|
||||
- 对高频查询增加物化视图或缓存中间结果。
|
||||
- 使用LIMIT限制排名条数,避免超大数据集排序。
|
||||
- 前端优化:ECharts实例复用与窗口resize监听,减少重绘开销;图表数据按需更新,避免全量刷新。
|
||||
- 缓存策略:可引入Redis缓存热点报表(如当月周期统计、Top N排名),设置合理TTL与失效策略,降低数据库压力。
|
||||
- 数据更新机制:建议在考核状态变更时触发增量更新任务,或定时任务批量刷新报表缓存。
|
||||
|
||||
[本节为通用性能指导,不直接分析具体文件]
|
||||
|
||||
## 故障排查指南
|
||||
- 接口返回空数据或异常:
|
||||
- 检查过滤条件(年、月、科室)是否正确传入。
|
||||
- 确认考核状态为最终确认(FINALIZED)。
|
||||
- 图表不显示或空白:
|
||||
- 检查ECharts实例初始化与容器尺寸。
|
||||
- 确认数据格式与字段名一致(如avg_score、total_bonus)。
|
||||
- 数据库连接问题:
|
||||
- 查看异步会话生命周期与异常回滚逻辑。
|
||||
- 检查数据库URL与连接池配置。
|
||||
- 指标模板缺失:
|
||||
- 确认初始化脚本已执行,模板与指标数据完整。
|
||||
|
||||
**章节来源**
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L1-L300)
|
||||
- [数据库连接 database.py](file://backend/app/core/database.py#L28-L39)
|
||||
- [前端报表页面 Reports.vue](file://frontend/src/views/reports/Reports.vue#L173-L181)
|
||||
|
||||
## 结论
|
||||
本模块以清晰的分层架构实现了BSC维度分析、科室统计、趋势与排名等核心报表功能。通过异步ORM与ECharts的结合,既保证了性能也提供了良好的用户体验。建议后续完善缓存与物化视图、扩展更多关键指标仪表盘与导出能力,并持续优化索引与查询计划以应对更大规模数据。
|
||||
|
||||
[本节为总结性内容,不直接分析具体文件]
|
||||
|
||||
## 附录
|
||||
|
||||
### 分析指标定义与计算方法
|
||||
- BSC维度得分:按指标权重加权求和,再除以总权重得到平均分。
|
||||
- 科室平均分:科室内员工加权得分的算术平均。
|
||||
- 趋势数据:按月分组的平均分与加权平均分。
|
||||
- 指标完成率:平均分/目标值×100%,上限100%。
|
||||
- 关键指标(演示):床位使用率、药占比、材料占比、患者满意度。
|
||||
|
||||
**章节来源**
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L20-L72)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L75-L146)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L149-L199)
|
||||
- [统计服务 stats_service.py](file://backend/app/services/stats_service.py#L247-L299)
|
||||
- [后端统计API stats.py](file://backend/app/api/v1/stats.py#L128-L153)
|
||||
|
||||
### 数据模型与索引
|
||||
- 关键实体:Department、Staff、Assessment、AssessmentDetail、Indicator、SalaryRecord。
|
||||
- 索引位置:考核记录、员工、指标、科室等表均有相应索引,加速查询与排序。
|
||||
|
||||
**章节来源**
|
||||
- [数据模型 models.py](file://backend/app/models/models.py#L62-L231)
|
||||
- [数据库设计文档 database.md](file://docs/database.md#L1-L95)
|
||||
|
||||
### 指标模板与BSC维度
|
||||
- 模板类型:通用模板与按科室类型的模板(如手术、非手术、医技、护理、行政等)。
|
||||
- 维度权重:模板可配置财务、客户、内部流程、学习成长维度权重。
|
||||
|
||||
**章节来源**
|
||||
- [初始化指标模板 init_templates.py](file://backend/app/scripts/init_templates.py#L81-L102)
|
||||
- [初始化指标模板脚本 init_indicator_templates.py](file://backend/init_indicator_templates.py#L234-L266)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user