【绩效】绩效考核、绩效档案
绩效考核是绩效计划启动后的运行过程。管理端负责启动计划、开启评分、发起绩效面谈、监控进度和归档;员工端负责指标填写、目标确认、自评/他评、结果审核、结果确认和申诉。
绩效流程由 HRM 自己的阶段状态机实现,不复用 BPM。模板与计划配置详见 《【绩效】绩效模板、绩效计划》。运行态表和完整流程如下:
# 1. 员工考核
创建计划并确定参评范围时,每名员工会生成一条 hrm_performance_assessment。管理员启动计划后,系统再把计划快照物化为考核维度、指标和阶段,并激活第一个业务节点。
# 1.1 表结构
省略
creator/create_time/updater/update_time/deleted/tenant_id等通用字段。
CREATE TABLE `hrm_performance_assessment` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`plan_id` bigint NOT NULL COMMENT '绩效计划编号',
`employee_id` bigint NOT NULL COMMENT '被考核员工编号',
`status` tinyint DEFAULT '2' COMMENT '考核状态',
`process_status` tinyint DEFAULT '1' COMMENT '流程状态',
`stage_type` tinyint DEFAULT '0' COMMENT '当前阶段类型',
`stage_sort` int DEFAULT '0' COMMENT '当前阶段排序',
`score` decimal(10,2) DEFAULT '0.00' COMMENT '最终得分',
`result_level` varchar(64) DEFAULT NULL COMMENT '结果等级',
`coefficient` decimal(10,2) DEFAULT '1.00' COMMENT '绩效系数',
`target_confirmation_result` tinyint DEFAULT NULL COMMENT '目标确认结果',
`target_confirmation_comment` varchar(1000) DEFAULT NULL COMMENT '目标确认意见',
`target_confirmation_time` datetime DEFAULT NULL COMMENT '目标确认时间',
`self_comment` varchar(2000) DEFAULT NULL COMMENT '自评评语',
`reviewer_comment` varchar(2000) DEFAULT NULL COMMENT '他评评语',
`result_comment` varchar(2000) DEFAULT NULL COMMENT '结果评语',
`result_confirmation_time` datetime DEFAULT NULL COMMENT '结果确认时间',
`result_audit_status` tinyint DEFAULT NULL COMMENT '结果审核状态',
`result_audit_time` datetime DEFAULT NULL COMMENT '结果审核时间',
`result_audit_reason` varchar(1000) DEFAULT NULL COMMENT '结果审核原因',
`appeal_reason` varchar(1000) DEFAULT NULL COMMENT '申诉原因',
`appeal_file_urls` varchar(2000) DEFAULT NULL COMMENT '申诉附件',
`appeal_submit_time` datetime DEFAULT NULL COMMENT '申诉提交时间',
`appeal_status` tinyint DEFAULT '0' COMMENT '申诉状态',
`appeal_time` datetime DEFAULT NULL COMMENT '申诉处理时间',
`appeal_comment` varchar(1000) DEFAULT NULL COMMENT '申诉处理意见',
`archive_time` datetime DEFAULT NULL COMMENT '归档时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='HRM 员工绩效考核';
该表包含以下运行子表:
| 表 | 关联与用途 |
|---|---|
hrm_performance_assessment_dimension | 通过 assessment_id 保存计划指标维度快照 |
hrm_performance_assessment_quota | 通过 dimension_id 保存运行指标、目标值、实际值和汇总分 |
hrm_performance_assessment_stage | 保存每个流程节点、处理员工、权重、状态和截止时间 |
hrm_performance_assessment_quota_score | 保存某个评分阶段对某个指标的原始得分和评语 |
hrm_performance_assessment_action_record | 保存用户与系统动作,组成流程时间线 |
hrm_performance_assessment_appeal_record | 保存一次申诉选择重开的评分阶段 |
查看维度、指标、评分、动作和申诉表结构
以下建表语句原样取自 yudao-module-hrm/src/test/resources/sql/create_tables.sql,因此保留单元测试使用的 H2 兼容语法和公共字段。
CREATE TABLE IF NOT EXISTS "hrm_performance_assessment_dimension" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"assessment_id" bigint NOT NULL,
"name" varchar(255) NOT NULL,
"quota_type" tinyint DEFAULT NULL,
"weight" decimal(10, 2) DEFAULT NULL,
"remark" varchar(255) DEFAULT NULL,
"allow_edit" bit NOT NULL DEFAULT FALSE,
"sort" int NOT NULL DEFAULT 0,
"creator" varchar(64) DEFAULT '',
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar(64) DEFAULT '',
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint NOT NULL DEFAULT 0,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "hrm_performance_assessment_quota" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"assessment_id" bigint NOT NULL,
"dimension_id" bigint NOT NULL,
"preset" bit NOT NULL DEFAULT TRUE,
"name" varchar(255) DEFAULT NULL,
"description" varchar(1000) DEFAULT NULL,
"standard" varchar(1000) DEFAULT NULL,
"weight" decimal(10, 2) DEFAULT 100.00,
"score_type" tinyint DEFAULT NULL,
"target_value" varchar(1000) DEFAULT NULL,
"actual_value" varchar(1000) DEFAULT NULL,
"self_score" decimal(10, 2) DEFAULT 0.00,
"reviewer_score" decimal(10, 2) DEFAULT 0.00,
"final_score" decimal(10, 2) DEFAULT 0.00,
"sort" int DEFAULT 0,
"creator" varchar(64) DEFAULT '',
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar(64) DEFAULT '',
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint NOT NULL DEFAULT 0,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "hrm_performance_assessment_quota_score" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"assessment_stage_id" bigint NOT NULL,
"assessment_quota_id" bigint NOT NULL,
"score" decimal(10, 2) NOT NULL,
"comment" varchar(1000) DEFAULT NULL,
"creator" varchar(64) DEFAULT '',
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar(64) DEFAULT '',
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint NOT NULL DEFAULT 0,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "hrm_performance_assessment_action_record" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"assessment_id" bigint NOT NULL,
"stage_id" bigint DEFAULT NULL,
"employee_id" bigint DEFAULT NULL,
"type" tinyint NOT NULL,
"title" varchar(128) NOT NULL,
"content" varchar(2000) DEFAULT NULL,
"file_urls" varchar(2000) DEFAULT NULL,
"status" tinyint DEFAULT NULL,
"creator" varchar(64) DEFAULT '',
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar(64) DEFAULT '',
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint NOT NULL DEFAULT 0,
PRIMARY KEY ("id")
);
CREATE TABLE IF NOT EXISTS "hrm_performance_assessment_appeal_record" (
"id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
"assessment_id" bigint NOT NULL,
"stage_id" bigint NOT NULL,
"status" tinyint NOT NULL,
"creator" varchar(64) DEFAULT '',
"create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updater" varchar(64) DEFAULT '',
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
"deleted" bit NOT NULL DEFAULT FALSE,
"tenant_id" bigint NOT NULL DEFAULT 0,
PRIMARY KEY ("id")
);
① plan_id + employee_id 表达“某个计划中的某名员工”;处理人和被考核人均关联 hrm_employee.id,任务执行时再通过员工 userId 校验当前账号。
② quota_score 保存每级评分原始值,quota 保存自评、他评和最终汇总分;最终得分按“维度权重 × 指标权重 × 评分阶段权重”计算。
③ 归档不会复制到另一套档案表,只会更新计划与考核状态,并写入 archive_time。过程阶段、评分和动作记录继续保留。
# 1.2 阶段表结构
hrm_performance_assessment_stage 是考核流程的运行节点,每名参评员工都有自己的一组阶段:
CREATE TABLE `hrm_performance_assessment_stage` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`assessment_id` bigint NOT NULL COMMENT '员工考核编号',
`type` tinyint NOT NULL COMMENT '阶段类型',
`name` varchar(128) NOT NULL COMMENT '阶段名称',
`handler_employee_id` bigint DEFAULT NULL COMMENT '处理员工编号',
`rater_type` tinyint DEFAULT NULL COMMENT '评分人类型',
`weight` decimal(10,2) DEFAULT NULL COMMENT '评分权重',
`scoring_type` tinyint DEFAULT NULL COMMENT '评分方式',
`visible_content` tinyint DEFAULT NULL COMMENT '可见内容',
`required_setting` bit DEFAULT NULL COMMENT '是否必填评语',
`reject_authority` bit DEFAULT NULL COMMENT '是否允许驳回',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '状态',
`score` decimal(10,2) DEFAULT NULL COMMENT '阶段得分',
`result_level` varchar(64) DEFAULT NULL COMMENT '阶段等级',
`comment` varchar(2000) DEFAULT NULL COMMENT '评语',
`reject_reason` varchar(1000) DEFAULT NULL COMMENT '驳回原因',
`submit_time` datetime DEFAULT NULL COMMENT '提交时间',
`deadline_time` datetime DEFAULT NULL COMMENT '截止时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='HRM 绩效考核阶段';
handler_employee_id 关联 HRM 员工,而不是后台账号;系统据此判断任务归属。deadline_time 主要用于申诉确认节点的超时处理。
# 1.3 启动与阶段
启动计划时,系统依次创建维度和指标、解析流程节点处理人、校验必办处理人已绑定后台账号,并激活首个节点。任一必办人无法解析或未绑定账号,启动失败。
| 阶段值 | 阶段 | 主要处理人 |
|---|---|---|
1 | 员工填写 | 被考核员工 |
2 | 目标确认 | 上级、部门负责人或指定员工 |
3/4 | 自评/他人评分 | 本人或计划配置的评分员工 |
5 | 结果审核 | 计划配置的审核员工 |
6 | 结果确认 | 被考核员工 |
7 | 申诉确认 | 计划配置的申诉处理员工 |
9/10 | 执行中/结束 | 系统推进 |
考核主流程
员工填写(可选)→ 目标确认(可选)→ 执行中
│ 管理员开启评分
↓
自评/他评 → 结果审核(可选)→ 绩效面谈 → 结果确认(可选)→ 结束 → 归档
│
└──员工申诉──→ 申诉确认──→ 重开所选评分阶段/维持原结果
阶段状态包括未处理、待处理、处理中、已处理、已驳回和已申诉;主记录状态表达整份考核,不能与节点状态混用。
# 2. 管理端:运行监控与绩效档案
# 2.1 运行监控
管理员从 [HRM 人力资源 -> 绩效管理 -> KPI 考核] 进入计划详情。
# 查询参评员工
@/views/hrm/performance/plan/detail/index.vue 的“参评员工”页签展示当前阶段、处理人、分数和等级,可按姓名、工号或手机号、部门、聘用形式、员工状态、当前阶段和结果等级“搜索”或“重置”。列表由 HrmPerformanceAssessmentController 的 GET /hrm/performance/assessment/page 提供;页面同时调用 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};详情只展示当前运行数据,不提供代替员工填写、评分或审核的管理操作。
# 推进或终止计划
计划详情由 GET /hrm/performance/plan/get?id={id} 回显整体进度。全员进入执行中后才能点击“开启评分”,全员完成评分和审核后才能从“更多”点击“发起面谈”,全员结束后才能“归档”,分别提交 POST /hrm/performance/plan/open-scoring?id={id}、POST /hrm/performance/plan/start-interview?id={id} 和 POST /hrm/performance/plan/archive?id={id}。进行中计划也可以从“更多”点击“终止”,确认后调用 POST /hrm/performance/plan/terminate?id={id};HrmPerformancePlanController 会再次校验状态和进度,终止后保留已经产生的指标、评分、阶段和动作记录。
# 2.2 绩效档案
计划归档后,可从 [HRM 人力资源 -> 绩效管理 -> 绩效档案] 查询结果。
# 查询员工档案
@/views/hrm/performance/assessment/index.vue 按员工聚合展示最近考核计划、最近评分、最近等级和考核次数,可按员工姓名或工号“搜索”或“重置”。页面通过 GET /hrm/performance/assessment/archive-employee-page 查询归档员工,不会混入仍在运行或已终止的考核。
# 查看个人档案与单次考核
点击员工姓名进入 employee/index.vue,页面用 GET /hrm/performance/assessment/archive-page 查询该员工的历次归档考核,并用 GET /hrm/performance/assessment/archive-plan-simple-list 提供“考核计划”筛选项。点击考核方案名称进入 detail/index.vue,再调用 GET /hrm/performance/assessment/archive-get?id={id}、GET /hrm/performance/assessment/archive-process-record-list?id={id} 查看单次考核的指标得分与动作时间线。
# 删除员工全部档案
在绩效档案首页勾选一名或多名员工,点击“批量删除”并确认,index.vue 调用 DELETE /hrm/performance/assessment/archive-employee-delete?employeeIds={employeeIds}。该操作需要 hrm:performance:archive:delete 权限,会清理所选员工的全部归档考核,不影响其他员工,也不会处理仍在运行的计划。
# 删除单次档案 / 批量删除
进入个人档案后,可点击单行“删除”,或勾选多次考核后点击“批量删除”。确认后 employee/index.vue 调用 DELETE /hrm/performance/assessment/archive-delete?ids={ids};HrmPerformanceAssessmentController 只删除选中的归档记录,若该员工已无档案,页面返回档案首页。

