Skip to content

SpringBoot+Vue3 绩效考核运营闭环:批次工作台 + 评估关系 + 评价单节点推进 + 绩效驾驶舱

🌐 演示地址https://ruoyioffice.com | 📦 源码1·GitHubruoyi-office | 📦 源码2·GitCoderuoyi-office | 📦 源码3·Giteeruoyi-office | 💬 微信:17156169080(备注「RuoYi Office」)

绩效系统最容易做成「配得挺全、跑不起来」:指标库、模板、方案都有了,一到季末仍是 HR 对着 Excel 催自评、催评审、催确认。真正难的是「批次怎么运营」——方案配置就绪后,用批次工作台一键发布并生成评估关系,用评价单状态机把人推到下一节点,用绩效驾驶舱看漏斗与风险池,用「我的绩效」给员工/主管一个统一入口。本文只讲运营闭环,评分加权与校准算法见姊妹篇。

绩效考核运营闭环 - 功能架构全景

▲ 运营闭环全景:方案/周期配置 → 发布生成(计划 + 评估关系)→ 评价单节点推进(10→50)→ 批次工作台催办与改主评 → 驾驶舱 KPI/漏斗/风险池 →「我的绩效」入口

引言:绩效考核运营到底难在哪?

做过绩效落地的 HR 都知道:难的不是「表单里有没有权重字段」,而是一个批次在组织里怎么被推着往前走。典型痛点可以压成五条:

  • 发布后没有「作战沙盘」:周期状态变成「进行中」,但谁没自评、哪个部门卡在评审、主评人空缺有多少,全靠人工拉表。
  • 评估关系一错全错:按部门负责人自动找主评,矩阵组织、兼岗、负责人离职立刻出洞;没有异常池和改派,评审节点会卡死。
  • 催办没有节点语义:只发「请尽快完成绩效」没用,必须点到「待自评 / 待上级评 / 待校准 / 待结果确认」。
  • 管理层看不见进度:领导问「这季度完了多少、哪里拖后腿、有没有申诉积压」,统计页如果只有平均分,回答不了运营问题。
  • 员工入口分散:自评一个菜单、评审一个菜单、结果确认再一个菜单,角色切换成本高,待办数字也不聚合。
现状后果
Excel 催办 + 微信群点名截止日一到,完成率仍是「大概七成」
主评写死在计划备注里改主管要改数据、改流程候选人,极易漏
只有结果报表没有漏斗知道「平均分 82」,不知道「卡在自评 120 人」
驾驶舱与业务单据脱节看见风险却点不进单据,无法闭环处置

本文结论前置:RuoYi Office 把绩效运营抽象为「批次发布 → 关系落库 → 单据节点推进 → 驾驶舱穿透 → 个人入口聚合」五步;评价单状态 10→50(申诉 60—64)是贯穿主线,工作台与驾驶舱都围着这条状态机转。

说明:姊妹文《SpringBoot+Vue3 绩效管理系统设计》偏 15 表与四级评分;《绩效管理产品选型》偏选型叙事。本文刻意少写评分算法,聚焦运营视角的产品实现。


一、业务设计:从「配规则」到「跑批次」

1.1 运营闭环一句话

绩效考核运营闭环是:在已有方案(模板、指标、关系规则、等级规则)之上,按周期(批次)发布 → 为每位参与人生成计划与主评关系 → 用评价单驱动自评/上级评/校准/结果确认 → 用工作台与驾驶舱催办与复盘。评分是结果,运营是把结果按时算出来并让人认账。

1.2 角色与职责

角色在闭环中的职责主要入口
HR 管理员配方案、建周期、发布批次、改主评、看驾驶舱周期列表 → 批次工作台 / 绩效统计
被考核人目标确认(若开启)、自评、结果确认/申诉「我的绩效」→ 自评 / 结果确认待办
主评人(上级)上级评审;异常时由 HR 改派「我的绩效」→ 上级评审待办
校准人 / HR校准填报、对齐等级分布校准待办 / 工作台卡点列表
管理者看完成率、部门排名、风险池绩效驾驶舱

1.3 评价单状态机(运营主线)

评价单是执行层的「车票」。状态码取自后端常量,运营侧必须会背:

10 待自评 → 20 待上级评 → 30 待校准 → 40 待结果确认 → 50 已完成
                                              │(不认可)

                         60 待发起 → 61 待审核 → 62 待校准 → 63 待确认 → 64 申诉完成
