浏览代码

1、增加区域、行业、职位树形接口

rayson 1 年之前
父节点
当前提交
99b9add51d
共有 30 个文件被更改,包括 657 次插入21 次删除
  1. 13 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/workexp/ExpTypeEnum.java
  2. 3 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/MendunerSystemApplication.java
  3. 14 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/area/AreaController.java
  4. 33 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/area/vo/AreaChildrenRespVO.java
  5. 1 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/area/vo/AreaRespVO.java
  6. 14 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/industry/IndustryController.java
  7. 38 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/industry/vo/IndustryChildrenRespVO.java
  8. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/vo/JobAdvertisedRespVO.java
  9. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/vo/JobAdvertisedSaveReqVO.java
  10. 14 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/position/PositionController.java
  11. 38 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/position/vo/PositionChildrenRespVO.java
  12. 24 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/AppJobAdvertisedController.java
  13. 53 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/vo/AppJobHomeRespVO.java
  14. 18 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/AreaConvert.java
  15. 18 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/IndustryConvert.java
  16. 18 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/PositionConvert.java
  17. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/area/AreaDO.java
  18. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobAdvertisedDO.java
  19. 5 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/area/AreaMapper.java
  20. 5 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/industry/IndustryMapper.java
  21. 6 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/position/PositionMapper.java
  22. 22 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/redis/RedisKeyConstants.java
  23. 16 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/area/AreaService.java
  24. 72 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/area/AreaServiceImpl.java
  25. 15 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/industry/IndustryService.java
  26. 74 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/industry/IndustryServiceImpl.java
  27. 21 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java
  28. 17 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  29. 21 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/position/PositionService.java
  30. 71 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/position/PositionServiceImpl.java

+ 13 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/workexp/ExpTypeEnum.java

@@ -0,0 +1,13 @@
+package com.citu.module.menduner.system.enums.workexp;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 工作经验(0 在校生 1应届生 2经验不限 3 1年以内 4 1-3年 5 3-5年 6 5-10年 7 10年以上)
+ **/
+@Getter
+@AllArgsConstructor
+public class ExpTypeEnum {
+
+}

+ 3 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/MendunerSystemApplication.java

@@ -4,10 +4,10 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 /**
+ * 项目的启动类
+ * 门墩儿 招聘模块 启动类
  * @author rayson
- * @description MendunerRecruitmentApplition 门墩儿 招聘模块 启动类
- * @create 2024/4/25 下午5:31
- **/
+ */
 @SpringBootApplication
 public class MendunerSystemApplication {
 

+ 14 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/area/AreaController.java

@@ -99,4 +99,18 @@ public class AreaController {
                         BeanUtils.toBean(list, AreaRespVO.class));
     }
 
+    @GetMapping("/get/tree")
+    @Operation(summary = "获取区域树形")
+    public CommonResult<List<AreaChildrenRespVO>> getArea(@Valid AreaListReqVO listReqVO) {
+        List<AreaChildrenRespVO> list = areaService.getArea(listReqVO);
+        return success(list);
+    }
+    @GetMapping("/get/children")
+    @Operation(summary = "根据区域id获得地区下级列表")
+    public CommonResult<List<AreaChildrenRespVO>> getAreaIdChildren(@RequestParam("id") Long id) {
+        List<AreaChildrenRespVO> list = areaService.getAreaIdChildren(id);
+        return success(list);
+    }
+
+
 }

+ 33 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/area/vo/AreaChildrenRespVO.java

