first commit

This commit is contained in:
2026-02-28 15:02:08 +08:00
commit f657de1c0d
55 changed files with 15806 additions and 0 deletions

285
docs/database.md Normal file
View File

@@ -0,0 +1,285 @@
# 数据库设计
## ER图
```
┌──────────────┐ ┌──────────────┐
│ departments │ │ users │
├──────────────┤ ├──────────────┤
│ id (PK) │ │ id (PK) │
│ name │ │ username │
│ code │ │ password_hash│
│ dept_type │ │ staff_id(FK) │
│ parent_id(FK)│ │ role │
│ level │ │ is_active │
│ sort_order │ └──────┬───────┘
│ is_active │ │
│ description │ │
└──────┬───────┘ │
│ │
│ 1:N │ N:1
│ │
▼ │
┌──────────────┐ │
│ staff │◀─────────────┘
├──────────────┤
│ id (PK) │
│ employee_id │
│ name │
│ department_id│──┐
│ position │ │
│ title │ │
│ base_salary │ │
│ perf_ratio │ │
│ status │ │
└──────┬───────┘ │
│ │
│ 1:N │
▼ │
┌──────────────┐ │
│ assessments │ │
├──────────────┤ │
│ id (PK) │ │
│ staff_id(FK) │──┼──────────┐
│ period_year │ │ │
│ period_month │ │ │
│ total_score │ │ │
│ status │ │ │
│ assessor_id │──┼──┐ │
│ reviewer_id │──┼──┼──┐ │
└──────┬───────┘ │ │ │ │
│ │ │ │ │
│ 1:N │ │ │ │
▼ │ │ │ │
┌──────────────┐ │ │ │ │
│assessment_ │ │ │ │ │
│ details │ │ │ │ │
├──────────────┤ │ │ │ │
│ id (PK) │ │ │ │ │
│ assessment_id│──┘ │ │ │
│ indicator_id │──┐ │ │ │
│ actual_value │ │ │ │ │
│ score │ │ │ │ │
└──────────────┘ │ │ │ │
│ │ │ │
┌──────────────┐ │ │ │ │
│ indicators │◀─┘ │ │ │
├──────────────┤ │ │ │
│ id (PK) │ │ │ │
│ name │ │ │ │
│ code │ │ │ │
│ indicator_type│ │ │ │
│ weight │ │ │ │
│ max_score │ │ │ │
│ target_value │ │ │ │
└──────────────┘ │ │ │
│ │ │
┌──────────────┐ │ │ │
│salary_records│ │ │ │
├──────────────┤ │ │ │
│ id (PK) │ │ │ │
│ staff_id(FK) │◀────┘ │ │
│ period_year │ │ │
│ period_month │ │ │
│ base_salary │ │ │
│ perf_score │ │ │
│ perf_bonus │ │ │
│ deduction │ │ │
│ allowance │ │ │
│ total_salary │ │ │
│ status │ │ │
└──────────────┘ │ │
│ │
└────────────────┴────┘
(自关联到staff)
```
## 数据表详解
### departments (科室表)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PK, AUTO | 主键 |
| name | VARCHAR(100) | NOT NULL | 科室名称 |
| code | VARCHAR(20) | UNIQUE, NOT NULL | 科室编码 |
| dept_type | ENUM | NOT NULL | 科室类型: clinical/medical_tech/medical_auxiliary/admin/logistics |
| parent_id | INTEGER | FK | 上级科室ID |
| level | INTEGER | DEFAULT 1 | 层级 (1-5) |
| sort_order | INTEGER | DEFAULT 0 | 排序 |
| is_active | BOOLEAN | DEFAULT TRUE | 是否启用 |
| description | TEXT | | 描述 |
| created_at | DATETIME | | 创建时间 |
| updated_at | DATETIME | | 更新时间 |
**索引**: idx_dept_type, idx_dept_parent
### staff (员工表)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PK, AUTO | 主键 |
| employee_id | VARCHAR(20) | UNIQUE, NOT NULL | 工号 |
| name | VARCHAR(50) | NOT NULL | 姓名 |
| department_id | INTEGER | FK, NOT NULL | 所属科室 |
| position | VARCHAR(50) | NOT NULL | 职位 |
| title | VARCHAR(50) | | 职称 |
| phone | VARCHAR(20) | | 联系电话 |
| email | VARCHAR(100) | | 邮箱 |
| base_salary | DECIMAL(10,2) | DEFAULT 0 | 基本工资 |
| performance_ratio | DECIMAL(5,2) | DEFAULT 1.0 | 绩效系数 (0-5) |
| status | ENUM | DEFAULT active | 状态: active/leave/resigned/retired |
| hire_date | DATETIME | | 入职日期 |
| created_at | DATETIME | | 创建时间 |
| updated_at | DATETIME | | 更新时间 |
**索引**: idx_staff_dept, idx_staff_status
### indicators (考核指标表)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PK, AUTO | 主键 |
| name | VARCHAR(100) | NOT NULL | 指标名称 |
| code | VARCHAR(20) | UNIQUE, NOT NULL | 指标编码 |
| indicator_type | ENUM | NOT NULL | 类型: quality/quantity/efficiency/service/cost |
| weight | DECIMAL(5,2) | DEFAULT 1.0 | 权重 (需>0) |
| max_score | DECIMAL(5,2) | DEFAULT 100 | 最高分值 |
| target_value | DECIMAL(10,2) | | 目标值 |
| unit | VARCHAR(20) | | 计量单位 |
| calculation_method | TEXT | | 计算方法说明 |
| description | TEXT | | 描述 |
| is_active | BOOLEAN | DEFAULT TRUE | 是否启用 |
| created_at | DATETIME | | 创建时间 |
| updated_at | DATETIME | | 更新时间 |
**索引**: idx_indicator_type
**约束**: ck_indicator_weight (weight > 0)
### assessments (考核记录表)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PK, AUTO | 主键 |
| staff_id | INTEGER | FK, NOT NULL | 被考核员工 |
| period_year | INTEGER | NOT NULL | 考核年度 |
| period_month | INTEGER | NOT NULL | 考核月份 |
| period_type | VARCHAR(20) | DEFAULT monthly | 周期类型 |
| total_score | DECIMAL(5,2) | DEFAULT 0 | 总分 |
| weighted_score | DECIMAL(5,2) | DEFAULT 0 | 加权得分 |
| status | ENUM | DEFAULT draft | 状态: draft/submitted/reviewed/finalized/rejected |
| assessor_id | INTEGER | FK | 考核人 |
| reviewer_id | INTEGER | FK | 审核人 |
| submit_time | DATETIME | | 提交时间 |
| review_time | DATETIME | | 审核时间 |
| remark | TEXT | | 备注 |
| created_at | DATETIME | | 创建时间 |
| updated_at | DATETIME | | 更新时间 |
**索引**: idx_assessment_staff, idx_assessment_period, idx_assessment_status
### assessment_details (考核明细表)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PK, AUTO | 主键 |
| assessment_id | INTEGER | FK, NOT NULL | 考核记录ID |
| indicator_id | INTEGER | FK, NOT NULL | 指标ID |
| actual_value | DECIMAL(10,2) | | 实际值 |
| score | DECIMAL(5,2) | DEFAULT 0 | 得分 |
| evidence | TEXT | | 佐证材料 |
| remark | TEXT | | 备注 |
| created_at | DATETIME | | 创建时间 |
| updated_at | DATETIME | | 更新时间 |
**索引**: idx_detail_assessment, idx_detail_indicator
### salary_records (工资核算表)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PK, AUTO | 主键 |
| staff_id | INTEGER | FK, NOT NULL | 员工ID |
| period_year | INTEGER | NOT NULL | 年度 |
| period_month | INTEGER | NOT NULL | 月份 |
| base_salary | DECIMAL(10,2) | DEFAULT 0 | 基本工资 |
| performance_score | DECIMAL(5,2) | DEFAULT 0 | 绩效得分 |
| performance_bonus | DECIMAL(10,2) | DEFAULT 0 | 绩效奖金 |
| deduction | DECIMAL(10,2) | DEFAULT 0 | 扣款 |
| allowance | DECIMAL(10,2) | DEFAULT 0 | 补贴 |
| total_salary | DECIMAL(10,2) | DEFAULT 0 | 应发工资 |
| status | VARCHAR(20) | DEFAULT pending | 状态: pending/confirmed/paid |
| remark | TEXT | | 备注 |
| created_at | DATETIME | | 创建时间 |
| updated_at | DATETIME | | 更新时间 |
**索引**: idx_salary_staff, idx_salary_period
### users (系统用户表)
| 字段 | 类型 | 约束 | 说明 |
|------|------|------|------|
| id | INTEGER | PK, AUTO | 主键 |
| username | VARCHAR(50) | UNIQUE, NOT NULL | 用户名 |
| password_hash | VARCHAR(255) | NOT NULL | 密码哈希 |
| staff_id | INTEGER | FK | 关联员工 |
| role | VARCHAR(20) | DEFAULT staff | 角色: admin/manager/staff |
| is_active | BOOLEAN | DEFAULT TRUE | 是否启用 |
| last_login | DATETIME | | 最后登录时间 |
| created_at | DATETIME | | 创建时间 |
| updated_at | DATETIME | | 更新时间 |
**索引**: idx_user_username
## 枚举类型
### DeptType (科室类型)
| 值 | 说明 |
|---|---|
| clinical | 临床科室 |
| medical_tech | 医技科室 |
| medical_auxiliary | 医辅科室 |
| admin | 行政科室 |
| logistics | 后勤科室 |
### StaffStatus (员工状态)
| 值 | 说明 |
|---|---|
| active | 在职 |
| leave | 休假 |
| resigned | 离职 |
| retired | 退休 |
### AssessmentStatus (考核状态)
| 值 | 说明 |
|---|---|
| draft | 草稿 |
| submitted | 已提交 |
| reviewed | 已审核 |
| finalized | 已确认 |
| rejected | 已驳回 |
### IndicatorType (指标类型)
| 值 | 说明 |
|---|---|
| quality | 质量指标 |
| quantity | 数量指标 |
| efficiency | 效率指标 |
| service | 服务指标 |
| cost | 成本指标 |
## 数据库迁移
使用Alembic进行数据库版本管理
```bash
# 生成迁移文件
alembic revision --autogenerate -m "description"
# 执行迁移
alembic upgrade head
# 回滚迁移
alembic downgrade -1
```