# API接口文档 ## 基础信息 - **Base URL**: `http://localhost:8000/api/v1` - **认证方式**: JWT Bearer Token - **响应格式**: JSON ## 通用响应格式 ### 成功响应 ```json { "code": 200, "message": "success", "data": { ... } } ``` ### 分页响应 ```json { "code": 200, "message": "success", "data": [ ... ], "total": 100, "page": 1, "page_size": 20 } ``` ### 错误响应 ```json { "detail": "错误信息" } ``` ## 认证接口 ### 登录 ``` POST /auth/login ``` **请求体**: ```json { "username": "admin", "password": "admin123" } ``` **响应**: ```json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "bearer" } ``` ### 获取当前用户 ``` GET /auth/me Authorization: Bearer {token} ``` **响应**: ```json { "id": 1, "username": "admin", "role": "admin", "is_active": true } ``` --- ## 科室管理 ### 获取科室列表 ``` GET /departments ``` **查询参数**: | 参数 | 类型 | 说明 | |------|------|------| | name | string | 科室名称(模糊搜索) | | dept_type | string | 科室类型 | | is_active | boolean | 是否启用 | | page | int | 页码 | | page_size | int | 每页数量 | **响应**: ```json { "code": 200, "message": "success", "data": [ { "id": 1, "name": "内科", "code": "NK001", "dept_type": "clinical", "parent_id": null, "level": 1, "sort_order": 1, "is_active": true, "created_at": "2024-01-01T00:00:00", "updated_at": "2024-01-01T00:00:00" } ], "total": 10, "page": 1, "page_size": 20 } ``` ### 获取科室树 ``` GET /departments/tree ``` **响应**: 返回树形结构的科室列表 ### 创建科室 ``` POST /departments ``` **请求体**: ```json { "name": "内科", "code": "NK001", "dept_type": "clinical", "parent_id": null, "level": 1, "sort_order": 1, "description": "内科科室" } ``` ### 更新科室 ``` PUT /departments/{id} ``` ### 删除科室 ``` DELETE /departments/{id} ``` --- ## 员工管理 ### 获取员工列表 ``` GET /staff ``` **查询参数**: | 参数 | 类型 | 说明 | |------|------|------| | name | string | 姓名(模糊搜索) | | employee_id | string | 工号 | | department_id | int | 科室ID | | status | string | 状态 | | page | int | 页码 | | page_size | int | 每页数量 | **响应**: ```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 /staff ``` **请求体**: ```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 /staff/{id} ``` ### 删除员工 ``` DELETE /staff/{id} ``` --- ## 考核指标 ### 获取指标列表 ``` GET /indicators ``` **查询参数**: | 参数 | 类型 | 说明 | |------|------|------| | name | string | 指标名称(模糊搜索) | | indicator_type | string | 指标类型 | | is_active | boolean | 是否启用 | **响应**: ```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 } ``` ### 创建指标 ``` POST /indicators ``` ### 更新指标 ``` PUT /indicators/{id} ``` ### 删除指标 ``` DELETE /indicators/{id} ``` --- ## 考核管理 ### 获取考核列表 ``` GET /assessments ``` **查询参数**: | 参数 | 类型 | 说明 | |------|------|------| | staff_id | int | 员工ID | | department_id | int | 科室ID | | period_year | int | 年度 | | period_month | int | 月份 | | status | string | 状态 | **响应**: ```json { "code": 200, "message": "success", "data": [ { "id": 1, "staff_id": 1, "staff_name": "张三", "department_name": "内科", "period_year": 2024, "period_month": 1, "period_type": "monthly", "total_score": 85.5, "weighted_score": 85.5, "status": "submitted", "created_at": "2024-01-15T00:00:00" } ], "total": 30, "page": 1, "page_size": 20 } ``` ### 获取考核详情 ``` GET /assessments/{id} ``` **响应**: 包含考核明细的完整信息 ### 创建考核 ``` POST /assessments ``` **请求体**: ```json { "staff_id": 1, "period_year": 2024, "period_month": 1, "period_type": "monthly", "details": [ { "indicator_id": 1, "actual_value": 450, "score": 90, "evidence": "门诊系统导出数据", "remark": "" } ] } ``` ### 更新考核 ``` PUT /assessments/{id} ``` ### 提交考核 ``` POST /assessments/{id}/submit ``` ### 审核考核 ``` POST /assessments/{id}/review ``` **请求体**: ```json { "approved": true, "remark": "审核通过" } ``` ### 删除考核 ``` DELETE /assessments/{id} ``` --- ## 工资核算 ### 获取工资列表 ``` GET /salary ``` **查询参数**: | 参数 | 类型 | 说明 | |------|------|------| | staff_id | int | 员工ID | | department_id | int | 科室ID | | period_year | int | 年度 | | period_month | int | 月份 | | status | string | 状态 | **响应**: ```json { "code": 200, "message": "success", "data": [ { "id": 1, "staff_id": 1, "staff_name": "张三", "department_name": "内科", "period_year": 2024, "period_month": 1, "base_salary": 5000.00, "performance_score": 85.5, "performance_bonus": 3000.00, "deduction": 0, "allowance": 500.00, "total_salary": 8500.00, "status": "pending", "created_at": "2024-02-01T00:00:00" } ], "total": 50, "page": 1, "page_size": 20 } ``` ### 生成工资记录 ``` POST /salary/generate ``` **请求体**: ```json { "period_year": 2024, "period_month": 1 } ``` ### 更新工资记录 ``` PUT /salary/{id} ``` ### 确认工资 ``` POST /salary/{id}/confirm ``` --- ## 统计报表 ### 科室绩效统计 ``` GET /stats/departments ``` **查询参数**: | 参数 | 类型 | 说明 | |------|------|------| | period_year | int | 年度 | | period_month | int | 月份 | **响应**: ```json { "code": 200, "message": "success", "data": [ { "department_id": 1, "department_name": "内科", "staff_count": 20, "avg_score": 85.5, "total_bonus": 60000.00 } ] } ``` ### 员工绩效排名 ``` GET /stats/ranking ``` **查询参数**: | 参数 | 类型 | 说明 | |------|------|------| | period_year | int | 年度 | | period_month | int | 月份 | | department_id | int | 科室ID(可选) | | limit | int | 返回数量 | ### 趋势分析 ``` GET /stats/trend ``` **查询参数**: | 参数 | 类型 | 说明 | |------|------|------| | start_year | int | 开始年度 | | start_month | int | 开始月份 | | end_year | int | 结束年度 | | end_month | int | 结束月份 | ### 绩效分布 ``` GET /stats/distribution ``` **查询参数**: | 参数 | 类型 | 说明 | |------|------|------| | period_year | int | 年度 | | period_month | int | 月份 | --- ## 错误码 | 状态码 | 说明 | |--------|------| | 200 | 成功 | | 400 | 请求参数错误 | | 401 | 未授权/Token过期 | | 403 | 权限不足 | | 404 | 资源不存在 | | 422 | 数据验证失败 | | 500 | 服务器内部错误 | ## API文档访问 启动后端服务后,可访问: - Swagger UI: http://localhost:8000/api/v1/docs - ReDoc: http://localhost:8000/api/v1/redoc