AI接入逻辑完善
This commit is contained in:
@@ -0,0 +1,173 @@
|
|||||||
|
package com.vetti.socket.agents;
|
||||||
|
|
||||||
|
import okhttp3.*;
|
||||||
|
import okio.ByteString;
|
||||||
|
import org.springframework.web.socket.BinaryMessage;
|
||||||
|
import org.springframework.web.socket.TextMessage;
|
||||||
|
import org.springframework.web.socket.WebSocketSession;
|
||||||
|
import org.springframework.web.socket.handler.TextWebSocketHandler;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ElevenLabsAgentClient extends TextWebSocketHandler{
|
||||||
|
|
||||||
|
// 存储Vue会话与ElevenLabs WebSocket的映射(多客户端隔离)
|
||||||
|
private static final Map<WebSocketSession, WebSocket> SESSION_MAP = new ConcurrentHashMap<>();
|
||||||
|
// ElevenLabs配置
|
||||||
|
private static final String ELEVEN_LABS_API_KEY = "你的ElevenLabs API Key";
|
||||||
|
private static final String AGENT_ID = "你的ElevenLabs Agent ID";
|
||||||
|
private static final String ELEVEN_LABS_WSS_URL = "wss://api.elevenlabs.io/v1/agents/" + AGENT_ID + "/stream";
|
||||||
|
// OkHttp客户端
|
||||||
|
private static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder()
|
||||||
|
.readTimeout(0, TimeUnit.MILLISECONDS) // WebSocket长连接取消读超时
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// ==================== 1. 处理Vue前端连接 ====================
|
||||||
|
@Override
|
||||||
|
public void afterConnectionEstablished(WebSocketSession vueSession) throws Exception {
|
||||||
|
super.afterConnectionEstablished(vueSession);
|
||||||
|
System.out.println("Vue前端连接成功:" + vueSession.getId());
|
||||||
|
|
||||||
|
// 建立与ElevenLabs Agents的WSS连接
|
||||||
|
buildElevenLabsWssConnection(vueSession);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 2. 处理Vue前端发送的文本消息(如语音指令、配置信息) ====================
|
||||||
|
@Override
|
||||||
|
protected void handleTextMessage(WebSocketSession vueSession, TextMessage message) throws Exception {
|
||||||
|
super.handleTextMessage(vueSession, message);
|
||||||
|
System.out.println("接收Vue文本消息:" + message.getPayload());
|
||||||
|
// 获取对应ElevenLabs WebSocket连接,转发消息
|
||||||
|
WebSocket elevenLabsWs = SESSION_MAP.get(vueSession);
|
||||||
|
if (elevenLabsWs != null && elevenLabsWs.queueSize() == 0) {
|
||||||
|
elevenLabsWs.send(message.getPayload());
|
||||||
|
System.out.println("转发文本消息到ElevenLabs成功");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 3. 处理Vue前端发送的二进制消息(核心:语音流数据) ====================
|
||||||
|
@Override
|
||||||
|
protected void handleBinaryMessage(WebSocketSession vueSession, BinaryMessage message) {
|
||||||
|
super.handleBinaryMessage(vueSession, message);
|
||||||
|
byte[] voiceData = message.getPayload().array();
|
||||||
|
System.out.println("接收Vue语音流数据,字节长度:" + voiceData.length);
|
||||||
|
|
||||||
|
// 获取对应ElevenLabs WebSocket连接,转发语音流(二进制)
|
||||||
|
WebSocket elevenLabsWs = SESSION_MAP.get(vueSession);
|
||||||
|
if (elevenLabsWs != null && elevenLabsWs.queueSize() == 0) {
|
||||||
|
elevenLabsWs.send(ByteString.of(voiceData));
|
||||||
|
System.out.println("转发语音流到ElevenLabs成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 释放二进制消息资源
|
||||||
|
// message.isLast();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 4. 处理Vue前端连接关闭 ====================
|
||||||
|
@Override
|
||||||
|
public void afterConnectionClosed(WebSocketSession vueSession, org.springframework.web.socket.CloseStatus status) throws Exception {
|
||||||
|
super.afterConnectionClosed(vueSession, status);
|
||||||
|
System.out.println("Vue前端连接关闭:" + vueSession.getId() + ",原因:" + status.getReason());
|
||||||
|
|
||||||
|
// 关闭对应的ElevenLabs WSS连接
|
||||||
|
WebSocket elevenLabsWs = SESSION_MAP.remove(vueSession);
|
||||||
|
if (elevenLabsWs != null) {
|
||||||
|
elevenLabsWs.close(1000, "Vue客户端断开连接");
|
||||||
|
System.out.println("关闭ElevenLabs WSS连接成功");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ==================== 5. 建立与ElevenLabs Agents的WSS连接 ====================
|
||||||
|
private void buildElevenLabsWssConnection(WebSocketSession vueSession) {
|
||||||
|
// 1. 构建ElevenLabs WSS请求(携带认证头)
|
||||||
|
Request request = new Request.Builder()
|
||||||
|
.url(ELEVEN_LABS_WSS_URL)
|
||||||
|
.header("xi-api-key", ELEVEN_LABS_API_KEY) // 必选认证头
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// 2. 构建ElevenLabs WSS监听器(处理响应并回流到Vue)
|
||||||
|
WebSocketListener elevenLabsListener = new WebSocketListener() {
|
||||||
|
// ElevenLabs WSS连接建立
|
||||||
|
@Override
|
||||||
|
public void onOpen(WebSocket webSocket, Response response) {
|
||||||
|
super.onOpen(webSocket, response);
|
||||||
|
System.out.println("与ElevenLabs Agents WSS连接成功");
|
||||||
|
// 存储Vue会话与ElevenLabs WS的映射
|
||||||
|
SESSION_MAP.put(vueSession, webSocket);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 接收ElevenLabs文本消息(如状态、错误提示),回流到Vue
|
||||||
|
@Override
|
||||||
|
public void onMessage(WebSocket webSocket, String text) {
|
||||||
|
super.onMessage(webSocket, text);
|
||||||
|
System.out.println("接收ElevenLabs文本消息:" + text);
|
||||||
|
try {
|
||||||
|
// 回流到Vue前端
|
||||||
|
if (vueSession.isOpen()) {
|
||||||
|
vueSession.sendMessage(new TextMessage(text));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("回流文本消息到Vue失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 接收ElevenLabs二进制消息(核心:音频流响应),回流到Vue
|
||||||
|
@Override
|
||||||
|
public void onMessage(WebSocket webSocket, ByteString bytes) {
|
||||||
|
super.onMessage(webSocket, bytes);
|
||||||
|
byte[] audioData = bytes.toByteArray();
|
||||||
|
System.out.println("接收ElevenLabs音频流数据,字节长度:" + audioData.length);
|
||||||
|
try {
|
||||||
|
// 回流二进制音频流到Vue前端
|
||||||
|
if (vueSession.isOpen()) {
|
||||||
|
vueSession.sendMessage(new BinaryMessage(audioData));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("回流音频流到Vue失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ElevenLabs WSS连接关闭
|
||||||
|
@Override
|
||||||
|
public void onClosed(WebSocket webSocket, int code, String reason) {
|
||||||
|
super.onClosed(webSocket, code, reason);
|
||||||
|
System.out.println("ElevenLabs WSS连接关闭:" + reason + ",状态码:" + code);
|
||||||
|
// 移除映射,关闭Vue连接
|
||||||
|
SESSION_MAP.remove(vueSession);
|
||||||
|
try {
|
||||||
|
if (vueSession.isOpen()) {
|
||||||
|
vueSession.close(org.springframework.web.socket.CloseStatus.NORMAL);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ElevenLabs WSS连接异常
|
||||||
|
@Override
|
||||||
|
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
|
||||||
|
super.onFailure(webSocket, t, response);
|
||||||
|
System.err.println("ElevenLabs WSS连接异常:" + t.getMessage());
|
||||||
|
// 移除映射,关闭Vue连接
|
||||||
|
SESSION_MAP.remove(vueSession);
|
||||||
|
try {
|
||||||
|
if (vueSession.isOpen()) {
|
||||||
|
vueSession.close(org.springframework.web.socket.CloseStatus.SERVER_ERROR);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 3. 建立ElevenLabs WSS连接
|
||||||
|
OK_HTTP_CLIENT.newWebSocket(request, elevenLabsListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -9,10 +9,7 @@ import com.vetti.common.core.controller.BaseController;
|
|||||||
import com.vetti.common.core.domain.AjaxResult;
|
import com.vetti.common.core.domain.AjaxResult;
|
||||||
import com.vetti.common.core.domain.R;
|
import com.vetti.common.core.domain.R;
|
||||||
import com.vetti.common.core.domain.dto.RealtimeClientSecretDto;
|
import com.vetti.common.core.domain.dto.RealtimeClientSecretDto;
|
||||||
import com.vetti.common.enums.MinioBucketNameEnum;
|
|
||||||
import com.vetti.common.utils.readFile.FileContentUtil;
|
|
||||||
import com.vetti.web.service.ICommonService;
|
import com.vetti.web.service.ICommonService;
|
||||||
import io.minio.GetObjectArgs;
|
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -21,10 +18,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* AI 共通测试接口处理
|
* AI 共通测试接口处理
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
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.HotakeInitialScreeningQuestionsInfo;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeCvOptimizeDto;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeInitialQuestionEliminationScoreDto;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeJobDescriptionGeneratorDto;
|
||||||
|
import com.vetti.hotake.domain.vo.HotakeInitialScreeningQuestionsVo;
|
||||||
|
import com.vetti.hotake.domain.vo.HotakeJobDescriptionGeneratorVo;
|
||||||
|
import com.vetti.hotake.domain.vo.HotakeResumeJobMatchingScoreVo;
|
||||||
|
import com.vetti.hotake.service.IHotakeAiCommonToolsService;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI共通工具 信息Controller
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-12-14
|
||||||
|
*/
|
||||||
|
@Api(tags ="AI共通工具信息")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/hotake/aiCommonTools")
|
||||||
|
public class HotakeAiCommonToolsController extends BaseController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IHotakeAiCommonToolsService hotakeAiCommonToolsService;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职位描述生成器
|
||||||
|
*/
|
||||||
|
@ApiOperation("职位描述生成器")
|
||||||
|
@PostMapping(value = "/jobDescriptionGenerator")
|
||||||
|
public R<HotakeJobDescriptionGeneratorDto> handleJobDescriptionGenerator(@RequestBody HotakeJobDescriptionGeneratorVo jobDescriptionGeneratorVo)
|
||||||
|
{
|
||||||
|
return R.ok(hotakeAiCommonToolsService.getJobDescriptionGenerator(jobDescriptionGeneratorVo.getRoleId()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初筛问题生成
|
||||||
|
*/
|
||||||
|
@ApiOperation("初筛问题生成")
|
||||||
|
@PostMapping(value = "/initialScreeningQuestionsGenerator")
|
||||||
|
public R<List<HotakeInitialScreeningQuestionsInfo>> handleInitialScreeningQuestions(@RequestBody HotakeInitialScreeningQuestionsVo questionsVo)
|
||||||
|
{
|
||||||
|
return R.ok(hotakeAiCommonToolsService.getInitialScreeningQuestionsGenerator(questionsVo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历岗位匹配度评分
|
||||||
|
*/
|
||||||
|
@ApiOperation("简历岗位匹配度评分")
|
||||||
|
@GetMapping(value = "/resumeJobMatchingScore")
|
||||||
|
public R<?> handleResumeJobMatchingScore(@RequestBody HotakeResumeJobMatchingScoreVo scoreVo)
|
||||||
|
{
|
||||||
|
return R.ok(hotakeAiCommonToolsService.getResumeJobMatchingScore(scoreVo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历分析优化器
|
||||||
|
*/
|
||||||
|
@ApiOperation("简历分析优化器")
|
||||||
|
@GetMapping(value = "/resumeAnalysisOptimizer")
|
||||||
|
public R<HotakeCvOptimizeDto> handleResumeAnalysisOptimizer()
|
||||||
|
{
|
||||||
|
return R.ok(hotakeAiCommonToolsService.getResumeAnalysisOptimizer(""));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初步筛选问题淘汰评分
|
||||||
|
*/
|
||||||
|
@ApiOperation("初步筛选问题淘汰评分")
|
||||||
|
@GetMapping(value = "/initialQuestionEliminationScore")
|
||||||
|
public R<HotakeInitialQuestionEliminationScoreDto> handleInitialQuestionEliminationScore()
|
||||||
|
{
|
||||||
|
return R.ok(hotakeAiCommonToolsService.getInitialQuestionEliminationScore(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -12,6 +12,7 @@ import com.vetti.hotake.domain.HotakeCvInfo;
|
|||||||
import com.vetti.hotake.service.IHotakeCvInfoService;
|
import com.vetti.hotake.service.IHotakeCvInfoService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import io.swagger.annotations.ApiParam;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
@@ -60,7 +61,7 @@ public class HotakeCvInfoController extends BaseController
|
|||||||
*/
|
*/
|
||||||
@ApiOperation("获取简历信息详细信息")
|
@ApiOperation("获取简历信息详细信息")
|
||||||
@GetMapping(value = "/{id}")
|
@GetMapping(value = "/{id}")
|
||||||
public R<HotakeCvInfo> getInfo(@PathVariable("id") Long id)
|
public R<HotakeCvInfo> getInfo(@ApiParam("简历ID") @PathVariable("id") Long id)
|
||||||
{
|
{
|
||||||
return R.ok(hotakeCvInfoService.selectHotakeCvInfoById(id),"");
|
return R.ok(hotakeCvInfoService.selectHotakeCvInfoById(id),"");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.vetti.common.core.page.TableDataInfo;
|
|||||||
import com.vetti.common.core.page.TableWebDataInfo;
|
import com.vetti.common.core.page.TableWebDataInfo;
|
||||||
import com.vetti.common.enums.BusinessType;
|
import com.vetti.common.enums.BusinessType;
|
||||||
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
|
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
|
||||||
|
import com.vetti.hotake.domain.vo.HotakeInitialScreeningQuestionsInfoVo;
|
||||||
import com.vetti.hotake.service.IHotakeInitialScreeningQuestionsInfoService;
|
import com.vetti.hotake.service.IHotakeInitialScreeningQuestionsInfoService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
@@ -94,4 +95,16 @@ public class HotakeInitialScreeningQuestionsInfoController extends BaseControlle
|
|||||||
{
|
{
|
||||||
return R.ok(hotakeInitialScreeningQuestionsInfoService.deleteHotakeInitialScreeningQuestionsInfoByIds(ids));
|
return R.ok(hotakeInitialScreeningQuestionsInfoService.deleteHotakeInitialScreeningQuestionsInfoByIds(ids));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增初步筛选问题信息
|
||||||
|
*/
|
||||||
|
@ApiOperation("批量新增初步筛选问题信息")
|
||||||
|
@Log(title = "批量新增初步筛选问题信息", businessType = BusinessType.INSERT)
|
||||||
|
@PostMapping("/batchAdd")
|
||||||
|
public R<?> batchAdd(@RequestBody HotakeInitialScreeningQuestionsInfoVo questionsInfoVo)
|
||||||
|
{
|
||||||
|
hotakeInitialScreeningQuestionsInfoService.batchInsertHotakeInitialScreeningQuestionsInfo(questionsInfoVo);
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.vetti.common.core.page.TableDataInfo;
|
|||||||
import com.vetti.common.core.page.TableWebDataInfo;
|
import com.vetti.common.core.page.TableWebDataInfo;
|
||||||
import com.vetti.common.enums.BusinessType;
|
import com.vetti.common.enums.BusinessType;
|
||||||
import com.vetti.hotake.domain.HotakeMeetingCalendarInfo;
|
import com.vetti.hotake.domain.HotakeMeetingCalendarInfo;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeMeetingCalendarDataDto;
|
||||||
import com.vetti.hotake.domain.vo.HotakeMeetingCalendarVo;
|
import com.vetti.hotake.domain.vo.HotakeMeetingCalendarVo;
|
||||||
import com.vetti.hotake.service.IHotakeMeetingCalendarInfoService;
|
import com.vetti.hotake.service.IHotakeMeetingCalendarInfoService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
@@ -47,12 +48,12 @@ public class HotakeMeetingCalendarInfoController extends BaseController
|
|||||||
/**
|
/**
|
||||||
* 查询会议日历记录主列表(无分页)
|
* 查询会议日历记录主列表(无分页)
|
||||||
*/
|
*/
|
||||||
@ApiOperation("查询会议日历记录列表(无分页)")
|
@ApiOperation("候选人-查询会议日历记录列表(无分页)")
|
||||||
@GetMapping("/getList")
|
@GetMapping("/getList")
|
||||||
public R<List<HotakeMeetingCalendarInfo>> list(HotakeMeetingCalendarInfo hotakeMeetingCalendarInfo)
|
public R<List<HotakeMeetingCalendarInfo>> list(HotakeMeetingCalendarInfo hotakeMeetingCalendarInfo)
|
||||||
{
|
{
|
||||||
List<HotakeMeetingCalendarInfo> list = hotakeMeetingCalendarInfoService.selectHotakeMeetingCalendarInfoList(hotakeMeetingCalendarInfo);
|
List<HotakeMeetingCalendarInfo> list = hotakeMeetingCalendarInfoService.selectHotakeMeetingCalendarInfoCandidateList(hotakeMeetingCalendarInfo);
|
||||||
return R.ok(list);
|
return R.ok(list,"");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -110,4 +111,15 @@ public class HotakeMeetingCalendarInfoController extends BaseController
|
|||||||
hotakeMeetingCalendarInfoService.saveHotakeMeetingCalendarInfo(calendarVo);
|
hotakeMeetingCalendarInfoService.saveHotakeMeetingCalendarInfo(calendarVo);
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询当前候选者会议日历数据
|
||||||
|
*/
|
||||||
|
@ApiOperation("查询当前候选者会议日历数据")
|
||||||
|
@GetMapping("/getCandidateCalendarList")
|
||||||
|
public R<List<HotakeMeetingCalendarDataDto>> listCandidateAll()
|
||||||
|
{
|
||||||
|
List<HotakeMeetingCalendarDataDto> list = hotakeMeetingCalendarInfoService.selectHotakeMeetingCalendarDataDtoList();
|
||||||
|
return R.ok(list,"");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ public class HotakeRolesApplyInfoController extends BaseController
|
|||||||
* 删除候选人岗位申请信息
|
* 删除候选人岗位申请信息
|
||||||
*/
|
*/
|
||||||
@ApiOperation("删除候选人岗位申请信息")
|
@ApiOperation("删除候选人岗位申请信息")
|
||||||
@Log(title = "候选人岗位申请信息", businessType = BusinessType.DELETE)
|
@Log(title = "删除候选人岗位申请信息", businessType = BusinessType.DELETE)
|
||||||
@DeleteMapping("/{ids}")
|
@DeleteMapping("/{ids}")
|
||||||
public R<?> remove(@PathVariable Long[] ids)
|
public R<?> remove(@PathVariable Long[] ids)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package com.vetti.web.controller.system;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
import com.vetti.common.core.domain.R;
|
||||||
|
import com.vetti.common.core.domain.dto.LoginDto;
|
||||||
import com.vetti.common.utils.MessageUtils;
|
import com.vetti.common.utils.MessageUtils;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
@@ -58,11 +60,11 @@ public class SysLoginController
|
|||||||
*/
|
*/
|
||||||
@ApiOperation("登录方法")
|
@ApiOperation("登录方法")
|
||||||
@PostMapping("/login")
|
@PostMapping("/login")
|
||||||
public AjaxResult login(@RequestBody LoginBody loginBody)
|
public R<LoginDto> login(@RequestBody LoginBody loginBody)
|
||||||
{
|
{
|
||||||
AjaxResult ajax = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
|
LoginDto loginDto = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
|
||||||
loginBody.getUuid());
|
loginBody.getUuid());
|
||||||
return ajax;
|
return R.ok(loginDto,"");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -123,6 +123,7 @@ public class SysProfileController extends BaseController
|
|||||||
//个人展示数据存储
|
//个人展示数据存储
|
||||||
currentUser.setBestSideJson(JSONUtil.toJsonStr(user.getBestSideDtoList()));
|
currentUser.setBestSideJson(JSONUtil.toJsonStr(user.getBestSideDtoList()));
|
||||||
}
|
}
|
||||||
|
currentUser.setUserOperStatus(user.getUserOperStatus());
|
||||||
currentUser.setSteps(user.getSteps());
|
currentUser.setSteps(user.getSteps());
|
||||||
if (userService.updateUserProfile(currentUser) > 0)
|
if (userService.updateUserProfile(currentUser) > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -173,6 +173,11 @@ chatGpt:
|
|||||||
modelQuestion: ft:gpt-4o-mini-2024-07-18:vetti:interview-corpus:ChvLmzLu
|
modelQuestion: ft:gpt-4o-mini-2024-07-18:vetti:interview-corpus:ChvLmzLu
|
||||||
modelCV: ft:gpt-3.5-turbo-0125:vetti:vetti-resume-full:CYT0C8JG
|
modelCV: ft:gpt-3.5-turbo-0125:vetti:vetti-resume-full:CYT0C8JG
|
||||||
modelJxCv: gpt-4o-mini
|
modelJxCv: gpt-4o-mini
|
||||||
|
modelJd: gpt-4o-mini
|
||||||
|
modelIsq: ft:gpt-4o-mini-2024-07-18:vetti:question-gen-expanded:CncFPHBB
|
||||||
|
modelRoleCv: ft:gpt-4o-mini-2024-07-18:vetti:resume-scoring-v2:CnbgEHQQ
|
||||||
|
modelCvJx: gpt-4o-mini
|
||||||
|
modelCbqpf: gpt-4o-mini
|
||||||
role: system
|
role: system
|
||||||
|
|
||||||
http:
|
http:
|
||||||
|
|||||||
@@ -173,6 +173,11 @@ chatGpt:
|
|||||||
modelQuestion: ft:gpt-4o-mini-2024-07-18:vetti:interview-corpus:ChvLmzLu
|
modelQuestion: ft:gpt-4o-mini-2024-07-18:vetti:interview-corpus:ChvLmzLu
|
||||||
modelCV: ft:gpt-3.5-turbo-0125:vetti:vetti-resume-full:CYT0C8JG
|
modelCV: ft:gpt-3.5-turbo-0125:vetti:vetti-resume-full:CYT0C8JG
|
||||||
modelJxCv: gpt-4o-mini
|
modelJxCv: gpt-4o-mini
|
||||||
|
modelJd: gpt-4o-mini
|
||||||
|
modelIsq: ft:gpt-4o-mini-2024-07-18:vetti:question-gen-expanded:CncFPHBB
|
||||||
|
modelRoleCv: ft:gpt-4o-mini-2024-07-18:vetti:resume-scoring-v2:CnbgEHQQ
|
||||||
|
modelCvJx: gpt-4o-mini
|
||||||
|
modelCbqpf: gpt-4o-mini
|
||||||
role: system
|
role: system
|
||||||
|
|
||||||
http:
|
http:
|
||||||
|
|||||||
@@ -42,6 +42,21 @@ public class ChatGPTClient {
|
|||||||
@Value("${chatGpt.modelJxCv}")
|
@Value("${chatGpt.modelJxCv}")
|
||||||
private String modelJxCv;
|
private String modelJxCv;
|
||||||
|
|
||||||
|
@Value("${chatGpt.modelJd}")
|
||||||
|
private String modelJd;
|
||||||
|
|
||||||
|
@Value("${chatGpt.modelIsq}")
|
||||||
|
private String modelIsq;
|
||||||
|
|
||||||
|
@Value("${chatGpt.modelRoleCv}")
|
||||||
|
private String modelRoleCv;
|
||||||
|
|
||||||
|
@Value("${chatGpt.modelCvJx}")
|
||||||
|
private String modelCvJx;
|
||||||
|
|
||||||
|
@Value("${chatGpt.modelCbqpf}")
|
||||||
|
private String modelCbqpf;
|
||||||
|
|
||||||
@Value("${chatGpt.role}")
|
@Value("${chatGpt.role}")
|
||||||
private String role;
|
private String role;
|
||||||
|
|
||||||
@@ -71,6 +86,16 @@ public class ChatGPTClient {
|
|||||||
resultText = sendMessage(promptText, model,objectMapper,client,role);
|
resultText = sendMessage(promptText, model,objectMapper,client,role);
|
||||||
}else if("JX".equals(type)){
|
}else if("JX".equals(type)){
|
||||||
resultText = sendMessage(promptText, modelJxCv,objectMapper,client,role);
|
resultText = sendMessage(promptText, modelJxCv,objectMapper,client,role);
|
||||||
|
}else if("JD".equals(type)){
|
||||||
|
resultText = sendMessage(promptText, modelJd,objectMapper,client,role);
|
||||||
|
}else if("ISQ".equals(type)){
|
||||||
|
resultText = sendMessage(promptText, modelIsq,objectMapper,client,role);
|
||||||
|
}else if("ROLECV".equals(type)){
|
||||||
|
resultText = sendMessage(promptText, modelRoleCv,objectMapper,client,role);
|
||||||
|
}else if("CVJX".equals(type)){
|
||||||
|
resultText = sendMessage(promptText, modelCvJx,objectMapper,client,role);
|
||||||
|
}else if("CBQPF".equals(type)){
|
||||||
|
resultText = sendMessage(promptText, modelCbqpf,objectMapper,client,role);
|
||||||
}else {
|
}else {
|
||||||
resultText = sendMessage(promptText, modelQuestion,objectMapper,client,role);
|
resultText = sendMessage(promptText, modelQuestion,objectMapper,client,role);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.vetti.common.core.domain.dto;
|
||||||
|
|
||||||
|
import com.vetti.common.core.domain.entity.SysUser;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 系统登陆返回登陆对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-10-29
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class LoginDto {
|
||||||
|
|
||||||
|
|
||||||
|
@ApiModelProperty("令牌")
|
||||||
|
private String token;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户ID")
|
||||||
|
private Long userId;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户信息对象")
|
||||||
|
private SysUser user;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -127,6 +127,9 @@ public class SysUser extends BaseEntity
|
|||||||
@ApiModelProperty("用户标识(1:新用户,2:老用户)")
|
@ApiModelProperty("用户标识(1:新用户,2:老用户)")
|
||||||
private String userFlag;
|
private String userFlag;
|
||||||
|
|
||||||
|
@ApiModelProperty("用户操作状态(1:初始化,2:已保存,3:已跳过)")
|
||||||
|
private String userOperStatus;
|
||||||
|
|
||||||
@ApiModelProperty("用户语音配置信息")
|
@ApiModelProperty("用户语音配置信息")
|
||||||
private String userSetJson;
|
private String userSetJson;
|
||||||
|
|
||||||
@@ -496,6 +499,15 @@ public class SysUser extends BaseEntity
|
|||||||
this.jobTitle = jobTitle;
|
this.jobTitle = jobTitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getUserOperStatus() {
|
||||||
|
return userOperStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserOperStatus(String userOperStatus) {
|
||||||
|
this.userOperStatus = userOperStatus;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.vetti.framework.web.service;
|
|||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
import com.vetti.common.core.domain.AjaxResult;
|
import com.vetti.common.core.domain.AjaxResult;
|
||||||
|
import com.vetti.common.core.domain.dto.LoginDto;
|
||||||
import com.vetti.common.utils.SecurityUtils;
|
import com.vetti.common.utils.SecurityUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.authentication.AuthenticationManager;
|
import org.springframework.security.authentication.AuthenticationManager;
|
||||||
@@ -64,9 +65,10 @@ public class SysLoginService
|
|||||||
* @param uuid 唯一标识
|
* @param uuid 唯一标识
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
public AjaxResult login(String username, String password, String code, String uuid)
|
public LoginDto login(String username, String password, String code, String uuid)
|
||||||
{
|
{
|
||||||
AjaxResult ajax = AjaxResult.success();
|
LoginDto loginDto = new LoginDto();
|
||||||
|
|
||||||
// 验证码校验
|
// 验证码校验
|
||||||
// validateCaptcha(username, code, uuid);
|
// validateCaptcha(username, code, uuid);
|
||||||
// 登录前置校验
|
// 登录前置校验
|
||||||
@@ -101,9 +103,12 @@ public class SysLoginService
|
|||||||
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
|
LoginUser loginUser = (LoginUser) authentication.getPrincipal();
|
||||||
recordLoginInfo(loginUser.getUserId());
|
recordLoginInfo(loginUser.getUserId());
|
||||||
// 生成token
|
// 生成token
|
||||||
ajax.put(Constants.TOKEN, tokenService.createToken(loginUser));
|
loginDto.setToken(tokenService.createToken(loginUser));
|
||||||
ajax.put("userId",loginUser.getUserId());
|
loginDto.setUserId(loginUser.getUserId());
|
||||||
return ajax;
|
SysUser user = userService.selectUserById(loginUser.getUserId());
|
||||||
|
loginDto.setUser(user);
|
||||||
|
|
||||||
|
return loginDto;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,8 @@ public class SysRegisterService {
|
|||||||
throw new ServiceException(MessageUtils.messageCustomize("systemSysRegisterService10005"));
|
throw new ServiceException(MessageUtils.messageCustomize("systemSysRegisterService10005"));
|
||||||
} else {
|
} else {
|
||||||
sysUser.setUserFlag(UserFlagEnum.FLAG_1.getCode());
|
sysUser.setUserFlag(UserFlagEnum.FLAG_1.getCode());
|
||||||
|
//操作状态初始化
|
||||||
|
sysUser.setUserOperStatus("1");
|
||||||
sysUser.setSysUserType(registerBody.getSysUserType());
|
sysUser.setSysUserType(registerBody.getSysUserType());
|
||||||
// sysUser.setNickName(username);
|
// sysUser.setNickName(username);
|
||||||
sysUser.setPwdUpdateDate(DateUtils.getNowDate());
|
sysUser.setPwdUpdateDate(DateUtils.getNowDate());
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.vetti.hotake.domain;
|
package com.vetti.hotake.domain;
|
||||||
|
|
||||||
import com.vetti.hotake.domain.dto.HotakeCvInfoDto;
|
import com.vetti.hotake.domain.dto.HotakeCvInfoDto;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeCvOptimizeDto;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.experimental.Accessors;
|
import lombok.experimental.Accessors;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
@@ -80,4 +81,16 @@ public class HotakeCvInfo extends BaseEntity
|
|||||||
@ApiModelProperty("简历评分")
|
@ApiModelProperty("简历评分")
|
||||||
private String score;
|
private String score;
|
||||||
|
|
||||||
|
@ApiModelProperty("简历分析结果数据存储")
|
||||||
|
private String cvOptimizeJson;
|
||||||
|
|
||||||
|
@ApiModelProperty("文本修正的数量")
|
||||||
|
private Integer textCorrectionsNums;
|
||||||
|
|
||||||
|
@ApiModelProperty("逻辑修正的数量")
|
||||||
|
private Integer logicCorrectionsNum;
|
||||||
|
|
||||||
|
@ApiModelProperty("简历分析结果数据")
|
||||||
|
private HotakeCvOptimizeDto cvOptimizeDto;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class HotakeMeetingCalendarInfo extends BaseEntity
|
|||||||
private String messageVia;
|
private String messageVia;
|
||||||
|
|
||||||
/** 状态(0 取消,1 正常) */
|
/** 状态(0 取消,1 正常) */
|
||||||
@ApiModelProperty("状态(0 取消,1 正常)")
|
@ApiModelProperty("状态(0 取消,1 正常,2 已完成面试)")
|
||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
@ApiModelProperty("岗位基本信息")
|
@ApiModelProperty("岗位基本信息")
|
||||||
@@ -69,4 +69,8 @@ public class HotakeMeetingCalendarInfo extends BaseEntity
|
|||||||
private List<HotakeMeetingCalendarDetail> calendarDetails;
|
private List<HotakeMeetingCalendarDetail> calendarDetails;
|
||||||
|
|
||||||
|
|
||||||
|
@ApiModelProperty("会议ID数据集合-查询使用")
|
||||||
|
private List<Long> meetingIds;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.vetti.hotake.domain.dto;
|
||||||
|
|
||||||
|
import com.vetti.hotake.domain.dto.VcDto.*;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历优化器 返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class HotakeCvOptimizeDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("分析总结")
|
||||||
|
private CvAnalysisSummaryDto analysisSummary;
|
||||||
|
@ApiModelProperty("文本修正(文字、语法等错误)")
|
||||||
|
private CvTextCorrectionsDto textCorrections;
|
||||||
|
@ApiModelProperty("逻辑修正")
|
||||||
|
private CvLogicCorrectionsDto logicCorrections;
|
||||||
|
@ApiModelProperty("优化建议")
|
||||||
|
private CvOptimizationSuggestionsDto optimizationSuggestions;
|
||||||
|
@ApiModelProperty("行动计划")
|
||||||
|
private CvActionPlanDto actionPlan;
|
||||||
|
@ApiModelProperty("预期改进效果")
|
||||||
|
private CvEstimatedImprovementDto estimatedImprovement;
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.vetti.hotake.domain.dto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初步筛选问题淘汰评分 返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class HotakeInitialQuestionEliminationScoreDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("评分")
|
||||||
|
private String score;
|
||||||
|
|
||||||
|
@ApiModelProperty("描述")
|
||||||
|
private String evaluate;
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package com.vetti.hotake.domain.dto;
|
||||||
|
|
||||||
|
import com.vetti.hotake.domain.dto.roleDto.NiceToHaveSkillsDto;
|
||||||
|
import com.vetti.hotake.domain.dto.roleDto.RequiredSkillsDto;
|
||||||
|
import com.vetti.hotake.domain.dto.roleDto.ResponsibilitiesDto;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 岗位-职位描述 返回信息
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class HotakeJobDescriptionGeneratorDto {
|
||||||
|
|
||||||
|
/** 关于职位 */
|
||||||
|
@ApiModelProperty("关于职位")
|
||||||
|
private String aboutRole;
|
||||||
|
|
||||||
|
/** 职责 */
|
||||||
|
@ApiModelProperty("职责")
|
||||||
|
private List<ResponsibilitiesDto> responsibilitiesList;
|
||||||
|
|
||||||
|
|
||||||
|
@ApiModelProperty("岗位所需技能信息数据集合")
|
||||||
|
private List<RequiredSkillsDto> skillsDtoList;
|
||||||
|
|
||||||
|
|
||||||
|
@ApiModelProperty("岗位加分技能信息数据集合")
|
||||||
|
private List<NiceToHaveSkillsDto> haveSkillsDtoList;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.vetti.hotake.domain.dto;
|
||||||
|
|
||||||
|
import com.vetti.common.annotation.Excel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会议日历返回数据 实体类对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class HotakeMeetingCalendarDataDto {
|
||||||
|
|
||||||
|
/** 会议日期 */
|
||||||
|
@ApiModelProperty("会议日期(年月日)")
|
||||||
|
@Excel(name = "会议日期")
|
||||||
|
private String meetingDate;
|
||||||
|
|
||||||
|
@ApiModelProperty("是否有会议(0:无,1:有会议)")
|
||||||
|
private String meetingFlag;
|
||||||
|
|
||||||
|
@ApiModelProperty("当前日期对应的会议数量")
|
||||||
|
private Integer nums;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-行动计划 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvActionPlanDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("立即修正项,优先级最高 ")
|
||||||
|
private List<String> immediateFixes;
|
||||||
|
|
||||||
|
@ApiModelProperty("内容改进项,中期执行 ")
|
||||||
|
private List<String> contentImprovements;
|
||||||
|
|
||||||
|
@ApiModelProperty("战略性提升项,长期优化 ")
|
||||||
|
private List<String> strategicEnhancements;
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-分析总结 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvAnalysisSummaryDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("简历综合评分 (0-100) ")
|
||||||
|
private String overallScore;
|
||||||
|
|
||||||
|
@ApiModelProperty("主要优势列表,突出候选人核心竞争力 ")
|
||||||
|
private List<String> mainStrengths;
|
||||||
|
|
||||||
|
|
||||||
|
@ApiModelProperty("关键问题列表,需要优先解决的问题 ")
|
||||||
|
private List<String> criticalIssues;
|
||||||
|
|
||||||
|
@ApiModelProperty("改进潜力:high/medium/low")
|
||||||
|
private String improvementPotential;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-职业发展逻辑 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvCareerProgressionDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("问题")
|
||||||
|
private String issue;
|
||||||
|
|
||||||
|
@ApiModelProperty("详细信息")
|
||||||
|
private String details;
|
||||||
|
|
||||||
|
@ApiModelProperty("建议")
|
||||||
|
private String suggestion;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-预期改进效果 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvEstimatedImprovementDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("当前ATS系统评分 (0-100) ")
|
||||||
|
private String currentAtsScore;
|
||||||
|
|
||||||
|
@ApiModelProperty("优化后预期ATS评分 ")
|
||||||
|
private String potentialAtsScore;
|
||||||
|
|
||||||
|
@ApiModelProperty("对招聘官的吸引力提升程度")
|
||||||
|
private String recruiterAppeal;
|
||||||
|
|
||||||
|
@ApiModelProperty("获得面试机会的概率提升")
|
||||||
|
private String interviewProbability;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-格式错误 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvFormattingIssuesDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("问题")
|
||||||
|
private String issue;
|
||||||
|
|
||||||
|
@ApiModelProperty("修正建议")
|
||||||
|
private String suggestion;
|
||||||
|
|
||||||
|
@ApiModelProperty("错误位置")
|
||||||
|
private List<String> locations;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-语法错误 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvGrammarErrorsDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("原始数据")
|
||||||
|
private String original;
|
||||||
|
|
||||||
|
@ApiModelProperty("修正数据")
|
||||||
|
private String corrected;
|
||||||
|
|
||||||
|
@ApiModelProperty("错误位置")
|
||||||
|
private String location;
|
||||||
|
|
||||||
|
@ApiModelProperty("解释说明")
|
||||||
|
private String explanation;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-关键词优化 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvKeywordOptimizationDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("缺少关键字")
|
||||||
|
private List<String> missingKeywords;
|
||||||
|
|
||||||
|
@ApiModelProperty("行业术语")
|
||||||
|
private List<String> industryTerms;
|
||||||
|
|
||||||
|
@ApiModelProperty("ats关键字")
|
||||||
|
private List<String> atsKeywords;
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-逻辑修正 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvLogicCorrectionsDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("时间线冲突列表数据集合")
|
||||||
|
private List<CvTimelineConflictsDto> timelineConflicts;
|
||||||
|
|
||||||
|
@ApiModelProperty("职业发展逻辑数据集合")
|
||||||
|
private List<CvCareerProgressionDto> careerProgressionDtos;
|
||||||
|
|
||||||
|
@ApiModelProperty("技能经验匹配数据集合")
|
||||||
|
private List<CvSkillExperienceMismatchDto> skillExperienceMismatchDtos;
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-优化建议 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvOptimizationSuggestionsDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("个人简介优化")
|
||||||
|
private CvPersonalSummaryDto personalSummary;
|
||||||
|
|
||||||
|
@ApiModelProperty("工作经历优化建议")
|
||||||
|
private List<CvWorkExperienceDto> workExperienceDtoList;
|
||||||
|
|
||||||
|
@ApiModelProperty("技能部分优化")
|
||||||
|
private CvSkillsSectionDto skillsSection;
|
||||||
|
|
||||||
|
@ApiModelProperty("关键词优化")
|
||||||
|
private CvKeywordOptimizationDto keywordOptimization;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-个人总结 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvPersonalSummaryDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("当前问题列表")
|
||||||
|
private List<String> currentIssues;
|
||||||
|
|
||||||
|
@ApiModelProperty("优化后的个人简介")
|
||||||
|
private String optimizedVersion;
|
||||||
|
|
||||||
|
@ApiModelProperty("关键改进点")
|
||||||
|
private List<String> keyImprovements;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-技能经验匹配 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvSkillExperienceMismatchDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("技能")
|
||||||
|
private String skill;
|
||||||
|
|
||||||
|
@ApiModelProperty("问题")
|
||||||
|
private String issue;
|
||||||
|
|
||||||
|
@ApiModelProperty("建议")
|
||||||
|
private String suggestion;
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-技能部分优化 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvSkillsSectionDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("当前问题")
|
||||||
|
private List<String> currentIssues;
|
||||||
|
|
||||||
|
@ApiModelProperty("建议结构")
|
||||||
|
private CvSuggestedStructureDto suggestedStructureDto;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-识别拼写错误 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvSpellingErrorsDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("原始数据")
|
||||||
|
private String original;
|
||||||
|
|
||||||
|
@ApiModelProperty("修正数据")
|
||||||
|
private String corrected;
|
||||||
|
|
||||||
|
@ApiModelProperty("错误位置")
|
||||||
|
private String location;
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-建议结构 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvSuggestedStructureDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("核心技能")
|
||||||
|
private List<String> coreSkills;
|
||||||
|
|
||||||
|
@ApiModelProperty("技术技能")
|
||||||
|
private List<String> technicalSkills;
|
||||||
|
|
||||||
|
@ApiModelProperty("认证")
|
||||||
|
private List<String> certifications;
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-文本修正(文字、语法等错误) -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvTextCorrectionsDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("识别拼写错误数据集合")
|
||||||
|
private List<CvSpellingErrorsDto> spellingErrors;
|
||||||
|
|
||||||
|
@ApiModelProperty("语法错误数据集合")
|
||||||
|
private List<CvGrammarErrorsDto> grammarErrors;
|
||||||
|
|
||||||
|
@ApiModelProperty("格式错误数据集合")
|
||||||
|
private List<CvFormattingIssuesDto> formattingIssues;
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-检查时间线冲突 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvTimelineConflictsDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("冲突类型 ")
|
||||||
|
private String conflict;
|
||||||
|
|
||||||
|
@ApiModelProperty("冲突详情 ")
|
||||||
|
private String details;
|
||||||
|
|
||||||
|
@ApiModelProperty("解决建议 ")
|
||||||
|
private String suggestion;
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.VcDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历-优化器-工作经验 -返回对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class CvWorkExperienceDto {
|
||||||
|
|
||||||
|
@ApiModelProperty("职位名称")
|
||||||
|
private String position;
|
||||||
|
|
||||||
|
@ApiModelProperty("当前描述")
|
||||||
|
private String currentDescription;
|
||||||
|
|
||||||
|
@ApiModelProperty("优化后描述")
|
||||||
|
private String optimizedDescription;
|
||||||
|
|
||||||
|
@ApiModelProperty("改进要点")
|
||||||
|
private List<String> improvements;
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package com.vetti.hotake.domain.dto.roleDto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 岗位-职责信息 返回信息
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-11-30
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class ResponsibilitiesDto {
|
||||||
|
|
||||||
|
/** 职责 */
|
||||||
|
@ApiModelProperty("职责")
|
||||||
|
private String responsibilities;
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package com.vetti.hotake.domain.vo;
|
||||||
|
|
||||||
|
import com.vetti.common.annotation.Excel;
|
||||||
|
import com.vetti.hotake.domain.HotakeInitScreQuestionsReplyRecordInfo;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 岗位-初步筛选问题淘汰评分 对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-12-14
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class HotakeInitialQuestionEliminationScoreVo {
|
||||||
|
|
||||||
|
@ApiModelProperty("岗位名称")
|
||||||
|
private String roleName;
|
||||||
|
|
||||||
|
/** 岗位ID */
|
||||||
|
@ApiModelProperty("岗位ID")
|
||||||
|
@Excel(name = "岗位ID")
|
||||||
|
private Long roleId;
|
||||||
|
|
||||||
|
@ApiModelProperty("初步筛选问题回答记录数据集合")
|
||||||
|
private List<HotakeInitScreQuestionsReplyRecordInfo> initScreQuestionsReplyRecordInfoList;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.vetti.hotake.domain.vo;
|
||||||
|
|
||||||
|
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 岗位-初筛问题 对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-12-14
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class HotakeInitialScreeningQuestionsInfoVo {
|
||||||
|
|
||||||
|
@ApiModelProperty("岗位ID")
|
||||||
|
private Long roleId;
|
||||||
|
|
||||||
|
@ApiModelProperty("初步筛选问题数据集合")
|
||||||
|
private List<HotakeInitialScreeningQuestionsInfo> questionsInfoList;
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.vetti.hotake.domain.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 岗位-初筛问题 对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-12-14
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class HotakeInitialScreeningQuestionsVo {
|
||||||
|
|
||||||
|
@ApiModelProperty("岗位ID")
|
||||||
|
private Long roleId;
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.vetti.hotake.domain.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 岗位-职位描述生成器 对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-12-14
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class HotakeJobDescriptionGeneratorVo {
|
||||||
|
|
||||||
|
@ApiModelProperty("岗位ID")
|
||||||
|
private Long roleId;
|
||||||
|
|
||||||
|
// @ApiModelProperty("岗位名")
|
||||||
|
// private String jobTitle;
|
||||||
|
//
|
||||||
|
// @ApiModelProperty("行业领域-岗位类型")
|
||||||
|
// private String industry;
|
||||||
|
//
|
||||||
|
// @ApiModelProperty("关键技能或经验要求")
|
||||||
|
// private String coreRequirements;
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.vetti.hotake.domain.vo;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 岗位-简历岗位匹配度评分 对象
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-12-14
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class HotakeResumeJobMatchingScoreVo {
|
||||||
|
|
||||||
|
@ApiModelProperty("岗位名")
|
||||||
|
private String jobTitle;
|
||||||
|
@ApiModelProperty("岗位描述")
|
||||||
|
private String jobDescription;
|
||||||
|
@ApiModelProperty("主要职责")
|
||||||
|
private String keyResponsibilities;
|
||||||
|
@ApiModelProperty("任职要求")
|
||||||
|
private String jobRequirements;
|
||||||
|
@ApiModelProperty("个人信息")
|
||||||
|
private String personalInformation;
|
||||||
|
@ApiModelProperty("工作经历")
|
||||||
|
private String workHistory;
|
||||||
|
@ApiModelProperty("项目经验")
|
||||||
|
private String projectExperience;
|
||||||
|
@ApiModelProperty("技能清单")
|
||||||
|
private String skillsList;
|
||||||
|
@ApiModelProperty("教育背景")
|
||||||
|
private String educationalBackground;
|
||||||
|
@ApiModelProperty("其他相关信息")
|
||||||
|
private String otherRelevantInformation;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -51,6 +51,15 @@ public interface HotakeInitialScreeningQuestionsInfoMapper
|
|||||||
*/
|
*/
|
||||||
public int deleteHotakeInitialScreeningQuestionsInfoById(Long id);
|
public int deleteHotakeInitialScreeningQuestionsInfoById(Long id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除初步筛选问题信息
|
||||||
|
*
|
||||||
|
* @param roleId 岗位ID
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public int deleteHotakeInitialScreeningQuestionsInfoByRoleId(Long roleId);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量删除初步筛选问题信息
|
* 批量删除初步筛选问题信息
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
package com.vetti.hotake.service;
|
||||||
|
|
||||||
|
import com.vetti.hotake.domain.HotakeAiInterviewQuestionsInfo;
|
||||||
|
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeCvOptimizeDto;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeInitialQuestionEliminationScoreDto;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeJobDescriptionGeneratorDto;
|
||||||
|
import com.vetti.hotake.domain.vo.HotakeInitialQuestionEliminationScoreVo;
|
||||||
|
import com.vetti.hotake.domain.vo.HotakeInitialScreeningQuestionsVo;
|
||||||
|
import com.vetti.hotake.domain.vo.HotakeResumeJobMatchingScoreVo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AI共通工具信息Service接口
|
||||||
|
*
|
||||||
|
* @author wangxiangshun
|
||||||
|
* @date 2025-12-14
|
||||||
|
*/
|
||||||
|
public interface IHotakeAiCommonToolsService {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 职位描述生成器
|
||||||
|
**/
|
||||||
|
public HotakeJobDescriptionGeneratorDto getJobDescriptionGenerator(Long roleId);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初筛问题生成
|
||||||
|
**/
|
||||||
|
public List<HotakeInitialScreeningQuestionsInfo> getInitialScreeningQuestionsGenerator(HotakeInitialScreeningQuestionsVo questionsVo);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历岗位匹配度评分
|
||||||
|
**/
|
||||||
|
public String getResumeJobMatchingScore(HotakeResumeJobMatchingScoreVo scoreVo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 简历分析优化器
|
||||||
|
**/
|
||||||
|
public HotakeCvOptimizeDto getResumeAnalysisOptimizer(String cvConnect);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初步筛选问题淘汰评分
|
||||||
|
**/
|
||||||
|
public HotakeInitialQuestionEliminationScoreDto getInitialQuestionEliminationScore(HotakeInitialQuestionEliminationScoreVo questionEliminationScoreVo);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package com.vetti.hotake.service;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
|
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
|
||||||
|
import com.vetti.hotake.domain.vo.HotakeInitialScreeningQuestionsInfoVo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 初步筛选问题信息Service接口
|
* 初步筛选问题信息Service接口
|
||||||
@@ -62,9 +63,9 @@ public interface IHotakeInitialScreeningQuestionsInfoService
|
|||||||
/**
|
/**
|
||||||
* 批量新增初步筛选问题信息
|
* 批量新增初步筛选问题信息
|
||||||
*
|
*
|
||||||
* @param hotakeInitialScreeningQuestionsInfoList 初步筛选问题信息列表
|
* @param questionsInfoVo 初步筛选问题数据对象
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
public int batchInsertHotakeInitialScreeningQuestionsInfo(List<HotakeInitialScreeningQuestionsInfo> hotakeInitialScreeningQuestionsInfoList);
|
public void batchInsertHotakeInitialScreeningQuestionsInfo(HotakeInitialScreeningQuestionsInfoVo questionsInfoVo);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.vetti.hotake.service;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import com.vetti.hotake.domain.HotakeMeetingCalendarInfo;
|
import com.vetti.hotake.domain.HotakeMeetingCalendarInfo;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeMeetingCalendarDataDto;
|
||||||
import com.vetti.hotake.domain.vo.HotakeMeetingCalendarVo;
|
import com.vetti.hotake.domain.vo.HotakeMeetingCalendarVo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,6 +29,16 @@ public interface IHotakeMeetingCalendarInfoService
|
|||||||
*/
|
*/
|
||||||
public List<HotakeMeetingCalendarInfo> selectHotakeMeetingCalendarInfoList(HotakeMeetingCalendarInfo hotakeMeetingCalendarInfo);
|
public List<HotakeMeetingCalendarInfo> selectHotakeMeetingCalendarInfoList(HotakeMeetingCalendarInfo hotakeMeetingCalendarInfo);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询会议日历记录主列表
|
||||||
|
*
|
||||||
|
* @param hotakeMeetingCalendarInfo 会议日历记录主
|
||||||
|
* @return 会议日历记录主集合
|
||||||
|
*/
|
||||||
|
public List<HotakeMeetingCalendarInfo> selectHotakeMeetingCalendarInfoCandidateList(HotakeMeetingCalendarInfo hotakeMeetingCalendarInfo);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增会议日历记录主
|
* 新增会议日历记录主
|
||||||
*
|
*
|
||||||
@@ -78,4 +89,12 @@ public interface IHotakeMeetingCalendarInfoService
|
|||||||
public void saveHotakeMeetingCalendarInfo(HotakeMeetingCalendarVo calendarVo);
|
public void saveHotakeMeetingCalendarInfo(HotakeMeetingCalendarVo calendarVo);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询当前候选者会议日历数据
|
||||||
|
*
|
||||||
|
* @return 查询当前候选者会议日历数据
|
||||||
|
*/
|
||||||
|
public List<HotakeMeetingCalendarDataDto> selectHotakeMeetingCalendarDataDtoList();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -14,8 +14,10 @@ import com.vetti.common.utils.readFile.FileContentUtil;
|
|||||||
import com.vetti.hotake.domain.HotakeCvInfo;
|
import com.vetti.hotake.domain.HotakeCvInfo;
|
||||||
import com.vetti.hotake.domain.HotakeProblemBaseInfo;
|
import com.vetti.hotake.domain.HotakeProblemBaseInfo;
|
||||||
import com.vetti.hotake.domain.dto.HotakeCvInfoDto;
|
import com.vetti.hotake.domain.dto.HotakeCvInfoDto;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeCvOptimizeDto;
|
||||||
import com.vetti.hotake.domain.dto.VcDto.*;
|
import com.vetti.hotake.domain.dto.VcDto.*;
|
||||||
import com.vetti.hotake.mapper.HotakeCvInfoMapper;
|
import com.vetti.hotake.mapper.HotakeCvInfoMapper;
|
||||||
|
import com.vetti.hotake.service.IHotakeAiCommonToolsService;
|
||||||
import com.vetti.hotake.service.IHotakeCvInfoService;
|
import com.vetti.hotake.service.IHotakeCvInfoService;
|
||||||
import com.vetti.hotake.service.IHotakeProblemBaseInfoService;
|
import com.vetti.hotake.service.IHotakeProblemBaseInfoService;
|
||||||
import io.minio.GetObjectArgs;
|
import io.minio.GetObjectArgs;
|
||||||
@@ -60,6 +62,9 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC
|
|||||||
@Autowired
|
@Autowired
|
||||||
private IHotakeProblemBaseInfoService hotakeProblemBaseInfoService;
|
private IHotakeProblemBaseInfoService hotakeProblemBaseInfoService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IHotakeAiCommonToolsService aiCommonToolsService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询简历信息
|
* 查询简历信息
|
||||||
*
|
*
|
||||||
@@ -74,7 +79,23 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC
|
|||||||
HotakeCvInfoDto cvInfoDto = JSONUtil.toBean(cvInfo.getCvTemplateJson(),HotakeCvInfoDto.class);
|
HotakeCvInfoDto cvInfoDto = JSONUtil.toBean(cvInfo.getCvTemplateJson(),HotakeCvInfoDto.class);
|
||||||
cvInfo.setCvInfoDto(cvInfoDto);
|
cvInfo.setCvInfoDto(cvInfoDto);
|
||||||
}
|
}
|
||||||
|
if(StrUtil.isNotEmpty(cvInfo.getCvOptimizeJson())){
|
||||||
|
//解析优化简历
|
||||||
|
HotakeCvOptimizeDto cvOptimizeDto = JSONUtil.toBean(cvInfo.getCvOptimizeJson(),HotakeCvOptimizeDto.class);
|
||||||
|
if(cvOptimizeDto != null){
|
||||||
|
cvInfo.setCvOptimizeDto(cvOptimizeDto);
|
||||||
|
if(cvOptimizeDto.getTextCorrections() != null && CollectionUtil.isNotEmpty(cvOptimizeDto.getTextCorrections().getFormattingIssues())){
|
||||||
|
cvInfo.setTextCorrectionsNums(cvOptimizeDto.getTextCorrections().getFormattingIssues().size());
|
||||||
|
}else{
|
||||||
|
cvInfo.setTextCorrectionsNums(0);
|
||||||
|
}
|
||||||
|
if(cvOptimizeDto.getLogicCorrections() != null && CollectionUtil.isNotEmpty(cvOptimizeDto.getLogicCorrections().getCareerProgressionDtos())){
|
||||||
|
cvInfo.setLogicCorrectionsNum(cvOptimizeDto.getTextCorrections().getFormattingIssues().size());
|
||||||
|
}else{
|
||||||
|
cvInfo.setLogicCorrectionsNum(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
HotakeProblemBaseInfo query = new HotakeProblemBaseInfo();
|
HotakeProblemBaseInfo query = new HotakeProblemBaseInfo();
|
||||||
query.setCvId(id);
|
query.setCvId(id);
|
||||||
List<HotakeProblemBaseInfo> problemBaseInfoList = hotakeProblemBaseInfoService.selectHotakeProblemBaseInfoList(query);
|
List<HotakeProblemBaseInfo> problemBaseInfoList = hotakeProblemBaseInfoService.selectHotakeProblemBaseInfoList(query);
|
||||||
@@ -264,25 +285,42 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC
|
|||||||
//对简历数据进行处理生成相应的题库数据
|
//对简历数据进行处理生成相应的题库数据
|
||||||
HotakeProblemBaseInfo problemBaseInfo = handleHotakeCvInfo(cvInfoDto,hotakeCvInfo.getId());
|
HotakeProblemBaseInfo problemBaseInfo = handleHotakeCvInfo(cvInfoDto,hotakeCvInfo.getId());
|
||||||
cvInfo.setProblemBaseInfo(problemBaseInfo);
|
cvInfo.setProblemBaseInfo(problemBaseInfo);
|
||||||
//生成对应的简历评分
|
//解析优化简历
|
||||||
String resultMsg = handleHotakeCvInfoScore(cvInfoDto);
|
HotakeCvOptimizeDto cvOptimizeDto = aiCommonToolsService.getResumeAnalysisOptimizer(contents);
|
||||||
cvInfo.setCvScore(resultMsg);
|
|
||||||
cvInfo.setExperience(cvInfoDto.getExperienceYear());
|
|
||||||
//分数解析
|
|
||||||
String[] strs = resultMsg.split("\n");
|
|
||||||
if(strs != null && strs.length > 0){
|
|
||||||
String score = strs[0].replaceAll("Score:","").trim();
|
|
||||||
String[] scores = score.split("/");
|
|
||||||
if(scores != null && scores.length > 0){
|
|
||||||
cvInfo.setAiMatchScore(scores[0]);
|
|
||||||
try{
|
|
||||||
cvInfo.setAiMatchScorePercentage(String.valueOf(new BigDecimal(scores[0]).
|
|
||||||
divide(new BigDecimal(5)).setScale(2,4)));
|
|
||||||
}catch (Exception e){e.printStackTrace();}
|
|
||||||
|
|
||||||
|
if(cvOptimizeDto != null){
|
||||||
|
cvInfo.setCvOptimizeJson(JSONUtil.toJsonStr(cvOptimizeDto));
|
||||||
|
if(cvOptimizeDto.getTextCorrections() != null && CollectionUtil.isNotEmpty(cvOptimizeDto.getTextCorrections().getFormattingIssues())){
|
||||||
|
cvInfo.setTextCorrectionsNums(cvOptimizeDto.getTextCorrections().getFormattingIssues().size());
|
||||||
|
}else{
|
||||||
|
cvInfo.setTextCorrectionsNums(0);
|
||||||
}
|
}
|
||||||
|
if(cvOptimizeDto.getLogicCorrections() != null && CollectionUtil.isNotEmpty(cvOptimizeDto.getLogicCorrections().getCareerProgressionDtos())){
|
||||||
|
cvInfo.setLogicCorrectionsNum(cvOptimizeDto.getTextCorrections().getFormattingIssues().size());
|
||||||
|
}else{
|
||||||
|
cvInfo.setLogicCorrectionsNum(0);
|
||||||
|
}
|
||||||
|
cvInfo.setCvOptimizeDto(cvOptimizeDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// //生成对应的简历评分
|
||||||
|
// String resultMsg = handleHotakeCvInfoScore(cvInfoDto);
|
||||||
|
// cvInfo.setCvScore(resultMsg);
|
||||||
|
cvInfo.setExperience(cvInfoDto.getExperienceYear());
|
||||||
|
//分数解析
|
||||||
|
// String[] strs = resultMsg.split("\n");
|
||||||
|
// if(strs != null && strs.length > 0){
|
||||||
|
// String score = strs[0].replaceAll("Score:","").trim();
|
||||||
|
// String[] scores = score.split("/");
|
||||||
|
// if(scores != null && scores.length > 0){
|
||||||
|
// cvInfo.setAiMatchScore(scores[0]);
|
||||||
|
// try{
|
||||||
|
// cvInfo.setAiMatchScorePercentage(String.valueOf(new BigDecimal(scores[0]).
|
||||||
|
// divide(new BigDecimal(5)).setScale(2,4)));
|
||||||
|
// }catch (Exception e){e.printStackTrace();}
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// }
|
||||||
cvInfo.setCvTemplateJson(JSONUtil.toJsonStr(cvInfoDto));
|
cvInfo.setCvTemplateJson(JSONUtil.toJsonStr(cvInfoDto));
|
||||||
fill(FillTypeEnum.UPDATE.getCode(), cvInfo);
|
fill(FillTypeEnum.UPDATE.getCode(), cvInfo);
|
||||||
hotakeCvInfoMapper.updateHotakeCvInfo(cvInfo);
|
hotakeCvInfoMapper.updateHotakeCvInfo(cvInfo);
|
||||||
|
|||||||
@@ -22,11 +22,14 @@ import com.vetti.common.utils.SecurityUtils;
|
|||||||
import com.vetti.common.utils.readFile.FileContentUtil;
|
import com.vetti.common.utils.readFile.FileContentUtil;
|
||||||
import com.vetti.hotake.domain.*;
|
import com.vetti.hotake.domain.*;
|
||||||
import com.vetti.hotake.domain.dto.HotakeCvInfoDto;
|
import com.vetti.hotake.domain.dto.HotakeCvInfoDto;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeInitialQuestionEliminationScoreDto;
|
||||||
import com.vetti.hotake.domain.dto.VcDto.*;
|
import com.vetti.hotake.domain.dto.VcDto.*;
|
||||||
import com.vetti.hotake.domain.vo.HotakeInitScreQuestionsReplyRecordInfoVo;
|
import com.vetti.hotake.domain.vo.HotakeInitScreQuestionsReplyRecordInfoVo;
|
||||||
|
import com.vetti.hotake.domain.vo.HotakeInitialQuestionEliminationScoreVo;
|
||||||
import com.vetti.hotake.mapper.HotakeCvInfoMapper;
|
import com.vetti.hotake.mapper.HotakeCvInfoMapper;
|
||||||
import com.vetti.hotake.mapper.HotakeRolesApplyInfoMapper;
|
import com.vetti.hotake.mapper.HotakeRolesApplyInfoMapper;
|
||||||
import com.vetti.hotake.mapper.HotakeRolesInfoMapper;
|
import com.vetti.hotake.mapper.HotakeRolesInfoMapper;
|
||||||
|
import com.vetti.hotake.service.IHotakeAiCommonToolsService;
|
||||||
import io.minio.GetObjectArgs;
|
import io.minio.GetObjectArgs;
|
||||||
import io.minio.MinioClient;
|
import io.minio.MinioClient;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -60,6 +63,9 @@ public class HotakeInitScreQuestionsReplyRecordInfoServiceImpl extends BaseServi
|
|||||||
@Autowired
|
@Autowired
|
||||||
private HotakeCvInfoMapper hotakeCvInfoMapper;
|
private HotakeCvInfoMapper hotakeCvInfoMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private IHotakeAiCommonToolsService aiCommonToolsService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private MinioClient minioClient;
|
private MinioClient minioClient;
|
||||||
|
|
||||||
@@ -180,62 +186,70 @@ public class HotakeInitScreQuestionsReplyRecordInfoServiceImpl extends BaseServi
|
|||||||
HotakeRolesApplyInfo applyInfo = hotakeRolesApplyInfoMapper.selectHotakeRolesApplyInfoById(initScreQuestionsReplyRecordInfoVo.getRoleApplyId());
|
HotakeRolesApplyInfo applyInfo = hotakeRolesApplyInfoMapper.selectHotakeRolesApplyInfoById(initScreQuestionsReplyRecordInfoVo.getRoleApplyId());
|
||||||
if (applyInfo != null) {
|
if (applyInfo != null) {
|
||||||
HotakeRolesInfo rolesInf = hotakeRolesInfoMapper.selectHotakeRolesInfoById(initScreQuestionsReplyRecordInfoVo.getRoleId());
|
HotakeRolesInfo rolesInf = hotakeRolesInfoMapper.selectHotakeRolesInfoById(initScreQuestionsReplyRecordInfoVo.getRoleId());
|
||||||
|
//获取初步筛选问题评分
|
||||||
|
HotakeInitialQuestionEliminationScoreVo eliminationScoreVo = new HotakeInitialQuestionEliminationScoreVo();
|
||||||
|
eliminationScoreVo.setRoleId(rolesInf.getId());
|
||||||
|
eliminationScoreVo.setRoleName(rolesInf.getRoleName());
|
||||||
|
eliminationScoreVo.setInitScreQuestionsReplyRecordInfoList(initScreQuestionsReplyRecordInfoVo.getInitScreQuestionsReplyRecordInfoList());
|
||||||
|
HotakeInitialQuestionEliminationScoreDto eliminationScoreDto = aiCommonToolsService.getInitialQuestionEliminationScore(eliminationScoreVo);
|
||||||
|
|
||||||
|
|
||||||
//查询候选人的当前最新简历信息
|
//查询候选人的当前最新简历信息
|
||||||
HotakeCvInfo queryCv = new HotakeCvInfo();
|
// HotakeCvInfo queryCv = new HotakeCvInfo();
|
||||||
queryCv.setUserId(SecurityUtils.getUserId());
|
// queryCv.setUserId(SecurityUtils.getUserId());
|
||||||
queryCv.setCvFileType("cv");
|
// queryCv.setCvFileType("cv");
|
||||||
List<HotakeCvInfo> cvInfos = hotakeCvInfoMapper.selectHotakeCvInfoList(queryCv);
|
// List<HotakeCvInfo> cvInfos = hotakeCvInfoMapper.selectHotakeCvInfoList(queryCv);
|
||||||
HotakeCvInfo cvInfo = null;
|
// HotakeCvInfo cvInfo = null;
|
||||||
if(CollectionUtil.isNotEmpty(cvInfos)) {
|
// if(CollectionUtil.isNotEmpty(cvInfos)) {
|
||||||
cvInfo = cvInfos.get(0);
|
// cvInfo = cvInfos.get(0);
|
||||||
}
|
// }
|
||||||
//解析简历内容以及获取简历对应的评分数据
|
// //解析简历内容以及获取简历对应的评分数据
|
||||||
log.info("开始处理简历");
|
// log.info("开始处理简历");
|
||||||
try {
|
// try {
|
||||||
InputStream inputStream = minioClient.getObject(
|
// InputStream inputStream = minioClient.getObject(
|
||||||
GetObjectArgs.builder()
|
// GetObjectArgs.builder()
|
||||||
.bucket(MinioBucketNameEnum.CV.getCode())
|
// .bucket(MinioBucketNameEnum.CV.getCode())
|
||||||
.object(applyInfo.getCvFile())
|
// .object(applyInfo.getCvFile())
|
||||||
.build());
|
// .build());
|
||||||
String contents = FileContentUtil.readFileContent(inputStream, applyInfo.getCvFileSuffix());
|
// String contents = FileContentUtil.readFileContent(inputStream, applyInfo.getCvFileSuffix());
|
||||||
log.info("简历信息:{}", contents);
|
// log.info("简历信息:{}", contents);
|
||||||
//验证文件内容是否改变,如果未改变不进行模型解析直接返回原有结果
|
// //验证文件内容是否改变,如果未改变不进行模型解析直接返回原有结果
|
||||||
String md5Hash = MD5.create().digestHex16(contents);
|
// String md5Hash = MD5.create().digestHex16(contents);
|
||||||
String scoreStr = "";
|
// String scoreStr = "";
|
||||||
if (StrUtil.isNotEmpty(md5Hash) && cvInfo != null && md5Hash.equals(cvInfo.getCvMd5())) {
|
// if (StrUtil.isNotEmpty(md5Hash) && cvInfo != null && md5Hash.equals(cvInfo.getCvMd5())) {
|
||||||
//直接获取简历表中的简历解析的详细数据
|
// //直接获取简历表中的简历解析的详细数据
|
||||||
applyInfo.setCvScore(cvInfo.getCvScore());
|
// applyInfo.setCvScore(cvInfo.getCvScore());
|
||||||
applyInfo.setCvTemplateJson(cvInfo.getCvTemplateJson());
|
// applyInfo.setCvTemplateJson(cvInfo.getCvTemplateJson());
|
||||||
fill(FillTypeEnum.UPDATE.getCode(), applyInfo);
|
// fill(FillTypeEnum.UPDATE.getCode(), applyInfo);
|
||||||
applyInfo.setCvMd5(md5Hash);
|
// applyInfo.setCvMd5(md5Hash);
|
||||||
applyInfo.setExperience(cvInfo.getExperience());
|
// applyInfo.setExperience(cvInfo.getExperience());
|
||||||
scoreStr = cvInfo.getCvScore();
|
// scoreStr = cvInfo.getCvScore();
|
||||||
}else{
|
// }else{
|
||||||
//生成简历模版数据信息
|
// //生成简历模版数据信息
|
||||||
HotakeCvInfoDto cvInfoDto = handleAnalysisCvInfo(contents);
|
// HotakeCvInfoDto cvInfoDto = handleAnalysisCvInfo(contents);
|
||||||
//生成对应的简历评分
|
// //生成对应的简历评分
|
||||||
String resultMsg = handleHotakeCvInfoScore(cvInfoDto);
|
// String resultMsg = handleHotakeCvInfoScore(cvInfoDto);
|
||||||
applyInfo.setCvScore(resultMsg);
|
// applyInfo.setCvScore(resultMsg);
|
||||||
applyInfo.setCvTemplateJson(JSONUtil.toJsonStr(cvInfoDto));
|
// applyInfo.setCvTemplateJson(JSONUtil.toJsonStr(cvInfoDto));
|
||||||
fill(FillTypeEnum.UPDATE.getCode(), cvInfo);
|
// fill(FillTypeEnum.UPDATE.getCode(), cvInfo);
|
||||||
applyInfo.setCvMd5(md5Hash);
|
// applyInfo.setCvMd5(md5Hash);
|
||||||
applyInfo.setExperience(cvInfoDto.getExperienceYear());
|
// applyInfo.setExperience(cvInfoDto.getExperienceYear());
|
||||||
scoreStr = resultMsg;
|
// scoreStr = resultMsg;
|
||||||
}
|
// }
|
||||||
//更新岗位申请数据记录--根据评分进行计算
|
//更新岗位申请数据记录--根据评分进行计算
|
||||||
//分数解析
|
//分数解析
|
||||||
String[] strs = scoreStr.split("\n");
|
// String[] strs = scoreStr.split("\n");
|
||||||
if(strs != null && strs.length > 0){
|
// if(strs != null && strs.length > 0){
|
||||||
String score = strs[0].replaceAll("Score:","").trim();
|
// String score = strs[0].replaceAll("Score:","").trim();
|
||||||
String[] scores = score.split("/");
|
// String[] scores = score.split("/");
|
||||||
if(scores != null && scores.length > 0){
|
// if(scores != null && scores.length > 0){
|
||||||
applyInfo.setAiMatchScore(scores[0]);
|
// applyInfo.setAiMatchScore(scores[0]);
|
||||||
try{
|
try{
|
||||||
applyInfo.setAiMatchScorePercentage(new BigDecimal(scores[0]).
|
applyInfo.setAiMatchScorePercentage(new BigDecimal(eliminationScoreDto.getScore()).
|
||||||
divide(new BigDecimal(5)).setScale(2,4));
|
divide(new BigDecimal(100)).setScale(2,4));
|
||||||
}catch (Exception e){e.printStackTrace();}
|
}catch (Exception e){e.printStackTrace();}
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
if(applyInfo.getAiMatchScorePercentage() != null){
|
if(applyInfo.getAiMatchScorePercentage() != null){
|
||||||
if(applyInfo.getAiMatchScorePercentage().compareTo(new BigDecimal(0.85)) >= 0){
|
if(applyInfo.getAiMatchScorePercentage().compareTo(new BigDecimal(0.85)) >= 0){
|
||||||
applyInfo.setCandidateStatus(CandidateStatusEnum.HOT.getCode());
|
applyInfo.setCandidateStatus(CandidateStatusEnum.HOT.getCode());
|
||||||
@@ -252,9 +266,9 @@ public class HotakeInitScreQuestionsReplyRecordInfoServiceImpl extends BaseServi
|
|||||||
applyInfo.setRecruiterId(rolesInf.getRecruiterId());
|
applyInfo.setRecruiterId(rolesInf.getRecruiterId());
|
||||||
applyInfo.setStage(StageEnum.APPLIED.getCode());
|
applyInfo.setStage(StageEnum.APPLIED.getCode());
|
||||||
hotakeRolesApplyInfoMapper.updateHotakeRolesApplyInfo(applyInfo);
|
hotakeRolesApplyInfoMapper.updateHotakeRolesApplyInfo(applyInfo);
|
||||||
} catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
e.printStackTrace();
|
// e.printStackTrace();
|
||||||
}
|
// }
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import com.vetti.common.enums.FillTypeEnum;
|
|||||||
import com.vetti.common.utils.SecurityUtils;
|
import com.vetti.common.utils.SecurityUtils;
|
||||||
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
|
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
|
||||||
import com.vetti.hotake.domain.dto.AnswerOptionsDto;
|
import com.vetti.hotake.domain.dto.AnswerOptionsDto;
|
||||||
|
import com.vetti.hotake.domain.vo.HotakeInitialScreeningQuestionsInfoVo;
|
||||||
import com.vetti.hotake.mapper.HotakeInitialScreeningQuestionsInfoMapper;
|
import com.vetti.hotake.mapper.HotakeInitialScreeningQuestionsInfoMapper;
|
||||||
import com.vetti.hotake.service.IHotakeInitialScreeningQuestionsInfoService;
|
import com.vetti.hotake.service.IHotakeInitialScreeningQuestionsInfoService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -128,12 +129,26 @@ public class HotakeInitialScreeningQuestionsInfoServiceImpl extends BaseServiceI
|
|||||||
/**
|
/**
|
||||||
* 批量新增初步筛选问题信息
|
* 批量新增初步筛选问题信息
|
||||||
*
|
*
|
||||||
* @param hotakeInitialScreeningQuestionsInfoList 初步筛选问题信息列表
|
* @param questionsInfoVo 初步筛选问题信息
|
||||||
* @return 结果
|
* @return 结果
|
||||||
*/
|
*/
|
||||||
@Transactional(rollbackFor=Exception.class)
|
@Transactional(rollbackFor=Exception.class)
|
||||||
@Override
|
@Override
|
||||||
public int batchInsertHotakeInitialScreeningQuestionsInfo(List<HotakeInitialScreeningQuestionsInfo> hotakeInitialScreeningQuestionsInfoList){
|
public void batchInsertHotakeInitialScreeningQuestionsInfo(HotakeInitialScreeningQuestionsInfoVo questionsInfoVo){
|
||||||
return hotakeInitialScreeningQuestionsInfoMapper.batchInsertHotakeInitialScreeningQuestionsInfo(hotakeInitialScreeningQuestionsInfoList);
|
//先删除之前的初步筛选问题数据
|
||||||
|
// hotakeInitialScreeningQuestionsInfoMapper.deleteHotakeInitialScreeningQuestionsInfoByRoleId(questionsInfoVo.getRoleId());
|
||||||
|
if(CollectionUtil.isNotEmpty(questionsInfoVo.getQuestionsInfoList())){
|
||||||
|
for(HotakeInitialScreeningQuestionsInfo questionsInfo : questionsInfoVo.getQuestionsInfoList()){
|
||||||
|
fill(FillTypeEnum.INSERT.getCode(), questionsInfo);
|
||||||
|
questionsInfo.setRecruiterId(SecurityUtils.getUserId());
|
||||||
|
if(CollectionUtil.isNotEmpty(questionsInfo.getAnswerOptionsList())){
|
||||||
|
questionsInfo.setAnswerOptions(JSONUtil.toJsonStr(questionsInfo.getAnswerOptionsList()));
|
||||||
|
}else {
|
||||||
|
questionsInfo.setAnswerOptions("");
|
||||||
|
}
|
||||||
|
questionsInfo.setRoleId(questionsInfoVo.getRoleId());
|
||||||
|
}
|
||||||
|
hotakeInitialScreeningQuestionsInfoMapper.batchInsertHotakeInitialScreeningQuestionsInfo(questionsInfoVo.getQuestionsInfoList());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.vetti.hotake.service.impl;
|
package com.vetti.hotake.service.impl;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -10,9 +12,11 @@ import com.vetti.common.core.service.BaseServiceImpl;
|
|||||||
import com.vetti.common.enums.FillTypeEnum;
|
import com.vetti.common.enums.FillTypeEnum;
|
||||||
import com.vetti.common.enums.MeetingCalendarStatus;
|
import com.vetti.common.enums.MeetingCalendarStatus;
|
||||||
import com.vetti.common.enums.StageEnum;
|
import com.vetti.common.enums.StageEnum;
|
||||||
|
import com.vetti.common.utils.SecurityUtils;
|
||||||
import com.vetti.hotake.domain.HotakeMeetingCalendarDetail;
|
import com.vetti.hotake.domain.HotakeMeetingCalendarDetail;
|
||||||
import com.vetti.hotake.domain.HotakeRolesApplyInfo;
|
import com.vetti.hotake.domain.HotakeRolesApplyInfo;
|
||||||
import com.vetti.hotake.domain.HotakeRolesInfo;
|
import com.vetti.hotake.domain.HotakeRolesInfo;
|
||||||
|
import com.vetti.hotake.domain.dto.HotakeMeetingCalendarDataDto;
|
||||||
import com.vetti.hotake.domain.vo.HotakeMeetingCalendarInfoVo;
|
import com.vetti.hotake.domain.vo.HotakeMeetingCalendarInfoVo;
|
||||||
import com.vetti.hotake.domain.vo.HotakeMeetingCalendarVo;
|
import com.vetti.hotake.domain.vo.HotakeMeetingCalendarVo;
|
||||||
import com.vetti.hotake.mapper.HotakeMeetingCalendarDetailMapper;
|
import com.vetti.hotake.mapper.HotakeMeetingCalendarDetailMapper;
|
||||||
@@ -160,6 +164,69 @@ public class HotakeMeetingCalendarInfoServiceImpl extends BaseServiceImpl implem
|
|||||||
return calendarInfos;
|
return calendarInfos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询候选者相关的会议记录数据
|
||||||
|
* @param hotakeMeetingCalendarInfo 会议日历记录主
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<HotakeMeetingCalendarInfo> selectHotakeMeetingCalendarInfoCandidateList(HotakeMeetingCalendarInfo hotakeMeetingCalendarInfo) {
|
||||||
|
//根据候选者查询会议明细数据
|
||||||
|
HotakeMeetingCalendarDetail queryCalendarDetail = new HotakeMeetingCalendarDetail();
|
||||||
|
queryCalendarDetail.setCandidateId(SecurityUtils.getUserId());
|
||||||
|
List<HotakeMeetingCalendarDetail> calendarDetailList = hotakeMeetingCalendarDetailMapper.selectHotakeMeetingCalendarDetailList(queryCalendarDetail);
|
||||||
|
|
||||||
|
if(CollectionUtil.isNotEmpty(calendarDetailList)) {
|
||||||
|
//查询明细中的会议主表ID
|
||||||
|
List<Long> meetingIds = calendarDetailList.stream().map(HotakeMeetingCalendarDetail::getMeetingId).collect(Collectors.toList());
|
||||||
|
hotakeMeetingCalendarInfo.setMeetingIds(meetingIds);
|
||||||
|
List<HotakeMeetingCalendarInfo> calendarInfos = hotakeMeetingCalendarInfoMapper.selectHotakeMeetingCalendarInfoList(hotakeMeetingCalendarInfo);
|
||||||
|
if (CollectionUtil.isNotEmpty(calendarInfos)) {
|
||||||
|
//查询岗位数据
|
||||||
|
HotakeRolesInfo query = new HotakeRolesInfo();
|
||||||
|
List<HotakeRolesInfo> rolesInfoList = hotakeRolesInfoMapper.selectHotakeRolesInfoList(query);
|
||||||
|
|
||||||
|
//查询岗位数据
|
||||||
|
HotakeRolesApplyInfo queryApply = new HotakeRolesApplyInfo();
|
||||||
|
List<HotakeRolesApplyInfo> applyInfoList = hotakeRolesApplyInfoMapper.selectHotakeRolesApplyInfoList(queryApply);
|
||||||
|
//获取对应的参会人员数据
|
||||||
|
HotakeMeetingCalendarDetail queryDetail = new HotakeMeetingCalendarDetail();
|
||||||
|
List<HotakeMeetingCalendarDetail> detailList = calendarDetailService.selectHotakeMeetingCalendarDetailList(queryDetail);
|
||||||
|
if (CollectionUtil.isNotEmpty(detailList)) {
|
||||||
|
Map<Long, List<HotakeMeetingCalendarDetail>> mapDetailList = detailList.stream().collect(Collectors.groupingBy(HotakeMeetingCalendarDetail::getMeetingId));
|
||||||
|
SysUser queryUser = new SysUser();
|
||||||
|
List<SysUser> userList = userService.selectUserList(queryUser);
|
||||||
|
for (HotakeMeetingCalendarInfo calendarInfo : calendarInfos) {
|
||||||
|
List<HotakeMeetingCalendarDetail> calendarDetails = mapDetailList.get(calendarInfo.getId());
|
||||||
|
for (HotakeMeetingCalendarDetail detail : calendarDetails) {
|
||||||
|
List<SysUser> users = userList.stream().filter(e -> e.getUserId() == detail.getCandidateId()).collect(Collectors.toList());
|
||||||
|
if (CollectionUtil.isNotEmpty(users)) {
|
||||||
|
detail.setCandidateUser(users.get(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
calendarInfo.setCalendarDetails(calendarDetails);
|
||||||
|
//返回岗位数据信息
|
||||||
|
List<HotakeRolesApplyInfo> applyInfos = applyInfoList.stream().filter(e->e.getId().longValue() == calendarInfo.getRoleApplyId().longValue()).toList();
|
||||||
|
if(CollectionUtil.isNotEmpty(applyInfos)) {
|
||||||
|
HotakeRolesApplyInfo applyInfo = applyInfos.get(0);
|
||||||
|
List<HotakeRolesInfo> rolesInfos = rolesInfoList.stream().filter(e->e.getId().longValue() == applyInfo.getRoleId().longValue()).toList();
|
||||||
|
if(CollectionUtil.isNotEmpty(rolesInfos)) {
|
||||||
|
HotakeRolesInfo rolesInfo = rolesInfos.get(0);
|
||||||
|
calendarInfo.setRolesInfo(rolesInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return calendarInfos;
|
||||||
|
}else{
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增会议日历记录主
|
* 新增会议日历记录主
|
||||||
*
|
*
|
||||||
@@ -262,7 +329,7 @@ public class HotakeMeetingCalendarInfoServiceImpl extends BaseServiceImpl implem
|
|||||||
calendarInfo.setMeetingName(meetingName);
|
calendarInfo.setMeetingName(meetingName);
|
||||||
//保存主表数据
|
//保存主表数据
|
||||||
fill(FillTypeEnum.INSERT.getCode(), calendarInfo);
|
fill(FillTypeEnum.INSERT.getCode(), calendarInfo);
|
||||||
insertHotakeMeetingCalendarInfo(calendarInfo);
|
hotakeMeetingCalendarInfoMapper.insertHotakeMeetingCalendarInfo(calendarInfo);
|
||||||
//保存明细数据
|
//保存明细数据
|
||||||
HotakeMeetingCalendarDetail hotakeMeetingCalendarDetail = new HotakeMeetingCalendarDetail();
|
HotakeMeetingCalendarDetail hotakeMeetingCalendarDetail = new HotakeMeetingCalendarDetail();
|
||||||
hotakeMeetingCalendarDetail.setMeetingId(calendarInfo.getId());
|
hotakeMeetingCalendarDetail.setMeetingId(calendarInfo.getId());
|
||||||
@@ -279,4 +346,41 @@ public class HotakeMeetingCalendarInfoServiceImpl extends BaseServiceImpl implem
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询当前候选者会议日历数据
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<HotakeMeetingCalendarDataDto> selectHotakeMeetingCalendarDataDtoList() {
|
||||||
|
List<HotakeMeetingCalendarDataDto> dataDtos = new ArrayList<>();
|
||||||
|
//根据候选者查询会议明细数据
|
||||||
|
HotakeMeetingCalendarDetail queryCalendarDetail = new HotakeMeetingCalendarDetail();
|
||||||
|
queryCalendarDetail.setCandidateId(SecurityUtils.getUserId());
|
||||||
|
List<HotakeMeetingCalendarDetail> calendarDetailList = hotakeMeetingCalendarDetailMapper.selectHotakeMeetingCalendarDetailList(queryCalendarDetail);
|
||||||
|
if(CollectionUtil.isNotEmpty(calendarDetailList)) {
|
||||||
|
HotakeMeetingCalendarInfo queryCalendarInfo = new HotakeMeetingCalendarInfo();
|
||||||
|
//查询明细中的会议主表ID
|
||||||
|
List<Long> meetingIds = calendarDetailList.stream().map(HotakeMeetingCalendarDetail::getMeetingId).collect(Collectors.toList());
|
||||||
|
queryCalendarInfo.setMeetingIds(meetingIds);
|
||||||
|
List<HotakeMeetingCalendarInfo> calendarInfos = hotakeMeetingCalendarInfoMapper.selectHotakeMeetingCalendarInfoList(queryCalendarInfo);
|
||||||
|
if (CollectionUtil.isNotEmpty(calendarInfos)) {
|
||||||
|
//获取对应的参会人员数据
|
||||||
|
Map<String,List<HotakeMeetingCalendarInfo>> mapCalendarInfo = calendarInfos.stream().collect(Collectors.groupingBy(HotakeMeetingCalendarInfo::getMeetingDate));
|
||||||
|
if(mapCalendarInfo != null) {
|
||||||
|
for(String key : mapCalendarInfo.keySet()) {
|
||||||
|
List<HotakeMeetingCalendarInfo> calendarInfoList = mapCalendarInfo.get(key);
|
||||||
|
HotakeMeetingCalendarDataDto dataDto = new HotakeMeetingCalendarDataDto();
|
||||||
|
dataDto.setMeetingDate(key);
|
||||||
|
dataDto.setMeetingFlag("1");
|
||||||
|
dataDto.setNums(calendarInfoList.size());
|
||||||
|
dataDtos.add(dataDto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dataDtos;
|
||||||
|
}else{
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<result property="aiMatchScore" column="ai_match_score" />
|
<result property="aiMatchScore" column="ai_match_score" />
|
||||||
<result property="aiMatchScorePercentage" column="ai_match_score_percentage" />
|
<result property="aiMatchScorePercentage" column="ai_match_score_percentage" />
|
||||||
|
|
||||||
|
<result property="cvOptimizeJson" column="cv_optimize_json" />
|
||||||
<result property="delFlag" column="del_flag" />
|
<result property="delFlag" column="del_flag" />
|
||||||
<result property="createBy" column="create_by" />
|
<result property="createBy" column="create_by" />
|
||||||
<result property="createTime" column="create_time" />
|
<result property="createTime" column="create_time" />
|
||||||
@@ -31,7 +32,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<sql id="selectHotakeCvInfoVo">
|
<sql id="selectHotakeCvInfoVo">
|
||||||
select id, user_id, cv_name, cv_file_type, cv_url,file_size_show,cv_file_suffix,
|
select id, user_id, cv_name, cv_file_type, cv_url,file_size_show,cv_file_suffix,
|
||||||
status,cv_template_json,cv_score,cv_md5,experience,ai_match_score,ai_match_score_percentage,
|
status,cv_template_json,cv_score,cv_md5,experience,ai_match_score,ai_match_score_percentage,cv_optimize_json,
|
||||||
del_flag, create_by, create_time, update_by, update_time, remark from hotake_cv_info
|
del_flag, create_by, create_time, update_by, update_time, remark from hotake_cv_info
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
@@ -70,6 +71,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<if test="experience != null">experience,</if>
|
<if test="experience != null">experience,</if>
|
||||||
<if test="aiMatchScore != null">ai_match_score,</if>
|
<if test="aiMatchScore != null">ai_match_score,</if>
|
||||||
<if test="aiMatchScorePercentage != null">ai_match_score_percentage,</if>
|
<if test="aiMatchScorePercentage != null">ai_match_score_percentage,</if>
|
||||||
|
<if test="cvOptimizeJson != null">cv_optimize_json,</if>
|
||||||
|
|
||||||
<if test="delFlag != null">del_flag,</if>
|
<if test="delFlag != null">del_flag,</if>
|
||||||
<if test="createBy != null">create_by,</if>
|
<if test="createBy != null">create_by,</if>
|
||||||
@@ -93,6 +95,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<if test="experience != null">#{experience},</if>
|
<if test="experience != null">#{experience},</if>
|
||||||
<if test="aiMatchScore != null">#{aiMatchScore},</if>
|
<if test="aiMatchScore != null">#{aiMatchScore},</if>
|
||||||
<if test="aiMatchScorePercentage != null">#{aiMatchScorePercentage},</if>
|
<if test="aiMatchScorePercentage != null">#{aiMatchScorePercentage},</if>
|
||||||
|
<if test="cvOptimizeJson != null">#{cvOptimizeJson},</if>
|
||||||
|
|
||||||
<if test="delFlag != null">#{delFlag},</if>
|
<if test="delFlag != null">#{delFlag},</if>
|
||||||
<if test="createBy != null">#{createBy},</if>
|
<if test="createBy != null">#{createBy},</if>
|
||||||
@@ -121,6 +124,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<if test="aiMatchScore != null">ai_match_score = #{aiMatchScore},</if>
|
<if test="aiMatchScore != null">ai_match_score = #{aiMatchScore},</if>
|
||||||
<if test="aiMatchScorePercentage != null">ai_match_score_percentage = #{aiMatchScorePercentage},</if>
|
<if test="aiMatchScorePercentage != null">ai_match_score_percentage = #{aiMatchScorePercentage},</if>
|
||||||
|
|
||||||
|
<if test="cvOptimizeJson != null">cv_optimize_json = #{cvOptimizeJson},</if>
|
||||||
|
|
||||||
<if test="delFlag != null">del_flag = #{delFlag},</if>
|
<if test="delFlag != null">del_flag = #{delFlag},</if>
|
||||||
<if test="createBy != null">create_by = #{createBy},</if>
|
<if test="createBy != null">create_by = #{createBy},</if>
|
||||||
<if test="createTime != null">create_time = #{createTime},</if>
|
<if test="createTime != null">create_time = #{createTime},</if>
|
||||||
|
|||||||
@@ -96,6 +96,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
delete from hotake_initial_screening_questions_info where id = #{id}
|
delete from hotake_initial_screening_questions_info where id = #{id}
|
||||||
</delete>
|
</delete>
|
||||||
|
|
||||||
|
<delete id="deleteHotakeInitialScreeningQuestionsInfoByRoleId" parameterType="Long">
|
||||||
|
delete from hotake_initial_screening_questions_info where role_id = #{roleId}
|
||||||
|
</delete>
|
||||||
|
|
||||||
<delete id="deleteHotakeInitialScreeningQuestionsInfoByIds" parameterType="String">
|
<delete id="deleteHotakeInitialScreeningQuestionsInfoByIds" parameterType="String">
|
||||||
delete from hotake_initial_screening_questions_info where id in
|
delete from hotake_initial_screening_questions_info where id in
|
||||||
<foreach item="id" collection="array" open="(" separator="," close=")">
|
<foreach item="id" collection="array" open="(" separator="," close=")">
|
||||||
|
|||||||
@@ -37,6 +37,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<if test="meetingDate != null and meetingDate != ''"> and meeting_date = #{meetingDate}</if>
|
<if test="meetingDate != null and meetingDate != ''"> and meeting_date = #{meetingDate}</if>
|
||||||
<if test="times != null and times != ''"> and times = #{times}</if>
|
<if test="times != null and times != ''"> and times = #{times}</if>
|
||||||
<if test="status != null and status != ''"> and status = #{status}</if>
|
<if test="status != null and status != ''"> and status = #{status}</if>
|
||||||
|
<if test="meetingIds != null ">
|
||||||
|
and id in
|
||||||
|
<foreach item="meetingId" collection="meetingIds" open="(" separator="," close=")">
|
||||||
|
#{meetingId}
|
||||||
|
</foreach>
|
||||||
|
</if>
|
||||||
</where>
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ public class SysUserServiceImpl implements ISysUserService
|
|||||||
* @return 用户信息集合信息
|
* @return 用户信息集合信息
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@DataScope(deptAlias = "d", userAlias = "u")
|
// @DataScope(deptAlias = "d", userAlias = "u")
|
||||||
public List<SysUser> selectUserList(SysUser user)
|
public List<SysUser> selectUserList(SysUser user)
|
||||||
{
|
{
|
||||||
return userMapper.selectUserList(user);
|
return userMapper.selectUserList(user);
|
||||||
@@ -90,7 +90,7 @@ public class SysUserServiceImpl implements ISysUserService
|
|||||||
* @return 用户信息集合信息
|
* @return 用户信息集合信息
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@DataScope(deptAlias = "d", userAlias = "u")
|
// @DataScope(deptAlias = "d", userAlias = "u")
|
||||||
public List<SysUser> selectAllocatedList(SysUser user)
|
public List<SysUser> selectAllocatedList(SysUser user)
|
||||||
{
|
{
|
||||||
return userMapper.selectAllocatedList(user);
|
return userMapper.selectAllocatedList(user);
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<result property="address" column="address" />
|
<result property="address" column="address" />
|
||||||
<result property="userFlag" column="user_flag" />
|
<result property="userFlag" column="user_flag" />
|
||||||
|
|
||||||
|
<result property="userOperStatus" column="user_oper_status" />
|
||||||
|
|
||||||
|
|
||||||
<association property="dept" javaType="SysDept" resultMap="deptResult" />
|
<association property="dept" javaType="SysDept" resultMap="deptResult" />
|
||||||
<collection property="roles" javaType="java.util.List" resultMap="RoleResult" />
|
<collection property="roles" javaType="java.util.List" resultMap="RoleResult" />
|
||||||
@@ -71,7 +73,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
|
d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
|
||||||
r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,u.sys_user_type
|
r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,u.sys_user_type
|
||||||
,u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,
|
,u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,
|
||||||
u.user_flag,u.user_set_json,u.company_name,u.job_title
|
u.user_flag,u.user_set_json,u.company_name,u.job_title,u.user_oper_status
|
||||||
from sys_user u
|
from sys_user u
|
||||||
left join sys_dept d on u.dept_id = d.dept_id
|
left join sys_dept d on u.dept_id = d.dept_id
|
||||||
left join sys_user_role ur on u.user_id = ur.user_id
|
left join sys_user_role ur on u.user_id = ur.user_id
|
||||||
@@ -80,7 +82,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
|
<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
|
||||||
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
|
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
|
||||||
d.dept_name, d.leader,u.sys_user_type,u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title from sys_user u
|
d.dept_name, d.leader,u.sys_user_type,u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title,u.user_oper_status from sys_user u
|
||||||
left join sys_dept d on u.dept_id = d.dept_id
|
left join sys_dept d on u.dept_id = d.dept_id
|
||||||
where u.del_flag = '0'
|
where u.del_flag = '0'
|
||||||
<if test="userId != null and userId != 0">
|
<if test="userId != null and userId != 0">
|
||||||
@@ -114,7 +116,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
|
<select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
|
||||||
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status,
|
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status,
|
||||||
u.create_time,u.sys_user_type,u.steps,u.job_position,u.experience,u.cv_url,u.location,
|
u.create_time,u.sys_user_type,u.steps,u.job_position,u.experience,u.cv_url,u.location,
|
||||||
u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title
|
u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title,u.user_oper_status
|
||||||
from sys_user u
|
from sys_user u
|
||||||
left join sys_dept d on u.dept_id = d.dept_id
|
left join sys_dept d on u.dept_id = d.dept_id
|
||||||
left join sys_user_role ur on u.user_id = ur.user_id
|
left join sys_user_role ur on u.user_id = ur.user_id
|
||||||
@@ -132,7 +134,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<select id="selectUnallocatedList" parameterType="SysUser" resultMap="SysUserResult">
|
<select id="selectUnallocatedList" parameterType="SysUser" resultMap="SysUserResult">
|
||||||
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time,u.sys_user_type,
|
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time,u.sys_user_type,
|
||||||
u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title
|
u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title,u.user_oper_status
|
||||||
from sys_user u
|
from sys_user u
|
||||||
left join sys_dept d on u.dept_id = d.dept_id
|
left join sys_dept d on u.dept_id = d.dept_id
|
||||||
left join sys_user_role ur on u.user_id = ur.user_id
|
left join sys_user_role ur on u.user_id = ur.user_id
|
||||||
@@ -202,6 +204,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<if test="companyName != null and companyName != ''">company_name,</if>
|
<if test="companyName != null and companyName != ''">company_name,</if>
|
||||||
<if test="jobTitle != null and jobTitle != ''">job_title,</if>
|
<if test="jobTitle != null and jobTitle != ''">job_title,</if>
|
||||||
|
<if test="userOperStatus != null and userOperStatus != ''">user_oper_status,</if>
|
||||||
|
|
||||||
create_time
|
create_time
|
||||||
)values(
|
)values(
|
||||||
@@ -234,6 +237,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<if test="companyName != null and companyName != ''">#{companyName},</if>
|
<if test="companyName != null and companyName != ''">#{companyName},</if>
|
||||||
<if test="jobTitle != null and jobTitle != ''">#{jobTitle},</if>
|
<if test="jobTitle != null and jobTitle != ''">#{jobTitle},</if>
|
||||||
|
<if test="userOperStatus != null and userOperStatus != ''">#{userOperStatus},</if>
|
||||||
|
|
||||||
sysdate()
|
sysdate()
|
||||||
)
|
)
|
||||||
@@ -270,6 +274,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<if test="companyName != null and companyName != ''">company_name = #{companyName},</if>
|
<if test="companyName != null and companyName != ''">company_name = #{companyName},</if>
|
||||||
<if test="jobTitle != null and jobTitle != ''">job_title = #{jobTitle},</if>
|
<if test="jobTitle != null and jobTitle != ''">job_title = #{jobTitle},</if>
|
||||||
|
<if test="userOperStatus != null and userOperStatus != ''">user_oper_status = #{userOperStatus},</if>
|
||||||
|
|
||||||
update_time = sysdate()
|
update_time = sysdate()
|
||||||
</set>
|
</set>
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<result property="address" column="address" />
|
<result property="address" column="address" />
|
||||||
<result property="userFlag" column="user_flag" />
|
<result property="userFlag" column="user_flag" />
|
||||||
|
|
||||||
|
<result property="userOperStatus" column="user_oper_status" />
|
||||||
|
|
||||||
|
|
||||||
<association property="dept" javaType="SysDept" resultMap="deptResult" />
|
<association property="dept" javaType="SysDept" resultMap="deptResult" />
|
||||||
<collection property="roles" javaType="java.util.List" resultMap="RoleResult" />
|
<collection property="roles" javaType="java.util.List" resultMap="RoleResult" />
|
||||||
@@ -71,7 +73,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
|
d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
|
||||||
r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,u.sys_user_type
|
r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status,u.sys_user_type
|
||||||
,u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,
|
,u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,
|
||||||
u.user_flag,u.user_set_json,u.company_name,u.job_title
|
u.user_flag,u.user_set_json,u.company_name,u.job_title,u.user_oper_status
|
||||||
from sys_user u
|
from sys_user u
|
||||||
left join sys_dept d on u.dept_id = d.dept_id
|
left join sys_dept d on u.dept_id = d.dept_id
|
||||||
left join sys_user_role ur on u.user_id = ur.user_id
|
left join sys_user_role ur on u.user_id = ur.user_id
|
||||||
@@ -80,7 +82,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
|
<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
|
||||||
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
|
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
|
||||||
d.dept_name, d.leader,u.sys_user_type,u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title from sys_user u
|
d.dept_name, d.leader,u.sys_user_type,u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title,u.user_oper_status from sys_user u
|
||||||
left join sys_dept d on u.dept_id = d.dept_id
|
left join sys_dept d on u.dept_id = d.dept_id
|
||||||
where u.del_flag = '0'
|
where u.del_flag = '0'
|
||||||
<if test="userId != null and userId != 0">
|
<if test="userId != null and userId != 0">
|
||||||
@@ -114,7 +116,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
<select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
|
<select id="selectAllocatedList" parameterType="SysUser" resultMap="SysUserResult">
|
||||||
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status,
|
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status,
|
||||||
u.create_time,u.sys_user_type,u.steps,u.job_position,u.experience,u.cv_url,u.location,
|
u.create_time,u.sys_user_type,u.steps,u.job_position,u.experience,u.cv_url,u.location,
|
||||||
u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title
|
u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title,u.user_oper_status
|
||||||
from sys_user u
|
from sys_user u
|
||||||
left join sys_dept d on u.dept_id = d.dept_id
|
left join sys_dept d on u.dept_id = d.dept_id
|
||||||
left join sys_user_role ur on u.user_id = ur.user_id
|
left join sys_user_role ur on u.user_id = ur.user_id
|
||||||
@@ -132,7 +134,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<select id="selectUnallocatedList" parameterType="SysUser" resultMap="SysUserResult">
|
<select id="selectUnallocatedList" parameterType="SysUser" resultMap="SysUserResult">
|
||||||
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time,u.sys_user_type,
|
select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time,u.sys_user_type,
|
||||||
u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title
|
u.steps,u.job_position,u.experience,u.cv_url,u.location,u.job_type,u.relocate,u.best_side_json,u.address,u.user_flag,u.user_set_json,u.company_name,u.job_title,u.user_oper_status
|
||||||
from sys_user u
|
from sys_user u
|
||||||
left join sys_dept d on u.dept_id = d.dept_id
|
left join sys_dept d on u.dept_id = d.dept_id
|
||||||
left join sys_user_role ur on u.user_id = ur.user_id
|
left join sys_user_role ur on u.user_id = ur.user_id
|
||||||
@@ -202,6 +204,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<if test="companyName != null and companyName != ''">company_name,</if>
|
<if test="companyName != null and companyName != ''">company_name,</if>
|
||||||
<if test="jobTitle != null and jobTitle != ''">job_title,</if>
|
<if test="jobTitle != null and jobTitle != ''">job_title,</if>
|
||||||
|
<if test="userOperStatus != null and userOperStatus != ''">user_oper_status,</if>
|
||||||
|
|
||||||
create_time
|
create_time
|
||||||
)values(
|
)values(
|
||||||
@@ -234,6 +237,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<if test="companyName != null and companyName != ''">#{companyName},</if>
|
<if test="companyName != null and companyName != ''">#{companyName},</if>
|
||||||
<if test="jobTitle != null and jobTitle != ''">#{jobTitle},</if>
|
<if test="jobTitle != null and jobTitle != ''">#{jobTitle},</if>
|
||||||
|
<if test="userOperStatus != null and userOperStatus != ''">#{userOperStatus},</if>
|
||||||
|
|
||||||
sysdate()
|
sysdate()
|
||||||
)
|
)
|
||||||
@@ -270,6 +274,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||||||
|
|
||||||
<if test="companyName != null and companyName != ''">company_name = #{companyName},</if>
|
<if test="companyName != null and companyName != ''">company_name = #{companyName},</if>
|
||||||
<if test="jobTitle != null and jobTitle != ''">job_title = #{jobTitle},</if>
|
<if test="jobTitle != null and jobTitle != ''">job_title = #{jobTitle},</if>
|
||||||
|
<if test="userOperStatus != null and userOperStatus != ''">user_oper_status = #{userOperStatus},</if>
|
||||||
|
|
||||||
update_time = sysdate()
|
update_time = sysdate()
|
||||||
</set>
|
</set>
|
||||||
|
|||||||
Reference in New Issue
Block a user