503 lines
17 KiB
Markdown
503 lines
17 KiB
Markdown
# 医院绩效管理系统增强设计文档
|
||
|
||
## 一、系统架构设计
|
||
|
||
### 1.1 技术架构
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ 前端层 (Frontend) │
|
||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||
│ │ Web 管理端 │ │ 移动端 H5 │ │ 小程序 │ │ 数据大屏 │ │
|
||
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
||
└─────────────────────────┬───────────────────────────────────┘
|
||
│ HTTP/REST API
|
||
┌─────────────────────────▼───────────────────────────────────┐
|
||
│ 后端层 (Backend) │
|
||
│ ┌──────────────────────────────────────────────────────┐ │
|
||
│ │ API Gateway │ │
|
||
│ ├──────────┬──────────┬──────────┬──────────┬──────────┤ │
|
||
│ │ 科室管理 │ 指标管理 │ 考核管理 │ 工资核算 │ 统计报表 │ │
|
||
│ └──────────┴──────────┴──────────┴──────────┴──────────┘ │
|
||
│ ┌──────────┬──────────┬──────────┬──────────┬──────────┤ │
|
||
│ │ 用户认证 │ 权限管理 │ 日志管理 │ 系统配置 │ 消息通知 │ │
|
||
│ └──────────┴──────────┴──────────┴──────────┴──────────┘ │
|
||
└─────────────────────────┬───────────────────────────────────┘
|
||
│ SQLAlchemy Async
|
||
┌─────────────────────────▼───────────────────────────────────┐
|
||
│ 数据层 (Data Layer) │
|
||
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ PostgreSQL │ │ Redis │ │ 文件存储 │ │
|
||
│ │ (主数据库) │ │ (缓存) │ │ (报表/附件) │ │
|
||
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 1.2 功能模块设计
|
||
|
||
```
|
||
医院绩效管理系统
|
||
├── 基础数据管理
|
||
│ ├── 科室信息管理(树形结构,支持 9 种科室类型)
|
||
│ ├── 员工信息管理
|
||
│ ├── 考核指标管理(支持 BSC 维度、指标模板)
|
||
│ └── 指标模板库(按科室类型预置指标)
|
||
├── 绩效考核流程
|
||
│ ├── 考核方案配置
|
||
│ ├── 考核任务创建
|
||
│ ├── 考核数据填报
|
||
│ ├── 考核提交与审核
|
||
│ ├── 考核结果确认
|
||
│ └── 批量创建考核
|
||
├── 数据分析报表
|
||
│ ├── BSC 维度分析(财务/客户/内部流程/学习成长)
|
||
│ ├── 科室绩效统计
|
||
│ ├── 员工绩效排名
|
||
│ ├── 趋势分析(月度/季度/年度)
|
||
│ ├── 指标完成度分析
|
||
│ └── 绩效分布分析
|
||
├── 绩效工资核算
|
||
│ ├── 绩效系数配置
|
||
│ ├── 自动计算工资
|
||
│ ├── 批量生成工资记录
|
||
│ ├── 工资确认与发放
|
||
│ └── 工资条导出
|
||
├── 满意度调查
|
||
│ ├── 调查问卷管理
|
||
│ ├── 移动端调查页面
|
||
│ ├── 满意度统计
|
||
│ └── 满意度趋势分析
|
||
└── 系统管理
|
||
├── 用户管理
|
||
├── 角色权限
|
||
├── 系统配置
|
||
└── 操作日志
|
||
```
|
||
|
||
## 二、数据库设计增强
|
||
|
||
### 2.1 新增数据表
|
||
|
||
#### 2.1.1 考核方案表 (assessment_plans)
|
||
```sql
|
||
CREATE TABLE assessment_plans (
|
||
id INTEGER PRIMARY KEY,
|
||
name VARCHAR(100) NOT NULL, -- 方案名称
|
||
plan_type VARCHAR(20) NOT NULL, -- 方案类型:monthly/quarterly/yearly
|
||
applicable_dept_types TEXT, -- 适用科室类型 (JSON)
|
||
bs_dimension_weights TEXT, -- BSC 维度权重 (JSON)
|
||
start_date DATE, -- 开始日期
|
||
end_date DATE, -- 结束日期
|
||
status VARCHAR(20) DEFAULT 'draft', -- 状态
|
||
created_at DATETIME,
|
||
updated_at DATETIME
|
||
);
|
||
```
|
||
|
||
#### 2.1.2 满意度调查表 (satisfaction_surveys)
|
||
```sql
|
||
CREATE TABLE satisfaction_surveys (
|
||
id INTEGER PRIMARY KEY,
|
||
survey_name VARCHAR(100) NOT NULL, -- 调查名称
|
||
survey_type VARCHAR(20) NOT NULL, -- 调查类型:patient/staff
|
||
questions TEXT NOT NULL, -- 问题列表 (JSON)
|
||
status VARCHAR(20) DEFAULT 'active',
|
||
start_date DATE,
|
||
end_date DATE,
|
||
target_departments TEXT, -- 目标科室 (JSON)
|
||
created_at DATETIME,
|
||
updated_at DATETIME
|
||
);
|
||
```
|
||
|
||
#### 2.1.3 满意度回答表 (satisfaction_responses)
|
||
```sql
|
||
CREATE TABLE satisfaction_responses (
|
||
id INTEGER PRIMARY KEY,
|
||
survey_id INTEGER NOT NULL,
|
||
respondent_type VARCHAR(20), -- 回答者类型
|
||
department_id INTEGER, -- 被评价科室
|
||
answers TEXT NOT NULL, -- 回答内容 (JSON)
|
||
total_score DECIMAL(5,2), -- 总分
|
||
submitted_at DATETIME,
|
||
FOREIGN KEY (survey_id) REFERENCES surveys(id)
|
||
);
|
||
```
|
||
|
||
#### 2.1.4 绩效系数配置表 (performance_coefficients)
|
||
```sql
|
||
CREATE TABLE performance_coefficients (
|
||
id INTEGER PRIMARY KEY,
|
||
department_id INTEGER, -- 科室 ID
|
||
staff_id INTEGER, -- 员工 ID
|
||
coefficient DECIMAL(5,2) DEFAULT 1.0, -- 系数
|
||
effective_year INTEGER, -- 生效年度
|
||
effective_month INTEGER, -- 生效月份
|
||
remark TEXT,
|
||
created_at DATETIME,
|
||
updated_at DATETIME
|
||
);
|
||
```
|
||
|
||
#### 2.1.5 奖惩记录表 (bonus_penalty_records)
|
||
```sql
|
||
CREATE TABLE bonus_penalty_records (
|
||
id INTEGER PRIMARY KEY,
|
||
department_id INTEGER,
|
||
staff_id INTEGER,
|
||
record_type VARCHAR(20), -- reward/punishment
|
||
reason TEXT NOT NULL, -- 原因
|
||
amount DECIMAL(10,2), -- 金额
|
||
score_impact DECIMAL(5,2), -- 分数影响
|
||
period_year INTEGER,
|
||
period_month INTEGER,
|
||
status VARCHAR(20) DEFAULT 'pending',
|
||
approved_by INTEGER,
|
||
created_at DATETIME,
|
||
updated_at DATETIME
|
||
);
|
||
```
|
||
|
||
### 2.2 指标模板数据结构
|
||
|
||
```json
|
||
{
|
||
"template_name": "手术临床科室考核指标",
|
||
"dept_type": "clinical_surgical",
|
||
"indicators": [
|
||
{
|
||
"name": "业务收入增长率",
|
||
"code": "FIN001",
|
||
"indicator_type": "quantity",
|
||
"bs_dimension": "financial",
|
||
"weight": 1.0,
|
||
"max_score": 100,
|
||
"target_value": 10,
|
||
"target_unit": "%",
|
||
"calculation_method": "(本期收入 - 同期收入)/同期收入 × 100%",
|
||
"assessment_method": "统计报表",
|
||
"deduction_standard": "每降低 1% 扣 2 分",
|
||
"data_source": "HIS 系统",
|
||
"is_veto": false
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
## 三、API 接口设计
|
||
|
||
### 3.1 指标管理 API
|
||
|
||
```
|
||
GET /api/v1/indicators # 获取指标列表
|
||
POST /api/v1/indicators # 创建指标
|
||
GET /api/v1/indicators/{id} # 获取指标详情
|
||
PUT /api/v1/indicators/{id} # 更新指标
|
||
DELETE /api/v1/indicators/{id} # 删除指标
|
||
GET /api/v1/indicators/templates # 获取指标模板列表
|
||
POST /api/v1/indicators/templates # 导入指标模板
|
||
POST /api/v1/indicators/batch # 批量操作指标
|
||
```
|
||
|
||
### 3.2 统计报表 API
|
||
|
||
```
|
||
GET /api/v1/stats/bsc-dimension # BSC 维度分析
|
||
GET /api/v1/stats/department # 科室绩效统计
|
||
GET /api/v1/stats/trend # 趋势分析
|
||
GET /api/v1/stats/ranking # 绩效排名
|
||
GET /api/v1/stats/completion # 指标完成度
|
||
GET /api/v1/stats/satisfaction # 满意度统计
|
||
```
|
||
|
||
### 3.3 工资核算 API
|
||
|
||
```
|
||
GET /api/v1/salary/config # 获取工资配置
|
||
POST /api/v1/salary/config # 更新工资配置
|
||
POST /api/v1/salary/calculate # 计算工资
|
||
POST /api/v1/salary/generate # 生成工资记录
|
||
GET /api/v1/salary/records # 获取工资记录
|
||
POST /api/v1/salary/confirm # 确认工资
|
||
```
|
||
|
||
### 3.4 满意度调查 API
|
||
|
||
```
|
||
GET /api/v1/surveys # 获取调查列表
|
||
POST /api/v1/surveys # 创建调查
|
||
GET /api/v1/surveys/{id} # 获取调查详情
|
||
POST /api/v1/surveys/{id}/respond # 提交回答
|
||
GET /api/v1/surveys/{id}/results # 获取调查结果
|
||
GET /api/v1/surveys/stats # 满意度统计
|
||
```
|
||
|
||
## 四、前端页面设计
|
||
|
||
### 4.1 页面结构
|
||
|
||
```
|
||
/src/views
|
||
├── basic/ # 基础数据管理
|
||
│ ├── Departments.vue # 科室管理
|
||
│ ├── Staff.vue # 员工管理
|
||
│ └── Indicators.vue # 指标管理(增强版)
|
||
├── assessment/ # 考核管理
|
||
│ ├── Plans.vue # 考核方案
|
||
│ ├── Assessments.vue # 考核列表
|
||
│ └── AssessmentDetail.vue # 考核详情
|
||
├── reports/ # 统计报表
|
||
│ ├── BSCAnalysis.vue # BSC 维度分析
|
||
│ ├── DepartmentStats.vue # 科室统计
|
||
│ ├── TrendAnalysis.vue # 趋势分析
|
||
│ └── Ranking.vue # 绩效排名
|
||
├── salary/ # 工资核算
|
||
│ ├── Config.vue # 工资配置
|
||
│ ├── Calculation.vue # 工资计算
|
||
│ └── Records.vue # 工资记录
|
||
├── satisfaction/ # 满意度调查
|
||
│ ├── Surveys.vue # 调查管理
|
||
│ ├── SurveyDetail.vue # 调查详情
|
||
│ └── Stats.vue # 满意度统计
|
||
└── mobile/ # 移动端页面
|
||
└── Survey.vue # 满意度调查 H5
|
||
```
|
||
|
||
### 4.2 指标管理页面增强
|
||
|
||
新增字段:
|
||
- BSC 维度选择器
|
||
- 适用科室类型(多选)
|
||
- 计算方法/公式
|
||
- 考核方法
|
||
- 扣分标准
|
||
- 数据来源
|
||
- 是否一票否决
|
||
|
||
### 4.3 统计报表页面
|
||
|
||
#### BSC 维度分析
|
||
- 四大维度得分雷达图
|
||
- 维度得分趋势图
|
||
- 科室维度对比
|
||
|
||
#### 科室绩效统计
|
||
- 科室得分排行榜
|
||
- 科室得分明细
|
||
- 科室得分构成
|
||
|
||
#### 趋势分析
|
||
- 月度趋势折线图
|
||
- 季度对比柱状图
|
||
- 年度对比图
|
||
|
||
## 五、实施计划
|
||
|
||
### 阶段一:基础数据增强(1 周)
|
||
- [ ] 更新科室类型枚举
|
||
- [ ] 更新指标模型和 schema
|
||
- [ ] 创建指标模板导入功能
|
||
- [ ] 前端指标管理页面增强
|
||
|
||
### 阶段二:统计报表开发(2 周)
|
||
- [ ] BSC 维度分析 API
|
||
- [ ] 科室绩效统计 API
|
||
- [ ] 趋势分析 API
|
||
- [ ] 前端报表页面开发
|
||
|
||
### 阶段三:工资核算功能(1 周)
|
||
- [ ] 绩效系数配置
|
||
- [ ] 工资自动计算
|
||
- [ ] 工资记录管理
|
||
- [ ] 工资条导出
|
||
|
||
### 阶段四:满意度调查(1 周)
|
||
- [ ] 调查管理 API
|
||
- [ ] 移动端调查页面
|
||
- [ ] 满意度统计
|
||
|
||
### 阶段五:测试与优化(1 周)
|
||
- [ ] 单元测试
|
||
- [ ] 集成测试
|
||
- [ ] 性能优化
|
||
- [ ] 文档完善
|
||
|
||
## 六、关键代码实现
|
||
|
||
### 6.1 指标模板导入服务
|
||
|
||
```python
|
||
class IndicatorTemplateService:
|
||
@staticmethod
|
||
async def import_template(
|
||
db: AsyncSession,
|
||
template_data: dict,
|
||
overwrite: bool = False
|
||
) -> int:
|
||
"""导入指标模板"""
|
||
dept_type = template_data['dept_type']
|
||
indicators = template_data['indicators']
|
||
created_count = 0
|
||
|
||
for ind_data in indicators:
|
||
# 检查是否已存在
|
||
existing = await db.execute(
|
||
select(Indicator).where(
|
||
Indicator.code == ind_data['code']
|
||
)
|
||
)
|
||
|
||
if existing.scalar_one_or_none():
|
||
if overwrite:
|
||
# 更新现有指标
|
||
...
|
||
continue
|
||
|
||
# 创建新指标
|
||
indicator = Indicator(**ind_data)
|
||
db.add(indicator)
|
||
created_count += 1
|
||
|
||
await db.commit()
|
||
return created_count
|
||
```
|
||
|
||
### 6.2 BSC 维度统计服务
|
||
|
||
```python
|
||
class StatsService:
|
||
@staticmethod
|
||
async def get_bsc_dimension_stats(
|
||
db: AsyncSession,
|
||
department_id: int,
|
||
period_year: int,
|
||
period_month: int
|
||
) -> dict:
|
||
"""获取 BSC 维度统计"""
|
||
dimensions = {
|
||
'financial': {'score': 0, 'weight': 0},
|
||
'customer': {'score': 0, 'weight': 0},
|
||
'internal_process': {'score': 0, 'weight': 0},
|
||
'learning_growth': {'score': 0, 'weight': 0}
|
||
}
|
||
|
||
# 查询考核详情
|
||
result = await db.execute(
|
||
select(
|
||
AssessmentDetail.score,
|
||
Indicator.weight,
|
||
Indicator.bs_dimension
|
||
)
|
||
.join(Indicator)
|
||
.join(Assessment)
|
||
.where(
|
||
Assessment.department_id == department_id,
|
||
Assessment.period_year == period_year,
|
||
Assessment.period_month == period_month
|
||
)
|
||
)
|
||
|
||
for row in result.fetchall():
|
||
dim = row.bs_dimension
|
||
if dim in dimensions:
|
||
dimensions[dim]['score'] += row.score * row.weight
|
||
dimensions[dim]['weight'] += row.weight
|
||
|
||
# 计算各维度得分
|
||
for dim in dimensions.values():
|
||
if dim['weight'] > 0:
|
||
dim['average'] = dim['score'] / dim['weight']
|
||
|
||
return dimensions
|
||
```
|
||
|
||
### 6.3 工资计算服务
|
||
|
||
```python
|
||
class SalaryService:
|
||
@staticmethod
|
||
async def calculate_salary(
|
||
db: AsyncSession,
|
||
staff_id: int,
|
||
period_year: int,
|
||
period_month: int
|
||
) -> dict:
|
||
"""计算员工工资"""
|
||
# 获取员工信息
|
||
staff = await StaffService.get_by_id(db, staff_id)
|
||
|
||
# 获取考核得分
|
||
assessment = await AssessmentService.get_by_staff_and_period(
|
||
db, staff_id, period_year, period_month
|
||
)
|
||
|
||
if not assessment:
|
||
return None
|
||
|
||
# 获取绩效系数
|
||
coeff = await PerformanceCoefficientService.get_coefficient(
|
||
db, staff_id, period_year, period_month
|
||
)
|
||
|
||
# 计算绩效奖金
|
||
base_salary = float(staff.base_salary)
|
||
performance_score = assessment.total_score
|
||
performance_ratio = float(staff.performance_ratio) * coeff
|
||
|
||
# 绩效奖金 = 基本工资 × (绩效得分/100) × 绩效系数
|
||
performance_bonus = base_salary * (performance_score / 100) * performance_ratio
|
||
|
||
# 获取奖惩记录
|
||
bonus_penalty = await BonusPenaltyService.get_total(
|
||
db, staff_id, period_year, period_month
|
||
)
|
||
|
||
# 应发工资 = 基本工资 + 绩效奖金 + 奖励 - 扣款
|
||
total_salary = base_salary + performance_bonus + bonus_penalty.get('reward', 0) - bonus_penalty.get('punishment', 0)
|
||
|
||
return {
|
||
'base_salary': base_salary,
|
||
'performance_score': performance_score,
|
||
'performance_ratio': performance_ratio,
|
||
'performance_bonus': performance_bonus,
|
||
'reward': bonus_penalty.get('reward', 0),
|
||
'punishment': bonus_penalty.get('punishment', 0),
|
||
'total_salary': total_salary
|
||
}
|
||
```
|
||
|
||
## 七、测试计划
|
||
|
||
### 7.1 单元测试
|
||
- 服务层方法测试
|
||
- API 接口测试
|
||
- 数据验证测试
|
||
|
||
### 7.2 集成测试
|
||
- 考核流程测试
|
||
- 工资计算测试
|
||
- 报表统计测试
|
||
|
||
### 7.3 性能测试
|
||
- 大数据量查询测试
|
||
- 并发访问测试
|
||
- 工资批量计算测试
|
||
|
||
## 八、部署方案
|
||
|
||
### 8.1 开发环境
|
||
- SQLite 数据库
|
||
- 热重载模式
|
||
- 详细日志
|
||
|
||
### 8.2 生产环境
|
||
- PostgreSQL 数据库
|
||
- Nginx 反向代理
|
||
- Gunicorn/Uvicorn workers
|
||
- Redis 缓存
|
||
- 日志轮转
|
||
|
||
### 8.3 备份策略
|
||
- 数据库每日备份
|
||
- 配置文件版本控制
|
||
- 日志归档保存
|