开源地址:https://gitee.com/fish982000/kpi-360-backend.git

  • 一套可直接用于生产的多模式(KPI / OKR / 360 度 / 通用)企业绩效考核平台。
  • 支持不同的考核方式(自评、上下级评、平级评),同时实现多种评分计算方式(比率法、区间法、定性平级法、加减法);
  • 支持分步评分和表格一屏评分的打分模式;
  • 不只是「教学项目」,而是按 DDD 分层、覆盖完整考核生命周期、可灵活配置规则与权重的开源系统;
  • 本项目前后端均重度采用AI编程实现,前端总体风格简洁,后端完全采用DDD模式构建,注重域之间隔离和防腐,业务域尽量做到充血,大家可以基于自己实际情况做改造,如发现bug或不足的地方欢迎提意见,也非常欢迎来到本人星球;

系统截图

模块
仪表盘(按季度概览) dashboard
考核模板设计器(维度 / 指标 / 考核方式 / 积分规则) templates2
考核活动管理(生成关系 → 启动 → 计算成绩) camp2
动态评价表单(按计算方式实时算分) evalute
我的成绩(扁平实例视图 + 结果确认) scores
权限管理(角色 + 资源树 + 按钮级控制) resoures2

一、产品定位

KPI-360 是面向中小型企业 HR / 业务部门负责人的通用化绩效考核中台。一次部署即可同时承接:

  • KPI:定量目标、目标值 + 实际值,按比率法 / 区间法 / 加减分法自动算分
  • OKR:目标 + 关键结果,权重可灵活配置、支持季度 / 年度滚动
  • 360 度评估:自评 + 上级评 + 下级评 + 同事评,支持匿名、提名、人数下限
  • 通用考核:员工胜任力、态度品行、培训测评等任意自定义模板

本项目特点

维度 一般 demo / 练手项目 KPI-360
架构 三层 CRUD(Controller-Service-Mapper) DDD 四层 + 充血模型 + 防腐端口,业务规则集中在 Domain 层
评分能力 只支持「直接打分」 5 套打分策略(直接打分 / 比率法 / 区间法 / 加减分法 / 定性等级法),通过策略模式 + ScoringEngine 路由
考核类型 写死一种 AssessType 元数据驱动(GEN / KPI / OKR / 360),同一系统横跨多种考核口径
评估关系 固定上下级 关系生成引擎:自评 / 上级评 / 下级评 / 同事评四路并行,支持「需先选人」交互(peer / sub)
表单 静态 React 表单 动态评价表单:模板配置驱动 UI,按指标 scoringType 实时渲染不同输入控件并算分
权限 仅登录拦截 三层隔离(菜单 + 路由守卫 + 按钮 resCode),Sa-Token + @SaCheckPermission,ADMIN 通配兜底
数据安全 明文存储 评估任务的 rater_id / execute_id AES-128 透明加密(Converter 层完成),历史明文兼容
成绩计算 简单平均 去极值 + 最低评分人数校验 + 权重再分配 + 分数封顶,规则全部 JSON 可配
结果模型 一张大宽表 考核实例(CampaignInst)+ 实例明细(CampaignInstDetail)状态化模型,支持「待评估 → 已评估 → 已确认 → 关闭」全生命周期
部署可用性 仅 dev 跑通 MyBatis-Plus 分页自动配置 + 全局异常 + 字段自动填充 + Knife4j 文档 + Nginx 部署示例

二、覆盖的考核模式

1. KPI(关键绩效指标)

  • 维度(Dimension)+ 指标(Indicator)二级结构
  • 每个指标可配置 目标值 / 单位 / 计算方式(scoringType)
    • DIRECT_SCORE 直接打分(评分人按主观打分)
    • RATIO 比率法(实际值 / 目标值 × 基础分,可配封顶)
    • STEP 区间法(阶梯分档,如 ≥110% 得 100,100~110% 得 80…)
    • ADD_SUB 加减分法(基础分 + 加分项 - 扣分项,可设上下限)
  • 维度权重 + 指标权重双层加权,自动归一化

2. OKR

  • 模板的「维度」即 Objective,「指标」即 Key Result
  • 权重可按季度自定义;通过 raterWeightConfig 控制谁来打分
  • 一个员工可以同时参与多个 OKR 周期(基于实例模型,互不干扰)

3. 360 度评估

  • 四路评估关系自动生成:自评 / 上级评 / 下级评 / 同事评
  • 下级评 / 同事评支持「先选人」流程(任务类型 SELECTED → 选人后转 ASSESS 子任务)
  • 同事评支持匿名展示(被考核人看不到具体评价人)
  • 评估人数下限校验(min_rater_threshold)—— 不到人数该路结果自动作废,权重重新分配

4. 通用考核(定性评价)

  • 计算方式 QUAL_LEVEL 定性等级:A / B / C / D 等级映射到分数
  • 支持单选量表、多选、问答、需证据填写(proof 字段)
  • 适用于素质评估、培训测评、态度考核等场景

三、核心流程

