【绩效】绩效模板、绩效计划
绩效模板与计划模块,由 yudao-module-hrm 后端模块的 performance.config、performance.plan 包实现,前端实现在 @/views/hrm/performance/config 和 @/views/hrm/performance/plan 目录。
本文解决的是「考什么、谁来评分、如何确认结果」:管理端先维护考核指标模板和结果模板,再通过四步表单创建绩效计划并确定参评范围。计划启动后的员工任务与绩效档案,详见 《【绩效】绩效考核、绩效档案》。
- 考核指标模板:可复用的维度与指标,例如「业绩指标 60% + 行为态度 40%」。
- 结果模板:把最终得分映射为等级和绩效系数,例如 A、B、C 三档。
- 绩效计划:配置聚合根,把两类模板复制成计划快照,模板后续变化不影响已创建的计划。
本文涉及表如下图所示:
# 1. 考核指标模板
考核指标模板,由 HrmPerformanceAssessmentTemplateController 提供接口(/hrm/performance/assessment-template)。维度、指标以内嵌 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 中每个维度保存名称、类型(HrmPerformanceQuotaTypeEnum:1 业绩指标、2 行为态度指标)、权重、是否允许员工编辑和指标列表;每个指标保存名称、说明、评分标准、权重和评分类型,显示顺序由指标在 JSON 数组中的先后决定。
② 权重规则:所有维度权重之和必须为 100%。不允许员工编辑的维度,其预置指标权重也必须为 100%;允许员工编辑时,可将剩余权重留给员工填写。
③ score_calculation 计分方式(HrmPerformanceScoreCalculationEnum,字典 hrm_performance_score_calculation)当前仅支持「加权计算」;upper_limit_type 分数上限类型(HrmPerformanceUpperLimitTypeEnum,字典 hrm_performance_upper_limit_type)当前仅支持「统一上限」。
④ dimension_count、quota_count 是列表展示用的冗余计数,保存时按 dimensions 自动汇总。
dimensions JSON 字段结构
[
{
"name": "业绩指标",
"quotaType": 1,
"weight": 70.00,
"remark": "由 HR 预置,员工不可改",
"allowEdit": false,
"quotas": [
{
"name": "季度销售额",
"illustrate": "本季度签约合同金额",
"standard": "达成 100 万得满分,每少 10 万扣 10 分",
"weight": 60.00,
"scoreType": 1
},
{
"name": "回款率",
"illustrate": "已回款金额 / 签约金额",
"standard": "90% 以上得满分",
"weight": 40.00,
"scoreType": 1
}
]
},
{
"name": "行为态度指标",
"quotaType": 2,
"weight": 30.00,
"remark": "员工自行补充",
"allowEdit": true,
"quotas": []
}
]
① quotaType 指标类型(HrmPerformanceQuotaTypeEnum):1 业绩指标、2 行为态度指标;scoreType 评分类型(HrmPerformanceQuotaScoreTypeEnum)。
② weight 在两层各自校验:维度权重之和为 100,维度内指标权重之和也要凑满 100。allowEdit = true 的维度可以只预置部分指标,剩余权重留给员工在「制定指标」时补足。
③ 指标的展示顺序就是 quotas 数组顺序,没有单独的排序字段。
这些配置没有独立编号和生命周期,由 HrmPerformanceAssessmentTemplateDO 的内嵌对象承载,随模板一次提交、整体保存。
模板的版本化修改
模板的「修改」不是覆盖原记录,而是把旧记录停用(status),再插入一条新记录。
因此已创建的绩效计划继续使用原模板编号和自己的配置快照,不会被新版本改写;也正因如此,被计划引用的模板版本不允许删除。
# 1.2 管理后台
对应 [HRM 人力资源 -> 绩效管理 -> KPI 考核设置 -> 考核指标模板] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/hrm/performance/config/assessment-template 目录。
# 列表
展示模板名称、维度数、指标数、创建人和创建时间,可按模板名称筛选。

# 新增
通过弹窗 PerformanceAssessmentTemplateForm.vue 完成,内部由 PerformanceAssessmentConfigEditor.vue 编排考核维度和维度下的指标项。保存前会校验维度和指标权重是否满足 100% 的要求。