状态含义当前节点 key典型办理人
10待自评self_review员工本人
20待上级评leader_review评估关系主评
30待校准hr_calibration校准人 / HR
40待结果确认result_confirm员工本人
50已完成
6064申诉链路appeal_*主管 / HR / 员工

工作台的环节统计、驾驶舱漏斗、风险池「逾期/未填」,全部按这套状态计数——统计口径与业务单据同源,避免「看板一套数、待办另一套」

1.4 批次状态与发布语义

周期(批次)从草稿到归档,发布不是改个枚举那么简单,而是一次事务:校验配置 → 标记已发布 → 生成计划与计划项 → generateByPeriod 写评估关系并回填 leaderUserId → 若方案跳过目标确认则自动确认并开评价单。

关键动作服务方法运营含义
预览参与人previewParticipants发布前看匹配模板人数、关系异常数
发布并生成publishAndGenerate草稿→进行中,并拉起计划生成
仅生成/重生成generatePerformancePlan已发布批次补人、重算关系
改主评updatePrimaryAssessor异常池处置,同步计划/单据/BPM 变量

二、系统设计:模块拼装与关键决策

2.1 子模块地图(运营相关)

子模块PC 路径(web-antd)功能面向角色
方案/模板/指标/等级views/hrm/performance/setting/*规则配置(本文略)HR
周期列表period/list建批次、进工作台HR
批次工作台period/workbench发布、关系、催办、卡点列表HR
评价任务assessment / assessment-task自评、评审、校准、确认全员
绩效统计(驾驶舱)statistics/KPI / 漏斗 / 部门 / 风险HR / 管理者
我的绩效my/三类待办聚合 + 关系预览员工 / 主管

2.2 设计决策对照

决策点方案理由
主评存在哪独立「评估关系」表,计划/单据冗余 leaderUserId改派一次三处同步,且可标记异常码
待办以谁为准业务 API 推进节点 + BPM 任务合并菜单推进时 BPM 可能滞后,待办不能只信流程引擎
驾驶舱是否预聚合表运行时聚合计划/单据/结果批次量级可控,口径与业务表一致、免双写
个人入口「我的绩效」聚合 taskView降低角色切换成本,数字可点进列表
移动端当前暂无 HRM 绩效页先保证 PC 运营闭环;APP 后续按待办复用同一 API

三、PC 端:批次工作台

3.1 工作台是什么

批次工作台是周期详情的「作战指挥台」。从周期列表点进 workbench?id={periodId},HR 在同一页完成:看批次信息与截止日、预览/生成评估关系、发布并生成、按环节看进度、钻到计划/评价单/结果列表、对异常关系改主评。

绩效批次工作台 - 总览

▲ 批次工作台总览:截止日、发布生成、环节进度与异常提示

3.2 环节统计口径

前端 stage-stats.ts 对本批次计划与评价单做收敛统计(与个人待办菜单解耦):

指标计数规则(摘要)
目标待确认 / 已确认计划 status === 1 / >= 2
待自评 / 待评审 / 待校准评价单 10 / 20 / 30
待结果确认40 或申诉确认 63
已完成50 或申诉完成 64
关系异常数评估关系 exceptionCode 非空

绩效批次工作台 - 环节进度

▲ 工作台环节进度:一眼看到卡在自评还是评审

3.3 催办怎么落地

催办不是另造一套消息产品,而是用状态切片列表 + 截止日字段驱动:

  1. 工作台按状态过滤本批次评价单(如只看 status=10)。
  2. 周期上维护 selfReviewDeadline / leaderReviewDeadline / calibrationDeadline
  3. 驾驶舱风险池把「今天 > 截止日且仍停在该节点」标为逾期。
  4. HR 对异常主评当场改派,评审办理人与 BPM leaderUserId 一并更新。

运营动作建议:每日打开工作台 → 先清异常关系 → 再按逾期风险催自评/评审 → 校准周看校准节点积压 → 结果确认周看 40/63


四、评估关系:生成、异常池、改主评

4.1 为什么必须独立「评估关系」

如果主评只写在计划字段里,会出现:自动找错人无法标注原因、改派不锁手工结果、BPM 候选人与业务办理人漂移。评估关系表解决三件事——自动解析、异常留痕、手工锁定

发布链路末尾强制调用:

text
publishAndGenerate → generatePerformancePlan → generateByPeriod →(可选)自动确认开单

4.2 自动生成逻辑(运营可读版)

对周期下每条计划:若已有关系且应保留(手工锁定等)则只回填 leader;否则按方案主评规则解析评估人(默认部门负责人),写入 relationType=主评source=自动,并把 exceptionCode/exceptionMsg 带上(如找不到负责人)。草稿阶段工作台用 previewParticipants 预览关系,发布前就能看见 abnormalCount

评估关系 - 异常池与改主评

▲ 评估关系列表:异常码、主评姓名、改派入口

4.3 改主评的同步边界

updatePrimaryAssessor 不只改关系行:计划 leaderUserId、评价单 leader 与(若在 leader_reviewcurrentAssignee*、主流程变量 leaderUserId 一并更新;手工改派后 source=手工locked=true,并清空异常码。这样异常池处置是「一次操作,三处一致」。


五、评价单节点推进:10 → 50

5.1 节点与 API 动作

从 → 到业务动作节点 key 变化
开单目标确认后创建评价单self_review,status=10
10 → 20submitSelfReviewleader_review,办理人=主评
20 → 30submitLeaderReviewhr_calibration
30 → 40submitCalibrationresult_confirm,办理人=员工
40 → 50confirmResult(confirmed=true)清空当前节点/办理人
40 → 申诉confirmResult(false) / startAppeal进入 60+

5.2 与 BPM 的协作方式

主流程在开单时启动;每次业务提交调用 completeMainProcessTask,并按需写入 leaderUserId / calibrationUserId。校准节点常按角色候选人派发,提交评审后会 syncAssigneeFromMainProcess,避免「业务办理人」和「流程任务候选人」长期不一致。待办页则合并 BPM 待办与业务单据待办,菜单推进时流程未跟上也不会丢待办。

评价单详情 - 节点推进

▲ 评价单详情:当前节点、办理人、评审/校准操作


六、绩效驾驶舱:KPI · 漏斗 · 风险池

6.1 接口契约

GET /admin-api/hrm/performance-statistics/cockpit

权限:hrm:performance-result:query。前端 getPerformanceStatisticsCockpit 把多选周期压成 periodIdStr 查询串。响应核心块:

字段含义运营用途
kpis进行中批次数、完成率、逾期数、风险人数、平均分、申诉数、单据总量/完成量顶部 KPI 卡
funnel目标待确认→已确认→待自评→待评审→待校准→待结果确认→已完成漏斗图
deptCompletion部门完成率(升序,落后部门在前)催办优先级
gradeDistribution等级分布校准后形态是否健康
periodCompletion多批次完成率对照跨期对比
risksoverdue / unfilled / appeals / consecutiveLowScore风险池四页签

默认范围:未指定周期时,取状态 1—4 的进行中批次,并附加最近 3 个已结束批次,便于对照。低分阈值默认 70,连续低分期数默认 3,均可在页头筛选。

6.2 页面结构

PC 页:views/hrm/performance/statistics/。顶部筛选公司/部门/周期/低分阈值 → KPI 卡 → ECharts 漏斗与等级分布 → 部门完成率 → 风险池 Tab(可跳进计划/评价单/结果详情)。首页分析看板也可嵌入同一统计组件。

绩效驾驶舱 - KPI 与漏斗

▲ 绩效驾驶舱:KPI 卡 + 漏斗 + 风险池入口

绩效驾驶舱 - 风险池

▲ 风险池:逾期、未填、申诉中、连续低分

6.3 风险池如何「可处置」

风险项带 bizType / bizId / stage,前端可路由到计划详情、评价单详情或结果详情。逾期判定绑定批次截止日字段;未填包含目标待确认与待自评;申诉中走 60—63 开放申诉;连续低分按员工最近 N 期结果分数全部低于阈值汇总。看板不是只读大屏,而是催办工作队列。


七、「我的绩效」:员工与主管的统一入口

views/hrm/performance/my/ 不做第二套业务逻辑,只做聚合:

入口卡片taskView角色文案
自评填报self_review我是被考核人
上级评审leader_review我是考核人
结果确认result_confirm我是被考核人

每个卡片用 getPerformanceAssessmentBillTodoPage({ pageSize: 1, taskView })total 作为角标;下方预览最近待办行,并可查看「我作为主评」的评估关系页。一跳进对应任务列表,避免在深层菜单里找入口。

我的绩效 - 待办聚合

▲ 「我的绩效」:三类待办数字与跳转


八、移动端现状(如实说明)

当前 UniApp 移动端尚未提供独立的 HRM 绩效页面(无 pages-hrm 下的绩效列表/详情)。PC 已打通工作台、驾驶舱与「我的绩效」;移动端后续可复用同一套评价单待办 API(taskView + 节点提交),按「web 转 app」规范补齐自评/评审/结果确认即可,无需改状态机。


九、后端核心实现

以下片段均来自 HRM 绩效模块真实源码,略去校验与工具方法,保留运营关键路径。

9.1 发布并生成:publishAndGenerate

草稿批次先校验配置与匹配参与人,置为已发布,再进入计划生成(内部会调评估关系生成)。

java
@Override
@Transactional(rollbackFor = Exception.class)
public void publishAndGenerate(Long id) {
    PerformancePeriodDO period = validatePerformancePeriodExists(id);
    if (period.getStatus() == null || period.getStatus() == 0) {
        validateCanPublish(period);
        period = preparePeriodForPublish(period);
        validatePublishConfig(period);
        validateHasMatchedParticipants(period);
        performancePeriodMapper.updateById(new PerformancePeriodDO().setId(id)
                .setStatus(1)
                .setPublishDate(period.getPublishDate() != null
                        ? period.getPublishDate() : LocalDate.now()));
    }
    // 生成计划 → generateByPeriod → 可选自动确认开单
    generatePerformancePlan(id);
}

9.2 评估关系:generateByPeriod

按方案主评规则解析;已锁定关系可保留;异常码写入关系行,并回填计划 leader。

java
@Override
@Transactional(rollbackFor = Exception.class)
public void generateByPeriod(Long periodId) {
    PerformancePeriodDO period = validatePeriodExists(periodId);
    PerformanceRelationRuleDO primaryRule = resolvePrimaryRule(period.getSchemeId());
    List<PerformancePlanDO> plans = performancePlanMapper.selectListByPeriodId(periodId);
    Map<Long, DeptRespDTO> deptCache = new HashMap<>();
    for (PerformancePlanDO plan : plans) {
        PerformanceEvalRelationDO existed = performanceEvalRelationMapper
                .selectByPeriodIdAndAssesseeEmployeeId(periodId, plan.getEmployeeId());
        if (existed != null && shouldPreserve(existed)) {
            fillPlanLeaderFromRelation(plan, existed);
            continue;
        }
        EmployeeDO employee = employeeMapper.selectById(plan.getEmployeeId());
        AssessorResolveResult resolveResult = resolveAssessor(primaryRule, employee, deptCache);
        PerformanceEvalRelationDO relation = new PerformanceEvalRelationDO()
                .setPeriodId(periodId)
                .setAssesseeEmployeeId(plan.getEmployeeId())
                .setAssessorUserId(resolveResult.assessorUserId())
                .setRelationType(RELATION_TYPE_PRIMARY)
                .setSource(SOURCE_AUTO)
                .setStatus(STATUS_VALID)
                .setExceptionCode(resolveResult.exceptionCode())
                .setExceptionMsg(resolveResult.exceptionMsg());
        // insert or update ...
        fillPlanLeaderFromRelation(plan, relation);
    }
}

9.3 节点推进:自评提交 10 → 20

写自评评审记录后,切状态与节点,办理人改为主评,并完成主流程当前任务。

java
performanceAssessmentBillMapper.updateById(new PerformanceAssessmentBillDO()
        .setId(bill.getId())
        .setStatus(BILL_STATUS_WAIT_LEADER)          // 20
        .setCurrentNodeKey("leader_review")
        .setCurrentNodeName(resolveNodeName("leader_review"))
        .setLeaderUserId(leaderUserId)
        .setLeaderUserName(leaderUserName)
        .setCurrentAssigneeId(leaderUserId)
        .setCurrentAssigneeName(leaderUserName));
Map<String, Object> variables = new HashMap<>();
variables.put("leaderUserId", leaderUserId);
completeMainProcessTask(bill, resolveNodeName("self_review"), "提交自评", variables, false);

上级评 → 校准(20→30)、校准 → 结果确认(30→40)、确认完成(40→50)同一套路:updateById 改状态/节点/办理人 + completeMainProcessTask。结果确认通过时用 UpdateWrapper 显式清空当前节点字段,避免仍出现在确认待办。

9.4 驾驶舱聚合:getCockpit

一次查出范围内计划、评价单、结果,再填充 KPI / 漏斗 / 部门 / 等级 / 风险。

java
@Override
public PerformanceStatisticsCockpitRespVO getCockpit(PerformanceStatisticsCockpitReqVO reqVO) {
    // ... 解析周期范围、公司/部门过滤 ...
    List<PerformancePlanDO> plans = performancePlanMapper.selectList(/* periodIds */);
    List<PerformanceAssessmentBillDO> bills = performanceAssessmentBillMapper.selectList(/* ... */);
    List<PerformanceResultDO> results = performanceResultMapper.selectList(/* score not null */);

    fillKpis(resp, scopedPeriods, bills, results);
    fillFunnel(resp, plans, bills);
    fillDeptCompletion(resp, bills);
    fillGradeDistribution(resp, results);
    fillPeriodCompletion(resp, scopedPeriods, bills);
    fillRisks(resp, periodMap, plans, bills, results, today, lowScoreThreshold, consecutiveCount);
    return resp;
}