①  设计期                  ②  执行期                       ③  结算期            ④  应用期
─────────────────────  ──────────────────────────────  ────────────────  ──────────────────
维度库      考核活动                                       计算成绩              我的成绩
  │           │                                            │                    │
  ▼           ▼                                            ▼                    ▼
指标库 ──► 模板(KPI/OKR/360) ──► 关系生成 ──► 评价填报 ──► 去极值 ──► 实例结果 ──► 员工确认 / 申诉
  │           │                       │                                          ▲
  ▼           ▼                       ▼                                          │
打分规则   raterWeightConfig      任务(ASSESS/SELECT)                         审批 / 归档
scoreRuleConfig                   self/super/sub/peer
阶段 角色 关键能力
① 设计 HR / 管理员 维度复用 + 指标多种计分方式 + 模板复制 + JSON 化的考核方式与积分规则
② 执行 HR / 直接上级 / 员工 一键生成评估关系与任务、最晚完成时间(lf_time = endTime+7d)、待办通知栏、自动联动结束
③ 结算 系统 加权汇总、去极值、最低评分人数校验、维度得分、排名、维度雷达图
④ 应用 员工 / HR 个人成绩页 + 结果确认 + 申诉流程 + 历史归档

四、扩展性设计

4.1 策略模式驱动的「打分引擎」

domain/assessment/service/scoring/
├── ScoringStrategy.java        // 接口:compute(indicator, response, options) -> calScore
├── DirectScoreStrategy.java
├── RatioStrategy.java
├── StepStrategy.java
├── AddSubStrategy.java
├── QualLevelStrategy.java
└── ScoringEngine.java          // 按 indicator.scoringType 路由到对应策略
  • 新增一种计分方式(例如「KPI + 权重浮动公式」),只需实现一个新 Strategy 并注册到 ScoringEngine,无需改动任何业务代码
  • 前端 TaskDetail.tsx 同步以相同分支渲染输入控件(实际值 / 等级 / 加减分项),逻辑一一映射

4.2 元数据化的「考核类型」

AssessType 枚举(GEN / KPI / OKR / 360)贯穿 Dimension / Indicator / Template / Campaign 四层。

  • 同一份维度库,可在 KPI 模板和 OKR 模板中复用
  • 同一个员工同一季度,可同时参与 KPI 考核与 360 评估,互不影响

4.3 JSON 可配置的「考核方式」与「积分规则」

assess_template.rater_weight_config(JSON):

[
  { "type": "self",  "weight": 0.30, "score_type": "table",
    "assessee_scope": { "include_type": "ALL",
                        "exclude_roles": ["DEPT_MANAGER","DEPT_SUPERVISOR"] },
    "rater_scope":    { "type": "SELF", "min_select": 1, "max_select": 1 },
    "rater_visiable": true },
  { "type": "peer",  "weight": 0.10, "min_select": 5, "max_select": 10,
    "rater_visiable": false, "...": "..." }
]

assess_template.score_rule_config(JSON):

{ "trim_extreme": true,          // 去极值
  "trim_count": 1,               // 去掉最高最低各 1 个
  "min_rater_threshold": 3,      // 评估人数下限
  "score_cap": 100 }             // 分数封顶

— 调整这两段 JSON,即可应对几乎所有企业的差异化考核规则,无需改代码、无需重新部署

4.4 防腐端口隔离的「跨域访问」

  • OrgUserQueryPort —— assessment 域访问 system 域人员数据
  • EvaluationFormQueryPort —— assessment 域获取模板表单结构
  • NotificationPort —— assessment 域发送通知

结果:assessment 域不直接 import 其他域的类,未来替换组织架构服务(如对接钉钉 / 企业微信通讯录)只需替换端口实现。

4.5 「考核实例」模型支持滚动 / 并行

CampaignInst + CampaignInstDetail 二级实例化:

  • 一个员工 × 一个活动 = 一个实例(独立状态:PROCESSING → ASSESSED → SUBMIT → CLOSE)
  • 一个实例 × 一种评价方式 = 一个明细(独立 weight / 评价人数 / 得分)
  • 天然支持同一员工同时参与多个活动、跨季度滚动考核

五、可用性说明

5.1 安全

  • Sa-Token 完整鉴权框架,token 走 Redis,分布式可横向扩容
  • 三层权限隔离:菜单(后端动态返回 menu tree)+ 路由守卫(前端 MenuGuard)+ 按钮(resCode 显隐)
  • @SaCheckPermission 全面铺开:8 个 Facade 的写接口全部声明权限码;ADMIN 角色通过 StpInterface 返回 * 自动放行
  • AES-128 字段级加密:评估任务的 rater_id / execute_id 落库自动加密,读取透明解密,历史明文兼容

5.2 性能 / 工程

  • MyBatis-Plus 分页 + createTime/updateTime 自动填充 + 逻辑删除
  • TanStack React Query 客户端缓存 + 自动失效刷新;同一接口跨页面共享缓存
  • Vite 8 + Tailwind 4 极速 HMR;TypeScript 严格模式 + ESLint
  • Knife4j (OpenAPI 3) 接口文档:http://localhost:8080/doc.html
  • 全局异常处理器BusinessException → 统一 Result.fail(...),前端 axios 拦截器统一 toast