# 修改
弹窗结构与新增相同。如上文所述,保存时实际是「停用旧版本 + 生成新版本」,已创建的 KPI 考核继续使用原模板快照。
# 删除
支持单条删除和批量删除。后端会先检查 hrm_performance_plan.assessment_template_id:模板已被计划引用时拒绝删除,未引用时才完成逻辑删除。
# 2. 结果模板
结果模板,由 HrmPerformanceResultTemplateController 提供接口(/hrm/performance/result-template)。它与指标模板一样采用版本化修改,被计划引用的版本不能删除。
# 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。
levels JSON 字段结构
[
{ "name": "S", "minScore": 90.00, "maxScore": 100.00, "coefficient": 1.50 },
{ "name": "A", "minScore": 80.00, "maxScore": 90.00, "coefficient": 1.20 },
{ "name": "B", "minScore": 60.00, "maxScore": 80.00, "coefficient": 1.00 },
{ "name": "C", "minScore": 0.00, "maxScore": 60.00, "coefficient": 0.80 }
]
coefficient 绩效系数是绩效模块输出给薪资模块的唯一数值:考核归档后,薪资侧按计薪月份读取该系数,详见 《【薪资】月度工资、工资条》。
# 2.2 管理后台
对应 [HRM 人力资源 -> 绩效管理 -> KPI 考核设置 -> 考核结果设置] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/hrm/performance/config/result-template 目录。
# 列表
展示模板名称、结果等级、创建人和创建时间,可按模板名称筛选。

# 新增与修改
通过弹窗 PerformanceResultTemplateForm.vue 完成,其中 PerformanceResultLevelForm.vue 用于新增、修改和删除等级行。保存时校验等级区间连续覆盖 0~100。
结果模板修改同样生成新版本并停用旧版本,不会改变已创建计划保存的结果快照。

