【绩效】绩效模板、绩效计划
绩效模板与计划用于定义“考什么、谁来评分、如何确认结果”。管理端先维护考核指标模板和结果模板,再通过四步表单创建绩效计划并确定参评范围。计划启动后的员工任务与绩效档案,详见 《【绩效】绩效考核、绩效档案》。
模块由 yudao-module-hrm 后端的 performance.config、performance.plan 包实现,前端位于 @/views/hrm/performance/config 和 @/views/hrm/performance/plan。相关表关系如下:
# 1. 考核指标模板
考核指标模板保存可复用的维度和指标,例如“业绩指标 60% + 行为态度 40%”。维度、指标以内嵌 JSON 保存,不建立独立模板子表。
# 1.1 表结构
省略
creator/create_time/updater/update_time/deleted/tenant_id等通用字段,下同。
CREATE TABLE `hrm_performance_assessment_template` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(500) NOT NULL COMMENT '模板名称',
`illustrate` varchar(1000) DEFAULT NULL COMMENT '模板说明',
`score_calculation` tinyint DEFAULT '1' COMMENT '计分方式',
`upper_limit_type` tinyint DEFAULT '0' COMMENT '分数上限类型',
`upper_limit_score` decimal(10,2) DEFAULT '100.00' COMMENT '分数上限',
`dimension_count` int DEFAULT '0' COMMENT '维度数量',
`quota_count` int DEFAULT '0' COMMENT '指标数量',
`dimensions` varchar(20000) NOT NULL COMMENT '维度和指标 JSON',
`status` tinyint DEFAULT '0' COMMENT '状态',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='HRM 绩效考核指标模板';
① dimensions 中的维度保存名称、类型、权重、是否允许员工编辑和指标列表;每个指标保存名称、说明、评分标准、权重和排序。
② 所有维度权重之和必须为 100%。不允许员工编辑的维度,其预置指标权重也必须为 100%;允许员工编辑时,可将剩余权重留给员工填写。
③ 模板“修改”采用版本化处理:旧记录停用,再插入一条新记录。已创建的计划继续使用原模板编号和自己的配置快照,不会被新版本改写。
# 1.2 管理后台
对应 [HRM 人力资源 -> 绩效管理 -> KPI 考核设置 -> 考核指标模板] 菜单。
# 列表
进入菜单后,@/views/hrm/performance/config/assessment-template/index.vue 默认加载模板列表,可按模板名称“搜索”或“重置”。页面通过 HrmPerformanceAssessmentTemplateController 的 GET /hrm/performance/assessment-template/page 查询模板名称、维度数、指标数、创建人和创建时间。

# 新增 / 修改
点击“新增”,或在目标模板右侧点击“编辑”,打开 PerformanceAssessmentTemplateForm.vue。表单内的 components/PerformanceAssessmentConfigEditor.vue 支持新增、编辑和删除考核维度,并在维度下新增、编辑和删除指标项;保存前会校验维度和指标权重。新增提交 POST /hrm/performance/assessment-template/create,编辑时先用 GET /hrm/performance/assessment-template/get?id={id} 回显,再提交 PUT /hrm/performance/assessment-template/update。
编辑不是覆盖原记录,而是生成新版本并停用旧版本;已创建的 KPI 考核继续使用原模板快照。
# 删除 / 批量删除
点击单行“删除”,或勾选多条记录后点击“批量删除”,确认后分别调用 DELETE /hrm/performance/assessment-template/delete?id={id}、DELETE /hrm/performance/assessment-template/delete-list?ids={ids}。后端会先检查 hrm_performance_plan.assessment_template_id,模板已被计划引用时拒绝删除,未引用时才完成逻辑删除并刷新列表。
# 2. 结果模板
结果模板把最终得分映射为等级和绩效系数,例如 A、B、C 三档。它与指标模板一样采用版本化修改,被计划引用的版本不能删除。
# 2.1 表结构
CREATE TABLE `hrm_performance_result_template` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(255) NOT NULL COMMENT '模板名称',
`levels` varchar(20000) NOT NULL COMMENT '等级配置 JSON',
`status` tinyint DEFAULT '0' COMMENT '状态',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='HRM 绩效结果模板';
① levels 保存等级名称、分数下限、分数上限和绩效系数。
② 各等级区间必须连续覆盖 0~100,不能重叠或留空;等级名称不可重复,绩效系数不能小于 0。
# 2.2 管理后台
对应 [HRM 人力资源 -> 绩效管理 -> KPI 考核设置 -> 考核结果设置] 菜单。
# 列表
@/views/hrm/performance/config/result-template/index.vue 展示模板名称、结果等级、创建人和创建时间,可按模板名称“搜索”或“重置”。列表由 HrmPerformanceResultTemplateController 的 GET /hrm/performance/result-template/page 提供。