# 3. 员工端:我的考核
对应 [HRM 人力资源 -> HRM 员工端 -> 绩效管理 -> KPI 考核] 菜单。一个账号即使拥有 HR 管理菜单,也只能处理 handler_employee_id 与账号绑定员工相匹配的任务;被考核人的结果确认和申诉同样按当前账号绑定员工校验。
# 查询六类任务
@/views/hrm/portal/performance/assessment/index.vue 组合 PerformanceTaskTabs.vue 和 PerformanceTaskTable.vue,提供指标填写、指标确认、指标评分、结果审核、结果确认、申诉确认六个页签,并按待办、已办或已申诉状态展示角标。页面先调用 HrmPortalPerformanceAssessmentController 的 GET /hrm/portal/performance/assessment/task-count 统计数量,再根据页签调用以下分页接口;关键字可匹配姓名、工号或考核名称,切换页签或状态后重新查询。
| 任务页签 | 分页接口 |
|---|---|
| 指标填写 | GET /hrm/portal/performance/assessment/fill-quota-task-page |
| 指标确认 | GET /hrm/portal/performance/assessment/target-confirmation-task-page |
| 指标评分 | GET /hrm/portal/performance/assessment/review-task-page |
| 结果审核 | GET /hrm/portal/performance/assessment/result-audit-task-page |
| 结果确认 | GET /hrm/portal/performance/assessment/result-confirmation-task-page |
| 申诉确认 | GET /hrm/portal/performance/assessment/appeal-task-page |
# 制定指标
在“指标填写 -> 待填写”中点击“制定指标”,打开 review/PerformanceQuotaForm.vue。员工只能在 allow_edit=true 的维度新增、修改或删除指标,并必须补足该维度剩余权重;提交后调用 PUT /hrm/portal/performance/assessment/fill-quota。未开启目标确认的考核直接进入执行中,已开启目标确认的考核则激活配置的确认节点;已填写页签仅提供“详情”,不能再次提交。
# 确认指标
在“指标确认 -> 待确认”中点击“去确认”,打开 process/PerformanceTargetConfirmForm.vue。处理人可点击“确认通过”,也可填写必填原因后点击“退回指标”;表单向 PUT /hrm/portal/performance/assessment/confirm-target 提交通过标记和意见。通过后进入后续阶段,退回后重新激活被考核人的指标填写任务;已确认页签只提供“查看”。
# 指标评分
在“指标评分 -> 待评分”中点击“去评分”,打开 review/PerformanceReviewForm.vue,填写每项分数和按配置要求填写评语。输入变化时调用 POST /hrm/portal/performance/assessment/score-preview,把已完成阶段与当前未提交分数合并试算;只有评分数据齐备时才展示最终等级。点击“提交评分”后调用 PUT /hrm/portal/performance/assessment/score,每个指标写入当前阶段的 hrm_performance_assessment_quota_score。
当前评分节点配置了驳回权限时,抽屉还显示“驳回上一阶段”;填写原因并确认后调用 PUT /hrm/portal/performance/assessment/reject-review-stage,重开上一已完成评分阶段并删除该阶段的指标评分。已评分页签只提供“查看”。
# 审核结果
全部评分完成后,计划开启了结果审核的考核会进入“结果审核”。处理人在待审核页签点击“去审核”,打开 process/PerformanceHandleForm.vue;选择通过会继续下一级或后续流程,选择驳回时必须勾选需要重开的评分节点。确认后调用 PUT /hrm/portal/performance/assessment/handle-result-audit,只重开选中的评分阶段,不会清空其他已完成评分。
# 确认结果 / 提交申诉
管理员发起绩效面谈后,开启结果确认的考核会出现在“结果确认 -> 待确认结果”。员工接受结果时点击“确认结果”并二次确认,PerformanceTaskTable.vue 调用 PUT /hrm/portal/performance/assessment/confirm-result;不同意且当前没有处理中申诉时点击“提交申诉”,在 process/PerformanceAppealForm.vue 填写必填原因、选择希望重开的评分阶段并按需上传附件,再调用 PUT /hrm/portal/performance/assessment/submit-appeal。提交后记录转入“已申诉”,不能重复发起处理中申诉。
# 确认申诉
申诉处理人在“申诉确认 -> 待确认”中点击“去确认”,打开 process/PerformanceHandleForm.vue。点击通过或驳回并确认后,表单调用 PUT /hrm/portal/performance/assessment/handle-appeal:中间级通过会流转到下一级,最终通过会清空最终得分、等级和系数并重开员工选择的评分阶段,任一级驳回则维持原结果并结束考核。已确认页签只提供“查看”。
# 查看考核详情
指标填写、结果确认的记录始终提供“详情”;指标确认、指标评分、结果审核和申诉确认在待办状态只显示对应的“去确认 / 去评分 / 去审核”处理按钮,进入已办后才显示“查看”。点击“详情”或“查看”时打开 detail/index.vue,通过 GET /hrm/portal/performance/assessment/get?id={id}&stageId={stageId} 查询与当前任务相匹配的考核、指标和阶段,再用 GET /hrm/portal/performance/assessment/process-record-list?id={id}&stageId={stageId} 展示流程时间线;详情本身只读。

