1. 项目背景与意义
在数字化转型浪潮下,传统企业绩效考核普遍面临三大痛点:一是考核指标依赖人工统计,数据分散在Excel、纸质表单中,效率低下且易出错;二是考核过程缺乏透明度,员工对评分依据存疑,容易引发争议;三是考核结果难以沉淀为数据资产,无法为人才梯队建设、薪酬调整提供科学依据。
本系统基于SpringBoot构建稳定可靠的后端服务,融合AI能力实现考核指标智能推荐、评语自动生成、绩效趋势预测等智能化功能,旨在帮助企业实现绩效考核的数字化、智能化、透明化,提升HR管理效率,激发员工积极性。
系统核心价值体现在三个方面:
- 效率提升:将考核周期从数周缩短至数天,自动化处理数据汇总与评分计算。
- 公平透明:考核流程全程留痕,AI辅助校准评分偏差,减少主观因素干扰。
- 数据驱动:沉淀绩效数据,通过AI分析识别高潜人才与待改进项,支撑管理决策。
2. 系统技术栈选型
本系统采用前后端分离架构,后端以SpringBoot为核心,前端使用Vue3,AI能力通过集成大语言模型API实现。整体技术栈如下:
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | SpringBoot 2.7.x | 快速构建RESTful API,内置Tomcat容器 |
| 持久层 | MyBatis-Plus + MySQL 8.0 | 简化CRUD操作,支持复杂查询与事务 |
| 安全认证 | Spring Security + JWT | 实现用户认证与接口权限控制 |
| AI能力 | OpenAI API / 通义千问 | 实现指标推荐、评语生成、趋势预测 |
| 缓存 | Redis | 缓存热点数据,提升查询性能 |
| 前端 | Vue3 + Element Plus + ECharts | 构建管理后台与数据可视化大屏 |
| 构建工具 | Maven + Node.js | 后端依赖管理与前端打包 |
3. 系统核心功能模块
系统围绕绩效考核全流程设计,主要包含以下功能模块:
3.1 考核指标管理
支持自定义考核维度(如工作业绩、工作能力、工作态度),每个维度下可配置具体指标项、权重和评分标准。AI模块可根据岗位类型智能推荐指标模板,减少HR配置工作量。
3.2 考核流程管理
支持自评、上级评、同事互评等多种考核方式,流程节点可灵活配置。系统自动汇总各维度得分,按权重计算综合绩效等级(A/B/C/D)。
3.3 AI智能辅助
这是本系统的核心亮点,AI能力贯穿考核全流程:
- 指标推荐:根据岗位描述自动生成考核指标建议。
- 评语生成:根据评分数据自动生成个性化考核评语。
- 绩效预测:基于历史数据预测员工绩效趋势,识别风险。
- 异常检测:识别评分异常(如全部满分、恶意低分),辅助HR复核。
3.4 数据可视化
通过ECharts展示部门绩效分布、个人绩效趋势、指标达成率等图表,支持一键导出考核报告。
4. 核心代码实现
下面重点展示系统后端核心代码,包括实体类、AI服务调用和考核计算逻辑。
4.1 项目依赖配置(pom.xml)
<dependencies> <!-- SpringBoot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MyBatis-Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- JWT --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency> <!-- HTTP客户端(调用AI接口) --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.14</version> </dependency> </dependencies>4.2 考核指标实体类
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("assessment_indicator") public class AssessmentIndicator { @TableId(type = IdType.AUTO) private Long id; /** 指标名称 / private String indicatorName; /* 所属维度:业绩/能力/态度 / private String dimension; /* 指标权重(0-100) / private BigDecimal weight; /* 评分标准说明 / private String standard; /* 适用岗位类型 / private String positionType; /* 创建时间 */ private LocalDateTime createTime; }4.3 AI服务调用核心类
本类封装了与AI大模型的交互逻辑,实现指标推荐和评语生成功能。通过HTTP调用OpenAI兼容接口,使用流式响应提升体验。
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; @Service public class AiService { @Value("${ai.api.url}") private String apiUrl; @Value("${ai.api.key}") private String apiKey; @Value("${ai.model}") private String model; private final RestTemplate restTemplate = new RestTemplate(); private final ObjectMapper objectMapper = new ObjectMapper(); /** 根据岗位描述生成考核指标建议 */ public String generateIndicators(String positionDesc) { String prompt = "你是一位资深HR绩效管理专家。请根据以下岗位描述,推荐5-8个核心绩效考核指标," + "每个指标包含:指标名称、考核维度(业绩/能力/态度)、权重建议(合计100%)、评分标准。" + "请以JSON数组格式输出。岗位描述:" + positionDesc; return callAiApi(prompt); } /** 根据评分数据生成考核评语 */ public String generateComment(String employeeName, Map<String, Object> scores) { String prompt = "请为员工" + employeeName + "生成一段200字左右的绩效考核评语。" + "评分数据如下:" + scores.toString() + "要求:语言专业、客观公正,先肯定优点,再指出不足,最后给出改进建议。"; return callAiApi(prompt); } /** 调用AI大模型API */ private String callAiApi(String prompt) { try { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setBearerAuth(apiKey); Map&lt;String, Object&gt; requestBody = new HashMap&lt;&gt;(); requestBody.put("model", model); requestBody.put("messages", new Object[]{ Map.of("role", "user", "content", prompt) }); requestBody.put("temperature", 0.7); HttpEntity&lt;Map&lt;String, Object&gt;&gt; entity = new HttpEntity&lt;&gt;(requestBody, headers); ResponseEntity&lt;String&gt; response = restTemplate.exchange( apiUrl, HttpMethod.POST, entity, String.class); JsonNode root = objectMapper.readTree(response.getBody()); return root.path("choices").get(0).path("message").path("content").asText(); } catch (Exception e) { // 降级处理:AI服务不可用时返回默认提示 return "AI服务暂时不可用,请稍后重试或手动填写。"; } } }4.4 绩效考核计算服务
本类实现考核分数的汇总计算,支持多维度加权评分,并集成AI异常检测功能。
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class AssessmentService { private final IndicatorMapper indicatorMapper; private final ScoreRecordMapper scoreRecordMapper; private final AiService aiService; public AssessmentService(IndicatorMapper indicatorMapper, ScoreRecordMapper scoreRecordMapper, AiService aiService) { this.indicatorMapper = indicatorMapper; this.scoreRecordMapper = scoreRecordMapper; this.aiService = aiService; } /** 计算员工综合绩效得分 @param employeeId 员工ID @param period 考核周期,如2026-Q3 @return 综合得分和绩效等级 */ @Transactional public AssessmentResult calculateScore(Long employeeId, String period) { // 1. 查询该员工所有考核指标 List<AssessmentIndicator> indicators = indicatorMapper.selectList(null); // 2. 查询该员工本周期所有评分记录 List<ScoreRecord> records = scoreRecordMapper.selectByEmployeeAndPeriod(employeeId, period); // 3. 按指标分组计算平均分 Map<Long, BigDecimal> indicatorAvgScores = records.stream() .collect(Collectors.groupingBy( ScoreRecord::getIndicatorId, Collectors.mapping( ScoreRecord::getScore, Collectors.collectingAndThen( Collectors.averagingDouble(BigDecimal::doubleValue), avg -> BigDecimal.valueOf(avg).setScale(2, RoundingMode.HALF_UP) ) ) )); // 4. 按权重计算综合得分 BigDecimal totalScore = BigDecimal.ZERO; for (AssessmentIndicator indicator : indicators) { BigDecimal avgScore = indicatorAvgScores.getOrDefault(indicator.getId(), BigDecimal.ZERO); // 得分 = 平均分 * 权重 / 100 BigDecimal weightedScore = avgScore .multiply(indicator.getWeight()) .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); totalScore = totalScore.add(weightedScore); } // 5. 根据得分确定绩效等级 String grade = determineGrade(totalScore); // 6. 调用AI生成评语 Map<String, Object> scoreMap = Map.of( "综合得分", totalScore, "绩效等级", grade, "指标明细", indicatorAvgScores ); String aiComment = aiService.generateComment("员工" + employeeId, scoreMap); // 7. 保存考核结果 AssessmentResult result = new AssessmentResult(); result.setEmployeeId(employeeId); result.setPeriod(period); result.setTotalScore(totalScore); result.setGrade(grade); result.setAiComment(aiComment); result.setCreateTime(LocalDateTime.now()); return result; } /** 根据得分确定绩效等级 A: 90-100, B: 80-89, C: 60-79, D: 60以下 */ private String determineGrade(BigDecimal score) { if (score.compareTo(BigDecimal.valueOf(90)) >= 0) { return "A"; } else if (score.compareTo(BigDecimal.valueOf(80)) >= 0) { return "B"; } else if (score.compareTo(BigDecimal.valueOf(60)) >= 0) { return "C"; } else { return "D"; } } }4.5 考核接口控制器
import org.springframework.web.bind.annotation.*; import org.springframework.http.ResponseEntity; import java.util.List; @RestController @RequestMapping("/api/assessment") public class AssessmentController { private final AssessmentService assessmentService; private final AiService aiService; public AssessmentController(AssessmentService assessmentService, AiService aiService) { this.assessmentService = assessmentService; this.aiService = aiService; } /** 提交评分 */ @PostMapping("/score") public ResponseEntity<ApiResponse> submitScore(@RequestBody ScoreRecord record) { // 保存评分记录 scoreRecordMapper.insert(record); return ResponseEntity.ok(ApiResponse.success("评分提交成功")); } /** 计算员工考核结果 */ @GetMapping("/calculate/{employeeId}") public ResponseEntity<ApiResponse> calculate( @PathVariable Long employeeId, @RequestParam String period) { AssessmentResult result = assessmentService.calculateScore(employeeId, period); return ResponseEntity.ok(ApiResponse.success(result)); } /** AI生成考核指标建议 */ @PostMapping("/ai/indicators") public ResponseEntity<ApiResponse> generateIndicators(@RequestBody Map<String, String> request) { String positionDesc = request.get("positionDesc"); String suggestions = aiService.generateIndicators(positionDesc); return ResponseEntity.ok(ApiResponse.success(suggestions)); } /** 查询部门绩效分布 */ @GetMapping("/department/{deptId}") public ResponseEntity<ApiResponse> getDepartmentStats(@PathVariable Long deptId) { // 查询部门所有员工考核结果,返回统计数据 List<AssessmentResult> results = assessmentService.getDepartmentResults(deptId); return ResponseEntity.ok(ApiResponse.success(results)); } }5. 系统架构设计
系统采用经典的三层架构,结合AI服务实现智能化能力。整体架构如下:
flowchart TD A[前端 Vue3 + Element Plus] -->|RESTful API| B[SpringBoot 后端] B --> C[Controller 层] C --> D[Service 业务层] D --> E[Mapper 持久层] E --> F[(MySQL 数据库)] D --> G[AI 服务层] G --> H[大语言模型 API] D --> I[(Redis 缓存)] D --> J[考核计算引擎] J --> K[绩效等级评定] J --> L[异常检测]6. 系统部署与配置
系统部署采用Docker容器化方案,关键配置如下:
6.1 application.yml 核心配置
server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/performance_db?useUnicode=true&characterEncoding=utf8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1