# 新增 / 修改
点击“新增”,或在单行右侧点击“编辑”,打开 PerformanceResultTemplateForm.vue;其中 components/PerformanceResultLevelForm.vue 用于新增、修改和删除等级行。保存时必须让等级区间连续覆盖 0~100,且不能重叠或留空。新增调用 POST /hrm/performance/result-template/create;编辑先调用 GET /hrm/performance/result-template/get?id={id} 回显,再调用 PUT /hrm/performance/result-template/update。
结果模板修改同样生成新版本并停用旧版本,不会改变已创建计划保存的结果快照。
# 删除 / 批量删除
点击单行“删除”,或勾选记录后点击“批量删除”,确认后分别调用 DELETE /hrm/performance/result-template/delete?id={id}、DELETE /hrm/performance/result-template/delete-list?ids={ids}。HrmPerformanceResultTemplateController 会把校验交给服务层:已被 KPI 考核引用的版本不能删除,避免历史等级和绩效系数失去来源。
# 3. 绩效计划
绩效计划是配置聚合根。它保存模板来源编号,同时把指标、结果、考评范围和流程复制成计划快照;模板后续变化不会影响已创建的计划。
# 3.1 表结构
CREATE TABLE `hrm_performance_plan` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(255) NOT NULL COMMENT '计划名称',
`cycle_type` tinyint DEFAULT NULL COMMENT '周期类型',
`cycle` varchar(255) DEFAULT NULL COMMENT '周期',
`quarter` tinyint DEFAULT NULL COMMENT '季度',
`start_time` datetime DEFAULT NULL COMMENT '开始时间',
`end_time` datetime DEFAULT NULL COMMENT '结束时间',
`description` varchar(1000) DEFAULT NULL COMMENT '说明',
`scopes` varchar(20000) NOT NULL COMMENT '考评范围 JSON',
`assessment_template_id` bigint NOT NULL COMMENT '指标模板编号',
`assessment_config` varchar(20000) NOT NULL COMMENT '指标快照 JSON',
`result_template_id` bigint NOT NULL COMMENT '结果模板编号',
`result_config` varchar(20000) NOT NULL COMMENT '结果快照 JSON',
`quota_setting_type` tinyint NOT NULL DEFAULT '1' COMMENT '指标制定方式',
`target_confirmation` bit NOT NULL DEFAULT b'0' COMMENT '是否目标确认',
`target_confirmation_stage` varchar(20000) DEFAULT NULL COMMENT '目标确认节点 JSON',
`review_stages` varchar(20000) NOT NULL COMMENT '评分节点 JSON',
`result_audit` bit NOT NULL DEFAULT b'1' COMMENT '是否结果审核',
`result_audit_stages` varchar(20000) DEFAULT NULL COMMENT '结果审核节点 JSON',
`result_confirmation` bit NOT NULL DEFAULT b'1' COMMENT '是否结果确认',
`appeal_stages` varchar(20000) DEFAULT NULL COMMENT '申诉节点 JSON',
`appeal_timeout_days` int NOT NULL DEFAULT '2' COMMENT '申诉超时天数',
`appeal_timeout_action` tinyint NOT NULL DEFAULT '1' COMMENT '申诉超时动作',
`sync_to_salary` bit DEFAULT b'0' COMMENT '是否同步薪资',
`paid_for_month` varchar(20) DEFAULT NULL COMMENT '计薪月份',
`stage_type` tinyint DEFAULT '0' COMMENT '当前阶段',
`status` tinyint DEFAULT '2' COMMENT '状态',
`operation_type` tinyint DEFAULT NULL COMMENT '下一操作',
`terminate_time` datetime DEFAULT NULL COMMENT '终止时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='HRM 绩效计划';
① scopes 支持员工/部门、聘用形式/员工状态,以及手工移除员工形成的排除范围。系统按范围生成 hrm_performance_assessment 参评员工记录。
② assessment_config、result_config 是计划实际运行依据,assessment_template_id、result_template_id 只保留来源关系。
③ target_confirmation_stage、review_stages、result_audit_stages、appeal_stages 都是内嵌流程配置;计划启动后才为每名员工解析为实际阶段和处理人。
# 3.2 管理后台
对应 [HRM 人力资源 -> 绩效管理 -> KPI 考核] 菜单。
# 列表与状态页签
@/views/hrm/performance/plan/index.vue 可按计划名称“搜索”或“重置”,并按未开始、进行中、已归档、已终止页签展示数量。列表分别调用 HrmPerformancePlanController 的 GET /hrm/performance/plan/page 和 GET /hrm/performance/plan/status-count;阶段人数随列表数据一起返回,状态页签数量仍受计划名称条件约束。
# 查看详情
点击计划名称进入 @/views/hrm/performance/plan/detail/index.vue,查看“详细资料”“参评员工”和“操作日志”。页面调用 GET /hrm/performance/plan/get?id={id} 回显计划,调用 GET /hrm/performance/plan/stage-count?planId={id}、GET /hrm/performance/plan/level-count?planId={id} 统计阶段和等级;点击参评员工姓名后,由 @/views/hrm/performance/assessment/detail/index.vue 通过 GET /hrm/performance/assessment/get?id={id}、GET /hrm/performance/assessment/process-record-list?id={id} 展示指标得分与流程记录。
# 维护参评员工
只有未开始计划可以维护参评员工。在详情的“参评员工”页签点击“添加员工”,PerformancePlanAssessmentAddForm.vue 先调用 GET /hrm/performance/assessment/unassigned-employee-id-list?planId={id} 排除已加入员工,确认后提交 POST /hrm/performance/assessment/create-list;勾选员工并点击“移除员工”,确认后提交 DELETE /hrm/performance/assessment/delete-list。HrmPerformanceAssessmentController 完成增减后,页面会刷新人数、阶段统计和列表;被移除员工同时写入计划排除范围,避免按部门或员工条件重新命中。
# 启动
未开始计划在列表点击“检查并开启考核”,会先进入详情的参评员工页签;核对后点击详情顶部“启动”并二次确认,detail/index.vue 调用 POST /hrm/performance/plan/start?id={id}。HrmPerformancePlanController 会校验参评范围、流程配置和所有必办处理员工的账号绑定,校验成功后生成维度、指标和运行节点,计划变为“进行中”;任一必办人无法解析或未绑定后台账号时,计划保持未开始并返回明确错误。
# 开启评分
进行中计划的全部员工进入执行中后,列表显示“开始评分”,详情显示“开启评分”。确认后均调用 POST /hrm/performance/plan/open-scoring?id={id},系统激活首个评分节点;前置条件未满足时按钮不显示,后端仍会再次校验。此操作由 index.vue 或 detail/index.vue 发起,Controller 完成后刷新计划阶段和参评员工进度。
# 发起绩效面谈
所有参评员工完成评分与结果审核后,列表显示“发起绩效面谈”,详情的“更多”中显示“发起面谈”。确认后调用 POST /hrm/performance/plan/start-interview?id={id},系统进入面谈阶段,并按计划配置激活员工结果确认或直接推进结束;尚有评分、审核任务未完成时不能执行。
# 归档 / 终止
全员考核结束后,可点击“归档”并确认,页面提交 POST /hrm/performance/plan/archive?id={id},计划和员工考核变为已归档并写入归档时间。进行中计划也始终可以点击“终止考核”或详情“更多 -> 终止”,确认后提交 POST /hrm/performance/plan/terminate?id={id};终止后不再推进流程,但已经产生的指标、评分、阶段和动作记录继续保留。两个操作都由 HrmPerformancePlanController 处理,并根据服务端进度校验决定是否允许执行。
# 删除
未开始计划可点击“删除考核”,已归档计划可点击“删除”;进行中和已终止计划没有删除入口。确认后 index.vue 或 detail/index.vue 调用 DELETE /hrm/performance/plan/delete?id={id},后端删除计划以及所属运行数据;已归档计划的绩效档案也随之清理。

