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 cb8fa69..dfe4c66 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 @@ -142,6 +142,18 @@ public class SysProfileController extends BaseController @PutMapping("/updatePersonalInfo") public R updatePersonalInfoProfile(@RequestBody SysUser user) { + //更新简历数据 + if("cvOper".equals(user.getOperFlag())){ + //查询简历数据 + HotakeCvInfo query = new HotakeCvInfo(); + query.setUserId(user.getUserId()); + query.setCvFileType("cv"); + List cvInfoList = cvInfoService.selectHotakeCvInfoList(query); + if(CollectionUtil.isNotEmpty(cvInfoList)){ + HotakeCvInfo cvInfo = cvInfoList.get(0); + user.setCvTemplateJson(cvInfo.getCvTemplateJson()); + } + } userService.updateUserProfile(user); return R.ok(); } 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 d60bf4d..566600d 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 @@ -180,6 +180,8 @@ public class SysUser extends BaseEntity { @ApiModelProperty("工作性值") private HotakeWorkNatureDto workNatureDto; + @ApiModelProperty("操作标记(cvOper:简历操作,需要同步简历信息到用户)") + private String operFlag; /** * 部门对象 @@ -550,6 +552,15 @@ public class SysUser extends BaseEntity { this.workNatureDto = workNatureDto; } + + public String getOperFlag() { + return operFlag; + } + + public void setOperFlag(String operFlag) { + this.operFlag = operFlag; + } + @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) diff --git a/vetti-common/src/main/java/com/vetti/common/enums/CvOperDataTypeEnum.java b/vetti-common/src/main/java/com/vetti/common/enums/CvOperDataTypeEnum.java new file mode 100644 index 0000000..b1c8964 --- /dev/null +++ b/vetti-common/src/main/java/com/vetti/common/enums/CvOperDataTypeEnum.java @@ -0,0 +1,33 @@ +package com.vetti.common.enums; + +/** + * 简历操作数据类型 + */ +public enum CvOperDataTypeEnum { + + IMPORT("import", "导入"), + MANUAL("manual", "手动"), + LINK("Link", "链接"), + + ; + + private final String code; + private final String info; + + CvOperDataTypeEnum(String code, String info) + { + this.code = code; + this.info = info; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + +} 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 ede78f7..3d4b266 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 @@ -93,6 +93,9 @@ public class HotakeCvInfo extends BaseEntity @ApiModelProperty("逻辑修正的数量") private Integer logicCorrectionsNum; + @ApiModelProperty("数据类型(import:导入,manual:手动,Link:链接)") + private String dataType; + @ApiModelProperty("简历分析结果数据") private HotakeCvOptimizeDto cvOptimizeDto; 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 9348db2..6e45840 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 @@ -8,8 +8,10 @@ import cn.hutool.json.JSONUtil; import com.vetti.common.ai.gpt.ChatGPTClient; import com.vetti.common.config.RuoYiConfig; import com.vetti.common.core.service.BaseServiceImpl; +import com.vetti.common.enums.CvOperDataTypeEnum; import com.vetti.common.enums.FillTypeEnum; import com.vetti.common.enums.MinioBucketNameEnum; +import com.vetti.common.exception.ServiceException; import com.vetti.common.utils.*; import com.vetti.common.utils.readFile.FileContentUtil; import com.vetti.hotake.domain.HotakeCvInfo; @@ -158,6 +160,20 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC String resultStr = handleAnalyzedAttachment(hotakeCvInfo.getCvUrl(), fileSuffix); hotakeCvInfo.setAnalyzedAttachmentJson(resultStr); } + if("cv".equals(hotakeCvInfo.getCvFileType())) { + hotakeCvInfo.setCvTemplateJson(JSONUtil.toJsonStr(hotakeCvInfo.getCvInfoDto())); + + //如果是手动创建的简历要生成简历的附件数据 + if(CvOperDataTypeEnum.MANUAL.getCode().equals(hotakeCvInfo.getDataType())){ + if(StrUtil.isNotEmpty(hotakeCvInfo.getCvTemplateJson())){ + HotakeSysFile sysFile = createCvFile(hotakeCvInfo.getCvTemplateJson()); + hotakeCvInfo.setCvName(sysFile.getFileName()); + hotakeCvInfo.setFileSizeShow(sysFile.getFileSizeShow()); + hotakeCvInfo.setCvUrl(sysFile.getStoragePath()); + } + } + } + hotakeCvInfoMapper.insertHotakeCvInfo(hotakeCvInfo); return hotakeCvInfo; } @@ -225,11 +241,19 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC fill(FillTypeEnum.UPDATE.getCode(), hotakeCvInfo); hotakeCvInfo.setCvTemplateJson(JSONUtil.toJsonStr(hotakeCvInfo.getCvInfoDto())); - //修改的时候重新生成问题和评分 - - + //创建简历 + if("cv".equals(hotakeCvInfo.getCvFileType())) { + //如果是手动创建的简历要生成简历的附件数据 + if(CvOperDataTypeEnum.MANUAL.getCode().equals(hotakeCvInfo.getDataType())){ + if(StrUtil.isNotEmpty(hotakeCvInfo.getCvTemplateJson())){ + HotakeSysFile sysFile = createCvFile(hotakeCvInfo.getCvTemplateJson()); + hotakeCvInfo.setCvName(sysFile.getFileName()); + hotakeCvInfo.setFileSizeShow(sysFile.getFileSizeShow()); + hotakeCvInfo.setCvUrl(sysFile.getStoragePath()); + } + } + } hotakeCvInfoMapper.updateHotakeCvInfo(hotakeCvInfo); - return hotakeCvInfo; } @@ -406,12 +430,12 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC //个人介绍 cvInfoDto.setAbout(StringUtils.getObjectStr(dataMap.get("professional_summary"))); - try{ + try { //技能工具 List skillsList = (List) dataMap.get("skills_certificates"); - if(CollectionUtil.isNotEmpty(skillsList)){ + if (CollectionUtil.isNotEmpty(skillsList)) { Map map = skillsList.get(0); - if(map != null){ + if (map != null) { List skillsAllList = (List) map.get("skills"); //技能工具 List skillsTools = new ArrayList<>(); @@ -426,10 +450,10 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC } } - }catch (Exception e){ + } catch (Exception e) { //技能工具 List skillsList = (List) dataMap.get("skills_certificates"); - if(CollectionUtil.isNotEmpty(skillsList)){ + if (CollectionUtil.isNotEmpty(skillsList)) { //技能工具 List skillsTools = new ArrayList<>(); if (CollectionUtil.isNotEmpty(skillsList)) { @@ -501,44 +525,12 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC cvInfo.setCvFileSuffix("pdf"); cvInfo.setStatus("1"); //生成简历PDF数据 - String markdown = aiCommonToolsService.handleGenerateMarkdown(cvData); - markdown = markdown.replaceAll("markdown", ""); - try { - String html = MarkdownUtil.markdownToHtml(markdown); - // 可注入 CSS - html = """ - - - - - - """ + html + """ - - - """; - //生成PDF文件 - String resultFileName = SecurityUtils.getUsername() + "_" + System.currentTimeMillis() + ".pdf"; - cvInfo.setCvName(resultFileName); - String resultPathUrl = RuoYiConfig.getProfile() + SYSTEM_DIR + resultFileName; - HtmlToPdfUtil.htmlToPdf(html, resultPathUrl); - //上传到minio中 - File pdf = new File(resultPathUrl); - MultipartFile multipartFile = - MultipartFileUtil.fileToMultipartFile(pdf); - HotakeSysFileVo fileVo = new HotakeSysFileVo(); - fileVo.setMinioBucketName("cv-fs"); - HotakeSysFile sysFile = sysFileService.insertHotakeSysFile(multipartFile, fileVo); - cvInfo.setFileSizeShow(sysFile.getFileSizeShow()); - cvInfo.setCvUrl(sysFile.getStoragePath()); - //创建简历对象数据 - insertHotakeCvInfo(cvInfo); - //保存简历PDF附件数据 -// log.info("Markdown数据为:{}",markdown); - } catch (Exception e) { - } + HotakeSysFile sysFile = createCvFile(cvData); + cvInfo.setCvName(sysFile.getFileName()); + cvInfo.setFileSizeShow(sysFile.getFileSizeShow()); + cvInfo.setCvUrl(sysFile.getStoragePath()); + //创建简历对象数据 + insertHotakeCvInfo(cvInfo); return cvInfo; } @@ -742,5 +734,46 @@ public class HotakeCvInfoServiceImpl extends BaseServiceImpl implements IHotakeC return ""; } + /** + * 创建简历附件信息 + * + * @param connect 简历内容 + */ + private HotakeSysFile createCvFile(String connect) { + + try { + String markdown = aiCommonToolsService.handleGenerateMarkdown(connect); + markdown = markdown.replaceAll("markdown", ""); + String html = MarkdownUtil.markdownToHtml(markdown); + // 可注入 CSS + html = """ + + + + + + """ + html + """ + + + """; + //生成PDF文件 + String resultFileName = SecurityUtils.getUsername() + "_" + System.currentTimeMillis() + ".pdf"; + String resultPathUrl = RuoYiConfig.getProfile() + SYSTEM_DIR + resultFileName; + HtmlToPdfUtil.htmlToPdf(html, resultPathUrl); + //上传到minio中 + File pdf = new File(resultPathUrl); + MultipartFile multipartFile = + MultipartFileUtil.fileToMultipartFile(pdf); + HotakeSysFileVo fileVo = new HotakeSysFileVo(); + fileVo.setMinioBucketName("cv-fs"); + HotakeSysFile sysFile = sysFileService.insertHotakeSysFile(multipartFile, fileVo); + return sysFile; + } catch (Exception e) { + throw new ServiceException("Resume creation exception, please contact the administrator"); + } + } } diff --git a/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCvInfoMapper.xml b/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCvInfoMapper.xml index bf991a3..5c3f944 100644 --- a/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCvInfoMapper.xml +++ b/vetti-hotakes/src/main/resources/mapper/hotake/HotakeCvInfoMapper.xml @@ -25,6 +25,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + @@ -35,7 +37,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,experience,ai_match_score,ai_match_score_percentage,cv_optimize_json,analyzed_attachment_json, + status,cv_template_json,cv_score,cv_md5,experience,ai_match_score,ai_match_score_percentage, + cv_optimize_json,analyzed_attachment_json,data_type, del_flag, create_by, create_time, update_by, update_time, remark from hotake_cv_info @@ -48,6 +51,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and cv_url = #{cvUrl} and cv_file_suffix = #{cvFileSuffix} and status = #{status} + and data_type = #{dataType} and del_flag = #{delFlag} @@ -78,6 +82,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" analyzed_attachment_json, + data_type, + del_flag, create_by, create_time, @@ -103,6 +109,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{cvOptimizeJson}, #{analyzedAttachmentJson}, + #{dataType}, #{delFlag}, #{createBy}, @@ -135,6 +142,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" analyzed_attachment_json = #{analyzedAttachmentJson}, + data_type = #{dataType}, + del_flag = #{delFlag}, create_by = #{createBy}, create_time = #{createTime},