@@ -0,0 +1,33 @@
+package com.citu.module.menduner.system.controller.admin.area.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Schema(description = "管理后台 -  地区列表 Request VO")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AreaChildrenRespVO {
+
+    @Schema(description = "id", example = "28186")
+    private Long id;
+
+    @Schema(description = "区域名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "区域类型", example = "2")
+    private Integer type;
+
+    @Schema(description = "上级区域", example = "9103")
+    private Long parentId;
+
+    /**
+     * 子节点
+     */
+    private List<AreaChildrenRespVO> children;
+
+}

+ 1 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/area/vo/AreaRespVO.java

@@ -13,6 +13,7 @@ import com.alibaba.excel.annotation.*;
 @ExcelIgnoreUnannotated
 public class AreaRespVO {
 
+
     @Schema(description = "id", example = "28186")
     @ExcelProperty("id")
     private Long id;

+ 14 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/industry/IndustryController.java

@@ -6,10 +6,7 @@ import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.excel.core.util.ExcelUtils;
-import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryListReqVO;
-import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryPageReqVO;
-import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryRespVO;
-import com.citu.module.menduner.system.controller.admin.industry.vo.IndustrySaveReqVO;
+import com.citu.module.menduner.system.controller.admin.industry.vo.*;
 
 import com.citu.module.menduner.system.dal.dataobject.industry.IndustryDO;
 import com.citu.module.menduner.system.service.industry.IndustryService;
@@ -107,4 +104,17 @@ public class IndustryController {
         industryService.syncBossIndustry();
     }
 
+    @GetMapping("/get/tree")
+    @Operation(summary = "获取行业树形")
+    public CommonResult<List<IndustryChildrenRespVO>> getIndustry(@Valid IndustryListReqVO listReqVO) {
+        List<IndustryChildrenRespVO> list = industryService.getIndustry(listReqVO);
+        return success(list);
+    }
+    @GetMapping("/get/children")
+    @Operation(summary = "根据职位id获得职位下级列表")
+    public CommonResult<List<IndustryChildrenRespVO>> getIndustryIdChildren(@RequestParam("id") Long id) {
+        List<IndustryChildrenRespVO> list = industryService.getIndustryIdChildren(id);
+        return success(list);
+    }
+
 }

+ 38 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/industry/vo/IndustryChildrenRespVO.java

@@ -0,0 +1,38 @@
+package com.citu.module.menduner.system.controller.admin.industry.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Schema(description = "管理后台 -  行业信息 Request VO")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class IndustryChildrenRespVO {
+
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "7293")
+    private Long id;
+
+    @Schema(description = "行业中文名称")
+    private String nameCn;
+
+    @Schema(description = "行业英文名称")
+    private String nameEn;
+
+    @Schema(description = "上级id", example = "11085")
+    private Long parentId;
+
+    @Schema(description = "层级")
+    private Integer level;
+
+    /**
+     * 子节点
+     */
+    private List<IndustryChildrenRespVO> children;
+
+}

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/vo/JobAdvertisedRespVO.java

