岗位- AI问题业务逻辑完善

This commit is contained in:
2025-12-14 15:42:14 +08:00
parent 37766b1a05
commit e18371ddb8
15 changed files with 730 additions and 8 deletions

View File

@@ -0,0 +1,68 @@
package com.vetti.hotake.domain;
import com.vetti.hotake.domain.dto.AiQuestionDto;
import lombok.Data;
import lombok.experimental.Accessors;
import io.swagger.annotations.ApiModelProperty;
import com.vetti.common.annotation.Excel;
import com.vetti.common.core.domain.BaseEntity;
import java.math.BigDecimal;
import java.util.List;
/**
* AI面试问题信息对象 hotake_ai_interview_questions_info
*
* @author wangxiangshun
* @date 2025-12-14
*/
@Data
@Accessors(chain = true)
public class HotakeAiInterviewQuestionsInfo extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键ID */
@ApiModelProperty("主键ID")
private Long id;
/** 岗位ID */
@ApiModelProperty("岗位ID")
@Excel(name = "岗位ID")
private Long roleId;
/** 招聘人ID */
@ApiModelProperty("招聘人ID")
@Excel(name = "招聘人ID")
private Long recruiterId;
/** 问题 */
@ApiModelProperty("问题")
@Excel(name = "问题")
private String questionTitle;
/** 概述 */
@ApiModelProperty("概述")
@Excel(name = "概述")
private String overview;
/** 焦点类型 */
@ApiModelProperty("焦点类型")
@Excel(name = "焦点类型")
private String focusType;
/** 问题明细记录json */
@ApiModelProperty("问题明细记录json")
@Excel(name = "问题明细记录json")
private String questionJson;
@ApiModelProperty("问题数量")
private Integer questionNum;
@ApiModelProperty("所需时间(分钟.min)")
private String times;
@ApiModelProperty("AI问题数据集合")
private List<AiQuestionDto> aiQuestionList;
}

View File

@@ -155,6 +155,15 @@ public class HotakeRolesInfo extends BaseEntity
@ApiModelProperty("语言")
private String languages;
@ApiModelProperty("AI筛选音频标识")
private String aiScreeningVideoFlag;
@ApiModelProperty("语音ID")
private String videoId;
@ApiModelProperty("语速")
private String speechSpeed;
@ApiModelProperty("数据类型release:发布Jobdraft:草稿,template:模版)")
private String dataType;

View File

@@ -0,0 +1,19 @@
package com.vetti.hotake.domain.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* AI面试问题对象
*
* @author wangxiangshun
* @date 2025-11-30
*/
@Data
@Accessors(chain = true)
public class AiQuestionDto {
@ApiModelProperty("问题")
private String questions;
}

View File

@@ -1,5 +1,6 @@
package com.vetti.hotake.domain.dto;
import com.vetti.hotake.domain.HotakeAiInterviewQuestionsInfo;
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
import com.vetti.hotake.domain.HotakeRolesInfo;
import com.vetti.hotake.domain.dto.roleDto.*;
@@ -40,4 +41,7 @@ public class HotakeRolesInfoDto extends HotakeRolesInfo {
@ApiModelProperty("初步筛选问题数据集合")
private List<HotakeInitialScreeningQuestionsInfo> initialScreeningQuestionsInfoList;
@ApiModelProperty("AI面试问题数据集合")
private List<HotakeAiInterviewQuestionsInfo> aiInterviewQuestionsInfoList;
}

View File

@@ -0,0 +1,69 @@
package com.vetti.hotake.mapper;
import java.util.List;
import com.vetti.hotake.domain.HotakeAiInterviewQuestionsInfo;
/**
* AI面试问题信息Mapper接口
*
* @author wangxiangshun
* @date 2025-12-14
*/
public interface HotakeAiInterviewQuestionsInfoMapper
{
/**
* 查询AI面试问题信息
*
* @param id AI面试问题信息主键
* @return AI面试问题信息
*/
public HotakeAiInterviewQuestionsInfo selectHotakeAiInterviewQuestionsInfoById(Long id);
/**
* 查询AI面试问题信息列表
*
* @param hotakeAiInterviewQuestionsInfo AI面试问题信息
* @return AI面试问题信息集合
*/
public List<HotakeAiInterviewQuestionsInfo> selectHotakeAiInterviewQuestionsInfoList(HotakeAiInterviewQuestionsInfo hotakeAiInterviewQuestionsInfo);
/**
* 新增AI面试问题信息
*
* @param hotakeAiInterviewQuestionsInfo AI面试问题信息
* @return 结果
*/
public int insertHotakeAiInterviewQuestionsInfo(HotakeAiInterviewQuestionsInfo hotakeAiInterviewQuestionsInfo);
/**
* 修改AI面试问题信息
*
* @param hotakeAiInterviewQuestionsInfo AI面试问题信息
* @return 结果
*/
public int updateHotakeAiInterviewQuestionsInfo(HotakeAiInterviewQuestionsInfo hotakeAiInterviewQuestionsInfo);
/**
* 删除AI面试问题信息
*
* @param id AI面试问题信息主键
* @return 结果
*/
public int deleteHotakeAiInterviewQuestionsInfoById(Long id);
/**
* 批量删除AI面试问题信息
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteHotakeAiInterviewQuestionsInfoByIds(Long[] ids);
/**
* 批量新增AI面试问题信息
*
* @param hotakeAiInterviewQuestionsInfoList AI面试问题信息列表
* @return 结果
*/
public int batchInsertHotakeAiInterviewQuestionsInfo(List<HotakeAiInterviewQuestionsInfo> hotakeAiInterviewQuestionsInfoList);
}

