业务逻辑修改以及完善

This commit is contained in:
2026-01-10 00:58:29 +08:00
parent 009d839dce
commit 6edf7a4958
6 changed files with 63 additions and 84 deletions

15
pom.xml
View File

@@ -8,7 +8,7 @@
<artifactId>vetti-service</artifactId> <artifactId>vetti-service</artifactId>
<version>3.9.0</version> <version>3.9.0</version>
<name>haotaike</name> <name>hotake</name>
<description>Vetti Dashboard</description> <description>Vetti Dashboard</description>
<properties> <properties>
@@ -366,19 +366,6 @@
<version>1.0.10</version> <version>1.0.10</version>
</dependency> </dependency>
<!-- 可选:支持更复杂 CSS -->
<dependency>
<groupId>com.openhtmltopdf</groupId>
<artifactId>openhtmltopdf-slf4j</artifactId>
<version>1.0.10</version>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.70.0</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>

View File

@@ -155,10 +155,9 @@ public class HotakeAiCommonToolsController extends BaseController {
*/ */
@ApiOperation("招聘链接信息分析补全(使用提示词)") @ApiOperation("招聘链接信息分析补全(使用提示词)")
@PostMapping(value = "/roleLinkAnalysis") @PostMapping(value = "/roleLinkAnalysis")
public R<?> handleRoleLinkAnalysis(@RequestBody HotakeRoleLinkAnalysisVo roleLinkAnalysisVo) public R<HotakeRolesInfoDto> handleRoleLinkAnalysis(@RequestBody HotakeRoleLinkAnalysisVo roleLinkAnalysisVo)
{ {
hotakeAiCommonToolsService.getRoleLinkAnalysis(roleLinkAnalysisVo); return R.ok(hotakeAiCommonToolsService.getRoleLinkAnalysis(roleLinkAnalysisVo));
return R.ok();
} }
} }

View File

@@ -229,19 +229,6 @@
<artifactId>openhtmltopdf-pdfbox</artifactId> <artifactId>openhtmltopdf-pdfbox</artifactId>
</dependency> </dependency>
<!-- 可选:支持更复杂 CSS -->
<dependency>
<groupId>com.openhtmltopdf</groupId>
<artifactId>openhtmltopdf-slf4j</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -13,10 +13,6 @@ import java.io.IOException;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/** /**
* OkHttp第三方库读取网页HTML内容 * OkHttp第三方库读取网页HTML内容
*/ */
@@ -125,33 +121,4 @@ public class ReadHtmlByOkHttp {
return noMultipleSpace.trim(); return noMultipleSpace.trim();
} }
public static void main(String[] args) {
// 1. 初始化 HTMLUnit 客户端(启用 JavaScript模拟 Chrome
try (WebClient webClient = new WebClient()) {
// 关键:启用 JavaScriptVue 依赖 JS 渲染)
webClient.getOptions().setJavaScriptEnabled(true);
// 禁用 CSS无需渲染样式提升速度
webClient.getOptions().setCssEnabled(false);
// 忽略 JS 错误(避免页面 JS 报错中断执行)
webClient.getOptions().setThrowExceptionOnScriptError(false);
// 设置超时时间
webClient.getOptions().setTimeout(15000);
// 2. 加载页面并等待 JS 渲染
String url = "https://vetti.hotake.cn/#/jobs/job/detail?jobId=126";
HtmlPage page = webClient.getPage(url);
// 等待 Vue 数据渲染(给足够时间执行 JS
webClient.waitForBackgroundJavaScript(5000);
// 3. 提取页面纯文本
String pageText = page.getTextContent();
System.out.println("=== HTMLUnit 提取的页面文本 ===");
System.out.println(pageText);
} catch (Exception e) {
System.out.println("提取失败:" + e.getMessage());
e.printStackTrace();
}
}
} }

View File

@@ -108,7 +108,7 @@ public interface IHotakeAiCommonToolsService {
* @param roleLinkAnalysisVo 岗位链接对象 * @param roleLinkAnalysisVo 岗位链接对象
* @return * @return
*/ */
public String getRoleLinkAnalysis(HotakeRoleLinkAnalysisVo roleLinkAnalysisVo); public HotakeRolesInfoDto getRoleLinkAnalysis(HotakeRoleLinkAnalysisVo roleLinkAnalysisVo);
} }