漏斗阶段名与工作台一致(目标待确认…已完成);KPI 完成率 = 已完成单据 / 单据总量;风险池最多保留 50 条/类,防止列表爆炸。

9.5 前端工作台环节统计(TypeScript)

typescript
for (const bill of bills) {
  const status = bill.status ?? 0;
  if (status === 10) waitSelfReview += 1;
  else if (status === 20) waitLeaderReview += 1;
  else if (status === 30) waitCalibration += 1;
  else if (status === 40 || status === 63) waitResultConfirm += 1;
  else if (status === 50 || status === 64) billFinished += 1;
}

与驾驶舱 fillFunnel 使用同一套状态语义,HR 在工作台看到的卡点,到驾驶舱漏斗上能对得上。


十、运营向创新设计(4 个亮点)

10.1 发布前预览 = 上线彩排

previewParticipants 同时返回匹配/未匹配人数、关系预览与 abnormalCount。草稿阶段就能发现「模板覆盖不到的岗位」和「找不到主评的人」,避免发布后第一天全员卡死。

10.2 异常池 + 锁定改派

自动关系允许失败(带异常码),手工改派锁定后重跑生成不会覆盖。评价单若已在上级评节点,改派即时切换办理人与 BPM 变量——这是矩阵组织和人事异动下的刚需。

