AI 候选人面试综合评估
This commit is contained in:
@@ -6,6 +6,7 @@ import java.util.List;
|
||||
import com.vetti.common.core.domain.entity.SysUser;
|
||||
import com.vetti.hotake.domain.dto.HotakeAiCvScoringRankingDto;
|
||||
import com.vetti.hotake.domain.dto.HotakeCandidateCompatibilityDto;
|
||||
import com.vetti.hotake.domain.dto.HotakeCandidateInterviewEvaluationDto;
|
||||
import com.vetti.hotake.domain.dto.HotakeCvInfoDto;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
@@ -136,6 +137,12 @@ public class HotakeRolesApplyInfo extends BaseEntity
|
||||
@ApiModelProperty("候选人匹配度最终得分")
|
||||
private BigDecimal candidateCompatibilityScore;
|
||||
|
||||
@ApiModelProperty("候选人面试综合评估JSON")
|
||||
private String evaluationJson;
|
||||
|
||||
@ApiModelProperty("候选人面试综合评估最终得分")
|
||||
private BigDecimal evaluationScore;
|
||||
|
||||
@ApiModelProperty("岗位信息")
|
||||
private HotakeRolesInfo rolesInfo;
|
||||
|
||||
@@ -154,6 +161,9 @@ public class HotakeRolesApplyInfo extends BaseEntity
|
||||
@ApiModelProperty("招聘者查看候选人匹配度数据对象")
|
||||
private HotakeCandidateCompatibilityDto compatibilityDto;
|
||||
|
||||
@ApiModelProperty("候选人面试综合评估数据对象")
|
||||
private HotakeCandidateInterviewEvaluationDto evaluationDto;
|
||||
|
||||
@ApiModelProperty("岗位申请ID数据集合")
|
||||
private List<Long> applyRoleIdList;
|
||||
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.vetti.hotake.domain.dto;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 候选人面试综合评估 返回对象
|
||||
*
|
||||
* @author ID
|
||||
* @date 2025-09-06
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class HotakeCandidateInterviewEvaluationDto {
|
||||
|
||||
@ApiModelProperty("评估分数")
|
||||
private String assessmentScore;
|
||||
|
||||
@ApiModelProperty("评估等级")
|
||||
private String assessmentLevel;
|
||||
|
||||
@ApiModelProperty("评估明细说明")
|
||||
private List<String> assessmentDetails;
|
||||
|
||||
@ApiModelProperty("评分分数")
|
||||
private String ratingScore;
|
||||
|
||||
@ApiModelProperty("评分等级")
|
||||
private String ratingLevel;
|
||||
|
||||
@ApiModelProperty("评分明细说明")
|
||||
private List<String> ratingDetails;
|
||||
|
||||
@ApiModelProperty("问答分数")
|
||||
private String questionsScore;
|
||||
|
||||
@ApiModelProperty("问答等级")
|
||||
private String questionsLevel;
|
||||
|
||||
@ApiModelProperty("问答明细说明")
|
||||
private List<String> questionsDetails;
|
||||
|
||||
@ApiModelProperty("综合分数")
|
||||
private String overallScore;
|
||||
|
||||
@ApiModelProperty("推荐说明")
|
||||
private String recommendation;
|
||||
}
|
||||
@@ -50,6 +50,9 @@ public class HotakeCandidateInterviewEvaluationVo {
|
||||
@ApiModelProperty("证书")
|
||||
private String certifications;
|
||||
|
||||
@ApiModelProperty("面试时间")
|
||||
private String interviewData;
|
||||
|
||||
@ApiModelProperty("问题")
|
||||
private String questions;
|
||||
|
||||
|
||||
@@ -156,6 +156,6 @@ public interface IHotakeAiCommonToolsService {
|
||||
* @param evaluationVo 候选人面试综合评估 输入信息
|
||||
* @return
|
||||
*/
|
||||
public HotakeCandidateCompatibilityDto getCandidateInterviewEvaluation(HotakeCandidateInterviewEvaluationVo evaluationVo);
|
||||
public HotakeCandidateInterviewEvaluationDto getCandidateInterviewEvaluation(HotakeCandidateInterviewEvaluationVo evaluationVo);
|
||||
|
||||
}
|
||||
|
||||
@@ -1340,30 +1340,30 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public HotakeCandidateCompatibilityDto getCandidateInterviewEvaluation(HotakeCandidateInterviewEvaluationVo evaluationVo) {
|
||||
HotakeCandidateCompatibilityDto dto = new HotakeCandidateCompatibilityDto();
|
||||
public HotakeCandidateInterviewEvaluationDto getCandidateInterviewEvaluation(HotakeCandidateInterviewEvaluationVo evaluationVo) {
|
||||
HotakeCandidateInterviewEvaluationDto dto = new HotakeCandidateInterviewEvaluationDto();
|
||||
String prompt = AiCommonPromptConstants.initializationCandidateInterviewEvaluationPrompt();
|
||||
|
||||
String userPrompt_1 = "Job Posting:\n" +
|
||||
"Title: "+evaluationVo.getTitle()+"\n" +
|
||||
"Description: "+evaluationVo.getDescription()+"\n" +
|
||||
"Required Skills: ${jobPosting.required_skills.join(', ')}\n" +
|
||||
"Preferred Skills: ${jobPosting.preferred_skills.join(', ')}\n" +
|
||||
"Experience Required: ${jobPosting.experience_required}\n" +
|
||||
"Required Skills: "+evaluationVo.getRequiredSkills()+"\n" +
|
||||
"Preferred Skills: "+evaluationVo.getPreferredSkills()+"\n" +
|
||||
"Experience Required: "+evaluationVo.getExperienceRequired()+"\n" +
|
||||
"\n" +
|
||||
"Candidate Information:\n" +
|
||||
"Name: ${candidate.name}\n" +
|
||||
"Current Position: ${candidate.current_position}\n" +
|
||||
"Email: ${candidate.email}\n" +
|
||||
"Work Experience: ${candidate.work_experience}\n" +
|
||||
"Skills: ${candidate.skills.join(', ')}\n" +
|
||||
"Education: ${candidate.education}\n" +
|
||||
"Certifications: ${candidate.certifications.join(', ')}\n" +
|
||||
"Name: "+evaluationVo.getName()+"\n" +
|
||||
"Current Position: "+evaluationVo.getCurrentPosition()+"\n" +
|
||||
"Email: "+evaluationVo.getEmail()+"\n" +
|
||||
"Work Experience: "+evaluationVo.getWorkExperience()+"\n" +
|
||||
"Skills: "+evaluationVo.getSkills()+"\n" +
|
||||
"Education: "+evaluationVo.getEducation()+"\n" +
|
||||
"Certifications: "+evaluationVo.getCertifications()+"\n" +
|
||||
"\n" +
|
||||
"${interviewData ? `Interview Data:\n" +
|
||||
"Questions: ${interviewData.questions.join('; ')}\n" +
|
||||
"Answers: ${interviewData.answers.join('; ')}\n" +
|
||||
"Scores: Technical=${interviewData.scores.technical}, Communication=${interviewData.scores.communication}, Safety Awareness=${interviewData.scores.safety_awareness}, Problem Solving=${interviewData.scores.problem_solving}` : ''}\n" +
|
||||
"Interview Data:"+evaluationVo.getInterviewData()+"\n" +
|
||||
"Questions: "+evaluationVo.getQuestions()+"\n" +
|
||||
"Answers: "+evaluationVo.getAnswers()+"\n" +
|
||||
"Scores: Technical="+evaluationVo.getTechnical()+", Communication="+evaluationVo.getCommunication()+", Safety Awareness="+evaluationVo.getSafetyAwareness()+", Problem Solving="+evaluationVo.getProblemSolving()+"}\n" +
|
||||
"\n" +
|
||||
"Please analyze this candidate and provide a comprehensive overview with Assessment, Rating, and Questions scores.";
|
||||
|
||||
@@ -1378,38 +1378,37 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I
|
||||
mapUserEntityOne.put("content", userPrompt_1);
|
||||
listOne.add(mapUserEntityOne);
|
||||
String promptJsonOne = JSONUtil.toJsonStr(listOne);
|
||||
String resultStrOne = chatGPTClient.handleAiChat(promptJsonOne, "AICAC");
|
||||
String resultStrOne = chatGPTClient.handleAiChat(promptJsonOne, "AICIV");
|
||||
String resultJsonOne = resultStrOne.replaceAll("```json", "").replaceAll("```", "");
|
||||
log.info("候选人面试综合评估:{}", resultJsonOne);
|
||||
Map dataMap = JSONUtil.toBean(resultJsonOne, Map.class);
|
||||
if(ObjectUtil.isNotEmpty(dataMap.get("strengths_score"))){
|
||||
dto.setStrengthsScore(new BigDecimal(dataMap.get("strengths_score").toString()));
|
||||
}else{
|
||||
dto.setStrengthsScore(BigDecimal.ZERO);
|
||||
}
|
||||
if(ObjectUtil.isNotEmpty(dataMap.get("differences_score"))){
|
||||
dto.setDifferencesScore(new BigDecimal(dataMap.get("differences_score").toString()));
|
||||
}else{
|
||||
dto.setDifferencesScore(BigDecimal.ZERO);
|
||||
}
|
||||
if(ObjectUtil.isNotEmpty(dataMap.get("cultural_score"))){
|
||||
dto.setCulturalScore(new BigDecimal(dataMap.get("cultural_score").toString()));
|
||||
}else{
|
||||
dto.setCulturalScore(BigDecimal.ZERO);
|
||||
Map scoreBreakdownMap = (Map)dataMap.get("score_breakdown");
|
||||
if(scoreBreakdownMap != null){
|
||||
Map assessmentMap = (Map)scoreBreakdownMap.get("assessment");
|
||||
if(assessmentMap != null){
|
||||
dto.setAssessmentScore(assessmentMap.get("score").toString());
|
||||
dto.setAssessmentLevel(assessmentMap.get("score").toString());
|
||||
List<String> details = (List<String>)assessmentMap.get("details");
|
||||
dto.setAssessmentDetails(details);
|
||||
}
|
||||
Map ratingMap = (Map)scoreBreakdownMap.get("rating");
|
||||
if(ratingMap != null){
|
||||
dto.setRatingScore(ratingMap.get("score").toString());
|
||||
dto.setRatingLevel(ratingMap.get("score").toString());
|
||||
List<String> details = (List<String>)ratingMap.get("details");
|
||||
dto.setRatingDetails(details);
|
||||
}
|
||||
Map questionsMap = (Map)scoreBreakdownMap.get("questions");
|
||||
if(questionsMap != null){
|
||||
dto.setQuestionsScore(questionsMap.get("score").toString());
|
||||
dto.setQuestionsLevel(questionsMap.get("score").toString());
|
||||
List<String> details = (List<String>)questionsMap.get("details");
|
||||
dto.setQuestionsDetails(details);
|
||||
}
|
||||
}
|
||||
|
||||
List<String> strengths = (List<String>)dataMap.get("key_strengths");
|
||||
dto.setKeyStrengths(strengths);
|
||||
|
||||
List<String> differences = (List<String>)dataMap.get("key_differences");
|
||||
dto.setKeyDifferences(differences);
|
||||
|
||||
List<String> fitDetails = (List<String>)dataMap.get("cultural_fit_details");
|
||||
dto.setCulturalFitDetails(fitDetails);
|
||||
|
||||
BigDecimal overallScore = dto.getStrengthsScore().multiply(new BigDecimal(0.4)).
|
||||
add(dto.getDifferencesScore().multiply(new BigDecimal(0.3)).add(dto.getCulturalScore().multiply(new BigDecimal(0.3))));
|
||||
dto.setOverallScore(overallScore);
|
||||
dto.setOverallScore(dataMap.get("overall_score").toString());
|
||||
dto.setRecommendation(dataMap.get("recommendation").toString());
|
||||
|
||||
return dto;
|
||||
}
|
||||
|
||||
@@ -18,15 +18,9 @@ import com.vetti.common.utils.DateUtils;
|
||||
import com.vetti.common.utils.SecurityUtils;
|
||||
import com.vetti.common.utils.readFile.FileContentUtil;
|
||||
import com.vetti.hotake.domain.*;
|
||||
import com.vetti.hotake.domain.dto.HotakeAiCvScoringRankingDto;
|
||||
import com.vetti.hotake.domain.dto.HotakeCandidateCompatibilityDto;
|
||||
import com.vetti.hotake.domain.dto.HotakeCvInfoDto;
|
||||
import com.vetti.hotake.domain.dto.HotakeInitialQuestionEliminationScoreDto;
|
||||
import com.vetti.hotake.domain.dto.*;
|
||||
import com.vetti.hotake.domain.dto.VcDto.*;
|
||||
import com.vetti.hotake.domain.vo.HotakeAiCvScoringRankingRoleApplyVo;
|
||||
import com.vetti.hotake.domain.vo.HotakeCandidateCompatibilityVo;
|
||||
import com.vetti.hotake.domain.vo.HotakeInitScreQuestionsReplyRecordInfoVo;
|
||||
import com.vetti.hotake.domain.vo.HotakeInitialQuestionEliminationScoreVo;
|
||||
import com.vetti.hotake.domain.vo.*;
|
||||
import com.vetti.hotake.mapper.HotakeCvInfoMapper;
|
||||
import com.vetti.hotake.mapper.HotakeRolesApplyInfoMapper;
|
||||
import com.vetti.hotake.mapper.HotakeRolesInfoMapper;
|
||||
@@ -264,22 +258,53 @@ public class HotakeInitScreQuestionsReplyRecordInfoServiceImpl extends BaseServi
|
||||
applyInfo.setAiCvScore(scoringRankingDto.getOverallScore());
|
||||
|
||||
//招聘者查看候选人匹配度
|
||||
HotakeCandidateCompatibilityVo compatibilityVo = new HotakeCandidateCompatibilityVo();
|
||||
compatibilityVo.setPosition(rolesInf.getRoleName());
|
||||
// HotakeCandidateCompatibilityVo compatibilityVo = new HotakeCandidateCompatibilityVo();
|
||||
// compatibilityVo.setPosition(rolesInf.getRoleName());
|
||||
// HotakeCvInfoDto cvInfoDto = JSONUtil.toBean(applyInfo.getCvTemplateJson(), HotakeCvInfoDto.class);
|
||||
// compatibilityVo.setCurrentPosition(cvInfoDto.getPosition());
|
||||
// compatibilityVo.setOverallRating(scoringRankingDto.getOverallScore().toString());
|
||||
// compatibilityVo.setWorkExperience(cvInfoDto.getExperienceYear());
|
||||
// List<String> skills = new ArrayList<>();
|
||||
// if(CollectionUtil.isNotEmpty(cvInfoDto.getSkillsTools())){
|
||||
// for (VcSkillsToolsDto toolsDto : cvInfoDto.getSkillsTools()){
|
||||
// skills.add(toolsDto.getContent());
|
||||
// }
|
||||
// }
|
||||
// compatibilityVo.setSkills(skills);
|
||||
//
|
||||
//
|
||||
//
|
||||
// HotakeCandidateCompatibilityDto compatibilityDto = aiCommonToolsService.handleCandidateCompatibility(compatibilityVo);
|
||||
// applyInfo.setCandidateCompatibilityJson(JSONUtil.toJsonStr(compatibilityDto));
|
||||
// applyInfo.setCandidateCompatibilityScore(compatibilityDto.getOverallScore());
|
||||
|
||||
//候选人面试综合评估
|
||||
HotakeCandidateInterviewEvaluationVo evaluationVo = new HotakeCandidateInterviewEvaluationVo();
|
||||
|
||||
evaluationVo.setTitle(rolesInf.getRoleName());
|
||||
evaluationVo.setDescription(rolesInf.getAboutRole());
|
||||
evaluationVo.setRequiredSkills(rolesInf.getRequiredSkillsJson());
|
||||
evaluationVo.setPreferredSkills(rolesInf.getNiceToHaveSkillsJson());
|
||||
evaluationVo.setExperienceRequired(rolesInf.getJobExperience());
|
||||
HotakeCvInfoDto cvInfoDto = JSONUtil.toBean(applyInfo.getCvTemplateJson(), HotakeCvInfoDto.class);
|
||||
compatibilityVo.setCurrentPosition(cvInfoDto.getPosition());
|
||||
compatibilityVo.setOverallRating(scoringRankingDto.getOverallScore().toString());
|
||||
compatibilityVo.setWorkExperience(cvInfoDto.getExperienceYear());
|
||||
List<String> skills = new ArrayList<>();
|
||||
if(CollectionUtil.isNotEmpty(cvInfoDto.getSkillsTools())){
|
||||
for (VcSkillsToolsDto toolsDto : cvInfoDto.getSkillsTools()){
|
||||
skills.add(toolsDto.getContent());
|
||||
}
|
||||
}
|
||||
compatibilityVo.setSkills(skills);
|
||||
HotakeCandidateCompatibilityDto compatibilityDto = aiCommonToolsService.handleCandidateCompatibility(compatibilityVo);
|
||||
applyInfo.setCandidateCompatibilityJson(JSONUtil.toJsonStr(compatibilityDto));
|
||||
applyInfo.setCandidateCompatibilityScore(compatibilityDto.getOverallScore());
|
||||
evaluationVo.setName(cvInfoDto.getName());
|
||||
evaluationVo.setCurrentPosition(cvInfoDto.getPosition());
|
||||
evaluationVo.setEmail(cvInfoDto.getEmail());
|
||||
evaluationVo.setWorkExperience(JSONUtil.toJsonStr(cvInfoDto.getExperience()));
|
||||
evaluationVo.setSkills(JSONUtil.toJsonStr(cvInfoDto.getSkillsTools()));
|
||||
evaluationVo.setEducation(JSONUtil.toJsonStr(cvInfoDto.getEducation()));
|
||||
evaluationVo.setCertifications("");
|
||||
evaluationVo.setInterviewData("");
|
||||
evaluationVo.setQuestions("");
|
||||
evaluationVo.setAnswers("");
|
||||
evaluationVo.setTechnical("");
|
||||
evaluationVo.setCommunication("");
|
||||
evaluationVo.setSafetyAwareness("");
|
||||
evaluationVo.setProblemSolving("");
|
||||
|
||||
HotakeCandidateInterviewEvaluationDto evaluationDto = aiCommonToolsService.getCandidateInterviewEvaluation(evaluationVo);
|
||||
applyInfo.setEvaluationJson(JSONUtil.toJsonStr(evaluationDto));
|
||||
applyInfo.setEvaluationScore(new BigDecimal(evaluationDto.getOverallScore()));
|
||||
|
||||
applyInfo.setRecruiterId(rolesInf.getRecruiterId());
|
||||
applyInfo.setStage(StageEnum.APPLIED.getCode());
|
||||
|
||||
Reference in New Issue
Block a user