提交文件

This commit is contained in:
2026-02-28 15:16:15 +08:00
parent 1a4e50e0a4
commit 44f250f58e
159 changed files with 61268 additions and 0 deletions

View File

@@ -0,0 +1,364 @@
# 考核相关字段
<cite>
**本文引用的文件**
- [models.py](file://backend/app/models/models.py)
- [schemas.py](file://backend/app/schemas/schemas.py)
- [assessments.py](file://backend/app/api/v1/assessments.py)
- [assessment_service.py](file://backend/app/services/assessment_service.py)
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue)
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue)
- [assessment.js](file://frontend/src/api/assessment.js)
- [stats.py](file://backend/app/api/v1/stats.py)
- [database.md](file://docs/数据库设计.md)
- [详细设计文档.md](file://docs/详细设计文档.md)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件聚焦于“考核相关字段”的数据字典与业务规则,覆盖以下对象:
- 考核记录表Assessment
- 考核明细表AssessmentDetail
- 考核状态枚举AssessmentStatus
- 考核周期、状态流转、评分计算、完整性校验与一致性保障机制
- 考核结果计算与统计分析相关字段说明
目标是帮助开发者与业务人员快速理解字段含义、取值范围、约束条件、状态转换与计算逻辑,并提供排障建议与最佳实践。
## 项目结构
后端采用分层架构API 控制器 → 服务层 → ORM 模型;前端通过 API 与后端交互,展示与操作考核流程。
```mermaid
graph TB
FE["前端视图<br/>Assessments.vue / AssessmentDetail.vue"] --> API["FastAPI 路由<br/>assessments.py"]
API --> SVC["服务层<br/>assessment_service.py"]
SVC --> DB["SQLAlchemy 模型<br/>models.py"]
DB --> SQL["数据库表<br/>assessments / assessment_details"]
API --> STATS["统计接口<br/>stats.py"]
```
图表来源
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L96)
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [models.py](file://backend/app/models/models.py#L149-L202)
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
章节来源
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L96)
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L1-L263)
- [models.py](file://backend/app/models/models.py#L149-L202)
- [stats.py](file://backend/app/api/v1/stats.py#L1-L242)
## 核心组件
- Assessment考核记录表
- 关键字段period_year、period_month、period_type、total_score、weighted_score、status、assessor_id、reviewer_id、submit_time、review_time、remark
- 业务规则:按月度周期生成记录;总分与加权得分由明细计算;状态驱动流程推进
- AssessmentDetail考核明细表
- 关键字段assessment_id、indicator_id、actual_value、score、evidence、remark
- 业务规则:每个指标一条明细;得分与佐证材料可编辑(草稿态)
- AssessmentStatus考核状态枚举
- 草稿draft、已提交submitted、已审核reviewed、已确认finalized、已驳回rejected
章节来源
- [models.py](file://backend/app/models/models.py#L149-L202)
- [schemas.py](file://backend/app/schemas/schemas.py#L31-L36)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
## 架构总览
考核流程由前端触发,经 API 路由进入服务层,持久化到数据库模型,最终支持统计分析。
```mermaid
sequenceDiagram
participant FE as "前端"
participant API as "API 路由"
participant SVC as "服务层"
participant DB as "模型/数据库"
FE->>API : "提交/审核/确认"
API->>SVC : "调用对应方法"
SVC->>DB : "读取/更新 Assessment/Details"
DB-->>SVC : "返回实体"
SVC-->>API : "返回处理结果"
API-->>FE : "返回响应"
```
图表来源
- [assessments.py](file://backend/app/api/v1/assessments.py#L105-L145)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L227-L255)
## 详细组件分析
### Assessment考核记录表数据字典
- 字段定义与约束
- id主键自增整数
- staff_id外键指向员工必填
- period_year整数必填年份范围约束见后端校验
- period_month整数必填1-12
- period_type字符串默认 monthly
- total_score数值总分创建时由明细得分求和
- weighted_score数值加权得分按指标权重加权求和
- status状态枚举默认 draft
- assessor_id外键考核人
- reviewer_id外键审核人
- submit_time提交时间
- review_time审核时间
- remark备注
- created_at/updated_at时间戳
- 业务规则
- 考核周期:以年/月为单位period_type 默认 monthly
- 总分与加权得分:由明细聚合计算
- 状态流转:草稿 → 已提交 → 已审核 → 已确认;或草稿 → 已驳回
- 时间字段:提交/审核时写入对应时间
- 约束与索引
- 索引staff_id、period_year+period_month、status
- 约束:状态枚举值限定
章节来源
- [models.py](file://backend/app/models/models.py#L149-L178)
- [schemas.py](file://backend/app/schemas/schemas.py#L220-L257)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
- [database.md](file://docs/数据库设计.md#L159-L177)
### AssessmentDetail考核明细表数据字典
- 字段定义与约束
- id主键自增整数
- assessment_id外键必填
- indicator_id外键必填
- actual_value实际值可选
- score数值得分创建默认 0
- evidence佐证材料可选
- remark备注
- created_at/updated_at时间戳
- 业务规则
- 每个指标一条明细
- 草稿态允许编辑得分与佐证材料
- 服务层在创建/更新时重新计算总分与加权得分
- 约束与索引
- 索引assessment_id、indicator_id
章节来源
- [models.py](file://backend/app/models/models.py#L181-L202)
- [schemas.py](file://backend/app/schemas/schemas.py#L196-L218)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
### AssessmentStatus考核状态枚举数据字典
- 枚举值
- draft草稿
- submitted已提交
- reviewed已审核
- finalized已确认
- rejected已驳回
- 状态转换规则
- 草稿 → 已提交(提交)
- 已提交 → 已审核 或 已驳回(审核)
- 已审核 → 已确认(确认)
- 草稿/已驳回 → 可更新(更新时仅允许草稿或已驳回)
章节来源
- [models.py](file://backend/app/models/models.py#L45-L52)
- [schemas.py](file://backend/app/schemas/schemas.py#L31-L36)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
### 考核周期与状态流转
- 考核周期
- 默认周期类型为 monthly
- 不同指标模板可配置周期(如年度、季度),但记录层面以年/月为单位
- 状态流转
- 提交:将状态从草稿改为已提交并记录提交时间
- 审核:将状态从已提交改为已审核或已驳回,并记录审核时间
- 确认:将状态从已审核改为已确认
```mermaid
stateDiagram-v2
[*] --> 草稿
草稿 --> 已提交 : "提交"
已提交 --> 已审核 : "审核通过"
已提交 --> 已驳回 : "审核驳回"
已审核 --> 已确认 : "确认"
已确认 --> [*]
已驳回 --> 草稿 : "重新编辑"
```
图表来源
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L57-L63)
章节来源
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L57-L63)
### 评分计算与字段约束
- 总分计算
- 总分 = 明细得分之和
- 加权得分计算
- 加权得分 = Σ(明细得分 × 指标权重)
- 权重来自指标表(指标权重 > 0
- 字段约束
- 指标权重必须大于 0数据库 CheckConstraint
- 年度/月份范围在 Pydantic 层面有限制
- 得分字段有最小值 0 的约束
```mermaid
flowchart TD
Start(["创建/更新考核"]) --> LoadDetails["加载明细与指标"]
LoadDetails --> SumScore["总分 = Σ 明细.score"]
LoadDetails --> WeightCalc["加权得分 = Σ 明细.score × 指标.weight"]
SumScore --> SaveAssessment["保存 Assessment"]
WeightCalc --> SaveAssessment
SaveAssessment --> End(["完成"])
```
图表来源
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
- [models.py](file://backend/app/models/models.py#L149-L178)
章节来源
- [assessment_service.py](file://backend/app/services/assessment_service.py#L70-L108)
- [models.py](file://backend/app/models/models.py#L149-L178)
### 完整性检查与一致性保障
- 前端约束
- 草稿态允许编辑得分与佐证材料,得分上限为指标最大分值
- 状态按钮随状态变化显示
- 后端约束
- 状态流转严格限制(仅草稿/已驳回可更新;仅已提交可审核;仅已审核可确认)
- 批量创建时按年/月/员工去重,避免重复记录
- 指标权重 > 0 的数据库约束
- 统计一致性
- 统计接口基于当前周期与部门维度聚合,确保跨部门/跨周期对比一致
章节来源
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L57-L96)
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L57-L63)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
- [models.py](file://backend/app/models/models.py#L144-L146)
### 考核结果计算与统计分析
- 计算字段
- total_score总分
- weighted_score加权得分
- 统计接口
- 科室绩效统计、周期统计、趋势分析、排名等
- 前端展示平均分、总人数、奖金汇总等
章节来源
- [stats.py](file://backend/app/api/v1/stats.py#L36-L242)
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L31-L74)
## 依赖关系分析
- 模型层
- Assessment ←→ AssessmentDetail一对多
- Assessment ←→ Staff多对一
- AssessmentDetail ←→ Indicator多对一
- 服务层
- 服务层负责状态流转、计算与批量创建
- API 层
- 提供 CRUD、提交、审核、确认、批量创建等接口
- 前端
- 视图根据状态动态渲染按钮与输入框
```mermaid
classDiagram
class Assessment {
+int id
+int staff_id
+int period_year
+int period_month
+string period_type
+float total_score
+float weighted_score
+AssessmentStatus status
+int assessor_id
+int reviewer_id
+datetime submit_time
+datetime review_time
+string remark
}
class AssessmentDetail {
+int id
+int assessment_id
+int indicator_id
+float actual_value
+float score
+string evidence
+string remark
}
class Staff
class Indicator
Assessment "1" o-- "*" AssessmentDetail : "明细"
Assessment "many" --> "1" Staff : "员工"
AssessmentDetail "many" --> "1" Indicator : "指标"
```
图表来源
- [models.py](file://backend/app/models/models.py#L149-L202)
章节来源
- [models.py](file://backend/app/models/models.py#L149-L202)
## 性能考量
- 查询性能
- 为 staff_id、period_year+period_month、status 建立索引,有利于筛选与排序
- 写入性能
- 批量创建时按部门与周期预检,避免重复记录
- 计算性能
- 总分与加权得分在服务层一次性计算,减少多次往返
- 建议
- 对高频查询增加复合索引
- 对大表进行分区或归档策略(如历史周期)
章节来源
- [models.py](file://backend/app/models/models.py#L174-L178)
- [assessment_service.py](file://backend/app/services/assessment_service.py#L208-L262)
## 故障排查指南
- 常见问题
- 状态不可变更:仅草稿/已驳回可更新;仅已提交可审核;仅已审核可确认
- 无法提交/审核/确认:检查当前状态是否符合预期
- 批量创建重复:系统按 staff_id+period_year+period_month 去重
- 指标权重异常:数据库约束要求权重 > 0
- 前端定位
- 查看状态标签与按钮可用性
- 校验得分上限与佐证材料输入
- 后端定位
- 检查服务层状态判断与时间字段写入
- 核对明细聚合逻辑与指标权重
章节来源
- [assessment_service.py](file://backend/app/services/assessment_service.py#L158-L205)
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L57-L63)
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L57-L96)
## 结论
本数据字典明确了考核记录与明细的核心字段、状态流转、评分计算与约束条件,并结合前后端实现展示了完整的业务闭环。遵循上述规则可确保数据一致性与流程可控性,同时为后续扩展(如维度得分、模板周期等)提供清晰边界。
## 附录
- API 路由与前端交互
- 列表/详情/创建/更新/提交/审核/确认/批量创建
- 前端通过 assessment.js 发起请求Assessments.vue 与 AssessmentDetail.vue 控制 UI 行为
章节来源
- [assessments.py](file://backend/app/api/v1/assessments.py#L1-L166)
- [assessment.js](file://frontend/src/api/assessment.js#L1-L50)
- [Assessments.vue](file://frontend/src/views/assessment/Assessments.vue#L1-L311)
- [AssessmentDetail.vue](file://frontend/src/views/assessment/AssessmentDetail.vue#L1-L96)