Files
2026-02-28 15:16:15 +08:00

14 KiB
Raw Permalink Blame History

工资核算管理

**本文引用的文件** - [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)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构概览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排除指南
  9. 结论
  10. 附录

简介

本文件为医院绩效系统的工资核算管理模块提供完整的技术文档。该模块负责:

  • 绩效奖金计算算法与参数配置
  • 工资记录的创建、更新与状态管理
  • 基于考核结果的批量工资生成
  • 工资确认与发放前的状态控制
  • 工资条生成、历史记录查询与统计分析
  • 数据来源、计算精度与异常处理机制说明

项目结构

工资核算管理模块由后端API路由、服务层、数据模型与前端界面组成采用分层架构设计确保职责分离与可扩展性。

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

图表来源

章节来源

核心组件

  • API路由层提供工资记录查询、详情、创建、更新、按考核生成、批量生成、确认与批量确认等REST接口。
  • 服务层:实现业务逻辑,包括绩效奖金计算、工资记录生成、状态变更与批量操作。
  • 数据模型层:定义工资记录、员工、考核等实体及其关系。
  • 数据模式层:定义请求/响应数据结构,确保前后端数据一致性。
  • 前端界面展示工资记录列表、支持筛选与编辑调用后端API完成操作。

章节来源

架构概览

工资核算管理遵循“前端-后端-数据库”的三层架构通过API路由统一对外提供服务服务层封装业务规则数据模型映射数据库表结构。

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 : 成功响应

图表来源

章节来源

详细组件分析

绩效奖金计算算法

  • 计算公式
    • 绩效奖金 = 绩效基数 × (绩效得分/100) × 绩效系数
    • 其中:绩效基数为固定常量;绩效得分来自考核加权得分;绩效系数来自员工配置。
  • 参数来源
    • 绩效基数:服务层常量字段
    • 绩效得分:来自已确认的考核记录的加权得分
    • 绩效系数来自员工表的performance_ratio字段
  • 精度与约束
    • 绩效基数保留两位小数
    • 绩效得分与系数保留两位小数
    • 数据库字段使用Numeric类型保证精度
flowchart TD
Start(["开始"]) --> LoadAssessment["加载已确认考核记录"]
LoadAssessment --> CheckExist{"是否存在?"}
CheckExist --> |否| ReturnNull["返回空"]
CheckExist --> |是| LoadStaff["加载员工信息"]
LoadStaff --> CalcBonus["计算绩效奖金<br/>基数×(得分/100)×系数"]
CalcBonus --> CreateRecord["创建工资记录<br/>合计=基本工资+奖金"]
CreateRecord --> Save["持久化到数据库"]
Save --> End(["结束"])

图表来源

章节来源

工资记录管理

  • 字段定义
    • 基本工资、绩效得分、绩效奖金、扣款、补贴、应发工资、状态、备注、创建/更新时间
  • 状态流转
    • pending待确认→ confirmed已确认
    • 仅pending状态可更新与确认
  • 计算规则
    • 应发工资 = 基本工资 + 绩效奖金 + 补贴 - 扣款
    • 更新时自动重新计算应发工资
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 : "外键"

图表来源

章节来源

批量工资生成与发放管理

  • 单个生成
    • 根据员工ID与年月检查是否存在已确认的考核记录且无重复工资记录然后生成工资记录
  • 科室批量生成
    • 遍历指定科室当月已确认考核的所有员工,逐个生成工资记录
  • 批量确认
    • 将指定年月可选科室下所有pending状态的工资记录批量置为confirmed
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 : 成功响应

图表来源

章节来源

工资条生成、历史记录查询与统计分析

  • 工资条生成
    • 通过“根据考核生成”或“批量生成”生成工资记录后,可在前端查看与编辑
  • 历史记录查询
    • 支持按员工、科室、年月、状态筛选,分页显示
  • 统计分析
    • 前端报表页面提供科室统计、排名等展示(与工资记录数据联动)
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 : 渲染表格

图表来源

章节来源

数据来源、计算精度与异常处理

  • 数据来源
    • 员工基本信息与绩效系数来自员工表
    • 考核记录来自考核表,需为已确认状态
    • 工资记录来自工资记录表
  • 计算精度
    • 基本工资、绩效奖金、扣款、补贴、应发工资均使用Numeric(10,2)
    • 绩效得分使用Numeric(5,2)
    • 绩效基数为浮点型常量
  • 异常处理
    • 未找到记录或状态不允许时返回错误
    • 重复生成工资记录时拒绝
    • 更新时仅允许pending状态

章节来源

依赖关系分析

  • API路由依赖服务层进行业务处理
  • 服务层依赖数据模型与数据模式进行数据访问与校验
  • 数据模型依赖SQLAlchemy ORM映射数据库表
  • 前端通过API封装调用后端接口
graph LR
FE["前端"] --> API["API路由"]
API --> SVC["服务层"]
SVC --> MODELS["数据模型"]
SVC --> SCHEMAS["数据模式"]
MODELS --> DB["数据库"]

图表来源

章节来源

性能考虑

  • 查询优化
    • 工资记录表对staff_id与(period_year, period_month)建立索引,提升筛选与分页性能
  • 批量操作
    • 批量生成与批量确认采用批量查询与批量更新,减少事务开销
  • 数据精度
    • 使用Numeric类型避免浮点运算误差累积
  • 前端渲染
    • 列表分页与按需加载,减轻前端渲染压力

章节来源

故障排除指南

  • 无法生成工资
    • 检查是否存在已确认的考核记录
    • 确认是否已存在同员工、同年月的工资记录
  • 更新失败
    • 仅pending状态可更新
    • 检查字段范围约束(如非负数)
  • 批量生成无结果
    • 确认科室当月考核状态是否为已确认
  • 前端显示异常
    • 检查筛选条件与分页参数
    • 确认后端接口返回格式

章节来源

结论

工资核算管理模块通过清晰的分层架构与严谨的数据模型,实现了从绩效计算到工资发放的全流程管理。模块具备良好的扩展性与可维护性,能够满足医院绩效工资核算的复杂需求,并为后续的功能增强(如税务处理、多币种支持等)提供了坚实基础。

附录