diff --git a/client-api/src/main/java/org/jiayunet/controller/JobController.java b/client-api/src/main/java/org/jiayunet/controller/JobController.java
index 83b33d7..9f1d08b 100644
--- a/client-api/src/main/java/org/jiayunet/controller/JobController.java
+++ b/client-api/src/main/java/org/jiayunet/controller/JobController.java
@@ -8,6 +8,9 @@ import org.jiayunet.pojo.dto.job.JobDetailDto;
import org.jiayunet.pojo.dto.job.JobDto;
import org.jiayunet.pojo.dto.job.JobAgentRecommendDto;
import org.jiayunet.pojo.param.job.*;
+import org.jiayunet.pojo.vo.HotCityVo;
+import org.jiayunet.pojo.vo.HotIndustryVo;
+import org.jiayunet.pojo.vo.HotJobCategoryVo;
import org.jiayunet.pojo.vo.JobApplyCountVo;
import java.util.List;
import org.jiayunet.pojo.vo.JobFavoriteCountVo;
@@ -64,6 +67,39 @@ public class JobController {
return jobService.countJobs(param, userId);
}
+ /**
+ * 岗位热门行业
+ *
按上架岗位数量倒序返回二级行业,接口允许不登录访问
+ *
+ * @param limit 返回条数,默认10
+ */
+ @GetMapping("/industry/hot")
+ public List listHotIndustries(@RequestParam(required = false, defaultValue = "10") Integer limit) {
+ return jobService.listHotIndustries(limit);
+ }
+
+ /**
+ * 热门岗位类型
+ * 按上架岗位数量倒序返回二级岗位类型,接口允许不登录访问
+ *
+ * @param limit 返回条数,默认10
+ */
+ @GetMapping("/category/hot")
+ public List listHotJobCategories(@RequestParam(required = false, defaultValue = "10") Integer limit) {
+ return jobService.listHotJobCategories(limit);
+ }
+
+ /**
+ * 热门城市
+ * 按上架岗位数量倒序返回城市,接口允许不登录访问
+ *
+ * @param limit 返回条数,默认10
+ */
+ @GetMapping("/city/hot")
+ public List listHotCities(@RequestParam(required = false, defaultValue = "10") Integer limit) {
+ return jobService.listHotCities(limit);
+ }
+
/**
* 岗位详情
* 返回岗位完整信息、公司信息、匹配度、收藏状态
diff --git a/client-api/src/main/java/org/jiayunet/service/JobService.java b/client-api/src/main/java/org/jiayunet/service/JobService.java
index 0c275aa..12b80e1 100644
--- a/client-api/src/main/java/org/jiayunet/service/JobService.java
+++ b/client-api/src/main/java/org/jiayunet/service/JobService.java
@@ -22,6 +22,9 @@ import org.jiayunet.pojo.po.*;
import org.jiayunet.tool.HttpTool;
import org.jiayunet.exception.BusinessException;
import org.jiayunet.exception.BusinessExpCodeEnum;
+import org.jiayunet.pojo.vo.HotCityVo;
+import org.jiayunet.pojo.vo.HotIndustryVo;
+import org.jiayunet.pojo.vo.HotJobCategoryVo;
import org.jiayunet.pojo.vo.JobApplyCountVo;
import org.jiayunet.pojo.vo.JobFavoriteCountVo;
import org.jiayunet.pojo.vo.JobListItemVo;
@@ -204,6 +207,33 @@ public class JobService {
return total == null ? 0L : total;
}
+ /**
+ * 热门行业查询(二级行业)
+ * 岗位关联公司、公司关联行业(bg_industry level=2),按上架岗位数量倒序取前 limit 个
+ * 只返回行业ID和名称,岗位数量仅用于排序不对外暴露
+ */
+ public List listHotIndustries(Integer limit) {
+ return jobMapper.selectHotIndustries(limit);
+ }
+
+ /**
+ * 热门岗位类型查询(二级岗位类型)
+ * bg_job.category_id 存三级叶子,SQL 内自关联上溯到二级后按二级分组,按上架岗位数量倒序取前 limit 个
+ * 只返回岗位类型ID和名称,岗位数量仅用于排序不对外暴露
+ */
+ public List listHotJobCategories(Integer limit) {
+ return jobMapper.selectHotJobCategories(limit);
+ }
+
+ /**
+ * 热门城市查询
+ * 岗位关联公司、公司关联地区,按上架岗位数量倒序取前 limit 个
+ * 只返回地区编码和名称,岗位数量仅用于排序不对外暴露
+ */
+ public List listHotCities(Integer limit) {
+ return jobMapper.selectHotCities(limit);
+ }
+
/**
* 扩展地区编码(包含自身和所有子级)
* 一次查询:code本身 + provinceCode匹配 + cityCode匹配
diff --git a/manager/src/main/java/org/jiayunet/mapper/JobMapper.java b/manager/src/main/java/org/jiayunet/mapper/JobMapper.java
index b8cef8c..e376c90 100644
--- a/manager/src/main/java/org/jiayunet/mapper/JobMapper.java
+++ b/manager/src/main/java/org/jiayunet/mapper/JobMapper.java
@@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.jiayunet.pojo.po.Job;
+import org.jiayunet.pojo.vo.HotCityVo;
+import org.jiayunet.pojo.vo.HotIndustryVo;
+import org.jiayunet.pojo.vo.HotJobCategoryVo;
import org.jiayunet.pojo.vo.JobListItemVo;
import java.time.Instant;
@@ -27,4 +30,22 @@ public interface JobMapper extends CommonMapper {
* 过滤条件与 selectJobPage 共用同一段 SQL(jobPageWhere),保证列表与总数口径一致
*/
Long countJobPage(@Param("jobIds") List jobIds, @Param("statusFilter") List statusFilter, @Param("keyword") String keyword, @Param("regionCodes") List regionCodes, @Param("categoryIds") List categoryIds, @Param("industryIds") List industryIds, @Param("employmentType") Integer employmentType, @Param("excludeJobIds") List excludeJobIds, @Param("excludeCompanyIds") List excludeCompanyIds, @Param("excludeRegionCodes") List excludeRegionCodes, @Param("excludeIndustryIds") List excludeIndustryIds, @Param("recruitCategory") Integer recruitCategory, @Param("companyTypes") List companyTypes, @Param("companyId") Long companyId, @Param("educations") List educations, @Param("publishStartTime") Instant publishStartTime, @Param("publishEndTime") Instant publishEndTime);
+
+ /**
+ * 查询热门行业(二级行业)
+ * 岗位关联公司、公司关联行业,按上架岗位数量倒序取前 limit 个
+ */
+ List selectHotIndustries(@Param("limit") Integer limit);
+
+ /**
+ * 查询热门岗位类型(二级岗位类型)
+ * 岗位类型表自关联,从三级叶子上溯到二级后分组,按上架岗位数量倒序取前 limit 个
+ */
+ List selectHotJobCategories(@Param("limit") Integer limit);
+
+ /**
+ * 查询热门城市
+ * 岗位关联公司、公司关联地区,按上架岗位数量倒序取前 limit 个
+ */
+ List selectHotCities(@Param("limit") Integer limit);
}
diff --git a/manager/src/main/java/org/jiayunet/pojo/vo/HotCityVo.java b/manager/src/main/java/org/jiayunet/pojo/vo/HotCityVo.java
new file mode 100644
index 0000000..a46e881
--- /dev/null
+++ b/manager/src/main/java/org/jiayunet/pojo/vo/HotCityVo.java
@@ -0,0 +1,18 @@
+package org.jiayunet.pojo.vo;
+
+import lombok.Data;
+
+/**
+ * 热门城市VO
+ *
+ * @author zk
+ */
+@Data
+public class HotCityVo {
+
+ /** 地区编码 */
+ private String code;
+
+ /** 地区名称 */
+ private String name;
+}
diff --git a/manager/src/main/java/org/jiayunet/pojo/vo/HotIndustryVo.java b/manager/src/main/java/org/jiayunet/pojo/vo/HotIndustryVo.java
new file mode 100644
index 0000000..c9cc1ff
--- /dev/null
+++ b/manager/src/main/java/org/jiayunet/pojo/vo/HotIndustryVo.java
@@ -0,0 +1,18 @@
+package org.jiayunet.pojo.vo;
+
+import lombok.Data;
+
+/**
+ * 热门行业VO(二级行业)
+ *
+ * @author zk
+ */
+@Data
+public class HotIndustryVo {
+
+ /** 行业ID */
+ private Long id;
+
+ /** 行业名称 */
+ private String name;
+}
diff --git a/manager/src/main/java/org/jiayunet/pojo/vo/HotJobCategoryVo.java b/manager/src/main/java/org/jiayunet/pojo/vo/HotJobCategoryVo.java
new file mode 100644
index 0000000..3df3563
--- /dev/null
+++ b/manager/src/main/java/org/jiayunet/pojo/vo/HotJobCategoryVo.java
@@ -0,0 +1,18 @@
+package org.jiayunet.pojo.vo;
+
+import lombok.Data;
+
+/**
+ * 热门岗位类型VO(二级岗位类型)
+ *
+ * @author zk
+ */
+@Data
+public class HotJobCategoryVo {
+
+ /** 岗位类型ID */
+ private Long id;
+
+ /** 岗位类型名称 */
+ private String name;
+}
diff --git a/manager/src/main/resources/mapper/JobMapper.xml b/manager/src/main/resources/mapper/JobMapper.xml
index a08e9db..7105234 100644
--- a/manager/src/main/resources/mapper/JobMapper.xml
+++ b/manager/src/main/resources/mapper/JobMapper.xml
@@ -188,4 +188,65 @@
+
+
+ SELECT
+ i.id,
+ i.name
+ FROM bg_job j
+ INNER JOIN bg_company c ON j.company_id = c.id
+ INNER JOIN bg_industry i ON c.industry_id = i.id
+ WHERE j.status = 0
+ AND c.status = 1
+ AND i.level = 2
+ GROUP BY i.id, i.name
+ ORDER BY COUNT(j.id) DESC
+
+ LIMIT #{limit}
+
+
+
+
+
+ SELECT
+ cat2.id,
+ cat2.name
+ FROM bg_job j
+ INNER JOIN bg_job_category cat3 ON j.category_id = cat3.id
+ INNER JOIN bg_job_category cat2 ON cat3.parent_id = cat2.id
+ WHERE j.status = 0
+ AND cat2.level = 2
+ GROUP BY cat2.id, cat2.name
+ ORDER BY COUNT(j.id) DESC
+
+ LIMIT #{limit}
+
+
+
+
+
+ SELECT
+ r.code,
+ r.name
+ FROM bg_job j
+ INNER JOIN bg_company c ON j.company_id = c.id
+ INNER JOIN bg_china_regions_code r ON c.region_code = r.code
+ WHERE j.status = 0
+ AND c.status = 1
+ GROUP BY r.code, r.name
+ ORDER BY COUNT(j.id) DESC
+
+ LIMIT #{limit}
+
+
+