# 删除
支持单条删除和批量删除。已被 KPI 考核引用的版本不能删除,避免历史等级和绩效系数失去来源。
# 3. 绩效计划
绩效计划,由 HrmPerformancePlanController 提供接口(/hrm/performance/plan)。它是配置聚合根:保存两类模板的来源编号,同时把指标、结果、考评范围和流程复制成计划快照。
# 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 绩效计划';
① 枚举 cycle_type 周期类型(HrmPerformanceCycleTypeEnum):1 月度、2 季度、3 上半年、4 下半年、5 全年、6 其他。标准周期的起止日必须匹配对应自然周期,只有「其他」才允许自定义。季度周期额外使用 quarter(HrmPerformanceQuarterEnum)。
② scopes 考评范围(范围类型见 HrmPerformancePlanScopeTypeEnum):1 员工 / 部门、2 聘用形式 / 员工状态、3 排除员工。系统按范围生成 hrm_performance_assessment 参评员工记录;管理员手工移除员工时,会把该员工写入排除范围,避免按条件重新命中。
scopes JSON 字段结构
[
{
"type": 1,
"deptIds": [101, 102],
"employeeIds": [2001]
},
{
"type": 2,
"employeeType": 1,
"employeeStatuses": [2, 3]
},
{
"type": 3,
"employeeIds": [2008]
}
]
① 三种类型是并集加排除的关系:类型 1、2 命中的员工取并集,再减去类型 3 的排除员工。
② employeeType 聘用形式、employeeStatuses 员工状态分别对应员工模块的 HrmEmployeeTypeEnum 和 HrmEmployeeEntryStatusEnum,详见 《【员工】员工管理》。
③ assessment_config、result_config 是计划实际运行依据,assessment_template_id、result_template_id 只保留来源关系。
④ 枚举 quota_setting_type 指标制定方式(HrmPerformanceQuotaSettingTypeEnum):1 系统制定(直接进入执行中)、2 员工填写(可开启目标确认)。
⑤ target_confirmation_stage、review_stages、result_audit_stages、appeal_stages 都是内嵌流程配置,计划启动后才为每名员工解析为实际阶段和处理人。
四个字段都用同一个处理人结构描述「谁来处理这个节点」:type 处理人类型(HrmPerformanceRaterTypeEnum)1 上级、2 部门负责人、3 指定评分人、4 被考核人;level 表示第几级上级;type = 3 时用 employeeId 指定具体员工。它们没有独立编号和生命周期,由 HrmPerformancePlanDO 的内嵌对象承载,随计划一次提交、整体保存。下面逐个展开:
target_confirmation_stage(目标确认节点):员工提交指标后,由谁确认。
target_confirmation_stage JSON 字段结构
不同于其余三个字段,目标确认只有一级,因此是单个对象而非数组:
{ "type": 1, "level": 1 }
示例表示由被考核人的直属上级确认。只有 target_confirmation = true 时该字段才有值;确认人退回后,被考核人的指标填写任务会被重新激活。
review_stages(评分节点):谁来评分、各占多少权重。
review_stages JSON 字段结构
[
{
"name": "员工自评",
"rater": { "type": 4 },
"weight": 30.00,
"scoringType": 1,
"visibleContent": 1,
"requiredSetting": true,
"rejectAuthority": false
},
{
"name": "上级评分",
"rater": { "type": 1, "level": 1 },
"weight": 70.00,
"scoringType": 1,
"visibleContent": 2,
"requiredSetting": true,
"rejectAuthority": true
}
]
① 处理人放在 rater 里,其余字段描述这一轮评分的规则。数组顺序就是评分顺序,weight 之和必须为 100,最终得分按各节点权重加权。
② scoringType 评分方式(HrmPerformanceReviewScoringTypeEnum)当前仅支持按指标评分;requiredSetting 控制评语是否必填。
③ visibleContent 可见内容(HrmPerformanceReviewVisibleContentEnum):1 仅自己的评分和评语、2 所有人的评分和评语。
④ rejectAuthority = true 时,该节点的处理人可以驳回上一已完成评分阶段,并清空那一阶段的指标评分。
result_audit_stages(结果审核节点):评分完成后的多级审核。
result_audit_stages JSON 字段结构
[
{ "type": 1, "level": 1 },
{ "type": 1, "level": 2 }
]
数组按顺序形成多级审核,示例表示先由直属上级审核、再由二级上级审核。只有 result_audit = true 时该字段才有值;审核驳回时需要勾选要重开的评分节点,不会清空其他已完成评分。
appeal_stages(申诉节点):员工提交申诉后的多级处理。
appeal_stages JSON 字段结构
[
{ "type": 1, "level": 1 },
{ "type": 3, "employeeId": 2001 }
]
同样按数组顺序形成多级处理,示例表示先由直属上级处理,再交给指定的 HR 员工。中间级通过会流转到下一级,最终一级通过才会重置得分并重开评分阶段;任一级驳回则维持原结果。超过 appeal_timeout_days 未处理时,按 appeal_timeout_action 由定时任务自动处理。
⑥ 枚举 appeal_timeout_action 申诉超时动作(HrmPerformanceAppealTimeoutActionEnum):1 自动拒绝、2 自动通过。超过 appeal_timeout_days 后由 HrmPerformanceAppealTimeoutJob 执行。
⑦ 枚举 operation_type 下一操作(HrmPerformancePlanOperationTypeEnum):1 开启评分、2 发起绩效面谈、3 归档。列表据此决定主操作按钮。
⑧ 枚举 status 计划状态(HrmPerformancePlanStatusEnum),对应字典 hrm_performance_plan_status。详见 §3.2 状态流转。
# 3.2 状态流转
计划生命周期由 HrmPerformancePlanServiceImpl 控制。状态枚举 HrmPerformancePlanStatusEnum:
| 状态值 | 枚举 | 说明 | 可执行操作 |
|---|---|---|---|
| 1 | DRAFT | 草稿 | —(当前创建接口不产生草稿) |
| 2 | NOT_STARTED | 未开始 | 编辑、增减参评员工、启动、删除 |
| 3 | RUNNING | 进行中 | 开启评分、发起绩效面谈、归档、终止 |
| 4 | ARCHIVED | 已归档 | 查看考核设置、删除 |
| 5 | TERMINATED | 已终止 | 查看考核设置 |
状态流转说明
创建 ──→ 未开始(2) ──启动──→ 进行中(3) ──全员结束、归档──→ 已归档(4)
│
└────────终止────────→ 已终止(5)
- 创建(
createPerformancePlan):四步表单保存后直接创建「未开始」计划,当前没有单独保存草稿的入口。 - 增减参评员工(
addPerformancePlanEmployees/removePerformancePlanEmployees):仅未开始计划可维护。被移除员工会写入计划的排除范围。 - 启动(
startPerformancePlan):校验参评范围、流程配置和所有必办处理员工的账号绑定,然后生成维度、指标和运行节点,并激活第一个业务节点。任一必办人无法解析或未绑定后台账号时,计划保持未开始并返回明确错误。 - 开启评分(
openPerformancePlanScoring):全部员工进入执行中后才可执行,系统激活首个评分节点。 - 发起绩效面谈(
startPerformancePlanInterview):全员完成评分与结果审核后才可执行,按计划配置激活员工结果确认或直接推进结束。 - 归档(
archivePerformancePlan):全员考核结束后执行,计划和员工考核变为已归档并写入归档时间。 - 终止(
terminatePerformancePlan):进行中计划随时可终止。终止后不再推进流程,但已经产生的指标、评分、阶段和动作记录继续保留。 - 删除(
deletePerformancePlan):仅未开始或已归档可删;已归档计划删除时,其绩效档案也随之清理。进行中和已终止计划没有删除入口。
# 3.3 四步创建
在计划列表点击【新增】,进入 @/views/hrm/performance/plan/form/index.vue 的四步配置页。可以点击步骤标题定位,也可以使用【上一步】【下一步】逐项校验,最后点击【保存】提交。
| 步骤 | 配置内容 | 承载组件 | 关键规则 |
|---|---|---|---|
| ① 基础设置 | 周期、起止时间、考评范围 | PerformancePlanBasicForm.vue | 月度、季度、半年、全年需匹配自然周期;「其他」可自定义 |
| ② 指标设置 | 指标模板、指标制定方式 | PerformancePlanIndicatorForm.vue | 系统制定直接进入执行中;员工填写可开启目标确认 |
| ③ 流程设置 | 评分、审核、确认、申诉节点 | PerformancePlanProcessForm.vue | 评分权重合计 100%;审核、申诉各最多三级 |
| ④ 结果设置 | 结果模板、薪资衔接 | PerformancePlanResultForm.vue | 同步薪资时必须选择 YYYY-MM 计薪月份 |

