SpringBoot+Vue3 绩效驾驶舱设计:8项KPI、4类风险,把平均分升级为完成率与堵点名单
🌐 演示地址:https://ruoyioffice.com | 📦 源码1·GitHub:ruoyi-office | 📦 源码2·GitCode:ruoyi-office | 📦 源码3·Gitee:ruoyi-office | 💬 微信:17156169080(备注「RuoYi Office」)
管理者真正关心的并不是“这批人的平均分是多少”,而是“考核完成了多少、卡在哪个阶段、哪些部门落后、哪些人需要马上处理”。RuoYi Office 的绩效驾驶舱用 3 级筛选、8 项 KPI、4 类统计视图、4 类风险名单和 3 种业务下钻,把静态结果汇总做成可行动的过程管理入口。

▲ 绩效驾驶舱全景:公司/部门/批次筛选统一限定统计口径,8 项 KPI 给出管理摘要,阶段漏斗与 3 类分布图定位堵点,4 类风险名单通过 bizId/bizType 下钻到计划、评价单或结果详情。
引言:为什么“平均分 82.6”不能指导管理动作?
平均分是结果指标,但它不能回答过程问题。 一家有多个公司、十几个部门的企业进入季度考核后,管理者通常会遇到四种追问:
- 完成率到底多少:100 人参评,完成 80 人和完成 30 人,即使平均分相同,管理风险完全不同。
- 流程卡在哪里:目标确认、自评、上级评审、HR 校准、结果确认,任何阶段都可能形成积压。
- 风险具体是谁:看到“逾期 12 项”还不够,必须能定位员工、部门、批次、环节和业务单据。
- 低分是否具有连续性:单期低分可能是波动,连续多期低于阈值才更值得管理者关注。
传统统计页往往只展示批次数、参与人数、平均分和金额合计。 这些数字适合汇报,却不适合催办和干预。
| 管理问题 | 只看平均分的盲区 | 驾驶舱给出的答案 |
|---|---|---|
| 本轮考核是否按计划推进 | 看不到已完成/总数 | 完成率 + 考核单总数/完成数 |
| 哪个环节最堵 | 看不到状态分布 | 7 阶段漏斗 |
| 哪个部门落后 | 缺少横向比较 | 部门完成率排序 |
| 哪些批次异常 | 不同批次混在一起 | 批次完成率对比 |
| 谁需要立即处理 | 汇总数字无法定位人员 | 4 类风险名单 |
| 点击后去哪处理 | 统计页与业务页割裂 | bizType + bizId 下钻 |
下面所有能力边界均以当前产品实现为准。 本文不会把规则统计包装成预测模型,也不会虚构自动发消息或人才九宫格。
一、业务升级:从“结果报表”到“行动驾驶舱”
1.1 驾驶舱不是大屏,而是管理动作入口
绩效驾驶舱是一个面向管理者的聚合视图,用于把考核过程、完成质量和风险对象放进同一统计口径。 它的价值不在于图表多,而在于每个数字都能回答一个管理问题。 本次设计形成一条清晰链路:
公司 / 部门 / 批次
↓
8 项 KPI 摘要
↓
阶段漏斗 + 部门完成率 + 等级分布 + 批次完成率
↓
逾期 / 未填报 / 连续低分 / 申诉积压
↓
计划详情 / 评价单详情 / 结果详情筛选决定“看哪一块组织、哪几批考核”。 KPI 决定“问题是否严重”。 图表决定“问题集中在哪里”。 风险名单决定“下一步处理谁”。 业务下钻决定“管理动作在哪里完成”。
1.2 三层信息密度
驾驶舱把信息分成摘要、诊断、行动三层。
| 层级 | 页面内容 | 管理用途 | 是否可直接行动 |
|---|---|---|---|
| 摘要层 | 8 项 KPI | 快速判断总体进度与风险规模 | 间接 |
| 诊断层 | 漏斗、部门/等级/批次图表 | 定位堵点与结构异常 | 间接 |
| 行动层 | 4 类风险名单 | 找到具体员工和业务环节 | 是 |
这种层次避免了把几十个指标平铺在同一屏。 管理者先看摘要,再看分布,最后进入名单。
1.3 风险预警是规则识别,不是黑盒预测
当前实现采用确定性业务规则。 每一条风险都有可解释的触发条件和来源数据。
| 风险类型 | 接口字段 | 触发逻辑 | 主要来源 |
|---|---|---|---|
| 逾期未办 | overdue | 当前日期晚于对应截止日且环节未完成 | 计划、评价单、批次日期 |
| 未填报 | unfilled | 目标待确认,或评价单仍待自评 | 计划、评价单 |
| 连续低分 | consecutiveLowScore | 最近连续 N 期得分均低于阈值 | 绩效结果 |
| 申诉积压 | appeals | 评价单处于申诉处理中状态 | 评价单 |
规则可复核,是这套设计的重要边界。 它没有预测某人未来会离职,也没有自动给员工贴人才标签。
二、统计口径:先把“看谁、看哪批”说清楚
2.1 公司、部门、批次三级筛选
驾驶舱支持按公司、部门和多个考核批次筛选。 前端公司变化时会重新加载该公司下的部门树,并清理不再有效的部门值。 后端则在计划、评价单、结果三类查询中同步应用 companyId 与 deptId。 这意味着 KPI、图表和风险名单使用同一组织口径,不会出现“卡片看全公司、名单只看某部门”的错位。 批次筛选支持多选。 前端把 periodIds 转为逗号分隔的 periodIdStr 传给 GET 接口。 后端同时兼容列表参数和逗号字符串,并用 LinkedHashSet 去重。
2.2 未选批次时的默认范围
用户未选择考核批次时,后端不是查询全部历史数据。 默认范围是:
- 状态在 1 到 4 的进行中批次;
- 再补充最近 3 个状态大于等于 5 的已出结果批次。
这个默认值兼顾当前过程和近期趋势。 它也避免全历史扫描造成页面信息过载。 批次下拉选项最多返回 30 条状态有效的记录。
2.3 低分阈值与连续期数
请求对象暴露两个风险参数:
lowScoreThreshold:连续低分阈值,默认 70;consecutivePeriodCount:连续期数,默认 3,若传入小于 2 的值也回退为 3。
当前前端开放了低分阈值输入框。 连续期数在页面请求中固定传 3。 因此当前用户可直接调整“多少分算低分”,而“连续多少期”暂按 3 期执行。
| 参数 | 后端默认值 | 当前前端行为 | 作用 |
|---|---|---|---|
| 公司 | 空 | 下拉可清空 | 限定组织 |
| 部门 | 空 | 随公司联动 | 限定部门 |
| 批次 | 进行中 + 近 3 个已出结果 | 多选 | 限定时间范围 |
| 低分阈值 | 70 | 可输入 0~100 | 连续低分判断 |
| 连续期数 | 3 | 固定传 3 | 最近连续期判断 |
三、8 项 KPI:不只看分数,更看进度和风险
3.1 8 项指标的真实含义
响应对象 Kpis 定义了 8 个字段。 其中页面用 6 张卡片展示,完成率卡片同时显示“完成数/总数”,因此 8 个统计量都进入了管理视野。
| KPI | 字段 | 计算口径 | 管理意义 |
|---|---|---|---|
| 活动批次数 | activePeriodCount | 状态 1~4 的批次数 | 当前并行推进规模 |
| 完成率 | completionRate | 完成单数 / 考核单总数 × 100% | 总体进度 |
| 逾期数 | overdueCount | 逾期风险项数量 | 紧急待办规模 |
| 风险人数 | riskPeopleCount | 逾期、连续低分、申诉人员去重 | 需要关注的人数 |
| 平均分 | averageScore | 有分结果的算术平均值 | 结果水平参考 |
| 申诉数 | appealCount | 申诉处理中评价单数量 | 异议积压程度 |
| 考核单总数 | billTotal | 筛选范围内评价单数 | 完成率分母 |
| 考核单完成数 | billFinished | 状态 50 或 64 的评价单数 | 完成率分子 |
这里有两个容易误读的细节。 第一,完成的判断包含正常完成状态 50 和申诉完成状态 64。 第二,风险人数不是四类风险的简单相加。 它只对逾期、连续低分和申诉人员做去重;仅“未填报但未逾期”的人员不会计入风险人数。
3.2 完成率为什么比参与人数更重要
参与人数只能说明覆盖规模。 完成率能够说明过程质量。 例如两个部门都有 50 人参评:
- A 部门完成 45 人,完成率 90%;
- B 部门完成 20 人,完成率 40%。
若只看参与人数,两者完全相同。 驾驶舱按评价单终态计算完成率,能直接暴露推进差异。 完成率保留 1 位小数,采用 HALF_UP。
3.3 平均分保留,但不让它垄断决策
平均分仍然有价值。 它来自筛选范围内 score 非空的绩效结果,保留 2 位小数。 但平均分只是 8 项指标之一。 页面同时把完成率、逾期、风险人数和申诉放在同一行,迫使管理视角从“分高不高”扩展到“过程顺不顺”。

