diff --git a/vetti-admin/src/main/java/com/vetti/web/controller/hotake/HotakeCandidateInterviewRecordInfoController.java b/vetti-admin/src/main/java/com/vetti/web/controller/hotake/HotakeCandidateInterviewRecordInfoController.java new file mode 100644 index 0000000..a057b02 --- /dev/null +++ b/vetti-admin/src/main/java/com/vetti/web/controller/hotake/HotakeCandidateInterviewRecordInfoController.java @@ -0,0 +1,106 @@ +package com.vetti.web.controller.hotake; + +import com.vetti.common.annotation.Log; +import com.vetti.common.core.controller.BaseController; +import com.vetti.common.core.domain.AjaxResult; +import com.vetti.common.core.page.TableDataInfo; +import com.vetti.common.enums.BusinessType; +import com.vetti.common.utils.poi.ExcelUtil; +import com.vetti.hotake.domain.HotakeCandidateInterviewRecordInfo; +import com.vetti.hotake.service.IHotakeCandidateInterviewRecordInfoService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 候选人面试记录信息Controller + * + * @author wangxiangshun + * @date 2025-12-08 + */ +@Api(tags ="候选人面试记录信息") +@RestController +@RequestMapping("/hotake/candidateInterviewRecordInfo") +public class HotakeCandidateInterviewRecordInfoController extends BaseController +{ + @Autowired + private IHotakeCandidateInterviewRecordInfoService hotakeCandidateInterviewRecordInfoService; + + /** + * 查询候选人面试记录信息列表 + */ + @ApiOperation("查询候选人面试记录信息列表") + @PreAuthorize("@ss.hasPermi('hotake:candidateInterviewRecordInfo:list')") + @GetMapping("/list") + public TableDataInfo list(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo) + { + startPage(); + List list = hotakeCandidateInterviewRecordInfoService.selectHotakeCandidateInterviewRecordInfoList(hotakeCandidateInterviewRecordInfo); + return getDataTable(list); + } + + /** + * 导出候选人面试记录信息列表 + */ + @ApiOperation("导出候选人面试记录信息列表") + @PreAuthorize("@ss.hasPermi('hotake:candidateInterviewRecordInfo:export')") + @Log(title = "候选人面试记录信息", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public AjaxResult export(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo) + { + List list = hotakeCandidateInterviewRecordInfoService.selectHotakeCandidateInterviewRecordInfoList(hotakeCandidateInterviewRecordInfo); + ExcelUtil util = new ExcelUtil(HotakeCandidateInterviewRecordInfo.class); + return util.exportExcel(list, "候选人面试记录信息数据"); + } + + /** + * 获取候选人面试记录信息详细信息 + */ + @ApiOperation("获取候选人面试记录信息详细信息") + @PreAuthorize("@ss.hasPermi('hotake:candidateInterviewRecordInfo:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return AjaxResult.success(hotakeCandidateInterviewRecordInfoService.selectHotakeCandidateInterviewRecordInfoById(id)); + } + + /** + * 新增候选人面试记录信息 + */ + @ApiOperation("新增候选人面试记录信息") + @PreAuthorize("@ss.hasPermi('hotake:candidateInterviewRecordInfo:add')") + @Log(title = "候选人面试记录信息", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo) + { + return toAjax(hotakeCandidateInterviewRecordInfoService.insertHotakeCandidateInterviewRecordInfo(hotakeCandidateInterviewRecordInfo)); + } + + /** + * 修改候选人面试记录信息 + */ + @ApiOperation("修改候选人面试记录信息") + @PreAuthorize("@ss.hasPermi('hotake:candidateInterviewRecordInfo:edit')") + @Log(title = "候选人面试记录信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo) + { + return toAjax(hotakeCandidateInterviewRecordInfoService.updateHotakeCandidateInterviewRecordInfo(hotakeCandidateInterviewRecordInfo)); + } + + /** + * 删除候选人面试记录信息 + */ + @ApiOperation("删除候选人面试记录信息") + @PreAuthorize("@ss.hasPermi('hotake:candidateInterviewRecordInfo:remove')") + @Log(title = "候选人面试记录信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(hotakeCandidateInterviewRecordInfoService.deleteHotakeCandidateInterviewRecordInfoByIds(ids)); + } +} diff --git a/vetti-admin/src/main/java/com/vetti/web/controller/system/SysProfileController.java b/vetti-admin/src/main/java/com/vetti/web/controller/system/SysProfileController.java index cfc4882..fbdbf6a 100644 --- a/vetti-admin/src/main/java/com/vetti/web/controller/system/SysProfileController.java +++ b/vetti-admin/src/main/java/com/vetti/web/controller/system/SysProfileController.java @@ -113,6 +113,8 @@ public class SysProfileController extends BaseController currentUser.setJobPosition(user.getJobPosition()); currentUser.setExperience(user.getExperience()); currentUser.setCvUrl(user.getCvUrl()); + currentUser.setJobTitle(user.getJobTitle()); + currentUser.setCompanyName(user.getCompanyName()); }else if (UserOperStepsEnum.STEPS_3.getCode().equals(user.getSteps())){ currentUser.setLocation(user.getLocation()); currentUser.setJobType(user.getJobType()); diff --git a/vetti-common/src/main/java/com/vetti/common/core/domain/entity/SysUser.java b/vetti-common/src/main/java/com/vetti/common/core/domain/entity/SysUser.java index d999abb..219eab1 100644 --- a/vetti-common/src/main/java/com/vetti/common/core/domain/entity/SysUser.java +++ b/vetti-common/src/main/java/com/vetti/common/core/domain/entity/SysUser.java @@ -115,7 +115,7 @@ public class SysUser extends BaseEntity @ApiModelProperty("是否搬家") private String relocate; - @ApiModelProperty("") + @ApiModelProperty("个人展示的链接JSON") private String bestSideJson; @ApiModelProperty("个人展示的链接地址") @@ -130,6 +130,12 @@ public class SysUser extends BaseEntity @ApiModelProperty("用户语音配置信息") private String userSetJson; + @ApiModelProperty("公司名称") + private String companyName; + + @ApiModelProperty("职位名称") + private String jobTitle; + /** 部门对象 */ @Excels({ @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), @@ -473,6 +479,23 @@ public class SysUser extends BaseEntity this.userSetJson = userSetJson; } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public String getJobTitle() { + return jobTitle; + } + + public void setJobTitle(String jobTitle) { + this.jobTitle = jobTitle; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeCandidateInterviewRecordInfo.java b/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeCandidateInterviewRecordInfo.java new file mode 100644 index 0000000..5d02b93 --- /dev/null +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeCandidateInterviewRecordInfo.java @@ -0,0 +1,49 @@ +package com.vetti.hotake.domain; + +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; + +/** + * 候选人面试记录信息对象 hotake_candidate_interview_record_info + * + * @author wangxiangshun + * @date 2025-12-08 + */ +@Data +@Accessors(chain = true) +public class HotakeCandidateInterviewRecordInfo extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 主键ID */ + @ApiModelProperty("主键ID") + private Long id; + + /** 用户ID */ + @ApiModelProperty("用户ID") + private Long userId; + + /** 简历ID */ + @ApiModelProperty("简历ID") + private Long cvId; + + /** 招聘人ID */ + @ApiModelProperty("招聘人ID") + private Long recruiterId; + + /** 候选人状态(Hot、Warm、Cold、Pending) */ + @ApiModelProperty("候选人状态(Hot、Warm、Cold、Pending)") + private String candidateStatus; + + /** 当前阶段 */ + @ApiModelProperty("当前阶段(Applied、Shortlisted、Interview、Offer、Hired)") + private String stage; + + /** 最后联系时间 */ + @ApiModelProperty("最后联系时间") + private String lastContact; + +} diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeCvInfo.java b/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeCvInfo.java index b3a0f35..e3f337a 100644 --- a/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeCvInfo.java +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeCvInfo.java @@ -62,6 +62,15 @@ public class HotakeCvInfo extends BaseEntity @ApiModelProperty("简历内容MD5 Hash") private String cvMd5; + @ApiModelProperty("工作经验") + private String experience; + + @ApiModelProperty("AI评分") + private String aiMatchScore; + + @ApiModelProperty("AI评分百分比") + private String aiMatchScorePercentage; + @ApiModelProperty("简历详细信息-固定模版") private HotakeCvInfoDto cvInfoDto; diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeCandidateInterviewRecordInfoMapper.java b/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeCandidateInterviewRecordInfoMapper.java new file mode 100644 index 0000000..676efe3 --- /dev/null +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeCandidateInterviewRecordInfoMapper.java @@ -0,0 +1,69 @@ +package com.vetti.hotake.mapper; + +import java.util.List; +import com.vetti.hotake.domain.HotakeCandidateInterviewRecordInfo; + +/** + * 候选人面试记录信息Mapper接口 + * + * @author wangxiangshun + * @date 2025-12-08 + */ +public interface HotakeCandidateInterviewRecordInfoMapper +{ + /** + * 查询候选人面试记录信息 + * + * @param id 候选人面试记录信息主键 + * @return 候选人面试记录信息 + */ + public HotakeCandidateInterviewRecordInfo selectHotakeCandidateInterviewRecordInfoById(Long id); + + /** + * 查询候选人面试记录信息列表 + * + * @param hotakeCandidateInterviewRecordInfo 候选人面试记录信息 + * @return 候选人面试记录信息集合 + */ + public List selectHotakeCandidateInterviewRecordInfoList(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo); + + /** + * 新增候选人面试记录信息 + * + * @param hotakeCandidateInterviewRecordInfo 候选人面试记录信息 + * @return 结果 + */ + public int insertHotakeCandidateInterviewRecordInfo(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo); + + /** + * 修改候选人面试记录信息 + * + * @param hotakeCandidateInterviewRecordInfo 候选人面试记录信息 + * @return 结果 + */ + public int updateHotakeCandidateInterviewRecordInfo(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo); + + /** + * 删除候选人面试记录信息 + * + * @param id 候选人面试记录信息主键 + * @return 结果 + */ + public int deleteHotakeCandidateInterviewRecordInfoById(Long id); + + /** + * 批量删除候选人面试记录信息 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteHotakeCandidateInterviewRecordInfoByIds(Long[] ids); + /** + * 批量新增候选人面试记录信息 + * + * @param hotakeCandidateInterviewRecordInfoList 候选人面试记录信息列表 + * @return 结果 + */ + public int batchInsertHotakeCandidateInterviewRecordInfo(List hotakeCandidateInterviewRecordInfoList); + +} diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeCvInfoMapper.java b/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeCvInfoMapper.java index a88fd6c..d820355 100644 --- a/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeCvInfoMapper.java +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeCvInfoMapper.java @@ -2,6 +2,7 @@ package com.vetti.hotake.mapper; import java.util.List; import com.vetti.hotake.domain.HotakeCvInfo; +import org.apache.ibatis.annotations.Param; /** * 简历信息Mapper接口 @@ -66,4 +67,13 @@ public interface HotakeCvInfoMapper */ public int batchInsertHotakeCvInfo(List hotakeCvInfoList); + + /** + * 删除简历信息 + * + * @param userId 用户信息ID + * @return 结果 + */ + public int deleteHotakeCvInfoByUserIdAndType(@Param("userId") Long userId,@Param("cvFileType") String cvFileType); + } diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeCandidateInterviewRecordInfoService.java b/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeCandidateInterviewRecordInfoService.java new file mode 100644 index 0000000..19c3e17 --- /dev/null +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeCandidateInterviewRecordInfoService.java @@ -0,0 +1,70 @@ +package com.vetti.hotake.service; + +import java.util.List; +import com.vetti.hotake.domain.HotakeCandidateInterviewRecordInfo; + +/** + * 候选人面试记录信息Service接口 + * + * @author wangxiangshun + * @date 2025-12-08 + */ +public interface IHotakeCandidateInterviewRecordInfoService +{ + /** + * 查询候选人面试记录信息 + * + * @param id 候选人面试记录信息主键 + * @return 候选人面试记录信息 + */ + public HotakeCandidateInterviewRecordInfo selectHotakeCandidateInterviewRecordInfoById(Long id); + + /** + * 查询候选人面试记录信息列表 + * + * @param hotakeCandidateInterviewRecordInfo 候选人面试记录信息 + * @return 候选人面试记录信息集合 + */ + public List selectHotakeCandidateInterviewRecordInfoList(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo); + + /** + * 新增候选人面试记录信息 + * + * @param hotakeCandidateInterviewRecordInfo 候选人面试记录信息 + * @return 结果 + */ + public int insertHotakeCandidateInterviewRecordInfo(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo); + + /** + * 修改候选人面试记录信息 + * + * @param hotakeCandidateInterviewRecordInfo 候选人面试记录信息 + * @return 结果 + */ + public int updateHotakeCandidateInterviewRecordInfo(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo); + + /** + * 批量删除候选人面试记录信息 + * + * @param ids 需要删除的候选人面试记录信息主键集合 + * @return 结果 + */ + public int deleteHotakeCandidateInterviewRecordInfoByIds(Long[] ids); + + /** + * 删除候选人面试记录信息信息 + * + * @param id 候选人面试记录信息主键 + * @return 结果 + */ + public int deleteHotakeCandidateInterviewRecordInfoById(Long id); + + /** + * 批量新增候选人面试记录信息 + * + * @param hotakeCandidateInterviewRecordInfoList 候选人面试记录信息列表 + * @return 结果 + */ + public int batchInsertHotakeCandidateInterviewRecordInfo(List hotakeCandidateInterviewRecordInfoList); + +} diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeCandidateInterviewRecordInfoServiceImpl.java b/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeCandidateInterviewRecordInfoServiceImpl.java new file mode 100644 index 0000000..622a7c7 --- /dev/null +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeCandidateInterviewRecordInfoServiceImpl.java @@ -0,0 +1,116 @@ +package com.vetti.hotake.service.impl; + +import java.util.List; + +import com.vetti.common.core.service.BaseServiceImpl; +import com.vetti.common.utils.DateUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.vetti.hotake.mapper.HotakeCandidateInterviewRecordInfoMapper; +import com.vetti.hotake.domain.HotakeCandidateInterviewRecordInfo; +import com.vetti.hotake.service.IHotakeCandidateInterviewRecordInfoService; + +/** + * 候选人面试记录信息Service业务层处理 + * + * @author wangxiangshun + * @date 2025-12-08 + */ +@SuppressWarnings("all") +@Service +public class HotakeCandidateInterviewRecordInfoServiceImpl extends BaseServiceImpl implements IHotakeCandidateInterviewRecordInfoService +{ + @Autowired + private HotakeCandidateInterviewRecordInfoMapper hotakeCandidateInterviewRecordInfoMapper; + + /** + * 查询候选人面试记录信息 + * + * @param id 候选人面试记录信息主键 + * @return 候选人面试记录信息 + */ + @Transactional(readOnly = true) + @Override + public HotakeCandidateInterviewRecordInfo selectHotakeCandidateInterviewRecordInfoById(Long id) + { + return hotakeCandidateInterviewRecordInfoMapper.selectHotakeCandidateInterviewRecordInfoById(id); + } + + /** + * 查询候选人面试记录信息列表 + * + * @param hotakeCandidateInterviewRecordInfo 候选人面试记录信息 + * @return 候选人面试记录信息 + */ + @Transactional(readOnly = true) + @Override + public List selectHotakeCandidateInterviewRecordInfoList(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo) + { + return hotakeCandidateInterviewRecordInfoMapper.selectHotakeCandidateInterviewRecordInfoList(hotakeCandidateInterviewRecordInfo); + } + + /** + * 新增候选人面试记录信息 + * + * @param hotakeCandidateInterviewRecordInfo 候选人面试记录信息 + * @return 结果 + */ + @Transactional(rollbackFor=Exception.class) + @Override + public int insertHotakeCandidateInterviewRecordInfo(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo) + { + return hotakeCandidateInterviewRecordInfoMapper.insertHotakeCandidateInterviewRecordInfo(hotakeCandidateInterviewRecordInfo); + } + + /** + * 修改候选人面试记录信息 + * + * @param hotakeCandidateInterviewRecordInfo 候选人面试记录信息 + * @return 结果 + */ + @Transactional(rollbackFor=Exception.class) + @Override + public int updateHotakeCandidateInterviewRecordInfo(HotakeCandidateInterviewRecordInfo hotakeCandidateInterviewRecordInfo) + { + return hotakeCandidateInterviewRecordInfoMapper.updateHotakeCandidateInterviewRecordInfo(hotakeCandidateInterviewRecordInfo); + } + + /** + * 批量删除候选人面试记录信息 + * + * @param ids 需要删除的候选人面试记录信息主键 + * @return 结果 + */ + @Transactional(rollbackFor=Exception.class) + @Override + public int deleteHotakeCandidateInterviewRecordInfoByIds(Long[] ids) + { + return hotakeCandidateInterviewRecordInfoMapper.deleteHotakeCandidateInterviewRecordInfoByIds(ids); + } + + /** + * 删除候选人面试记录信息信息 + * + * @param id 候选人面试记录信息主键 + * @return 结果 + */ + @Transactional(rollbackFor=Exception.class) + @Override + public int deleteHotakeCandidateInterviewRecordInfoById(Long id) + { + return hotakeCandidateInterviewRecordInfoMapper.deleteHotakeCandidateInterviewRecordInfoById(id); + } + /** + * 批量新增候选人面试记录信息 + * + * @param hotakeCandidateInterviewRecordInfoList 候选人面试记录信息列表 + * @return 结果 + */ + @Transactional(rollbackFor=Exception.class) + @Override + public int batchInsertHotakeCandidateInterviewRecordInfo(List hotakeCandidateInterviewRecordInfoList){ + return hotakeCandidateInterviewRecordInfoMapper.batchInsertHotakeCandidateInterviewRecordInfo(hotakeCandidateInterviewRecordInfoList); + } +} diff --git a/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeCvInfoServiceImpl.java b/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeCvInfoServiceImpl.java index ecfa830..43c399f 100644 --- a/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeCvInfoServiceImpl.java +++ b/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeCvInfoServiceImpl.java @@ -112,6 +112,8 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC @Transactional(rollbackFor = Exception.class) @Override public HotakeCvInfo insertHotakeCvInfo(HotakeCvInfo hotakeCvInfo) { + //删除原先的CV简历信息 + hotakeCvInfoMapper.deleteHotakeCvInfoByUserIdAndType(SecurityUtils.getUserId(),"cv"); fill(FillTypeEnum.INSERT.getCode(), hotakeCvInfo); String fileSuffix = FileUtil.getSuffix(hotakeCvInfo.getCvUrl()); if (StrUtil.isNotEmpty(fileSuffix)) { @@ -247,12 +249,14 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC .object(cvInfo.getCvUrl()) .build()); String contents = FileContentUtil.readFileContent(inputStream, cvInfo.getCvFileSuffix()); + log.info("简历信息:{}",contents); //验证文件内容是否改变,如果未改变不进行模型解析直接返回原有结果 String md5Hash = MD5.create().digestHex16(contents); if(StrUtil.isNotEmpty(md5Hash) && md5Hash.equals(cvInfo.getCvMd5())){ //直接返回简历结果 return cvInfo; } + cvInfo.setCvMd5(md5Hash); //生成简历模版数据信息 HotakeCvInfoDto cvInfoDto = handleAnalysisCvInfo(contents); cvInfo.setCvInfoDto(cvInfoDto); @@ -285,7 +289,7 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC List> list = new LinkedList(); Map entity = new HashMap<>(); entity.put("role","user"); - entity.put("content","从下面提供的文本中提取所有能识别到的简历信息,只提取原文中存在的内容,不要补充、不推测、不总结。需要提取的字段包括:name(姓名或人名)、phone(电话号码)、email(电子邮件地址)、position(岗位或者简历中自己期望的职位等)、location(地点或者地址、家庭住址)、links(所有链接地址)、currentWork(当前工作公司)、about(关于我/自我介绍)、skills_tools(关键资格(许可证、注册/会员资格、认证))、languages(语言能力,主要就是Languages下面的语言)、experience(工作经历,除了title、company、location、durationStart、durationEnd,其他的都放到description里面,并且description里面要根据换行符分成不同的content),日期要拆分成开始时间(durationStart)和结束时间(durationEnd))、education(教育经历,日期要拆分成开始时间(durationStart)和结束时间(durationEnd))。请将提取结果以结构化 JSON 格式返回,格式如下:{ \\\"name\\\": \\\"\\\", \\\"phone\\\": \\\"\\\", \\\"email\\\": \\\"\\\", \\\"links\\\": [{\\\"content\\\":\\\"\\\"}], \\\"about\\\": \\\"\\\", \\\"skillsTools\\\": [{\\\"content\\\":\\\"\\\"}], \\\"languages\\\": [{\\\"content\\\":\\\"\\\"}], \\\"experience\\\": [{\\\"title\\\": \\\"\\\", \\\"company\\\": \\\"\\\",\\\"location\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\",\\\"description\\\": [{\\\"content\\\":\\\"\\\"}]}], \\\"education\\\": [{\\\"degree\\\": \\\"\\\",\\\"institution\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\"}] }。字段不存在则返回 null 或空数组。只返回标准可解析的 JSON结构 ,不要多余的```json等信息,不要解释说明,不要改写内容。以下为待处理文本:"+contents); + entity.put("content","从下面提供的文本中提取所有能识别到的简历信息,只提取原文中存在的内容,不要补充、不推测、不总结。需要提取的字段包括:name(姓名或人名)、phone(电话号码)、email(电子邮件地址)、position(岗位或者简历中自己期望的职位等)、location(地点或者地址、家庭住址)、links(所有链接地址)、currentWork(当前工作公司)、about(关于我/自我介绍)、skills_tools(关键资格(许可证、注册/会员资格、认证))、languages(语言能力,主要就是Languages下面的语言)、experience(工作经历,除了title、company、location、durationStart、durationEnd,其他的都放到description里面,并且description里面要根据换行符分成不同的content),日期要拆分成开始时间(durationStart)和结束时间(durationEnd))、education(教育经历,日期要拆分成开始时间(durationStart)和结束时间(durationEnd))。请将提取结果以结构化 JSON 格式返回,格式如下:{ \\\"name\\\": \\\"\\\", \\\"phone\\\": \\\"\\\", \\\"currentWork\\\": \\\"\\\", \\\"position\\\": \\\"\\\", \\\"location\\\": \\\"\\\", \\\"email\\\": \\\"\\\", \\\"links\\\": [{\\\"content\\\":\\\"\\\"}], \\\"about\\\": \\\"\\\", \\\"skillsTools\\\": [{\\\"content\\\":\\\"\\\"}], \\\"languages\\\": [{\\\"content\\\":\\\"\\\"}], \\\"experience\\\": [{\\\"title\\\": \\\"\\\", \\\"company\\\": \\\"\\\",\\\"location\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\",\\\"description\\\": [{\\\"content\\\":\\\"\\\"}]}], \\\"education\\\": [{\\\"degree\\\": \\\"\\\",\\\"institution\\\": \\\"\\\",\\\"durationStart\\\": \\\"\\\",\\\"durationEnd\\\": \\\"\\\"}] }。字段不存在则返回 null 或空数组。只返回标准可解析的 JSON结构 ,不要多余的```json等信息,不要解释说明,不要改写内容。以下为待处理文本:"+contents); //根据AI做 list.add(entity); String resultCv = chatGPTClient.handleAiChat(JSONUtil.toJsonStr(list), "JX"); diff --git a/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCandidateInterviewRecordInfoMapper.xml b/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCandidateInterviewRecordInfoMapper.xml new file mode 100644 index 0000000..047a453 --- /dev/null +++ b/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCandidateInterviewRecordInfoMapper.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + select id, user_id, cv_id, recruiter_id, candidate_status, stage, last_contact, del_flag, create_by, create_time, update_by, update_time, remark from hotake_candidate_interview_record_info + + + + + + + + insert into hotake_candidate_interview_record_info + + user_id, + cv_id, + recruiter_id, + candidate_status, + stage, + last_contact, + del_flag, + create_by, + create_time, + update_by, + update_time, + remark, + + + #{userId}, + #{cvId}, + #{recruiterId}, + #{candidateStatus}, + #{stage}, + #{lastContact}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{remark}, + + + + + update hotake_candidate_interview_record_info + + user_id = #{userId}, + cv_id = #{cvId}, + recruiter_id = #{recruiterId}, + candidate_status = #{candidateStatus}, + stage = #{stage}, + last_contact = #{lastContact}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + remark = #{remark}, + + where id = #{id} + + + + delete from hotake_candidate_interview_record_info where id = #{id} + + + + delete from hotake_candidate_interview_record_info where id in + + #{id} + + + + + insert into hotake_candidate_interview_record_info( id, user_id, cv_id, recruiter_id, candidate_status, stage, last_contact, del_flag, create_by, create_time, update_by, update_time, remark,) values + + ( #{item.id}, #{item.userId}, #{item.cvId}, #{item.recruiterId}, #{item.candidateStatus}, #{item.stage}, #{item.lastContact}, #{item.delFlag}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime}, #{item.remark},) + + + \ No newline at end of file diff --git a/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCvInfoMapper.xml b/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCvInfoMapper.xml index 78ed392..4d41660 100644 --- a/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCvInfoMapper.xml +++ b/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCvInfoMapper.xml @@ -16,6 +16,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + @@ -25,7 +30,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - 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, + 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, del_flag, create_by, create_time, update_by, update_time, remark from hotake_cv_info @@ -60,6 +66,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" cv_template_json, cv_score, cv_md5, + + experience, + ai_match_score, + ai_match_score_percentage, + del_flag, create_by, create_time, @@ -78,6 +89,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{cvTemplateJson}, #{cvScore}, #{cvMd5}, + + #{experience}, + #{aiMatchScore}, + #{aiMatchScorePercentage}, + #{delFlag}, #{createBy}, #{createTime}, @@ -100,6 +116,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" cv_template_json = #{cvTemplateJson}, cv_score = #{cvScore}, cv_md5 = #{cvMd5}, + + experience = #{experience}, + ai_match_score = #{aiMatchScore}, + ai_match_score_percentage = #{aiMatchScorePercentage}, + del_flag = #{delFlag}, create_by = #{createBy}, create_time = #{createTime}, @@ -114,6 +135,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" delete from hotake_cv_info where id = #{id} + + delete from hotake_cv_info where user_id = #{userId} and cv_file_type = #{cvFileType} + + + delete from hotake_cv_info where id in diff --git a/vetti-hotakes/target/maven-archiver/pom.properties b/vetti-hotakes/target/maven-archiver/pom.properties deleted file mode 100644 index da14a64..0000000 --- a/vetti-hotakes/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Thu Nov 27 13:22:25 CST 2025 -artifactId=vetti-hotakes -groupId=com.vetti -version=3.9.0 diff --git a/vetti-hotakes/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/vetti-hotakes/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 922fdc2..0000000 --- a/vetti-hotakes/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,7 +0,0 @@ -com/vetti/hotake/domain/dto/VcDto/VcExperienceDto.class -com/vetti/hotake/domain/dto/VcDto/VcSkillsToolsDto.class -com/vetti/hotake/domain/dto/VcDto/VcEducationDto.class -com/vetti/hotake/domain/dto/VcDto/VcLinksDto.class -com/vetti/hotake/domain/dto/VcDto/VcExperienceDescriptionDto.class -com/vetti/hotake/domain/dto/VcDto/VcLanguagesDto.class -com/vetti/hotake/service/impl/HotakeCvInfoServiceImpl.class diff --git a/vetti-hotakes/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/vetti-hotakes/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index dd70b57..0000000 --- a/vetti-hotakes/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,39 +0,0 @@ -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeInterviewDetailMapper.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeSysNoticeMapper.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeMeetingCalendarInfoServiceImpl.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeSysFileMapper.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeSysFileServiceImpl.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/dto/HotakeSysNoticeTypeNameDto.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeSysFileService.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeCvInfo.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeInterviewInfoMapper.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeMeetingCalendarDetailServiceImpl.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeSysFile.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeInterviewDetailServiceImpl.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeInterviewInfoServiceImpl.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeSysNoticeServiceImpl.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeProblemBaseInfoMapper.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeMeetingCalendarDetail.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeSysNoticeTypeMapper.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeSysNoticeType.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeProblemBaseInfo.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeCvInfoServiceImpl.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeProblemBaseInfoService.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeMeetingCalendarInfo.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/dto/HotakeSysFileDto.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeMeetingCalendarInfoMapper.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeInterviewDetailService.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeCvInfoMapper.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/impl/HotakeProblemBaseInfoServiceImpl.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeInterviewDetail.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeSysNotice.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/vo/HotakeSysFileVo.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeInterviewInfoService.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeMeetingCalendarInfoService.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/dto/HotakeSysNoticeViewDto.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/mapper/HotakeMeetingCalendarDetailMapper.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/dto/HotakeSysNoticeDto.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/domain/HotakeInterviewInfo.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeSysNoticeService.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeCvInfoService.java -/Users/wangxiangshun/Public/project-aio/vetti/vetti-service/vetti-hotakes/src/main/java/com/vetti/hotake/service/IHotakeMeetingCalendarDetailService.java diff --git a/vetti-hotakes/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/vetti-hotakes/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29..0000000 diff --git a/vetti-system/src/main/resources/mapper/system/SysUserMapper.xml b/vetti-system/src/main/resources/mapper/system/SysUserMapper.xml index 129aec1..a06c7bc 100644 --- a/vetti-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/vetti-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -27,6 +27,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + @@ -67,7 +70,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.pwd_update_date, u.create_by, u.create_time, u.remark, 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 - ,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.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 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 @@ -76,7 +80,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 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.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 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 @@ -128,7 +132,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 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 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 from sys_user u left join sys_dept d on u.dept_id = d.dept_id where u.del_flag = '0' @@ -110,7 +114,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 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.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 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 @@ -196,6 +200,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" user_flag, user_set_json, + company_name, + job_title, + create_time )values( #{userId}, @@ -225,6 +232,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{userFlag}, #{userSetJson}, + #{companyName}, + #{jobTitle}, + sysdate() ) @@ -256,7 +266,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" best_side_json = #{bestSideJson}, address = #{address}, user_flag = #{userFlag}, - user_set_json = #{userSetJson}, + + + company_name = #{companyName}, + job_title = #{jobTitle}, update_time = sysdate()