From 7dd3b96b9268d43297032530c884ff79b2e00d5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E8=BE=89?= Date: Fri, 26 Jun 2026 23:54:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B2=97=E4=BD=8D=E6=90=9C=E7=B4=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BDbug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/cms/domain/ESJobDocument.java | 3 ++ .../main/java/com/ruoyi/cms/domain/Job.java | 3 ++ .../cms/service/impl/ESJobSearchImpl.java | 32 +++++++++++++++--- .../cms/service/impl/JobServiceImpl.java | 33 +++++++++++++++++++ .../main/resources/mapper/app/JobMapper.xml | 8 +++-- sql/migration_add_is_urgent.sql | 4 +++ 6 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 sql/migration_add_is_urgent.sql diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ESJobDocument.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ESJobDocument.java index 4c80f48..e77c382 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ESJobDocument.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/ESJobDocument.java @@ -82,6 +82,9 @@ public class ESJobDocument @ApiModelProperty("是否火") private Integer isHot; + @ApiModelProperty("是否急聘") + private Integer isUrgent; + @ApiModelProperty("申请次数") private Integer applyNum; diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/Job.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/Job.java index 8acf763..3c49c63 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/Job.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/Job.java @@ -103,6 +103,9 @@ public class Job extends BaseEntity @ApiModelProperty("是否火") private Integer isHot; + @ApiModelProperty("是否急聘 0否 1是") + private Integer isUrgent; + @ApiModelProperty("申请次数") @JsonIgnore private Integer applyNum; 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 4171a9e..e745d14 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 @@ -346,6 +346,13 @@ public class ESJobSearchImpl implements IESJobSearchService if(!StringUtil.isEmptyOrNull(appUser.getSalaryMin())){ newSearch.setMinSalary(Long.valueOf(appUser.getSalaryMin())); } + // 请求参数覆盖用户资料中的薪资偏好 + if(Objects.nonNull(esJobSearch.getSalaryMin()) || Objects.nonNull(esJobSearch.getMinSalary())){ + newSearch.setMinSalary(Objects.nonNull(esJobSearch.getSalaryMin()) ? esJobSearch.getSalaryMin() : esJobSearch.getMinSalary()); + } + if(Objects.nonNull(esJobSearch.getSalaryMax()) || Objects.nonNull(esJobSearch.getMaxSalary())){ + newSearch.setMaxSalary(Objects.nonNull(esJobSearch.getSalaryMax()) ? esJobSearch.getSalaryMax() : esJobSearch.getMaxSalary()); + } if(!StringUtil.isEmptyOrNull(esJobSearch.getJobType())){ newSearch.setJobType(esJobSearch.getJobType()); } @@ -891,8 +898,16 @@ public class ESJobSearchImpl implements IESJobSearchService ESJobSearch newSearch = new ESJobSearch(); BeanUtils.copyProperties(esJobSearch,newSearch); - //查询 - if(appUser!=null){ + + // 判断是否为用户主动搜索(有明确的搜索条件),而非纯推荐场景 + boolean isExplicitSearch = !StringUtil.isEmptyOrNull(esJobSearch.getJobTitle()) + || !StringUtil.isEmptyOrNull(esJobSearch.getJobCategory()) + || !StringUtil.isEmptyOrNull(esJobSearch.getCompanyName()) + || !StringUtil.isEmptyOrNull(esJobSearch.getDescription()); + + // 用户资料偏好仅在"纯推荐"场景下作为个性化过滤条件; + // 用户主动搜索时不应被资料中的薪资/学历/经验/区域等偏好缩小结果范围 + if(appUser != null && !isExplicitSearch){ if(!ListUtil.isEmptyOrNull(appUser.getJobTitle())){ List jobTitle = appUser.getJobTitle(); newSearch.setJobTitle(String.join(",", jobTitle)); @@ -906,9 +921,6 @@ public class ESJobSearchImpl implements IESJobSearchService if(!StringUtil.isEmptyOrNull(appUser.getWorkExperience())){ newSearch.setExperience(appUser.getWorkExperience()); } - if(!StringUtil.isEmptyOrNull(esJobSearch.getExperience())){ - newSearch.setExperience(esJobSearch.getExperience()); - } if(!StringUtil.isEmptyOrNull(appUser.getSalaryMax())){ newSearch.setMaxSalary(Long.valueOf(appUser.getSalaryMax())); } @@ -917,12 +929,22 @@ public class ESJobSearchImpl implements IESJobSearchService } } + // 请求参数始终优先于用户资料偏好 + if(Objects.nonNull(esJobSearch.getSalaryMin()) || Objects.nonNull(esJobSearch.getMinSalary())){ + newSearch.setMinSalary(Objects.nonNull(esJobSearch.getSalaryMin()) ? esJobSearch.getSalaryMin() : esJobSearch.getMinSalary()); + } + if(Objects.nonNull(esJobSearch.getSalaryMax()) || Objects.nonNull(esJobSearch.getMaxSalary())){ + newSearch.setMaxSalary(Objects.nonNull(esJobSearch.getSalaryMax()) ? esJobSearch.getSalaryMax() : esJobSearch.getMaxSalary()); + } if(!StringUtil.isEmptyOrNull(esJobSearch.getArea())){ newSearch.setArea(esJobSearch.getArea()); } if(!StringUtil.isEmptyOrNull(esJobSearch.getEducation())){ newSearch.setEducation(esJobSearch.getEducation()); } + if(!StringUtil.isEmptyOrNull(esJobSearch.getExperience())){ + newSearch.setExperience(esJobSearch.getExperience()); + } if(!StringUtil.isEmptyOrNull(esJobSearch.getJobTitle())){ newSearch.setJobTitle(esJobSearch.getJobTitle()); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java index 11c3195..38bb8dd 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java @@ -34,15 +34,20 @@ import org.dromara.easyes.core.biz.EsPageInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; +import javax.sql.DataSource; import java.io.BufferedReader; import java.io.InputStreamReader; import java.math.BigDecimal; import java.net.HttpURLConnection; import java.net.URL; +import java.sql.Connection; +import java.sql.Statement; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -96,6 +101,34 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe @Autowired private NoticeMapper noticeMapper; + @Autowired + private DataSource dataSource; + + /** + * 应用启动后自动迁移:添加 is_urgent 列(幂等) + */ + @EventListener(ApplicationReadyEvent.class) + public void migrateIsUrgentColumn() { + try (Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement()) { + String checkSql = "SELECT COUNT(*) FROM information_schema.columns WHERE table_name='job' AND column_name='is_urgent'"; + java.sql.ResultSet rs = stmt.executeQuery(checkSql); + boolean exists = false; + if (rs.next()) { + exists = rs.getInt(1) > 0; + } + rs.close(); + if (!exists) { + stmt.execute("ALTER TABLE job ADD COLUMN is_urgent CHAR(1) DEFAULT '0'"); + logger.info("急聘功能迁移: 成功添加 job.is_urgent 列"); + } else { + logger.info("急聘功能迁移: job.is_urgent 列已存在,跳过"); + } + } catch (Exception e) { + logger.error("急聘功能迁移失败: {}", e.getMessage()); + } + } + /** * 更新工作地址的经纬度信息 */ diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/JobMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/JobMapper.xml index 020f993..19e76e1 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/app/JobMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/app/JobMapper.xml @@ -26,6 +26,7 @@ + @@ -61,6 +62,7 @@ + @@ -99,7 +101,7 @@ - select job_id, job_title, min_salary, max_salary, education, experience, company_name, job_location, posting_date, vacancies, del_flag, create_by, create_time, update_by, update_time, remark, latitude, longitude, "view", company_id , is_hot ,apply_num,is_publish, description,job_location_area_code,data_source,job_url,job_category,is_explain,explain_url,cover,job_type,job_address, review_status from job + select job_id, job_title, min_salary, max_salary, education, experience, company_name, job_location, posting_date, vacancies, del_flag, create_by, create_time, update_by, update_time, remark, latitude, longitude, "view", company_id , is_hot ,is_urgent,apply_num,is_publish, description,job_location_area_code,data_source,job_url,job_category,is_explain,explain_url,cover,job_type,job_address, review_status from job INSERT INTO row_work ( @@ -128,7 +130,7 @@ INSERT INTO job ( job_title, min_salary, max_salary, education, experience, company_name, job_location, job_location_area_code, posting_date, vacancies, latitude, longitude, "view", company_id, - is_hot, apply_num, description, is_publish, data_source, job_url, remark, del_flag, + is_hot, is_urgent, apply_num, description, is_publish, data_source, job_url, remark, del_flag, create_by, create_time, row_id, job_category,job_type,job_address ) VALUES @@ -136,7 +138,7 @@ #{job.jobTitle}, #{job.minSalary}, #{job.maxSalary}, #{job.education}, #{job.experience}, #{job.companyName}, #{job.jobLocation}, #{job.jobLocationAreaCode}, #{job.postingDate}, #{job.vacancies}, #{job.latitude}, #{job.longitude}, #{job.view}, #{job.companyId}, - #{job.isHot}, #{job.applyNum}, #{job.description}, #{job.isPublish}, #{job.dataSource}, + #{job.isHot}, #{job.isUrgent}, #{job.applyNum}, #{job.description}, #{job.isPublish}, #{job.dataSource}, #{job.jobUrl}, #{job.remark}, #{job.delFlag}, #{job.createBy}, #{job.createTime}, #{job.rowId}, #{job.jobCategory},#{job.jobType},#{job.jobAddress} ) diff --git a/sql/migration_add_is_urgent.sql b/sql/migration_add_is_urgent.sql new file mode 100644 index 0000000..7c0682d --- /dev/null +++ b/sql/migration_add_is_urgent.sql @@ -0,0 +1,4 @@ +-- 急聘功能:给 job 表添加 is_urgent 字段 +-- 0 = 非急聘(默认),1 = 急聘 +ALTER TABLE "ks_db3"."job" ADD COLUMN "is_urgent" CHAR(1) DEFAULT '0'; +COMMENT ON COLUMN "ks_db3"."job"."is_urgent" IS '是否急聘 0否 1是';