# 3.3 四步创建
# 新增 KPI 考核
在计划列表点击“新增”,进入 @/views/hrm/performance/plan/form/index.vue 的四步配置页。可以点击步骤标题定位,也可以使用“上一步”“下一步”逐项校验,最后点击“保存”调用 POST /hrm/performance/plan/create;创建结果直接是“未开始”,当前没有单独保存草稿。点击“返回”则退出配置页,不提交数据。
| 步骤 | 配置内容 | 关键规则 |
|---|---|---|
| ① 基础设置 | 周期、起止时间、考评范围 | 月度、季度、半年、全年需匹配自然周期;“其他”可自定义 |
| ② 指标设置 | 指标模板、指标制定方式 | 系统制定直接进入执行中;员工填写可开启目标确认 |
| ③ 流程设置 | 评分、审核、确认、申诉节点 | 评分权重合计 100%;审核、申诉各最多三级 |
| ④ 结果设置 | 结果模板、薪资衔接 | 同步薪资时必须选择 YYYY-MM 计薪月份 |
周期类型包括月度、季度、上半年、下半年、全年和其他。标准周期的起止日必须匹配对应自然周期;“其他”才允许填写自定义周期。
考评范围有两种主要选法:
- 直接选择员工或部门,部门范围包含其下员工。
- 按聘用形式和员工状态筛选;管理员在计划详情手工移除员工时,系统会把该员工写入排除范围。
处理人按以下规则解析:
| 类型 | 解析方式 |
|---|---|
| 上级 | 沿 hrm_employee.leader_employee_id 解析指定层级 |
| 部门负责人 | 读取 System 部门负责人账号,再找到其绑定的 HRM 员工 |
| 指定员工 | 直接保存选择的 hrm_employee.id |
| 被考核人 | 使用当前考核对应的员工,用于自评等节点 |
运行态保存的是 hrm_employee.id;启动计划时,系统校验所有必办处理员工已经绑定后台账号。评分人不能重复,评分阶段权重之和必须为 100%;员工自评阶段不能配置驳回。
# 修改 / 查看考核设置
未开始计划可在详情点击“编辑”,HrmPerformancePlanController 先通过 GET /hrm/performance/plan/get?id={id} 回显,保存时调用 PUT /hrm/performance/plan/update。进行中、已归档和已终止计划只能点击“查看考核设置”,以只读方式打开相同四步配置,不显示保存按钮。@/views/hrm/performance/plan/form/index.vue 的四步内容分别由 PerformancePlanBasicForm.vue、PerformancePlanIndicatorForm.vue、PerformancePlanProcessForm.vue 和 PerformancePlanResultForm.vue 承载,状态是否允许修改由前后端共同校验。

# 3.4 状态流转
计划状态为 2 未开始、3 进行中、4 已归档、5 已终止。当前创建接口直接创建“未开始”计划,不提供单独保存草稿。
计划状态
创建 ──→ 未开始(2) ──启动──→ 进行中(3) ──全员结束、归档──→ 已归档(4)
│
└────────终止────────→ 已终止(5)
未开始阶段可编辑、增减参评员工或删除。进行中计划依次由管理员执行“开启评分 → 发起绩效面谈 → 归档”;终止和归档都会保留已经产生的考核过程数据。
# 4. 管理端与员工端的分工
模板、计划、参评范围和计划生命周期全部由管理端维护。指标填写、目标确认、自评/他评、结果审核、结果确认和申诉处理,则由计划解析出的员工在 PC 员工端完成;拥有 HR 管理菜单并不会自动获得这些待办。
计划开启 sync_to_salary 后,只有已归档考核的绩效系数才会提供给指定计薪月份。该字段用于模块衔接,不表示薪资核算会自动把系数乘入工资项。