View File

@@ -0,0 +1,70 @@
package com.vetti.hotake.service;
import java.util.List;
import com.vetti.hotake.domain.HotakeAiInterviewQuestionsInfo;
/**
* AI面试问题信息Service接口
*
* @author wangxiangshun
* @date 2025-12-14
*/
public interface IHotakeAiInterviewQuestionsInfoService
{
/**
* 查询AI面试问题信息
*
* @param id AI面试问题信息主键
* @return AI面试问题信息
*/
public HotakeAiInterviewQuestionsInfo selectHotakeAiInterviewQuestionsInfoById(Long id);
/**
* 查询AI面试问题信息列表
*
* @param hotakeAiInterviewQuestionsInfo AI面试问题信息
* @return AI面试问题信息集合
*/
public List<HotakeAiInterviewQuestionsInfo> selectHotakeAiInterviewQuestionsInfoList(HotakeAiInterviewQuestionsInfo hotakeAiInterviewQuestionsInfo);
/**
* 新增AI面试问题信息
*
* @param hotakeAiInterviewQuestionsInfo AI面试问题信息
* @return 结果
*/
public int insertHotakeAiInterviewQuestionsInfo(HotakeAiInterviewQuestionsInfo hotakeAiInterviewQuestionsInfo);
/**
* 修改AI面试问题信息
*
* @param hotakeAiInterviewQuestionsInfo AI面试问题信息
* @return 结果
*/
public int updateHotakeAiInterviewQuestionsInfo(HotakeAiInterviewQuestionsInfo hotakeAiInterviewQuestionsInfo);
/**
* 批量删除AI面试问题信息
*
* @param ids 需要删除的AI面试问题信息主键集合
* @return 结果
*/
public int deleteHotakeAiInterviewQuestionsInfoByIds(Long[] ids);
/**
* 删除AI面试问题信息信息
*
* @param id AI面试问题信息主键
* @return 结果
*/
public int deleteHotakeAiInterviewQuestionsInfoById(Long id);
/**
* 批量新增AI面试问题信息
*
* @param hotakeAiInterviewQuestionsInfoList AI面试问题信息列表
* @return 结果
*/
public int batchInsertHotakeAiInterviewQuestionsInfo(List<HotakeAiInterviewQuestionsInfo> hotakeAiInterviewQuestionsInfoList);
}

View File