10.3 业务推进与流程待办双轨合并

绩效节点可以由业务 API 直接推进(自评/评审菜单),不强制用户只会在流程中心点同意。待办查询合并两套 ID,解决「业务已到下一节点、流程任务未刷新」的运营投诉。

10.4 驾驶舱即催办队列

KPI、漏斗、风险池都从业务表实时聚合,风险行可穿透到单据。管理者问「谁拖后腿」时,答案是列表而不是截图。


十一、技术亮点总结

设计要点实现方式价值
批次一键发布publishAndGenerate 事务链配置与执行解耦,发布可重复生成
评估关系落库generateByPeriod + 异常码主评可审计、可改派、可锁定
状态机主线评价单 10→50 / 申诉 60—64工作台与驾驶舱同源计数
节点推进Service 改状态 + 完成 BPM 任务业务菜单与流程中心都能走
改主评三同步关系 / 计划 / 单据 + 流程变量杜绝「人改了流程还找旧主管」
驾驶舱聚合GET .../cockpitgetCockpitKPI/漏斗/部门/风险一站式
个人入口my/ + taskView 角标降低找菜单成本
截止日催办周期 deadline × 风险池把「催一下」变成可量化逾期
前端环节统计stage-stats.ts本批次口径,不被个人待办污染
PC 优先移动端暂无绩效页先稳运营闭环,再扩端

