From efbfcb339d1e8251afd240a8c6564d23be959a54 Mon Sep 17 00:00:00 2001 From: Administrator Date: Thu, 22 Jan 2026 22:11:55 +0800 Subject: [PATCH] =?UTF-8?q?AI=E9=9D=A2=E8=AF=95=E9=97=AE=E9=A2=98=E7=94=9F?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/HotakeAiCommonToolsController.java | 3 +- .../constant/AiCommonPromptConstants.java | 2 +- .../service/IHotakeAiCommonToolsService.java | 2 +- .../impl/HotakeAiCommonToolsServiceImpl.java | 62 +++++++++++++++---- 4 files changed, 54 insertions(+), 15 deletions(-) diff --git a/vetti-admin/src/main/java/com/vetti/web/controller/ai/HotakeAiCommonToolsController.java b/vetti-admin/src/main/java/com/vetti/web/controller/ai/HotakeAiCommonToolsController.java index b3b456c..5b38d4e 100644 --- a/vetti-admin/src/main/java/com/vetti/web/controller/ai/HotakeAiCommonToolsController.java +++ b/vetti-admin/src/main/java/com/vetti/web/controller/ai/HotakeAiCommonToolsController.java @@ -2,6 +2,7 @@ package com.vetti.web.controller.ai; import com.vetti.common.core.controller.BaseController; import com.vetti.common.core.domain.R; +import com.vetti.hotake.domain.HotakeAiInterviewQuestionsInfo; import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo; import com.vetti.hotake.domain.HotakeRolesInfo; import com.vetti.hotake.domain.dto.*; @@ -177,7 +178,7 @@ public class HotakeAiCommonToolsController extends BaseController { */ @ApiOperation("AI面试问题生成") @PostMapping(value = "/aiInterviewQuestions") - public R handleAiInterviewQuestions(@RequestBody HotakeRolesInfo rolesInfo) + public R handleAiInterviewQuestions(@RequestBody HotakeRolesInfo rolesInfo) { return R.ok(hotakeAiCommonToolsService.getAiInterviewQuestions(rolesInfo)); } diff --git a/vetti-common/src/main/java/com/vetti/common/constant/AiCommonPromptConstants.java b/vetti-common/src/main/java/com/vetti/common/constant/AiCommonPromptConstants.java index 62a3c2c..936c4db 100644 --- a/vetti-common/src/main/java/com/vetti/common/constant/AiCommonPromptConstants.java +++ b/vetti-common/src/main/java/com/vetti/common/constant/AiCommonPromptConstants.java @@ -2072,7 +2072,7 @@ public class AiCommonPromptConstants { "4. Avoid cultural bias and discriminatory content\n" + "5. Don't design complex algorithm questions requiring long thinking time\n" + "\n" + - "Please generate a high-quality, standardized set of AI interview questions based on the provided job information.\n"; + "Please generate a high-quality, standardized set of AI interview questions based on the provided job information.Only return JSON structured data, no other data.\n"; return promptStr; } diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeAiCommonToolsService.java b/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeAiCommonToolsService.java index f04b659..7483602 100644 --- a/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeAiCommonToolsService.java +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeAiCommonToolsService.java @@ -125,7 +125,7 @@ public interface IHotakeAiCommonToolsService { * @param rolesInfo 岗位信息 * @return */ - public String getAiInterviewQuestions(HotakeRolesInfo rolesInfo); + public HotakeAiInterviewQuestionsInfo getAiInterviewQuestions(HotakeRolesInfo rolesInfo); /** diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeAiCommonToolsServiceImpl.java b/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeAiCommonToolsServiceImpl.java index 8f2cf0d..7d71a4d 100644 --- a/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeAiCommonToolsServiceImpl.java +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeAiCommonToolsServiceImpl.java @@ -13,14 +13,12 @@ import com.vetti.common.enums.RoleBenefitsEnum; import com.vetti.common.exception.ServiceException; import com.vetti.common.utils.SecurityUtils; import com.vetti.common.utils.html.ReadHtmlByOkHttp; -import com.vetti.hotake.domain.HotakeInitScreQuestionsReplyRecordInfo; -import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo; -import com.vetti.hotake.domain.HotakeRolesApplyInfo; -import com.vetti.hotake.domain.HotakeRolesInfo; +import com.vetti.hotake.domain.*; import com.vetti.hotake.domain.dto.*; import com.vetti.hotake.domain.dto.VcDto.*; import com.vetti.hotake.domain.dto.roleDto.*; import com.vetti.hotake.domain.vo.*; +import com.vetti.hotake.mapper.HotakeAiInterviewQuestionsInfoMapper; import com.vetti.hotake.mapper.HotakeInitialScreeningQuestionsInfoMapper; import com.vetti.hotake.mapper.HotakeRolesApplyInfoMapper; import com.vetti.hotake.mapper.HotakeRolesInfoMapper; @@ -55,6 +53,9 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I @Autowired private HotakeInitialScreeningQuestionsInfoMapper hotakeInitialScreeningQuestionsInfoMapper; + @Autowired + private HotakeAiInterviewQuestionsInfoMapper hotakeAiInterviewQuestionsInfoMapper; + @Autowired private ChatGPTClient chatGPTClient; @@ -588,12 +589,20 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I @Override public String handleWebInfoExtract(HotakeWebInfoExtractVo webInfoExtractVo) { //获取 - String webContent = handleWebContentScraping(webInfoExtractVo.getWebUrl()); + if(StrUtil.isEmpty(webInfoExtractVo.getWebUrl())){ + throw new ServiceException(""); + } + String webUrl = webInfoExtractVo.getWebUrl(); + if(!webInfoExtractVo.getWebUrl().toLowerCase().contains("https")){ + webUrl = webUrl.replaceAll("http","https"); + } + + String webContent = handleWebContentScraping(webUrl); String prompt = AiCommonPromptConstants.initializationWebInfoExtractPrompt(); String userPrompt = "Please analyze the following company website:\n" + "\n" + - "URL: " + webInfoExtractVo.getWebUrl() + "\n" + + "URL: " + webUrl + "\n" + "\n" + "Content:\n" + webContent; @@ -973,19 +982,20 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I * @return */ @Override - public String getAiInterviewQuestions(HotakeRolesInfo rolesInfo) { + public HotakeAiInterviewQuestionsInfo getAiInterviewQuestions(HotakeRolesInfo rolesInfo) { + HotakeRolesInfo hotakeRolesInfo = hotakeRolesInfoMapper.selectHotakeRolesInfoById(rolesInfo.getId()); String prompt = AiCommonPromptConstants.initializationAiInterviewQuestionsPrompt(); String userPrompt_1 = "Please generate AI interview questions based on the following job description:\n" + "\n" + "**Job Information**:\n" + - "Job Title:【" + rolesInfo.getRoleName() + "】\n" + - "Technical Requirements:【" + rolesInfo.getRequiredSkillsJson() + "-" + rolesInfo.getNiceToHaveSkillsJson() + "】\n" + - "Experience Requirements:【" + rolesInfo.getJobExperience() + "】\n" + + "Job Title:【" + hotakeRolesInfo.getRoleName() + "】\n" + + "Technical Requirements:【" + hotakeRolesInfo.getRequiredSkillsJson() + "-" + hotakeRolesInfo.getNiceToHaveSkillsJson() + "】\n" + + "Experience Requirements:【" + hotakeRolesInfo.getJobExperience() + "】\n" + "Interview Duration:【】\n" + "Company Culture:【】\n" + - "Special Requirements:【" + rolesInfo.getAboutRole() + "】\n" + + "Special Requirements:【" + hotakeRolesInfo.getAboutRole() + "】\n" + "`;"; log.info("AI面试问题生成:{}", userPrompt_1); //处理岗位信息补充 @@ -1003,7 +1013,35 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I String resultJsonOne = resultStrOne.replaceAll("```json", "").replaceAll("```", ""); log.info("AI面试问题生成结果:{}", resultJsonOne); - return resultJsonOne; + try{ + Map mapData = JSONUtil.toBean(resultJsonOne,Map.class); + List questionMapList = (List)mapData.get("interview_questions"); + if(CollectionUtil.isNotEmpty(questionMapList)){ + HotakeAiInterviewQuestionsInfo questionsInfo = new HotakeAiInterviewQuestionsInfo(); + questionsInfo.setQuestionTitle("General Questions"); + questionsInfo.setFocusType("Personality & Culture"); + questionsInfo.setRoleId(rolesInfo.getId()); + questionsInfo.setRecruiterId(SecurityUtils.getUserId()); + questionsInfo.setOverview("This is General Questions Overview"); + + BigDecimal times = BigDecimal.ZERO; + List questionDtoList = new ArrayList<>(); + for(Map map : questionMapList){ + AiQuestionDto questionDto = new AiQuestionDto(); + questionDto.setQuestions(map.get("question_text").toString()); + questionDtoList.add(questionDto); + times = times.add(new BigDecimal(map.get("estimated_time").toString())); + } + questionsInfo.setAiQuestionList(questionDtoList); + questionsInfo.setTimes(times.toString()); + //进行数据更新 + hotakeAiInterviewQuestionsInfoMapper.insertHotakeAiInterviewQuestionsInfo(questionsInfo); + return questionsInfo; + } + }catch (Exception e){ + e.printStackTrace(); + } + return new HotakeAiInterviewQuestionsInfo(); } /**