@@ -61,6 +61,10 @@ public class JobAdvertisedRespVO {
     @ExcelProperty("薪酬to")
     private Integer payTo;
 
+    @Schema(description = "薪酬单位")
+    @ExcelProperty("薪酬单位")
+    private Integer payUnit;
+
     @Schema(description = "职位标签")
     @ExcelProperty("职位标签")
     private String tagList;

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/vo/JobAdvertisedSaveReqVO.java

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.system.controller.admin.job.vo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -51,6 +52,9 @@ public class JobAdvertisedSaveReqVO {
     @Schema(description = "薪酬to")
     private Integer payTo;
 
+    @Schema(description = "薪酬单位")
+    private Integer payUnit;
+
     @Schema(description = "职位标签")
     private String tagList;
 

+ 14 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/position/PositionController.java

@@ -6,10 +6,7 @@ import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.excel.core.util.ExcelUtils;
-import com.citu.module.menduner.system.controller.admin.position.vo.PositionListReqVO;
-import com.citu.module.menduner.system.controller.admin.position.vo.PositionPageReqVO;
-import com.citu.module.menduner.system.controller.admin.position.vo.PositionRespVO;
-import com.citu.module.menduner.system.controller.admin.position.vo.PositionSaveReqVO;
+import com.citu.module.menduner.system.controller.admin.position.vo.*;
 import com.citu.module.menduner.system.dal.dataobject.position.PositionDO;
 import com.citu.module.menduner.system.service.position.PositionService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -107,4 +104,17 @@ public class PositionController {
     public void syncBossPosition() {
         positionService.syncBossPosition();
     }
+
+    @GetMapping("/get/tree")
+    @Operation(summary = "获取职位树形")
+    public CommonResult<List<PositionChildrenRespVO>> getPosition(@Valid PositionListReqVO listReqVO) {
+        List<PositionChildrenRespVO> list = positionService.getPosition(listReqVO);
+        return success(list);
+    }
+    @GetMapping("/get/children")
+    @Operation(summary = "根据职位id获得职位下级列表")
+    public CommonResult<List<PositionChildrenRespVO>> getPositionIdChildren(@RequestParam("id") Long id) {
+        List<PositionChildrenRespVO> list = positionService.getPositionIdChildren(id);
+        return success(list);
+    }
 }

+ 38 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/position/vo/PositionChildrenRespVO.java

@@ -0,0 +1,38 @@
+package com.citu.module.menduner.system.controller.admin.position.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Schema(description = "管理后台 -  行业信息 Request VO")
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PositionChildrenRespVO {
+
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "27892")
+    private Long id;
+
+    @Schema(description = "职位中文名称")
+    private String nameCn;
+
+    @Schema(description = "职位英文名称")
+    private String nameEn;
+
+    @Schema(description = "上级id", example = "11085")
+    private Long parentId;
+
+    @Schema(description = "层级")
+    private Integer level;
+
+    /**
+     * 子节点
+     */
+    private List<PositionChildrenRespVO> children;
+
+}

+ 24 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/AppJobAdvertisedController.java

@@ -0,0 +1,24 @@
+package com.citu.module.menduner.system.controller.app.job;
+
+import com.citu.module.menduner.system.service.job.JobAdvertisedService;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@Tag(name = "用户端 - 招聘职位信息")
+@RestController
+@RequestMapping("/menduner/system/job/advertised")
+@Validated
+@Slf4j
+public class AppJobAdvertisedController {
+
+    @Resource
+    private JobAdvertisedService jobAdvertisedService;
+
+
+
+}

+ 53 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/vo/AppJobHomeRespVO.java

@@ -0,0 +1,53 @@
+package com.citu.module.menduner.system.controller.app.job.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Schema(description = "menduner - 招聘职位首页 Response VO")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class AppJobHomeRespVO {
+
+    @Schema(description = "职位id", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
+    private Long id;
+
+    @Schema(description = "职位类型id", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
+    private Long positionId;
+
+    @Schema(description = "薪酬from", requiredMode = Schema.RequiredMode.REQUIRED, example = "6")
+    private Integer payFrom;
+
+    @Schema(description = "薪酬to", requiredMode = Schema.RequiredMode.REQUIRED, example = "12")
+    private Integer payTo;
+
+    @Schema(description = "工作地区名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "广州")
+    private String areaName;
+
+    @Schema(description = "工作经验(menduner_exp_type)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer expType;
+
+    @Schema(description = "学历要求(menduner_education_type)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer eduType;
+
+    @Schema(description = "职位标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "[xx,xx]")
+    private String tagList;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
+    private Long enterpriseId;
+
+    @Schema(description = "企业别称", requiredMode = Schema.RequiredMode.REQUIRED, example = "xx科技")
+    private String anotherName;
+
+    @Schema(description = "所在行业", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
+    private Long industryId;
+
+    @Schema(description = "人员规模(0-20人,20-99人,100-499人,500-999人,1000-9999人,9999人以上)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer scale;
+
+
+}

+ 18 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/AreaConvert.java

@@ -0,0 +1,18 @@
+package com.citu.module.menduner.system.convert;
+
+import com.citu.module.menduner.system.controller.admin.area.vo.AreaChildrenRespVO;
+import com.citu.module.menduner.system.dal.dataobject.area.AreaDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+@Mapper
+public interface AreaConvert {
+
+    AreaConvert INSTANCE = Mappers.getMapper(AreaConvert.class);
+
+    AreaChildrenRespVO convert(AreaDO areaDO);
+
+    List<AreaChildrenRespVO> convertList(List<AreaDO> list);
+}

+ 18 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/IndustryConvert.java

@@ -0,0 +1,18 @@
+package com.citu.module.menduner.system.convert;
+
+import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryChildrenRespVO;
+import com.citu.module.menduner.system.dal.dataobject.industry.IndustryDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+@Mapper
+public interface IndustryConvert {
+
+    IndustryConvert INSTANCE = Mappers.getMapper(IndustryConvert.class);
+
+    IndustryChildrenRespVO convert(IndustryDO industryDO);
+
+    List<IndustryChildrenRespVO> convertList(List<IndustryDO> list);
+}

+ 18 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/PositionConvert.java

@@ -0,0 +1,18 @@
+package com.citu.module.menduner.system.convert;
+
+import com.citu.module.menduner.system.controller.admin.position.vo.PositionChildrenRespVO;
+import com.citu.module.menduner.system.dal.dataobject.position.PositionDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+@Mapper
+public interface PositionConvert {
+
+    PositionConvert INSTANCE = Mappers.getMapper(PositionConvert.class);
+
+    PositionChildrenRespVO convert(PositionDO industryDO);
+
+    List<PositionChildrenRespVO> convertList(List<PositionDO> list);
+}

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/area/AreaDO.java

@@ -32,7 +32,7 @@ public class AreaDO extends BaseDO {
      */
     private String name;
     /**
-     * 区域类型
+     * 枚举 {@link AreaTypeEnum}
      */
     private Integer type;
     /**

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobAdvertisedDO.java

@@ -69,6 +69,10 @@ public class JobAdvertisedDO extends BaseDO {
      * 薪酬to
      */
     private Integer payTo;
+    /**
+     * 薪酬单位
+     */
+    private Integer payUnit;
     /**
      * 职位标签
      */

+ 5 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/area/AreaMapper.java

@@ -8,6 +8,7 @@ import com.citu.module.menduner.system.controller.admin.area.vo.AreaPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.area.AreaDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -37,4 +38,8 @@ public interface AreaMapper extends BaseMapperX<AreaDO> {
                 .orderByAsc(AreaDO::getId));
 
     }
+
+    default List<AreaDO> selectListByParentId(Collection<Long> parentIds) {
+        return selectList(AreaDO::getParentId, parentIds);
+    }
 }

+ 5 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/industry/IndustryMapper.java

@@ -8,6 +8,7 @@ import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryPage
 import com.citu.module.menduner.system.dal.dataobject.industry.IndustryDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Collection;
 import java.util.List;
 
 
@@ -35,6 +36,10 @@ public interface IndustryMapper extends BaseMapperX<IndustryDO> {
                 .orderByAsc(IndustryDO::getUpdateTime));
     }
 
+    default List<IndustryDO> selectListByParentId(Collection<Long> parentIds) {
+        return selectList(IndustryDO::getParentId, parentIds);
+    }
+
     /**
      * 清空行业数据
      **/

+ 6 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/position/PositionMapper.java

@@ -5,9 +5,11 @@ import com.citu.framework.mybatis.core.mapper.BaseMapperX;
 import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.citu.module.menduner.system.controller.admin.position.vo.PositionListReqVO;
 import com.citu.module.menduner.system.controller.admin.position.vo.PositionPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.industry.IndustryDO;
 import com.citu.module.menduner.system.dal.dataobject.position.PositionDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Collection;
 import java.util.List;
 
 /**
@@ -38,6 +40,10 @@ public interface PositionMapper extends BaseMapperX<PositionDO> {
                 .orderByAsc(PositionDO::getId));
     }
 
+    default List<PositionDO> selectListByParentId(Collection<Long> parentIds) {
+        return selectList(PositionDO::getParentId, parentIds);
+    }
+
     /**
      * 清空职位数据
      **/

+ 22 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/redis/RedisKeyConstants.java

@@ -32,7 +32,29 @@ public interface RedisKeyConstants {
      */
     String MDE_USER_ROLE_ID_LIST = "mde_user_role_ids";
 
+    /**
+     * 指定区域的所有子区域信息的缓存
+     * <p>
+     * KEY 格式:mde_area_children:{id}
+     * VALUE 数据类型:String 子区域编号集合
+     */
+    String MDE_AREA_CHILDREN_id_LIST ="mde_area_children";
+
+    /**
+     * 指定职位的所有子区域信息的缓存
+     * <p>
+     * KEY 格式:mde_area_children:{id}
+     * VALUE 数据类型:String 子职位编号集合
+     */
+    String MDE_POSITION_CHILDREN_id_LIST ="mde_position_children";
 
+    /**
+     * 指定行业的所有子行业信息的缓存
+     * <p>
+     * KEY 格式:mde_area_children:{id}
+     * VALUE 数据类型:String 子行业编号集合
+     */
+    String MDE_INDUSTRY_CHILDREN_id_LIST ="mde_industry_children";
 
 
 }

+ 16 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/area/AreaService.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.system.service.area;
 
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.admin.area.vo.AreaChildrenRespVO;
 import com.citu.module.menduner.system.controller.admin.area.vo.AreaListReqVO;
 import com.citu.module.menduner.system.controller.admin.area.vo.AreaPageReqVO;
 import com.citu.module.menduner.system.controller.admin.area.vo.AreaSaveReqVO;
@@ -61,8 +62,23 @@ public interface AreaService {
      * @return 地区列表
      */
     List<AreaDO> getAreaList(AreaListReqVO listReqVO);
+
     /**
      * 根据地区名称获取详细信息
      */
     AreaDO getAreaByName(String name);
+
+    /**
+     * 根据区域id获得地区列表
+     *
+     * @param id 查询条件
+     * @return 地区列表
+     **/
+    List<AreaChildrenRespVO> getAreaIdChildren(Long id);
+
+    /**
+     * 获取中国的区域
+     * @param reqVO 查询条件
+     **/
+    List<AreaChildrenRespVO> getArea(AreaListReqVO reqVO);
 }

+ 72 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/area/AreaServiceImpl.java

@@ -1,19 +1,28 @@
 package com.citu.module.menduner.system.service.area;
 
+import cn.hutool.core.collection.CollUtil;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.admin.area.vo.AreaChildrenRespVO;
 import com.citu.module.menduner.system.controller.admin.area.vo.AreaListReqVO;
 import com.citu.module.menduner.system.controller.admin.area.vo.AreaPageReqVO;
 import com.citu.module.menduner.system.controller.admin.area.vo.AreaSaveReqVO;
+import com.citu.module.menduner.system.convert.AreaConvert;
 import com.citu.module.menduner.system.dal.dataobject.area.AreaDO;
 import com.citu.module.menduner.system.dal.mysql.area.AreaMapper;
+import com.citu.module.menduner.system.dal.redis.RedisKeyConstants;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.framework.common.util.collection.CollectionUtils.convertSet;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_AREA_NOT_EXISTS;
 
 /**
@@ -27,7 +36,8 @@ public class AreaServiceImpl implements AreaService {
 
     @Resource
     private AreaMapper areaMapper;
-
+    @Resource
+    private  RedisTemplate<String, AreaChildrenRespVO> redisTemplate;
     @Override
     public Long createArea(AreaSaveReqVO createReqVO) {
         // 插入
@@ -38,6 +48,8 @@ public class AreaServiceImpl implements AreaService {
     }
 
     @Override
+    @CacheEvict(cacheNames = RedisKeyConstants.MDE_AREA_CHILDREN_id_LIST,
+            allEntries = true) // allEntries 清空所有缓存,因为操作一个区域,涉及到多个缓存
     public void updateArea(AreaSaveReqVO updateReqVO) {
         // 校验存在
         validateAreaExists(updateReqVO.getId());
@@ -47,6 +59,8 @@ public class AreaServiceImpl implements AreaService {
     }
 
     @Override
+    @CacheEvict(cacheNames = RedisKeyConstants.MDE_AREA_CHILDREN_id_LIST,
+            allEntries = true) // allEntries 清空所有缓存,因为操作一个区域,涉及到多个缓存
     public void deleteArea(Long id) {
         // 校验存在
         validateAreaExists(id);
@@ -79,4 +93,60 @@ public class AreaServiceImpl implements AreaService {
     public AreaDO getAreaByName(String name) {
         return areaMapper.selectOne(AreaDO::getName, name);
     }
+
+    @Override
+    @Cacheable(cacheNames = RedisKeyConstants.MDE_AREA_CHILDREN_id_LIST, key = "#id", unless = "#result.size==0")
+    public List<AreaChildrenRespVO> getAreaIdChildren(Long id) {
+        List<AreaChildrenRespVO> children = new LinkedList<>();
+        // 遍历每一层
+        Collection<Long> parentIds = Collections.singleton(id);
+        for (int i = 0; i < Short.MAX_VALUE; i++) { // 使用 Short.MAX_VALUE 避免 bug 场景下,存在死循环
+            // 查询当前层,所有的子区域
+            List<AreaDO> areaDOList = areaMapper.selectListByParentId(parentIds);
+            // 1. 如果没有子区域,则结束遍历
+            if (CollUtil.isEmpty(areaDOList)) {
+                break;
+            }
+            // 2. 如果有子区域,继续遍历
+            children.addAll(AreaConvert.INSTANCE.convertList(areaDOList));
+            parentIds = convertSet(areaDOList, AreaDO::getId);
+        }
+        return children;
+    }
+
+    @Override
+    public List<AreaChildrenRespVO> getArea(AreaListReqVO reqVO){
+        List<AreaDO> areaList = areaMapper.selectList(reqVO);
+        if (null == areaList) {
+            return null;
+        }
+        List<AreaChildrenRespVO> convertList = AreaConvert.INSTANCE.convertList(areaList);
+        //获取父节点
+        List<AreaChildrenRespVO> collect = convertList.stream().filter(m -> m.getParentId() == 0).map(
+                (m) -> {
+                    m.setChildren(getChildren(m, convertList));
+                    return m;
+                }
+        ).collect(Collectors.toList());
+        return collect;
+    }
+
+    /**
+     * 递归查询子节点
+     * @param root  根节点
+     * @param all   所有节点
+     * @return 根节点信息
+     */
+    private List<AreaChildrenRespVO> getChildren(AreaChildrenRespVO root, List<AreaChildrenRespVO> all) {
+        List<AreaChildrenRespVO> children = all.stream().filter(m -> {
+            return Objects.equals(m.getParentId(), root.getId());
+        }).map(
+                (m) -> {
+                    m.setChildren(getChildren(m, all));
+                    return m;
+                }
+        ).collect(Collectors.toList());
+        return children;
+    }
+
 }

+ 15 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/industry/IndustryService.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.system.service.industry;
 
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryChildrenRespVO;
 import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryListReqVO;
 import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryPageReqVO;
 import com.citu.module.menduner.system.controller.admin.industry.vo.IndustrySaveReqVO;
@@ -67,4 +68,18 @@ public interface IndustryService {
      */
     void syncBossIndustry();
 
+    /**
+     * 根据行业id获得地区列表
+     *
+     * @param id 查询条件
+     * @return 地区列表
+     **/
+    List<IndustryChildrenRespVO> getIndustryIdChildren(Long id);
+
+    /**
+     * 获取中国的行业
+     * @param reqVO 查询条件
+     **/
+    List<IndustryChildrenRespVO> getIndustry(IndustryListReqVO reqVO);
+
 }

+ 74 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/industry/IndustryServiceImpl.java

@@ -1,13 +1,21 @@
 package com.citu.module.menduner.system.service.industry;
 
+import cn.hutool.core.collection.CollUtil;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
+
+import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryChildrenRespVO;
 import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryListReqVO;
 import com.citu.module.menduner.system.controller.admin.industry.vo.IndustryPageReqVO;
 import com.citu.module.menduner.system.controller.admin.industry.vo.IndustrySaveReqVO;
+import com.citu.module.menduner.system.convert.IndustryConvert;
+
 import com.citu.module.menduner.system.dal.dataobject.industry.IndustryDO;
 import com.citu.module.menduner.system.dal.mysql.industry.IndustryMapper;
+import com.citu.module.menduner.system.dal.redis.RedisKeyConstants;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -15,10 +23,11 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.framework.common.util.collection.CollectionUtils.convertSet;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_INDUSTRY_NOT_EXISTS;
 
 
@@ -40,6 +49,8 @@ public class IndustryServiceImpl implements IndustryService {
     private RestTemplate restTemplate;
 
     @Override
+    @CacheEvict(cacheNames = RedisKeyConstants.MDE_INDUSTRY_CHILDREN_id_LIST,
+            allEntries = true)
     public Long createIndustry(IndustrySaveReqVO createReqVO) {
         // 插入
         IndustryDO industry = BeanUtils.toBean(createReqVO, IndustryDO.class);
@@ -49,6 +60,8 @@ public class IndustryServiceImpl implements IndustryService {
     }
 
     @Override
+    @CacheEvict(cacheNames = RedisKeyConstants.MDE_INDUSTRY_CHILDREN_id_LIST,
+            allEntries = true)
     public void updateIndustry(IndustrySaveReqVO updateReqVO) {
         // 校验存在
         validateIndustryExists(updateReqVO.getId());
@@ -58,6 +71,8 @@ public class IndustryServiceImpl implements IndustryService {
     }
 
     @Override
+    @CacheEvict(cacheNames = RedisKeyConstants.MDE_INDUSTRY_CHILDREN_id_LIST,
+            allEntries = true)
     public void deleteIndustry(Long id) {
         // 校验存在
         validateIndustryExists(id);
@@ -88,6 +103,8 @@ public class IndustryServiceImpl implements IndustryService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @CacheEvict(cacheNames = RedisKeyConstants.MDE_INDUSTRY_CHILDREN_id_LIST,
+            allEntries = true)
     public void syncBossIndustry() {
         log.info(" ========== 开始解析同步BOSS行业信息到数据库 ========== ");
         String url = "https://www.zhipin.com/wapi/zpCommon/data/industry.json";
@@ -136,4 +153,59 @@ public class IndustryServiceImpl implements IndustryService {
             }
         }
     }
+
+    @Override
+    public List<IndustryChildrenRespVO> getIndustry(IndustryListReqVO reqVO) {
+        List<IndustryDO> areaList = industryMapper.selectList(reqVO);
+        if (null == areaList) {
+            return null;
+        }
+        List<IndustryChildrenRespVO> convertList = IndustryConvert.INSTANCE.convertList(areaList);
+        //获取父节点
+        List<IndustryChildrenRespVO> collect = convertList.stream().filter(m -> m.getParentId() == 0).map(
+                (m) -> {
+                    m.setChildren(getChildren(m, convertList));
+                    return m;
+                }
+        ).collect(Collectors.toList());
+        return collect;
+    }
+
+    @Override
+    @Cacheable(cacheNames = RedisKeyConstants.MDE_INDUSTRY_CHILDREN_id_LIST, key = "#id", unless = "#result.size==0")
+    public List<IndustryChildrenRespVO> getIndustryIdChildren(Long id) {
+        List<IndustryChildrenRespVO> children = new LinkedList<>();
+        // 遍历每一层
+        Collection<Long> parentIds = Collections.singleton(id);
+        for (int i = 0; i < Short.MAX_VALUE; i++) { // 使用 Short.MAX_VALUE 避免 bug 场景下,存在死循环
+            // 查询当前层,所有的子节点
+            List<IndustryDO> areaDOList = industryMapper.selectListByParentId(parentIds);
+            // 1. 如果没有子节点,则结束遍历
+            if (CollUtil.isEmpty(areaDOList)) {
+                break;
+            }
+            // 2. 如果有子节点,继续遍历
+            children.addAll(IndustryConvert.INSTANCE.convertList(areaDOList));
+            parentIds = convertSet(areaDOList, IndustryDO::getId);
+        }
+        return children;
+    }
+
+    /**
+     * 递归查询子节点
+     * @param root  根节点
+     * @param all   所有节点
+     * @return 根节点信息
+     */
+    private List<IndustryChildrenRespVO> getChildren(IndustryChildrenRespVO root, List<IndustryChildrenRespVO> all) {
+        List<IndustryChildrenRespVO> children = all.stream().filter(m -> {
+            return Objects.equals(m.getParentId(), root.getId());
+        }).map(
+                (m) -> {
+                    m.setChildren(getChildren(m, all));
+                    return m;
+                }
+        ).collect(Collectors.toList());
+        return children;
+    }
 }

+ 21 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java

@@ -4,6 +4,7 @@ package com.citu.module.menduner.system.service.job;
 import java.util.*;
 import javax.validation.*;
 import com.citu.module.menduner.system.controller.admin.job.vo.*;
+import com.citu.module.menduner.system.controller.app.job.vo.AppJobHomeRespVO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.pojo.PageParam;
@@ -53,4 +54,24 @@ public interface JobAdvertisedService {
      */
     PageResult<JobAdvertisedDO> getJobAdvertisedPage(JobAdvertisedPageReqVO pageReqVO);
 
+    /**
+     * 获取推荐招聘职位分页
+     * @param pageParam 分页
+     * @return 门墩儿-招聘职位分页
+     **/
+    PageResult<AppJobHomeRespVO> getRecommendedJobPage(PageParam pageParam);
+
+    /**
+     * 获取最新招聘职位分页
+     * @param pageParam 分页
+     * @return 门墩儿-招聘职位分页
+     **/
+    PageResult<AppJobHomeRespVO> getLatestJobPage(PageParam pageParam);
+
+    /**
+     * 获取急聘招聘职位分页
+     * @param pageParam 分页
+     * @return 门墩儿-招聘职位分页
+     **/
+    PageResult<AppJobHomeRespVO> getUrgentJobPage(PageParam pageParam);
 }

+ 17 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java

@@ -1,10 +1,12 @@
 package com.citu.module.menduner.system.service.job;
 
 
+import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.module.menduner.system.controller.admin.job.vo.JobAdvertisedPageReqVO;
 import com.citu.module.menduner.system.controller.admin.job.vo.JobAdvertisedSaveReqVO;
+import com.citu.module.menduner.system.controller.app.job.vo.AppJobHomeRespVO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
 import org.springframework.stereotype.Service;
@@ -69,4 +71,19 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         return jobAdvertisedMapper.selectPage(pageReqVO);
     }
 
+
+    @Override
+    public PageResult<AppJobHomeRespVO> getRecommendedJobPage(PageParam pageParam) {
+        return null;
+    }
+
+    @Override
+    public PageResult<AppJobHomeRespVO> getLatestJobPage(PageParam pageParam) {
+        return null;
+    }
+
+    @Override
+    public PageResult<AppJobHomeRespVO> getUrgentJobPage(PageParam pageParam) {
+        return null;
+    }
 }

+ 21 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/position/PositionService.java

@@ -1,11 +1,14 @@
 package com.citu.module.menduner.system.service.position;
 
-import javax.validation.*;
-import com.citu.module.menduner.system.controller.admin.position.vo.*;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.admin.position.vo.PositionChildrenRespVO;
+import com.citu.module.menduner.system.controller.admin.position.vo.PositionListReqVO;
+import com.citu.module.menduner.system.controller.admin.position.vo.PositionPageReqVO;
+import com.citu.module.menduner.system.controller.admin.position.vo.PositionSaveReqVO;
 import com.citu.module.menduner.system.controller.app.position.vo.AppPositionClickReqVO;
 import com.citu.module.menduner.system.dal.dataobject.position.PositionDO;
-import com.citu.framework.common.pojo.PageResult;
 
+import javax.validation.Valid;
 import java.util.List;
 
 /**
@@ -70,4 +73,19 @@ public interface PositionService {
      * 同步boss职位类型
      */
     void syncBossPosition();
+
+    /**
+     * 根据职位id获得职位列表
+     *
+     * @param id 查询条件
+     * @return 地区列表
+     **/
+    List<PositionChildrenRespVO> getPositionIdChildren(Long id);
+
+    /**
+     * 获取职位信息
+     *
+     * @param reqVO 查询条件
+     **/
+    List<PositionChildrenRespVO> getPosition(PositionListReqVO reqVO);
 }

+ 71 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/position/PositionServiceImpl.java

@@ -1,17 +1,23 @@
 package com.citu.module.menduner.system.service.position;
 
+import cn.hutool.core.collection.CollUtil;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.admin.position.vo.PositionChildrenRespVO;
 import com.citu.module.menduner.system.controller.admin.position.vo.PositionListReqVO;
 import com.citu.module.menduner.system.controller.admin.position.vo.PositionPageReqVO;
 import com.citu.module.menduner.system.controller.admin.position.vo.PositionSaveReqVO;
 import com.citu.module.menduner.system.controller.app.position.vo.AppPositionClickReqVO;
 import com.citu.module.menduner.system.controller.app.visits.vo.AppMdeVisitsSaveReqVO;
+import com.citu.module.menduner.system.convert.PositionConvert;
 import com.citu.module.menduner.system.dal.dataobject.position.PositionDO;
 import com.citu.module.menduner.system.dal.mysql.position.PositionMapper;
+import com.citu.module.menduner.system.dal.redis.RedisKeyConstants;
 import com.citu.module.menduner.system.enums.visits.MdeVisitsEnum;
 import com.citu.module.menduner.system.service.visits.MdeVisitsService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -20,10 +26,11 @@ import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.framework.common.util.collection.CollectionUtils.convertSet;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_POSITION_NOT_EXISTS;
 
 /**
@@ -75,6 +82,8 @@ public class PositionServiceImpl implements PositionService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    @CacheEvict(cacheNames = RedisKeyConstants.MDE_POSITION_CHILDREN_id_LIST,
+            allEntries = true)
     public Long createPosition(PositionSaveReqVO createReqVO) {
         // 插入
         PositionDO position = BeanUtils.toBean(createReqVO, PositionDO.class);
@@ -84,6 +93,8 @@ public class PositionServiceImpl implements PositionService {
     }
 
     @Override
+    @CacheEvict(cacheNames = RedisKeyConstants.MDE_POSITION_CHILDREN_id_LIST,
+            allEntries = true)
     public void updatePosition(PositionSaveReqVO updateReqVO) {
         // 校验存在
         validatePositionExists(updateReqVO.getId());
@@ -93,6 +104,8 @@ public class PositionServiceImpl implements PositionService {
     }
 
     @Override
+    @CacheEvict(cacheNames = RedisKeyConstants.MDE_POSITION_CHILDREN_id_LIST,
+            allEntries = true)
     public void deletePosition(Long id) {
         // 校验存在
         validatePositionExists(id);
@@ -156,4 +169,60 @@ public class PositionServiceImpl implements PositionService {
         log.info(" ========== 同步BOSS职业类型完成 ========== ");
     }
 
+    @Override
+    public List<PositionChildrenRespVO> getPosition(PositionListReqVO reqVO) {
+        List<PositionDO> areaList = positionMapper.selectList(reqVO);
+        if (null == areaList) {
+            return null;
+        }
+        List<PositionChildrenRespVO> convertList = PositionConvert.INSTANCE.convertList(areaList);
+        //获取父节点
+        List<PositionChildrenRespVO> collect = convertList.stream().filter(m -> m.getParentId() == 0).map(
+                (m) -> {
+                    m.setChildren(getChildren(m, convertList));
+                    return m;
+                }
+        ).collect(Collectors.toList());
+        return collect;
+    }
+
+    @Override
+    @Cacheable(cacheNames = RedisKeyConstants.MDE_POSITION_CHILDREN_id_LIST, key = "#id", unless = "#result.size==0")
+    public List<PositionChildrenRespVO> getPositionIdChildren(Long id) {
+        List<PositionChildrenRespVO> children = new LinkedList<>();
+        // 遍历每一层
+        Collection<Long> parentIds = Collections.singleton(id);
+        for (int i = 0; i < Short.MAX_VALUE; i++) { // 使用 Short.MAX_VALUE 避免 bug 场景下,存在死循环
+            // 查询当前层,所有的子节点
+            List<PositionDO> areaDOList = positionMapper.selectListByParentId(parentIds);
+            // 1. 如果没有子节点,则结束遍历
+            if (CollUtil.isEmpty(areaDOList)) {
+                break;
+            }
+            // 2. 如果有子节点,继续遍历
+            children.addAll(PositionConvert.INSTANCE.convertList(areaDOList));
+            parentIds = convertSet(areaDOList, PositionDO::getId);
+        }
+        return children;
+    }
+
+    /**
+     * 递归查询子节点
+     *
+     * @param root 根节点
+     * @param all  所有节点
+     * @return 根节点信息
+     */
+    private List<PositionChildrenRespVO> getChildren(PositionChildrenRespVO root, List<PositionChildrenRespVO> all) {
+        List<PositionChildrenRespVO> children = all.stream().filter(m -> {
+            return Objects.equals(m.getParentId(), root.getId());
+        }).map(
+                (m) -> {
+                    m.setChildren(getChildren(m, all));
+                    return m;
+                }
+        ).collect(Collectors.toList());
+        return children;
+    }
+
 }