# 考评范围
考评范围有两种主要选法,可以叠加使用:
- 直接选择员工或部门,部门范围包含其下员工。
- 按聘用形式和员工状态筛选。管理员在计划详情手工移除员工时,系统会把该员工写入排除范围。

# 处理人解析
流程节点上配置的是「处理人类型」,运行态保存的才是具体的 hrm_employee.id。类型见 HrmPerformanceRaterTypeEnum:
| 值 | 枚举 | 类型 | 解析方式 |
|---|---|---|---|
| 1 | SUPERIOR | 上级 | 沿 hrm_employee.leader_employee_id 解析指定层级 |
| 2 | DEPT_LEADER | 部门负责人 | 读取 System 部门负责人账号,再找到其绑定的 HRM 员工 |
| 3 | SPECIFIED | 指定评分人 | 直接保存选择的 hrm_employee.id |
| 4 | SELF | 被考核人 | 使用当前考核对应的员工,用于自评等节点 |
评分节点还需配置评分方式(HrmPerformanceReviewScoringTypeEnum,当前为「按指标评分」)和可见内容(HrmPerformanceReviewVisibleContentEnum:1 仅自己的评分和评语、2 所有人的评分和评语)。
⚠️ 注意:评分人不能重复,评分阶段权重之和必须为 100%;员工自评阶段不能配置驳回。启动计划时,系统会再次校验所有必办处理员工已经绑定后台账号。

# 3.4 管理后台
对应 [HRM 人力资源 -> 绩效管理 -> KPI 考核] 菜单,对应 yudao-ui-admin-vue3 项目的 @/views/hrm/performance/plan 目录。
# 列表
可按计划名称筛选,并按未开始、进行中、已归档、已终止展示页签及数量。阶段人数随列表数据一起返回。

# 详情
点击计划名称进入 plan/detail/index.vue,包含「详细资料」「参评员工」和「操作日志」三个页签,并展示阶段与等级统计。点击参评员工姓名可跳转到该员工的考核详情。

# 维护参评员工
只有未开始计划可以维护参评员工。 在详情的「参评员工」页签点击【添加员工】,PerformancePlanAssessmentAddForm.vue 会先排除已加入员工;勾选员工点击【移除员工】即可移出,同时写入计划排除范围。

# 启动
未开始计划在列表点击【检查并开启考核】,会先进入详情的参评员工页签;核对后点击详情顶部【启动】并二次确认。
# 开启评分、发起绩效面谈与归档
三个操作按顺序解锁:全员进入执行中后显示【开始评分】,全员完成评分与审核后显示【发起绩效面谈】,全员考核结束后显示【归档】。前置条件未满足时按钮不显示,后端仍会再次校验。
# 修改与查看考核设置
未开始计划可在详情点击【编辑】,重新打开四步配置页保存。进行中、已归档和已终止计划只能点击【查看考核设置】,以只读方式打开相同的四步页面,不显示保存按钮。
# 终止与删除
进行中计划可从【更多】点击【终止考核】;未开始计划可点击【删除考核】,已归档计划可点击【删除】。
# 4. 管理端与员工端的分工
模板、计划、参评范围和计划生命周期全部由管理端维护。指标填写、目标确认、自评 / 他评、结果审核、结果确认和申诉处理,则由计划解析出的员工在 PC 员工端完成。
拥有 HR 菜单 ≠ 拥有绩效待办
绩效任务按 handler_employee_id 与账号绑定员工是否匹配来判断归属。一个账号即使拥有 HR 管理菜单,也只能处理属于自己的任务,详见 《【绩效】绩效考核、绩效档案》。
计划开启 sync_to_salary 后,只有已归档考核的绩效系数才会提供给指定的计薪月份。该字段用于模块衔接,不表示薪资核算会自动把系数乘入工资项。