▲ 绩效驾驶舱首屏:顶部按公司、部门、批次和低分阈值统一筛选;KPI 区突出进行中批次、完成率、逾期待办、风险人数、平均得分和申诉中,风险预警区直接列出当前需处理人员。
四、4 类分析视图:从总量定位结构性堵点
4.1 阶段漏斗:7 个节点看考核停在哪里
阶段漏斗不是传统营销漏斗,而是绩效流程状态计数。 后端按计划和评价单状态组装 7 个节点:
目标待确认
目标已确认
待自评
待评审
待校准
待结果确认
已完成“目标待确认”和“目标已确认”来自绩效计划。 其余节点来自评价单。 前端目前用柱状图展示,横轴是阶段,纵轴是人数。 这样能快速判断积压主要发生在员工、主管、HR 还是结果确认环节。
4.2 部门完成率:按低完成率优先暴露
部门完成率以评价单为基础。 后端按 deptId + deptName 分组,分别统计总数、完成数与完成率。 没有部门的数据统一归入“未分配部门”。 后端列表按完成率升序排列。 前端反转后绘制横向条形图,以适配图表阅读方向。 工具提示同时展示百分比和 完成数/总数,避免小样本部门仅凭百分比产生误判。
4.3 等级分布:看结果结构,不做人才九宫格
等级分布来源于绩效结果的 level 字段。 未定级结果统一归入“未定级”。 前端以环形饼图展示等级名称、人数和占比。 它用于观察 S/A/B/C/D 等级结构。 当前实现没有绩效—潜力双轴,也没有人才九宫格。
4.4 批次完成率:比较不同考核周期的推进质量
批次完成率按每个筛选批次统计评价单总数、完成数和完成率。 前端以纵向柱状图对比。 该视图适合回答:
- 当前季度是否比上季度推进更慢;
- 某个月度批次是否长期未收尾;
- 多个并行批次中哪个最需要催办。
四类分析视图各自解决不同问题。
| 视图 | 数据维度 | 最适合回答的问题 |
|---|---|---|
| 阶段漏斗 | 流程节点 | 卡在哪一步 |
| 部门完成率 | 组织部门 | 哪个部门落后 |
| 等级分布 | 绩效等级 | 结果结构如何 |
| 批次完成率 | 考核批次 | 哪一批推进异常 |
五、4 类风险名单:规则、边界与下钻对象
5.1 逾期未办:截止日之后仍停在当前环节
逾期判断统一使用 today.isAfter(deadline)。 也就是说,到期日当天不算逾期,从下一天开始进入风险。 不同阶段对应不同日期:
| 当前阶段 | 对比日期 | 风险备注示例 |
|---|---|---|
| 目标待确认 | 批次开始日 | 已超过批次开始日 |
| 待自评 | 自评截止日 | 已超过自评截止日 |
| 待上级评 | 评审截止日 | 已超过评审截止日 |
| 待校准 | 校准截止日 | 已超过校准截止日 |
目标待确认的计划既会进入未填报名单,也可能在超过批次开始日后进入逾期名单。 待自评评价单同样可能同时属于未填报和逾期。 这是不同管理视角下的合理交集,不是重复数据错误。
5.2 未填报:范围比“所有未完成”更窄
当前 unfilled 只收集两类对象:
- 状态为 1、仍待目标确认的绩效计划;
- 状态为 10、仍待员工自评的评价单。
待上级评审、待校准和待结果确认不进入未填报。 这些阶段若超期,会进入逾期名单。 因此“未填报”更接近员工端尚未完成目标确认或自评,而不是所有流程待办的统称。
5.3 连续低分:只看最近连续 N 期
连续低分按员工分组。 每名员工的结果按 periodId 倒序排列,截取最近 N 条。 只有最近 N 期的每一期得分都严格小于阈值,才生成风险。 若阈值是 70:
69 / 68 / 65:命中;69 / 70 / 65:不命中,因为 70 不小于 70;69 / 68:不命中,因为不足 3 期;69 / 68 / 65 / 90:命中,因为只判断最近 3 期。
风险备注会记录最近各期得分与阈值。 风险行关联最近一期结果的 ID,便于下钻结果详情。 需要注意:当前“最近”按批次 ID 倒序近似判断,不是按开始日期重新排序。 在本项目批次按时间递增创建的约定下,这个规则保持简单且可解释。
5.4 申诉积压:状态 60~63 都算处理中
申诉中的判断范围是评价单状态 60 到 63。 这覆盖待发起/处理中到待申诉结果确认,但不包含状态 64 的申诉完成。 风险行阶段名称优先使用评价单的当前节点名称。 若当前节点名称为空,则显示“申诉处理中”。 申诉数 KPI 与申诉风险名单使用同一个 isAppealOpen 判断。
5.5 每类最多返回 50 行
后端通过 RISK_LIMIT = 50 限制每类风险列表。 这个限制控制了驾驶舱响应体和前端表格负载。 页面表格默认每页显示 8 行。 如果企业规模更大,后续可以把风险名单拆成独立分页接口。 当前实现适合“驾驶舱快速发现 + 点击处理”的定位。