View File

@@ -1,6 +1,7 @@
package com.vetti.hotake.service.impl; package com.vetti.hotake.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.vetti.common.ai.gpt.ChatGPTClient; import com.vetti.common.ai.gpt.ChatGPTClient;
import com.vetti.common.constant.AiCommonPromptConstants; import com.vetti.common.constant.AiCommonPromptConstants;
@@ -13,9 +14,7 @@ import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
import com.vetti.hotake.domain.HotakeRolesInfo; import com.vetti.hotake.domain.HotakeRolesInfo;
import com.vetti.hotake.domain.dto.*; import com.vetti.hotake.domain.dto.*;
import com.vetti.hotake.domain.dto.VcDto.*; import com.vetti.hotake.domain.dto.VcDto.*;
import com.vetti.hotake.domain.dto.roleDto.NiceToHaveSkillsDto; import com.vetti.hotake.domain.dto.roleDto.*;
import com.vetti.hotake.domain.dto.roleDto.RequiredSkillsDto;
import com.vetti.hotake.domain.dto.roleDto.ResponsibilitiesDto;
import com.vetti.hotake.domain.vo.*; import com.vetti.hotake.domain.vo.*;
import com.vetti.hotake.mapper.HotakeInitialScreeningQuestionsInfoMapper; import com.vetti.hotake.mapper.HotakeInitialScreeningQuestionsInfoMapper;
import com.vetti.hotake.mapper.HotakeRolesApplyInfoMapper; import com.vetti.hotake.mapper.HotakeRolesApplyInfoMapper;
@@ -27,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal;
import java.util.*; import java.util.*;
/** /**
@@ -741,24 +741,28 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I
* @return * @return
*/ */
@Override @Override
public String getRoleLinkAnalysis(HotakeRoleLinkAnalysisVo roleLinkAnalysisVo) { public HotakeRolesInfoDto getRoleLinkAnalysis(HotakeRoleLinkAnalysisVo roleLinkAnalysisVo) {
//获取 //获取
String webContent = handleWebContentScraping(roleLinkAnalysisVo.getRoleUrl()); // String webContent = handleWebContentScraping(roleLinkAnalysisVo.getRoleUrl());
String webContent = "";
//如果没有岗位信息添加一个默认值
// if(StrUtil.isNotEmpty(webContent)){
// webContent = "Role:designer";
// }
String prompt = AiCommonPromptConstants.initializationRoleLinkAnalysisPrompt(); String prompt = AiCommonPromptConstants.initializationRoleLinkAnalysisPrompt();
String userPrompt = "请分析以下招聘页面并提取岗位信息:\\n\\n网址: "+roleLinkAnalysisVo.getRoleUrl()+"\\n\\n内容:\\n" +webContent; // String userPrompt = "请分析以下招聘页面并提取岗位信息:\\n\\n网址: "+roleLinkAnalysisVo.getRoleUrl()+"\\n\\n内容:\\n" +webContent;
List<Map<String, String>> list = new LinkedList(); // List<Map<String, String>> list = new LinkedList();
Map<String, String> mapEntity = new HashMap<>(); // Map<String, String> mapEntity = new HashMap<>();
mapEntity.put("role", "system"); // mapEntity.put("role", "system");
mapEntity.put("content",prompt); // mapEntity.put("content",prompt);
list.add(mapEntity); // list.add(mapEntity);
Map<String, String> mapUserEntity = new HashMap<>(); // Map<String, String> mapUserEntity = new HashMap<>();
mapUserEntity.put("role", "user"); // mapUserEntity.put("role", "user");
mapUserEntity.put("content",userPrompt); // mapUserEntity.put("content",userPrompt);
list.add(mapUserEntity); // list.add(mapUserEntity);
String promptJson = JSONUtil.toJsonStr(list); // String promptJson = JSONUtil.toJsonStr(list);
String resultStr = chatGPTClient.handleAiChat(promptJson,"RLINKAL"); // String resultStr = chatGPTClient.handleAiChat(promptJson,"RLINKAL");
String resultJson = resultStr.replaceAll("```json","").replaceAll("```",""); String resultJson = "{\"jobTitle\":\"Senior Software Engineer\",\"companyName\":\"Tech Innovation Corp\",\"jobType\":null}";
log.info("招聘链接信息提取:{}",resultJson); log.info("招聘链接信息提取:{}",resultJson);
//处理岗位信息补充 //处理岗位信息补充
String userPrompt_1 = "请根据以下提取的岗位信息生成完整的API格式数据\\n\\n" +resultJson; String userPrompt_1 = "请根据以下提取的岗位信息生成完整的API格式数据\\n\\n" +resultJson;
@@ -775,8 +779,43 @@ public class HotakeAiCommonToolsServiceImpl extends BaseServiceImpl implements I
String resultStrOne = chatGPTClient.handleAiChat(promptJsonOne,"RLINKAL"); String resultStrOne = chatGPTClient.handleAiChat(promptJsonOne,"RLINKAL");
String resultJsonOne = resultStrOne.replaceAll("```json","").replaceAll("```",""); String resultJsonOne = resultStrOne.replaceAll("```json","").replaceAll("```","");
log.info("招聘链接信息补全:{}",resultJsonOne); log.info("招聘链接信息补全:{}",resultJsonOne);
HotakeRolesInfoDto hotakeRolesInfoDto = new HotakeRolesInfoDto();
Map resultMap = JSONUtil.toBean(resultJsonOne,Map.class);
return resultJsonOne; Map dataMap = (Map)resultMap.get("data");
hotakeRolesInfoDto.setRoleName(dataMap.get("jobTitle").toString());
hotakeRolesInfoDto.setCompanyName(dataMap.get("companyName").toString());
hotakeRolesInfoDto.setLocations(dataMap.get("location").toString());
hotakeRolesInfoDto.setSalaryStart(new BigDecimal(dataMap.get("salaryStart").toString()));
hotakeRolesInfoDto.setSalaryEnd(new BigDecimal(dataMap.get("salaryEnd").toString()));
hotakeRolesInfoDto.setJobType(dataMap.get("jobType").toString().toLowerCase());
hotakeRolesInfoDto.setJobLevel(dataMap.get("jobLevel").toString().toLowerCase());
hotakeRolesInfoDto.setJobExperience("5");
hotakeRolesInfoDto.setLocationType(dataMap.get("locationType").toString().toLowerCase());
hotakeRolesInfoDto.setAboutRole(dataMap.get("aboutRole").toString());
hotakeRolesInfoDto.setResponsibilities(dataMap.get("responsibilities").toString());
//岗位所需技能信息
List<RequiredSkillsDto> requiredSkillsList = (List<RequiredSkillsDto>)dataMap.get("requiredSkills");
hotakeRolesInfoDto.setRequiredSkillsList(requiredSkillsList);
List<NiceToHaveSkillsDto> niceToHaveSkillsList = (List<NiceToHaveSkillsDto>)dataMap.get("niceToHaveSkillsList");
hotakeRolesInfoDto.setNiceToHaveSkillsList(niceToHaveSkillsList);
List<RoleBenefitsDto> roleBenefitsList = (List<RoleBenefitsDto>)dataMap.get("roleBenefitsList");
hotakeRolesInfoDto.setRoleBenefitsList(roleBenefitsList);
Map educationRequirementsMap = (Map)dataMap.get("educationRequirements");
EducationRequirementsDto educationRequirements = new EducationRequirementsDto();
educationRequirements.setAcademicMajor(educationRequirementsMap.get("academicMajor").toString());
educationRequirements.setDegree(educationRequirementsMap.get("degree").toString());
hotakeRolesInfoDto.setEducationRequirements(educationRequirements);
List<CertificationsLicensesDto> certificationsLicensesList = (List<CertificationsLicensesDto>)dataMap.get("certificationsLicensesList");
hotakeRolesInfoDto.setCertificationsLicensesList(certificationsLicensesList);
return hotakeRolesInfoDto;
} }