From 6b7e359234e0ec913db9febd0e0f9f50ba0a98c6 Mon Sep 17 00:00:00 2001 From: sh Date: Tue, 3 Feb 2026 12:39:27 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=AE=8C=E6=88=90=E7=94=9F=E6=88=90=E7=AE=80?= =?UTF-8?q?=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 12 ++- ruoyi-bussiness/pom.xml | 6 ++ .../cms/controller/app/AppUserController.java | 71 ++++++++++++++++++ .../controller/cms/CmsAppUserController.java | 73 ++++++++++++++++++- .../java/com/ruoyi/cms/util/DictUtils.java | 4 +- .../java/com/ruoyi/cms/util/StringUtil.java | 28 +++++++ 6 files changed, 187 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 9c71e50..f1dff9d 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ 2.0.43 6.6.1 2.13.0 - 4.1.2 + 5.2.2 2.3 0.9.1 3.5.1 @@ -121,6 +121,16 @@ poi-ooxml ${poi.version} + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-ooxml-schemas + ${poi.version} + diff --git a/ruoyi-bussiness/pom.xml b/ruoyi-bussiness/pom.xml index 3ccfa26..6ab2cd7 100644 --- a/ruoyi-bussiness/pom.xml +++ b/ruoyi-bussiness/pom.xml @@ -111,6 +111,12 @@ org.springframework.boot spring-boot-starter-websocket + + com.deepoove + poi-tl + 1.12.2 + compile + \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppUserController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppUserController.java index 33942dc..d4dbc7c 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppUserController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/AppUserController.java @@ -1,6 +1,13 @@ package com.ruoyi.cms.controller.app; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; +import com.deepoove.poi.util.PoitlIOUtils; import com.ruoyi.cms.domain.AppReviewJob; +import com.ruoyi.cms.util.DictUtils; +import com.ruoyi.cms.util.StringUtil; +import com.ruoyi.common.core.domain.entity.AppSkill; import com.ruoyi.common.core.domain.entity.AppUser; import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.cms.domain.Job; @@ -11,6 +18,7 @@ import com.ruoyi.common.annotation.BussinessLog; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.cms.domain.vo.AppUserLky; +import com.ruoyi.common.core.domain.entity.UserWorkExperiences; import com.ruoyi.common.core.domain.model.RegisterBody; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.utils.DateUtils; @@ -21,9 +29,13 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedOutputStream; +import java.io.OutputStream; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * app用户Controller @@ -180,4 +192,63 @@ public class AppUserController extends BaseController appReviewJob.setUserId(SiteSecurityUtils.getUserId()); return toAjax(appReviewJobService.insertAppReviewJob(appReviewJob)); } + + @ApiOperation("生成简历") + @GetMapping("/createResume") + public void createResume(HttpServletResponse response){ + try { + Long userId=null; + if(SiteSecurityUtils.isLogin()){ + userId=SiteSecurityUtils.getUserId(); + } + String templatePath="/data/downloadmodel/简历.docx"; + AppUser result=appUserService.selectAppUserByUserId(userId); + Map dataMap = new HashMap<>(); + dataMap.put("name", result.getName()); + dataMap.put("sex", DictUtils.getDictLabel("app_sex",result.getSex())); + dataMap.put("birthDate", StringUtil.getBirthDateFromIdCard(result.getIdCard())); + dataMap.put("education", DictUtils.getDictLabel("education",result.getEducation())); + dataMap.put("politicalAffiliation", DictUtils.getDictLabel("political_affiliation",result.getPoliticalAffiliation())); + dataMap.put("nation", DictUtils.getDictLabel("nation",result.getNation())); + dataMap.put("domicileAddress", result.getDomicileAddress()); + dataMap.put("address", result.getAddress()); + String salary=result.getSalaryMin()+"-"+result.getSalaryMax(); + dataMap.put("salary", salary); + dataMap.put("area", DictUtils.getDictLabel("area",result.getArea())); + dataMap.put("jobTitle", String.join(",",result.getJobTitle())); + + LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); + Configure builder = Configure.builder() + .bind("workExperiences",policy) + .bind("skillList",policy) + .build(); + + List userWorkExperiences = result.getExperiencesList(); + List skillList=result.getAppSkillsList(); + skillList.forEach(it->it.setLevels(DictUtils.getDictLabel("skill_level",it.getLevels()))); + + dataMap.put("workExperiences", userWorkExperiences); + dataMap.put("skillList", skillList); + + String name=result.getName(); + name = new String(name.getBytes("gb2312"), "ISO8859-1"); + XWPFTemplate template = XWPFTemplate.compile(templatePath,builder).render(dataMap); + + response.setCharacterEncoding("utf-8"); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment; filename="+ name); + response.setHeader("Pragma", "public"); + response.setHeader("Cache-Control", "max-age=0"); + + OutputStream out = response.getOutputStream(); + BufferedOutputStream bos = new BufferedOutputStream(out); + template.write(bos); + bos.flush(); + out.flush(); + PoitlIOUtils.closeQuietlyMulti(template, bos, out); + + }catch (Exception e){ + e.printStackTrace(); + } + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsAppUserController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsAppUserController.java index 8748220..5bf7291 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsAppUserController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CmsAppUserController.java @@ -1,10 +1,14 @@ package com.ruoyi.cms.controller.cms; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.io.BufferedOutputStream; +import java.io.OutputStream; +import java.util.*; import javax.servlet.http.HttpServletResponse; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; +import com.deepoove.poi.util.PoitlIOUtils; import com.ruoyi.cms.domain.AppReviewJob; import com.ruoyi.cms.domain.vo.AppUserLky; import com.ruoyi.cms.service.IAppReviewJobService; @@ -13,11 +17,13 @@ import com.ruoyi.cms.util.RoleUtils; import com.ruoyi.cms.util.StringUtil; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.annotation.BussinessLog; +import com.ruoyi.common.core.domain.entity.AppSkill; import com.ruoyi.common.core.domain.entity.AppUserShow; +import com.ruoyi.common.core.domain.entity.UserWorkExperiences; import com.ruoyi.common.core.domain.model.RegisterBody; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.SiteSecurityUtils; +import com.ruoyi.cms.util.DictUtils; import com.ruoyi.common.utils.StringUtils; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -297,4 +303,63 @@ public class CmsAppUserController extends BaseController return error("查询简历失败,请稍后重试"); } } + + @ApiOperation("生成简历") + @GetMapping("/createResume") + public void createResume(HttpServletResponse response){ + try { + Long userId=null; + if(SecurityUtils.isLogin()){ + userId=SecurityUtils.getUserId(); + } + String templatePath="/data/downloadmodel/简历.docx"; + AppUser result=appUserService.selectAppUserByUserId(userId); + Map dataMap = new HashMap<>(); + dataMap.put("name", result.getName()); + dataMap.put("sex", DictUtils.getDictLabel("app_sex",result.getSex())); + dataMap.put("birthDate", StringUtil.getBirthDateFromIdCard(result.getIdCard())); + dataMap.put("education", DictUtils.getDictLabel("education",result.getEducation())); + dataMap.put("politicalAffiliation", DictUtils.getDictLabel("political_affiliation",result.getPoliticalAffiliation())); + dataMap.put("nation", DictUtils.getDictLabel("nation",result.getNation())); + dataMap.put("domicileAddress", result.getDomicileAddress()); + dataMap.put("address", result.getAddress()); + String salary=result.getSalaryMin()+"-"+result.getSalaryMax(); + dataMap.put("salary", salary); + dataMap.put("area", DictUtils.getDictLabel("area",result.getArea())); + dataMap.put("jobTitle", String.join(",",result.getJobTitle())); + + LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); + Configure builder = Configure.builder() + .bind("workExperiences",policy) + .bind("skillList",policy) + .build(); + + List userWorkExperiences = result.getExperiencesList(); + List skillList=result.getAppSkillsList(); + skillList.forEach(it->it.setLevels(DictUtils.getDictLabel("skill_level",it.getLevels()))); + + dataMap.put("workExperiences", userWorkExperiences); + dataMap.put("skillList", skillList); + + String name=result.getName(); + name = new String(name.getBytes("gb2312"), "ISO8859-1"); + XWPFTemplate template = XWPFTemplate.compile(templatePath,builder).render(dataMap); + + response.setCharacterEncoding("utf-8"); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment; filename="+ name); + response.setHeader("Pragma", "public"); + response.setHeader("Cache-Control", "max-age=0"); + + OutputStream out = response.getOutputStream(); + BufferedOutputStream bos = new BufferedOutputStream(out); + template.write(bos); + bos.flush(); + out.flush(); + PoitlIOUtils.closeQuietlyMulti(template, bos, out); + + }catch (Exception e){ + e.printStackTrace(); + } + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/DictUtils.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/DictUtils.java index 1f24961..e4ffb76 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/DictUtils.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/DictUtils.java @@ -103,7 +103,7 @@ public class DictUtils { for (String value : dictValue.split(separator)) { - if (value.equals(dict.getDictValue())) + if (value.trim().equals(dict.getDictValue().trim())) { propertyString.append(dict.getDictLabel()).append(separator); break; @@ -115,7 +115,7 @@ public class DictUtils { for (BussinessDictData dict : datas) { - if (dictValue.equals(dict.getDictValue())) + if (dictValue.trim().equals(dict.getDictValue().trim())) { return dict.getDictLabel(); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java index 2507870..2404908 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java @@ -3,6 +3,7 @@ package com.ruoyi.cms.util; import com.ruoyi.common.utils.StringUtils; import javax.servlet.http.HttpServletRequest; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -315,4 +316,31 @@ public class StringUtil { .filter(StringUtils::hasText) .collect(Collectors.toList()); } + + /** + * 从身份证号码中提取出生日期,格式化为 YYYY-MM-DD + * @param idCard 身份证号码(15位或18位) + * @return 格式化后的出生日期,解析失败返回空字符串 + */ + public static String getBirthDateFromIdCard(String idCard) { + if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) { + return ""; + } + String birthDateStr = ""; + try { + if (idCard.length() == 18) { + birthDateStr = idCard.substring(6, 14); + } else if (idCard.length() == 15) { + birthDateStr = "20" + idCard.substring(6, 12); + } + + SimpleDateFormat sdfInput = new SimpleDateFormat("yyyyMMdd"); + SimpleDateFormat sdfOutput = new SimpleDateFormat("yyyy-MM-dd"); + Date birthDate = sdfInput.parse(birthDateStr); + return sdfOutput.format(birthDate); + + } catch (Exception e) { + return ""; + } + } }