▲ 驾驶舱图表区:阶段漏斗、部门完成率、等级分布与批次完成率集中展示;底部保留风险名单入口,具体人员明细见上一张首屏截图。
六、业务下钻:让风险名单真正可处理
6.1 bizId + bizType 是统计与业务之间的桥
风险行不仅返回展示字段,还携带 bizId 与 bizType。
bizId 表示业务对象主键。
bizType 表示业务对象类型。
| bizType | 风险来源 | 下钻页面 |
|---|---|---|
plan | 目标未确认计划 | 计划详情 |
assessment_bill | 自评、评审、校准、申诉评价单 | 评价单详情 |
result | 连续低分结果 | 绩效结果详情 |
这个设计没有在后端拼接前端路由。 后端只描述业务语义,前端根据类型选择页面。 因此 API 可以保持跨端稳定,路由调整也只影响前端映射。
6.2 风险行包含的定位信息
RiskItem 返回以下字段:
- 员工 ID、工号、姓名;
- 部门 ID、部门名称;
- 批次 ID、批次名称;
- 阶段编码、阶段名称;
- 分数、等级、规则备注;
- 业务 ID、业务类型。
这些字段足以让管理者在不下钻时理解风险,也能让页面准确打开对应对象。
6.3 批次工作台与驾驶舱的分工
驾驶舱回答跨公司、跨部门、跨批次的全局问题。 批次工作台则更适合处理某一个批次内的具体阶段任务。 两者不是重复页面:
- 驾驶舱强调横向比较与风险发现;
- 批次工作台强调单批次推进与阶段操作;
- 计划、评价单、结果详情负责最终业务处理。