技术栈锚点:后端 Spring Boot 3.5 + MyBatis-Plus + Flowable;前端 Vue3 + Vben Admin + Ant Design Vue + ECharts(驾驶舱图表)。


十二、快速体验

在线演示

推荐体验路径(8 步)

  1. 登录后进入 人力资源 → 绩效管理 → 周期,打开一个进行中或草稿批次。
  2. 进入 批次工作台,先看参与人预览与关系异常数。
  3. 草稿批次执行 发布并生成,观察计划数、关系数是否对齐。
  4. 在异常关系上 改主评,确认评价单办理人是否更新。
  5. 用员工账号打开 我的绩效,进入自评待办并提交(10→20)。
  6. 用主管账号完成上级评审(20→30),HR 完成校准(30→40)。
  7. 员工结果确认(40→50),回到工作台看环节进度归零卡点。
  8. 打开 绩效统计(驾驶舱),核验漏斗与风险池是否与工作台一致。

本地启动(摘要)

powershell
# 后端:ruoyi-office 单体启动(默认 48080)
# 前端:
cd ruoyi-office-vben
pnpm dev:antd    # http://localhost:5800

源码仓库

平台地址
GitHubhttps://github.com/yuqing2026/ruoyi-office
GitCodehttps://gitcode.com/zhouzhongyan/ruoyi-office
Giteehttps://gitee.com/yqzy1688/ruoyi-office