@@ -0,0 +1,161 @@
package com.vetti.hotake.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.vetti.common.core.service.BaseServiceImpl;
import com.vetti.common.enums.FillTypeEnum;
import com.vetti.hotake.domain.HotakeAiInterviewQuestionsInfo;
import com.vetti.hotake.domain.dto.AiQuestionDto;
import com.vetti.hotake.mapper.HotakeAiInterviewQuestionsInfoMapper;
import com.vetti.hotake.service.IHotakeAiInterviewQuestionsInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* AI面试问题信息Service业务层处理
*
* @author wangxiangshun
* @date 2025-12-14
*/
@SuppressWarnings("all")
@Service
public class HotakeAiInterviewQuestionsInfoServiceImpl extends BaseServiceImpl implements IHotakeAiInterviewQuestionsInfoService
{
@Autowired
private HotakeAiInterviewQuestionsInfoMapper hotakeAiInterviewQuestionsInfoMapper;
/**
* 查询AI面试问题信息
*
* @param id AI面试问题信息主键
* @return AI面试问题信息
*/
@Transactional(readOnly = true)
@Override
public HotakeAiInterviewQuestionsInfo selectHotakeAiInterviewQuestionsInfoById(Long id)
{
HotakeAiInterviewQuestionsInfo questionsInfo = hotakeAiInterviewQuestionsInfoMapper.selectHotakeAiInterviewQuestionsInfoById(id);
if(questionsInfo != null){
Integer questionNum = 0;
String times = "0";
if(StrUtil.isNotEmpty(questionsInfo.getQuestionJson())){
List<AiQuestionDto> aiQuestionList = JSONUtil.toList(questionsInfo.getQuestionJson(), AiQuestionDto.class);
questionsInfo.setAiQuestionList(aiQuestionList);
questionNum = aiQuestionList.size();
times = String.valueOf(aiQuestionList.size() * 1.5);
}
questionsInfo.setQuestionNum(questionNum);
questionsInfo.setTimes(times);
}
return questionsInfo;
}
/**
* 查询AI面试问题信息列表
*
* @param hotakeAiInterviewQuestionsInfo AI面试问题信息
* @return AI面试问题信息
*/
@Transactional(readOnly = true)
@Override
public List<HotakeAiInterviewQuestionsInfo> selectHotakeAiInterviewQuestionsInfoList(HotakeAiInterviewQuestionsInfo hotakeAiInterviewQuestionsInfo)
{
List<HotakeAiInterviewQuestionsInfo> questionsInfoList = hotakeAiInterviewQuestionsInfoMapper.selectHotakeAiInterviewQuestionsInfoList(hotakeAiInterviewQuestionsInfo);
if(CollectionUtil.isNotEmpty(questionsInfoList)){
for (HotakeAiInterviewQuestionsInfo questionsInfo : questionsInfoList) {
if(questionsInfo != null){
Integer questionNum = 0;
String times = "0";
if(StrUtil.isNotEmpty(questionsInfo.getQuestionJson())){
List<AiQuestionDto> aiQuestionList = JSONUtil.toList(questionsInfo.getQuestionJson(), AiQuestionDto.class);
questionsInfo.setAiQuestionList(aiQuestionList);
questionNum = aiQuestionList.size();
times = String.valueOf(aiQuestionList.size() * 1.5);
}
questionsInfo.setQuestionNum(questionNum);
questionsInfo.setTimes(times);
}
}
}
return questionsInfoList;
}
/**
* 新增AI面试问题信息
*
* @param hotakeAiInterviewQuestionsInfo AI面试问题信息
* @return 结果
*/
@Transactional(rollbackFor=Exception.class)
@Override
public int insertHotakeAiInterviewQuestionsInfo(HotakeAiInterviewQuestionsInfo hotakeAiInterviewQuestionsInfo)
{
fill(FillTypeEnum.INSERT.getCode(), hotakeAiInterviewQuestionsInfo);
if(CollectionUtil.isNotEmpty(hotakeAiInterviewQuestionsInfo.getAiQuestionList())){
hotakeAiInterviewQuestionsInfo.setQuestionJson(JSONUtil.toJsonStr(hotakeAiInterviewQuestionsInfo.getAiQuestionList()));
}else{
hotakeAiInterviewQuestionsInfo.setQuestionJson("");
}
return hotakeAiInterviewQuestionsInfoMapper.insertHotakeAiInterviewQuestionsInfo(hotakeAiInterviewQuestionsInfo);
}
/**
* 修改AI面试问题信息
*
* @param hotakeAiInterviewQuestionsInfo AI面试问题信息
* @return 结果
*/
@Transactional(rollbackFor=Exception.class)
@Override
public int updateHotakeAiInterviewQuestionsInfo(HotakeAiInterviewQuestionsInfo hotakeAiInterviewQuestionsInfo)
{
fill(FillTypeEnum.UPDATE.getCode(), hotakeAiInterviewQuestionsInfo);
if(CollectionUtil.isNotEmpty(hotakeAiInterviewQuestionsInfo.getAiQuestionList())){
hotakeAiInterviewQuestionsInfo.setQuestionJson(JSONUtil.toJsonStr(hotakeAiInterviewQuestionsInfo.getAiQuestionList()));
}else{
hotakeAiInterviewQuestionsInfo.setQuestionJson("");
}
return hotakeAiInterviewQuestionsInfoMapper.updateHotakeAiInterviewQuestionsInfo(hotakeAiInterviewQuestionsInfo);
}
/**
* 批量删除AI面试问题信息
*
* @param ids 需要删除的AI面试问题信息主键
* @return 结果
*/
@Transactional(rollbackFor=Exception.class)
@Override
public int deleteHotakeAiInterviewQuestionsInfoByIds(Long[] ids)
{
return hotakeAiInterviewQuestionsInfoMapper.deleteHotakeAiInterviewQuestionsInfoByIds(ids);
}
/**
* 删除AI面试问题信息信息
*
* @param id AI面试问题信息主键
* @return 结果
*/
@Transactional(rollbackFor=Exception.class)
@Override
public int deleteHotakeAiInterviewQuestionsInfoById(Long id)
{
return hotakeAiInterviewQuestionsInfoMapper.deleteHotakeAiInterviewQuestionsInfoById(id);
}
/**
* 批量新增AI面试问题信息
*
* @param hotakeAiInterviewQuestionsInfoList AI面试问题信息列表
* @return 结果
*/
@Transactional(rollbackFor=Exception.class)
@Override
public int batchInsertHotakeAiInterviewQuestionsInfo(List<HotakeAiInterviewQuestionsInfo> hotakeAiInterviewQuestionsInfoList){
return hotakeAiInterviewQuestionsInfoMapper.batchInsertHotakeAiInterviewQuestionsInfo(hotakeAiInterviewQuestionsInfoList);
}
}

