# 医院绩效管理系统增强设计文档 ## 一、系统架构设计 ### 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 备份策略 - 数据库每日备份 - 配置文件版本控制 - 日志归档保存