相关阅读

  • 《SpringBoot+Vue3 绩效管理系统设计:KPI/OKR + 360 + 校准申诉》——配置层与评分引擎
  • 本文——批次运营、工作台、驾驶舱与个人入口

常见问题(FAQ)

RuoYi Office 的绩效考核运营闭环包含哪些能力?

包含方案配置之上的批次发布、评估关系生成与改主评、评价单节点推进(10→50,申诉 60—64)、批次工作台催办、绩效驾驶舱(KPI/漏斗/部门完成率/风险池)以及「我的绩效」待办聚合。可在在线演示环境体验;完整能力与持续维护由商业版提供。

评价单状态 10、20、30、40、50 分别是什么意思?

10 待自评,20 待上级评,30 待校准,40 待结果确认,50 已完成。员工不认可结果进入申诉链 6064。工作台环节统计与驾驶舱漏斗都按这套状态计数。

评估关系异常时怎么处理?

在批次工作台打开评估关系 Tab,筛选带 exceptionCode 的行,使用改主评选择新的评估人。系统会同步计划、评价单办理人,并尝试更新主流程变量 leaderUserId;手工改派会锁定,避免下次自动生成覆盖。

绩效驾驶舱的数据从哪来?会不会和待办对不上?

来自 GET /hrm/performance-statistics/cockpit,由 PerformanceStatisticsServiceImpl.getCockpit 实时聚合计划、评价单、结果表,不另建汇总表。漏斗阶段名与工作台 stage-stats 对齐;若待办合并了 BPM 与业务 ID,而驾驶舱只计业务状态,个别瞬时差属正常,以评价单 status 为准排查。

移动端能做绩效自评吗?

当前 UniApp 尚未提供 HRM 绩效专用页面。PC 端「我的绩效」与任务列表已可用;移动端后续可复用同一套待办与节点提交 API,无需改状态机设计。

和「只有结果报表」的绩效系统比,差在哪?

结果报表回答「得了多少分」;运营闭环回答「卡在哪、催谁、谁异常、风险多少」。RuoYi Office 用工作台 + 驾驶舱风险池把催办变成可穿透队列,而不是季末再补一张完成率 Excel。


结语

绩效考核运营的本质,不是再加一张「统计表」,而是让每一个批次都有指挥台、每一条评价单都有下一个办理人、每一类风险都能点进去处置。RuoYi Office 用评估关系承接「谁评谁」,用 10→50 状态机承接「评到哪了」,用工作台与驾驶舱承接「HR 今天催什么」,用「我的绩效」承接「我今天要办哪几件」——评分算法可以很复杂,但运营主线必须足够短、足够硬。

同一套「发布生成 → 关系/办理人 → 节点推进 → 看板穿透」也可复用到述职评议、试用期考核、项目阶段评价等「周期性、多人、多节点」场景:换批次实体与节点枚举即可,不必重做催办体系。

你们公司现在绩效催办靠什么?Excel 邮件、企微群机器人,还是系统待办?评估关系出错时,是改主数据还是改流程候选人?欢迎在评论区聊聊你们踩过的坑。

如果这篇运营向拆解有帮助,欢迎点赞收藏,也欢迎去仓库点个 Star——评分引擎与校准申诉的细节,可继续阅读姊妹篇《绩效管理系统设计》。


💡 想要体验 RuoYi Office 的强大功能?

🌐 在线演示https://ruoyioffice.com/web/(账号 admin / admin123)

📦 源码仓库GitHub | GitCode | Gitee

💬 技术咨询:添加微信 17156169080,备注「RuoYi Office」

如果觉得不错,请给个 Star 支持一下!

联系我们

获取报价、演示和二开方案

微信咨询二维码

微信咨询

17156169080

添加时备注「RuoYi Office」

在线体验商业版