View File

@@ -13,17 +13,21 @@ import com.vetti.common.utils.DateUtils;
import com.vetti.common.utils.MessageUtils;
import com.vetti.common.utils.SecurityUtils;
import com.vetti.common.utils.uuid.IdUtils;
import com.vetti.hotake.domain.HotakeAiInterviewQuestionsInfo;
import com.vetti.hotake.domain.HotakeInitialScreeningQuestionsInfo;
import com.vetti.hotake.domain.HotakeRolesInfo;
import com.vetti.hotake.domain.dto.AiQuestionDto;
import com.vetti.hotake.domain.dto.HotakeRolesInfoDto;
import com.vetti.hotake.domain.dto.roleDto.*;
import com.vetti.hotake.mapper.HotakeRolesInfoMapper;
import com.vetti.hotake.service.IHotakeAiInterviewQuestionsInfoService;
import com.vetti.hotake.service.IHotakeInitialScreeningQuestionsInfoService;
import com.vetti.hotake.service.IHotakeRolesInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
@@ -42,6 +46,9 @@ public class HotakeRolesInfoServiceImpl extends BaseServiceImpl implements IHota
@Autowired
private IHotakeInitialScreeningQuestionsInfoService hotakeInitialScreeningQuestionsInfoService;
@Autowired
private IHotakeAiInterviewQuestionsInfoService hotakeAiInterviewQuestionsInfoService;
/**
* 查询岗位信息
*
@@ -106,6 +113,11 @@ public class HotakeRolesInfoServiceImpl extends BaseServiceImpl implements IHota
queryQuestion.setRoleId(id);
List<HotakeInitialScreeningQuestionsInfo> questionsInfoList = hotakeInitialScreeningQuestionsInfoService.selectHotakeInitialScreeningQuestionsInfoList(queryQuestion);
dto.setInitialScreeningQuestionsInfoList(questionsInfoList);
HotakeAiInterviewQuestionsInfo queryAiQuestion = new HotakeAiInterviewQuestionsInfo();
queryAiQuestion.setRoleId(id);
List<HotakeAiInterviewQuestionsInfo> aiInterviewQuestionsInfoList = hotakeAiInterviewQuestionsInfoService.selectHotakeAiInterviewQuestionsInfoList(queryAiQuestion);
dto.setAiInterviewQuestionsInfoList(aiInterviewQuestionsInfoList);
}
return dto;
@@ -273,6 +285,8 @@ public class HotakeRolesInfoServiceImpl extends BaseServiceImpl implements IHota
}else{
rolesInfo.setRoleBenefitsJson("");
}
//todo 暂时加在这里,完成第3步的时候,初始化第5步的内容
createAiQuestion(rolesInfoId);
}
if(RoleOperStepsEnum.STEPS_4.getCode().equals(hotakeRolesInfo.getOperStep())){
@@ -306,4 +320,26 @@ public class HotakeRolesInfoServiceImpl extends BaseServiceImpl implements IHota
HotakeRolesInfoDto rolesInfoDto = selectHotakeRolesInfoDtoById(rolesInfo.getId());
return rolesInfoDto;
}
/**
* 初始化AI面试问题-临时的
* @param roleId 岗位ID
*/
private void createAiQuestion(Long roleId){
HotakeAiInterviewQuestionsInfo questionsInfo = new HotakeAiInterviewQuestionsInfo();
questionsInfo.setQuestionTitle("General Questions");
questionsInfo.setFocusType("Personality & Culture");
questionsInfo.setRoleId(roleId);
questionsInfo.setRecruiterId(SecurityUtils.getUserId());
questionsInfo.setOverview("This is General Questions Overview");
List<AiQuestionDto> questionDtoList = new ArrayList<>();
AiQuestionDto questionDto = new AiQuestionDto();
questionDto.setQuestions("Can you provide an example of a situation where you had to work in a physically demanding environment?,How do you plan to handle tasks that require specific construction knowledge or skills that you may not have yet?");
questionDtoList.add(questionDto);
questionsInfo.setAiQuestionList(questionDtoList);
hotakeAiInterviewQuestionsInfoService.insertHotakeAiInterviewQuestionsInfo(questionsInfo);
}
}