5.3 部署友好

  • 标准 Spring Boot fatjar:mvn clean packagejava -jar
  • 前端 Nginx 静态部署 + /api/ 反向代理
  • 数据库初始化 SQL 在 backend/src/main/resources/db/migration/ 下管理(含 RBAC 种子数据,开箱即用)
  • 关键资源(密钥 / 数据库密码)支持环境变量覆盖(KPI360_SECURITY_AESKEY 等)

六、架构总览

6.1 后端 DDD 四层

facade(HTTP 接口层)
   ├─ web/        Controller(@RestController + @SaCheckPermission)
   ├─ dto/        请求对象
   ├─ vo/         响应对象
   └─ assembler/  MapStruct 转换(Dto↔Command / View↔Vo)

application(应用层 · 编排 + 事务)
   ├─ command/    写命令对象
   ├─ query/      读返回 View(CQRS)
   └─ service/    AppService(@Transactional)

domain(领域层 · 业务核心)
   ├─ {system | assessment | auth | notification}
   ├─ entity / valobj / aggregate
   ├─ service     领域服务(含 ScoringEngine、CampaignGenerateService、ScoreCalculationService)
   ├─ repository  IXxxRepository 接口
   └─ port        防腐端口(OrgUserQueryPort / EvaluationFormQueryPort / NotificationPort)

infrastructure(基础设施层)
   ├─ persistence/{dataobject, mapper, converter, repository}
   ├─ bridge      端口实现
   └─ security    Sa-Token / BCrypt / AES 工具

依赖方向严格单向:facade → application → domain ← infrastructure,领域层不依赖任何技术框架,业务规则可独立单元测试。

6.2 前端

src/
├─ api/           接口封装(按业务模块 16 个)
├─ store/         Zustand(仅 auth)
├─ hooks/         usePermission(按 resCode 控制按钮显隐)
├─ router/        懒加载 + MenuGuard
├─ components/Layout/  动态菜单(基于后端 menu tree)
├─ pages/         15 个业务页面
└─ utils/         iconLibrary(统一 lucide 图标)
  • React 19 + TypeScript 6 + Vite 8 + Ant Design 6 + Tailwind 4
  • TanStack React Query 5 数据层,组件按"左树 + 右内容"标准模式
  • 国际化、主题色(紫色 #8b5cf6)、圆角(rounded-primary)统一约定

七、与一般开源练手项目的对比小结

能力 通常的练手项目 KPI-360
业务覆盖 单一考核口径 KPI / OKR / 360 / 通用 一体化
评分逻辑 硬编码 if-else 策略模式 + JSON 规则可配
关系生成 不支持 4 路评估关系自动生成 + 选人流程
数据安全 明文 字段级 AES + Sa-Token + 三层权限
状态机 没有或随意改字段 Campaign / Task / Inst 实体方法封装迁移
工程化 主分支 push 就上线 DDD 防腐 + Assembler + 单元可测试
文档化 README 一句话 后端 31 章 + 前端 28 章详细变更日志
可扩展性 改业务必须改核心 新增计分方式 / 考核类型 / 端口实现,零侵入

八、技术栈

后端:Java 17 · Spring Boot 3.2 · MyBatis-Plus · Sa-Token · MySQL 8 · Redis · MapStruct · Knife4j · Lombok · EasyExcel · Hutool

前端:React 19 · TypeScript 6 · Vite 8 · Ant Design 6 · Tailwind 4 · TanStack React Query 5 · Zustand · Axios · React Router 7 · Recharts · dayjs · lucide-react

详细技术栈与部署步骤见:

九、后期扩展

  • ✅ DDD 四层 + Assembler 层完成
  • ✅ KPI / OKR / 360 / 通用 四类考核模板支持
  • ✅ 5 套打分策略(DirectScore / Ratio / Step / AddSub / QualLevel)
  • ✅ 考核实例模型(CampaignInst) + 成绩确认 / 申诉
  • ✅ Sa-Token 三层权限隔离 + 字段级 AES 加密
  • ✅ 仪表盘按季度过滤(startMonth / endMonth)
  • 🚧 WebSocket 实时通知(替换 60s 轮询)
  • 🚧 批量导入导出(员工 / 模板 / 成绩 Excel)
  • 🚧 BI 集成(成绩同步至 Superset / DataEase)
  • 🚧 多租户隔离(SaaS 化版本)
  • 🚧 本项目后续会作为一个服务集成到作者另外一个正在开发的项目中(办聊)

十、开源协议

本项目采用 GPL2.0 协议,追加Commons Clause。

  • 允许个人 / 团队 技术学习企业内部使用
  • 禁止任何形式的对外商业化(包括但不限于:对外销售、SaaS 化对外服务、二次封装售卖等)
  • 商业授权请联系作者

二次分发须遵守 GPL 协议,保留版权声明与作者署名。

如果本项目对你有帮助,欢迎 Star ⭐ 与转发

posted on 2026-06-10 08:29  fish982000  阅读(3)  评论(0)    收藏  举报