# 4. 员工端:我的绩效档案
对应 [HRM 人力资源 -> HRM 员工端 -> 绩效管理 -> 我的绩效档案] 菜单。该页面只读,不提供删除、修改或查询其他员工档案的操作。
# 查询本人档案
计划归档后,@/views/hrm/portal/performance/assessment/history/index.vue 可按考核名称“搜索”或“重置”,展示本人的计划周期、最终得分、等级、绩效系数和归档时间。页面调用 GET /hrm/portal/performance/assessment/page,HrmPortalPerformanceAssessmentController 按当前账号绑定员工限制数据范围。
# 查看考核详情
点击“查看”进入 detail/index.vue,通过 GET /hrm/portal/performance/assessment/get?id={id} 查询指标与评分结果,并通过 GET /hrm/portal/performance/assessment/process-record-list?id={id} 加载共用的 PerformanceProcessRecordTimeline.vue 流程时间线。详情不会显示管理端的删除按钮或员工任务处理按钮。

# 5. 定时任务与薪资衔接
HrmPerformanceAppealTimeoutJob 处理已超过 deadline_time 的申诉节点,按计划配置自动通过或自动拒绝,并写入动作记录。Job 本身不硬编码执行周期,需要在平台“定时任务”中配置。
计划开启同步薪资并设置 paid_for_month 后,薪资模块只读取已归档考核的绩效系数;同一员工同月命中多个计划时,取最新归档记录。当前系数作为衔接数据提供,不会自动乘入月工资的工资项。