From a2b0c279634c5f81cbf89c6edd7428c65534365a Mon Sep 17 00:00:00 2001 From: sh Date: Fri, 17 Jul 2026 19:58:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9es=E5=88=86=E8=AF=8D=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/cms/CmsAppUserController.java | 2 +- .../cms/domain/ik/JobSearchCondition.java | 6 ++- .../cms/service/impl/ESJobSearchImpl.java | 23 ++++++-- .../cms/util/ik/TextConditionParserUtil.java | 52 ++++++++++++++++--- .../common/constant/EncryptConstants.java | 3 +- 5 files changed, 74 insertions(+), 12 deletions(-) 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 525d9f3..bac5a11 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 @@ -316,7 +316,7 @@ public class CmsAppUserController extends BaseController try { Long userId=null; if(SecurityUtils.isLogin()){ - userId=SecurityUtils.getUserId(); + userId=RoleUtils.getSysAppuserId(); } String templatePath="/data/downloadmodel/简历.docx"; AppUser result=appUserService.selectAppUserByUserId(userId); diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ik/JobSearchCondition.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ik/JobSearchCondition.java index d8caa7a..05b63a2 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ik/JobSearchCondition.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ik/JobSearchCondition.java @@ -1,7 +1,6 @@ package com.ruoyi.cms.domain.ik; import lombok.Data; -import java.math.BigDecimal; @Data public class JobSearchCondition { @@ -30,4 +29,9 @@ public class JobSearchCondition { private String educationText; /** 匹配到的工作经验原始文本(3-5年/应届毕业生...用于过滤岗位名称) */ private String workExpText; + + /** + * 所属行政区划 + */ + private String regionCode; } \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java index 5d8600d..5fcadd6 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/ESJobSearchImpl.java @@ -663,9 +663,15 @@ public class ESJobSearchImpl implements IESJobSearchService // } // } if(!StringUtil.isEmptyOrNull(jobQuery.getJobTitle())){ - wrapper.and(a->a.match(ESJobDocument::getJobTitle,jobQuery.getJobTitle(),5.0f) - .or() - .match(ESJobDocument::getDescription,jobQuery.getJobTitle(),1.0f)); + List jobNameList = splitJobNames(jobQuery.getJobTitle()); + if(jobNameList != null && !jobNameList.isEmpty()){ + wrapper.and(mainBool -> mainBool.should(outer -> { + for (String word : jobNameList) { + outer.should(sub -> sub.match(ESJobDocument::getJobTitle, word, 5.0f) + .or().match(ESJobDocument::getDescription, word, 1.0f)); + } + })); + } } if(!StringUtil.isEmptyOrNull(jobQuery.getEducation())){ List integers=StringUtil.convertStringToIntegerList(jobQuery.getEducation()); @@ -967,4 +973,15 @@ public class ESJobSearchImpl implements IESJobSearchService return esJobDocuments; } + + private List splitJobNames(String jobStr) { + if (StringUtil.isEmptyOrNull(jobStr)) { + return Collections.emptyList(); + } + return Arrays.stream(jobStr.split(",")) + .map(String::trim) + .map(s -> s.replace("/", " ")) + .filter(s -> !StringUtil.isEmptyOrNull(s)) + .collect(Collectors.toList()); + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ik/TextConditionParserUtil.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ik/TextConditionParserUtil.java index 510ebbd..22c7afb 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ik/TextConditionParserUtil.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/ik/TextConditionParserUtil.java @@ -2,6 +2,7 @@ package com.ruoyi.cms.util.ik; import com.ruoyi.cms.domain.ik.JobSearchCondition; import com.ruoyi.cms.domain.ik.ParserDictDTO; +import com.ruoyi.cms.util.StringUtil; import java.util.*; import java.util.regex.Matcher; @@ -34,6 +35,9 @@ public class TextConditionParserUtil { "(月薪|薪资|工资)\\s*(一|二|三|四|五|六|七|八|九|十)(千|万)" ); + // 定义喀什地区固定编码常量 + private static final String KASHGAR_FULL_CODE = "653100000000"; + //中文数字映射表 private static Long getChineseNum(String numChar, String unit) { int num; @@ -103,8 +107,10 @@ public class TextConditionParserUtil { // 5.拼接岗位名称,过滤已识别维度词汇 List matchJobList= extractStandardJobName(input, tokenList,dictDTO.getStandardJobSet(),dictDTO.getJobIndexMap()); - if (matchJobList != null && !matchJobList.isEmpty()) { - condition.setJobTitle(String.join(",", matchJobList)); + //拆分带/的 + List finalJobList = splitFilterDistinct(matchJobList,input); + if (finalJobList != null && !finalJobList.isEmpty()) { + condition.setJobTitle(String.join(",", finalJobList)); } else { condition.setJobTitle(input); } @@ -114,14 +120,22 @@ public class TextConditionParserUtil { private static void extractAreaCode(String text, JobSearchCondition condition, Map areaMap) { List> entryList = new ArrayList<>(areaMap.entrySet()); entryList.sort((o1, o2) -> Integer.compare(o2.getKey().length(), o1.getKey().length())); + + boolean hitCounty = false; for (Map.Entry entry : entryList) { String areaName = entry.getKey(); if (text.contains(areaName)) { condition.setAddress(areaName); condition.setJobLocationAreaCode(String.valueOf(entry.getValue())); + hitCounty = true; break; } } + + if (!hitCounty && text.contains("喀什地区")) { + condition.setAddress("喀什地区"); + condition.setRegionCode(KASHGAR_FULL_CODE); + } } private static void extractWorkExpCode(String text, JobSearchCondition condition, Map expMap) { @@ -280,7 +294,7 @@ public class TextConditionParserUtil { List jobList = new ArrayList<>(standardJobSet); // 长名称优先,优先匹配更长岗位,避免短词根优先命中 jobList.sort((s1, s2) -> Integer.compare(s2.length(), s1.length())); - final int MAX_MATCH_SIZE = 5; + //final int MAX_MATCH_SIZE = 5; for (String jobName : jobList) { if (text.contains(jobName)) { @@ -298,9 +312,9 @@ public class TextConditionParserUtil { for (String jobName : jobList) { if (jobName.contains(word)) { matchSet.add(jobName); - if (matchSet.size() >= MAX_MATCH_SIZE) { - return new ArrayList<>(matchSet); - } +// if (matchSet.size() >= MAX_MATCH_SIZE) { +// return new ArrayList<>(matchSet); +// } } } } @@ -312,6 +326,32 @@ public class TextConditionParserUtil { return null; } + /** + * 拆分岗位斜杠、全局去重 + */ + private static List splitFilterDistinct(List sourceList, String rawInput) { + if (sourceList == null || sourceList.isEmpty() || StringUtil.isEmptyOrNull(rawInput)) { + return null; + } + String cleanInput = rawInput.replace("/", ""); + Set set = new HashSet<>(); + for (String str : sourceList) { + String[] arr = str.split("/"); + for (String seg : arr) { + String trimSeg = seg.trim(); + if (StringUtil.isEmptyOrNull(trimSeg)) { + continue; + } + // 过滤无关联片段 + if (rawInput.contains(trimSeg) || trimSeg.contains(cleanInput)) { + set.add(trimSeg); + } + } + } + List res = new ArrayList<>(set); + return res.isEmpty() ? null : res; + } + private static boolean isFilterWord(String word, JobSearchCondition condition) { // 基础过滤词 if (word.matches("\\d+") || new ArrayList<>(Arrays.asList( diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/EncryptConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/EncryptConstants.java index c9ef84e..dd6e53c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/EncryptConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/EncryptConstants.java @@ -68,6 +68,7 @@ public class EncryptConstants { "/app/user/list", "/app/appskill/list", "/cms/appskill/list", - "/cms/employeeConfirm/list" + "/cms/employeeConfirm/list", + "/app/user/createResume" ); } \ No newline at end of file