▲ 绩效批次工作台:承接驾驶舱发现的问题,在单个考核批次内查看阶段进度与处理对象;驾驶舱负责发现,工作台和业务详情负责推进。
七、后端实现:一个接口聚合三类业务数据
7.1 聚合入口:统一选批次,再查计划、评价单和结果
getCockpit 先解析阈值与连续期数,再确定批次范围。
批次为空时直接返回默认空结构,避免前端做大量空值判断。 下面是入口方法的真实源码裁剪:
public PerformanceStatisticsCockpitRespVO getCockpit(PerformanceStatisticsCockpitReqVO reqVO) {
PerformanceStatisticsCockpitReqVO req =
reqVO == null ? new PerformanceStatisticsCockpitReqVO() : reqVO;
BigDecimal lowScoreThreshold = req.getLowScoreThreshold() == null
? DEFAULT_LOW_SCORE : req.getLowScoreThreshold();
int consecutiveCount = req.getConsecutivePeriodCount() == null
|| req.getConsecutivePeriodCount() < 2
? DEFAULT_CONSECUTIVE : req.getConsecutivePeriodCount();
List<PerformancePeriodDO> allPeriods = performancePeriodMapper.selectSimpleList();
List<Long> requestedPeriodIds = resolveRequestedPeriodIds(req);
List<PerformancePeriodDO> scopedPeriods = resolvePeriods(allPeriods, requestedPeriodIds);
List<Long> periodIds = scopedPeriods.stream()
.map(PerformancePeriodDO::getId).filter(Objects::nonNull).toList();
PerformanceStatisticsCockpitRespVO resp = new PerformanceStatisticsCockpitRespVO();
if (periodIds.isEmpty()) {
return resp;
}
// 后续按同一范围查询计划、评价单、结果并完成聚合接口路径是:
GET /admin-api/hrm/performance-statistics/cockpit控制器权限沿用绩效结果查询权限:
hrm:performance-result:query接口返回统一使用 CommonResult<PerformanceStatisticsCockpitRespVO>。
7.2 KPI 聚合:完成状态、比例和平均分
KPI 聚合直接基于已经筛选好的批次、评价单和结果。 真实源码裁剪如下:
private void fillKpis(PerformanceStatisticsCockpitRespVO resp,
List<PerformancePeriodDO> periods,
List<PerformanceAssessmentBillDO> bills,
List<PerformanceResultDO> results) {
Kpis kpis = resp.getKpis();
kpis.setActivePeriodCount((int) periods.stream()
.filter(p -> p.getStatus() != null
&& p.getStatus() >= 1 && p.getStatus() <= 4)
.count());
int total = bills.size();
int finished = (int) bills.stream().filter(this::isFinished).count();
kpis.setBillTotal(total);
kpis.setBillFinished(finished);
kpis.setCompletionRate(rate(finished, total));
kpis.setAppealCount((int) bills.stream().filter(this::isAppealOpen).count());
if (!results.isEmpty()) {
BigDecimal sum = results.stream().map(PerformanceResultDO::getScore)
.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
kpis.setAverageScore(sum.divide(BigDecimal.valueOf(results.size()),
2, RoundingMode.HALF_UP));
}
}逾期数与风险人数依赖风险识别结果,因此在 fillRisks 中补齐。 这种顺序避免重复扫描风险对象。
7.3 连续低分:最近 N 期全部低于阈值
连续低分识别先按员工分组,再取最近 N 条。 下面的裁剪保留了排序、数量门槛、全低判断和下钻对象:
List<PerformanceResultDO> ordered = entry.getValue().stream()
.sorted(Comparator.comparing(PerformanceResultDO::getPeriodId).reversed())
.toList();
if (ordered.size() < consecutiveCount) {
continue;
}
List<PerformanceResultDO> recent = ordered.subList(0, consecutiveCount);
boolean allLow = recent.stream()
.allMatch(r -> r.getScore().compareTo(threshold) < 0);
if (!allLow) {
continue;
}
PerformanceResultDO latest = recent.get(0);
RiskItem item = new RiskItem();
item.setEmployeeId(latest.getEmployeeId());
item.setEmployeeName(latest.getEmployeeName());
item.setPeriodId(latest.getPeriodId());
item.setStage("consecutive_low_score");
item.setStageLabel("连续低分");
item.setScore(latest.getScore());
item.setLevel(latest.getLevel());
item.setBizId(latest.getId());
item.setBizType("result");代码使用严格小于号。 因此阈值本身不属于低分,这一点应在业务口径说明中保持一致。
7.4 风险人数采用员工去重
风险人数通过 Set<Long> 汇总员工 ID。 它将逾期、连续低分、申诉三类名单合并后去重。 同一员工同时逾期和连续低分,只计 1 人。 员工 ID 为空的风险行不会进入人数统计。 这使“风险项数量”和“风险人数”形成两个互补指标:
- 逾期数回答有多少个问题;
- 风险人数回答涉及多少个人。
八、前端实现:筛选、图表与下钻保持轻量
8.1 API 层把数组转换为 GET 友好参数
前端类型完整映射了 KPI、漏斗、部门完成率、批次完成率和风险结构。 请求时抽出 periodIds,转换为逗号字符串:
export function getPerformanceStatisticsCockpit(
params: PerformanceStatisticsApi.CockpitReq,
) {
const { periodIds, ...rest } = params;
return requestClient.get<PerformanceStatisticsApi.CockpitResp>(
'/hrm/performance-statistics/cockpit',
{
params: {
...rest,
periodIdStr: periodIds?.length
? periodIds.join(',')
: undefined,
},
},
);
}这段代码只有一个传输层职责。 页面仍然使用 number[],后端 GET 绑定则得到稳定字符串。
8.2 通用图表卡片只负责渲染 option
cockpit-chart.vue 接收标题、高度和 ECharts option。
它不理解绩效业务。 页面负责构造漏斗、部门、等级和批次的 option,通用组件只在 option 变化时重新渲染。 这种拆分让 4 张图共享卡片布局,又保留各自的业务格式化逻辑。
8.3 风险标签页按同一表格切换数据源
页面维护 activeRiskTab。 计算属性根据标签返回四个数组之一:
overdue → risks.overdue
unfilled → risks.unfilled
lowScore → risks.consecutiveLowScore
appeals → risks.appeals表格列保持一致。 阶段列根据标签显示不同颜色:
- 逾期、连续低分使用红色;
- 申诉使用警告色;
- 未填报使用处理中颜色。
8.4 点击整行按业务类型路由
前端下钻逻辑没有依赖风险名称,而是依赖 bizType。 真实源码裁剪如下:
function openRisk(row: PerformanceStatisticsApi.RiskItem) {
if (row.bizType === 'plan' && row.bizId) {
router.push({
path: '/hrm/performance/assessment-task/plan-info',
query: { id: row.bizId },
});
return;
}
if (row.bizType === 'assessment_bill' && row.bizId) {
router.push({
path: '/hrm/performance/assessment-task/assessment-info',
query: { id: row.bizId, viewMode: 'view' },
});
return;
}
if (row.bizType === 'result' && row.bizId) {
router.push({
path: '/hrm/performance/result-info',
query: { id: String(row.bizId) },
});
}
}整行点击降低了操作成本。 用户不需要先找一个很小的“详情”按钮。
九、设计决策:为什么这样做
9.1 一个聚合接口,保证同屏口径一致
若每张卡片、每张图、每个风险标签分别请求接口,页面会产生多个时间点的快照。 考核状态恰好变化时,完成率与风险名单可能对不上。 当前实现通过一个接口返回所有驾驶舱数据。 优点是口径一致、加载状态简单。 代价是后端一次查询并聚合三类业务对象。 在当前驾驶舱范围和每类风险最多 50 行的设计下,这个取舍合理。
9.2 规则在后端,展示在前端
逾期、申诉中、连续低分等规则都由后端判断。 前端只负责展示与路由。 这样避免不同客户端各自实现规则后出现差异。 低分阈值和连续期数仍通过请求参数传入,为规则留出可配置空间。
9.3 风险对象保留业务类型,而不是统一成评价单
目标未确认发生在计划上。 自评、评审、校准和申诉发生在评价单上。 连续低分来自结果。 如果强行把所有风险映射到评价单,会丢失最自然的业务入口。
bizType + bizId 允许每类风险回到真正的数据源。
9.4 明确不做的能力
当前版本没有以下能力:
- 不基于历史数据预测未来绩效;
- 不自动向员工或主管发送风险消息;
- 不提供人才九宫格;
- 不把连续低分直接解释为淘汰建议;
- 不替代管理者对异常数据的人工复核。
这些边界能防止统计看板被误解为自动决策系统。
十、技术亮点总结
| 设计点 | 实现方式 | 业务价值 |
|---|---|---|
| 统一筛选 | 公司、部门、批次共同限定三类数据 | KPI、图表、名单口径一致 |
| 智能默认批次 | 进行中 + 近 3 个已出结果 | 兼顾当前推进与近期趋势 |
| 8 项 KPI | 进度、风险、结果三类指标 | 摆脱平均分单一视角 |
| 7 阶段漏斗 | 计划状态 + 评价单状态 | 快速发现流程堵点 |
| 部门完成率 | 部门分组并统计完成数/总数 | 横向定位落后组织 |
| 等级分布 | 结果等级聚合 | 观察结果结构 |
| 批次完成率 | 按批次独立统计 | 比较周期推进质量 |
| 4 类风险 | 逾期、未填报、低分、申诉 | 把汇总变成名单 |
| 连续低分 | 最近 N 期严格低于阈值 | 识别持续性问题 |
| 风险人数去重 | 员工 ID Set 聚合 | 区分风险项和涉及人数 |
| 业务下钻 | bizType + bizId | 从发现直接进入处理 |
| 响应限流 | 每类风险最多 50 行 | 控制驾驶舱负载 |
十一、快速体验
在线演示:https://ruoyioffice.com/web/(账号 admin / 密码 admin123) 操作路径:HRM 人力资源 → 绩效管理 → 绩效统计 推荐体验流程:
- 先不选择批次,观察系统默认加载进行中批次与最近 3 个已出结果批次。
- 切换公司,确认部门树随公司变化,且原有无效部门会被清空。
- 选择一个部门,对比完成率、逾期数和风险人数如何变化。
- 多选两个批次,在批次完成率图中比较推进差异。
- 调整低分阈值,观察连续低分名单是否变化。
- 在风险预警中依次切换逾期、未填报、连续低分和申诉积压。
- 点击一条风险记录,确认进入计划、评价单或结果详情。
- 打开批次工作台,继续处理单批次的阶段任务。
本地启动:
cd W:\ruoyi-office\ruoyi-office
mvn -P boot -DskipTests compilecd W:\ruoyi-office\ruoyi-office-vben
pnpm dev:antd本地前端默认访问地址为 http://localhost:5800。 后端默认端口为 48080,管理端 API 前缀为 /admin-api。 源码仓库:
| 平台 | 地址 |
|---|---|
| GitHub | https://github.com/yuqing2026/ruoyi-office |
| GitCode | https://gitcode.com/zhouzhongyan/ruoyi-office |
| Gitee | https://gitee.com/yqzy1688/ruoyi-office |
基础能力可通过在线演示和源码仓库了解。 完整版本、持续维护与企业落地方案请按实际需求咨询。
十二、从源码得到的实施建议
12.1 先统一状态口径,再做图表
完成率最容易因“什么算完成”产生争议。 本实现明确把状态 50 与 64 都视为完成。 企业二次开发时,应先确认申诉完成是否计入本批次完成,再扩展其他状态。
12.2 截止日必须与业务阶段一一对应
不同阶段使用不同截止日。 不要用一个批次结束日期判断全部逾期,否则无法说明到底是员工、主管还是 HR 超期。
12.3 连续低分必须同时说明阈值和窗口
“连续低分”不是一个完整口径。 完整口径应写成“最近 3 期均低于 70 分”。 当前风险备注正是按这个方式生成,方便管理者复核。
12.4 风险名单要能回到业务对象
只展示员工姓名会导致管理者再次搜索。 风险行至少应携带业务主键和业务类型。 下钻是驾驶舱从“可看”变成“可用”的关键一步。
结语
绩效驾驶舱的核心不是把平均分画得更漂亮,而是建立“统计口径—结构诊断—风险名单—业务处理”的闭环。 这次实现用 8 项 KPI 保留总体判断,用阶段漏斗和 3 类分布图定位组织与批次差异,再用 4 类规则风险把问题落实到人和单据。 整个过程基于可解释规则。 管理者能知道为什么某人进入名单,也能点击记录回到计划、评价单或结果详情。 这种“摘要 + 诊断 + 行动”的设计也可以推广到招聘进度、培训完成率、合同履约、项目里程碑和资产盘点等管理场景。 如果你正在建设绩效系统,建议先问三个问题:
- 你们的完成口径是什么?
- 最容易堵在哪个阶段?
- 风险名单能否一键回到业务单据?
欢迎在评论区分享你们更关注“部门完成率”还是“连续低分”,也欢迎体验真实页面后交流改进建议。
常见问题(FAQ)
绩效驾驶舱的完成率如何计算?
完成率等于已完成评价单数除以评价单总数,再乘 100%。 当前状态 50(正常完成)和 64(申诉完成)都计为已完成,结果保留 1 位小数。
连续低分预警是如何识别的?
系统按员工汇总有得分的绩效结果,按批次 ID 倒序取最近 N 期。 最近 N 期每一期都严格小于低分阈值才命中;默认 N 为 3、阈值为 70。
风险人数为什么不等于四类风险人数相加?
同一员工可能同时出现在逾期、连续低分和申诉名单中,风险人数会按员工 ID 去重。 另外,仅未填报但尚未逾期的人员当前不计入风险人数 KPI。
未选择考核批次时会查询全部历史数据吗?
不会。 默认查询状态 1~4 的进行中批次,再加入最近 3 个状态大于等于 5 的已出结果批次。
点击风险记录可以直接处理吗?
可以下钻到对应业务详情。 计划风险进入计划详情,评价环节和申诉风险进入评价单详情,连续低分进入绩效结果详情。
这套驾驶舱是否包含预测、自动通知和人才九宫格?
当前不包含。 现有能力是基于业务状态、截止日期、历史结果和阈值的可解释规则统计;完整产品能力与企业落地方案可通过在线演示和咨询进一步了解。
💡 想要体验 RuoYi Office 的绩效驾驶舱?
🌐 在线演示:https://ruoyioffice.com/web/(账号 admin / admin123)
📦 源码仓库:GitHub | GitCode | Gitee
💬 技术咨询:添加微信 17156169080,备注「RuoYi Office」
⭐ 如果本文对你的绩效系统设计有帮助,欢迎 Star、收藏并分享给团队!
