Kaynağa Gözat

1、增加最佳东方的行业、职位的同步
2、增肌招聘职位列表接口

rayson 10 ay önce
ebeveyn
işleme
9a2089c1fd
12 değiştirilmiş dosya ile 251 ekleme ve 22 silme
  1. 5 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/industry/IndustryController.java
  2. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobAdvertisedController.java
  3. 6 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/position/PositionController.java
  4. 15 16
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/AppPersonController.java
  5. 44 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedReqVO.java
  6. 16 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobAdvertisedMapper.java
  7. 5 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/industry/IndustryService.java
  8. 52 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/industry/IndustryServiceImpl.java
  9. 8 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java
  10. 7 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  11. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/position/PositionService.java
  12. 80 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/position/PositionServiceImpl.java

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

@@ -107,6 +107,10 @@ public class IndustryController {
         industryService.syncBossIndustry();
     }
 
-
+    @GetMapping("/sync/veryeast")
+    @Operation(summary = "同步最佳东方行业信息")
+    public void syncVeryeastIndustry() {
+        industryService.syncVeryeastIndustry();
+    }
 
 }

+ 9 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobAdvertisedController.java

@@ -8,6 +8,7 @@ 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.base.job.JobAdvertisedPageReqVO;
+import com.citu.module.menduner.system.controller.base.job.JobAdvertisedReqVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
@@ -78,6 +79,14 @@ public class JobAdvertisedController {
         return success(BeanUtils.toBean(pageResult, JobAdvertisedRespVO.class));
     }
 
+    @GetMapping("/list")
+    @Operation(summary = "获得招聘职位列表")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:query')")
+    public CommonResult<List<JobAdvertisedRespVO>> getJobAdvertisedList(@Valid JobAdvertisedReqVO reqVO) {
+        List<JobAdvertisedDO> list = jobAdvertisedService.list(reqVO);
+        return success(BeanUtils.toBean(list, JobAdvertisedRespVO.class));
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "导出招聘职位 Excel")
     @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:export')")

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

@@ -106,4 +106,10 @@ public class PositionController {
         positionService.syncBossPosition();
     }
 
+    @GetMapping("/sync/veryeast")
+    @Operation(summary = "同步最佳东方职位类型")
+    public void syncVeryeastPosition() {
+        positionService.syncVeryeastPosition();
+    }
+
 }

+ 15 - 16
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/AppPersonController.java

@@ -63,6 +63,13 @@ public class AppPersonController {
         return success(result);
     }
 
+    @PreAuthenticated
+    @DeleteMapping("/job/unfavorite")
+    @Operation(summary = "用户取消收藏职位")
+    public CommonResult<Boolean> unFavorite(@RequestParam("jobId") Long jobId) {
+        Boolean result = jobFavoriteService.unFavorite(jobId);
+        return success(result);
+    }
 
     @PreAuthenticated
     @PostMapping("/enterprise/subscribe")
@@ -72,6 +79,14 @@ public class AppPersonController {
         return success(result);
     }
 
+    @PreAuthenticated
+    @DeleteMapping("/enterprise/unsubscribe")
+    @Operation(summary = "用户取消关注订阅企业")
+    public CommonResult<Boolean> unsubscribe(@RequestParam("enterpriseId") Long enterpriseId) {
+        Boolean result = enterpriseSubscribeService.unSubscribe(enterpriseId);
+        return success(result);
+    }
+
     @PreAuthenticated
     @PostMapping("/get/job/favorite/page")
     @Operation(summary = "获取收藏的招聘职位分页")
@@ -88,22 +103,6 @@ public class AppPersonController {
         return success(jobIntegrationService.getEnterpriseSubscribePage(reqVO));
     }
 
-    @PreAuthenticated
-    @DeleteMapping("/job/unfavorite")
-    @Operation(summary = "用户取消收藏职位")
-    public CommonResult<Boolean> unFavorite(@RequestParam("jobId") Long jobId) {
-        Boolean result = jobFavoriteService.unFavorite(jobId);
-        return success(result);
-    }
-
-    @PreAuthenticated
-    @DeleteMapping("/enterprise/unsubscribe")
-    @Operation(summary = "用户取消关注订阅企业")
-    public CommonResult<Boolean> unsubscribe(Long enterpriseId) {
-        Boolean result = enterpriseSubscribeService.unSubscribe(enterpriseId);
-        return success(result);
-    }
-
 
     @PreAuthenticated
     @GetMapping("/job/favorite/count")

+ 44 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/job/JobAdvertisedReqVO.java

@@ -0,0 +1,44 @@
+package com.citu.module.menduner.system.controller.base.job;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "招聘职位查询条件 Request VO")
+@Data
+public class JobAdvertisedReqVO {
+
+    @Schema(description = "招聘职位id", example = "29465")
+    private List<Long> id;
+
+    @Schema(description = "企业id", example = "29465")
+    private Long enterpriseId;
+
+    @Schema(description = "发布用户id", example = "9592")
+    private Long userId;
+
+    @Schema(description = "工作地区", example = "25976")
+    private Long areaId;
+
+    @Schema(description = "职位名称", example = "张三")
+    private String name;
+
+    @Schema(description = "职位类型id", example = "31707")
+    private Long positionId;
+
+    @Schema(description = "招聘类型", example = "2")
+    private String type;
+
+    @Schema(description = "工作经验", example = "1")
+    private String expType;
+
+    @Schema(description = "学历要求", example = "1")
+    private String eduType;
+
+    @Schema(description = "是否雇佣 (众聘)")
+    private boolean hire;
+
+    @Schema(description = "职位状态", example = "2")
+    private String status;
+}

+ 16 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobAdvertisedMapper.java

@@ -17,6 +17,7 @@ import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJ
 import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisReqVO;
 import com.citu.module.menduner.system.controller.base.analysis.RecruitJobAnalysisRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedPageReqVO;
+import com.citu.module.menduner.system.controller.base.job.JobAdvertisedReqVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.dataobject.visits.MdeVisitsDO;
@@ -54,6 +55,21 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
                 .orderByDesc(JobAdvertisedDO::getId));
     }
 
+    default List<JobAdvertisedDO> list(JobAdvertisedReqVO reqVO) {
+        return selectList(new LambdaQueryWrapperX<JobAdvertisedDO>()
+                .inIfPresent(JobAdvertisedDO::getId, reqVO.getId())
+                .eqIfPresent(JobAdvertisedDO::getEnterpriseId, reqVO.getEnterpriseId())
+                .eqIfPresent(JobAdvertisedDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(JobAdvertisedDO::getAreaId, reqVO.getAreaId())
+                .likeIfPresent(JobAdvertisedDO::getName, reqVO.getName())
+                .eqIfPresent(JobAdvertisedDO::getPositionId, reqVO.getPositionId())
+                .eqIfPresent(JobAdvertisedDO::getType, reqVO.getType())
+                .eqIfPresent(JobAdvertisedDO::getExpType, reqVO.getExpType())
+                .eqIfPresent(JobAdvertisedDO::getEduType, reqVO.getEduType())
+                .eqIfPresent(JobAdvertisedDO::getHire, reqVO.isHire())
+                .eqIfPresent(JobAdvertisedDO::getStatus, reqVO.getStatus())
+                .orderByDesc(JobAdvertisedDO::getId));
+    }
     default Long countByEnterpriseId(Long enterpriseId) {
         return selectCount(new LambdaQueryWrapperX<JobAdvertisedDO>()
                 .eq(JobAdvertisedDO::getEnterpriseId, enterpriseId)

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

@@ -70,6 +70,11 @@ public interface IndustryService {
      */
     void syncBossIndustry();
 
+    /**
+     * 同步最佳东方行业数据
+     */
+    void syncVeryeastIndustry();
+
     /**
      * 根据行业id获得地区列表
      *

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

@@ -143,6 +143,58 @@ public class IndustryServiceImpl implements IndustryService {
         log.info(" ========== 同步BOSS行业信息完成 ========== ");
     }
 
+    @Override
+    @DSTransactional
+    @CacheEvict(cacheNames =
+            {
+                    RedisKeyConstants.MDE_INDUSTRY_CHILDREN,
+                    RedisKeyConstants.MDE_INDUSTRY_TREE
+            },
+            allEntries = true)
+    public void syncVeryeastIndustry() {
+
+        log.info(" ========== 开始解析同步最佳东方行业信息到数据库 ========== ");
+        String url = "https://dfws-file.veimg.cn/dict/ve/cn/common/options.json";
+        ResponseEntity<Map> responseEntity = restTemplate.getForEntity(url, Map.class);
+        log.debug("[httpRequest][RequestType({}) 的响应结果({})", responseEntity);
+        if (!responseEntity.getStatusCode().is2xxSuccessful()) {
+            log.error("同步最佳东方行业信息错误");
+            return;
+        }
+        // 获取响应体中的数据
+        Map<String, Object> responseBody = responseEntity.getBody();
+
+        LinkedHashMap<String, Object> resultMap = (LinkedHashMap<String, Object>) responseBody.get("data");
+        // 行业分类
+        List<Map<String, Object>> companyIndustry = (List<Map<String, Object>>) resultMap.get("company-industry");
+        // 行业类型
+        List<Map<String, Object>> companyType = (List<Map<String, Object>>) resultMap.get("company-type");
+
+        // 清空数据
+        industryMapper.truncate();
+
+        Map<String, Long> idMap = new HashMap<>();
+        for (Map<String, Object> industry : companyIndustry) {
+            IndustryDO obj = IndustryDO.builder()
+                    .nameCn(industry.get("value").toString())
+                    .parentId(0L)
+                    .level(1).build();
+
+            industryMapper.insert(obj);
+            idMap.put(industry.get("id").toString(), obj.getId());
+        }
+        // 再保存companyType
+        for (Map<String, Object> industry : companyType) {
+            IndustryDO obj = IndustryDO.builder()
+                    .nameCn(industry.get("value").toString())
+                    .parentId(idMap.getOrDefault(industry.get("parent_id").toString(),0L))
+                    .level(2).build();
+
+            industryMapper.insert(obj);
+        }
+        log.info(" ========== 同步最佳东方行业信息完成 ========== ");
+    }
+
     /**
      * @param industry 职位对象
      * @param parentId 上级职位code

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

@@ -14,6 +14,7 @@ import com.citu.module.menduner.system.controller.base.analysis.RecruitAnalysisR
 import com.citu.module.menduner.system.controller.base.analysis.RecruitJobAnalysisRespVO;
 import com.citu.module.menduner.system.controller.base.analysis.RecruitJobCvRelAnalysisRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedPageReqVO;
+import com.citu.module.menduner.system.controller.base.job.JobAdvertisedReqVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 
@@ -66,6 +67,13 @@ public interface JobAdvertisedService {
      */
     PageResult<JobAdvertisedDO> getJobAdvertisedPage(JobAdvertisedPageReqVO pageReqVO);
 
+    /**
+     * 获得招聘职位列表
+     *
+     * @param reqVO 列表查询
+     * @return 招聘职位列表
+     */
+    List<JobAdvertisedDO> list(JobAdvertisedReqVO reqVO);
 
     // ========== 求职端 ==========
 

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

@@ -20,6 +20,7 @@ import com.citu.module.menduner.system.controller.base.analysis.RecruitJobAnalys
 import com.citu.module.menduner.system.controller.base.contact.EnterpriseUserContactRespVO;
 import com.citu.module.menduner.system.controller.base.enterprise.vo.EnterpriseBaseSimpleRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedPageReqVO;
+import com.citu.module.menduner.system.controller.base.job.JobAdvertisedReqVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedSaveReqVO;
 import com.citu.module.menduner.system.convert.JobAdvertisedConvert;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
@@ -40,10 +41,7 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Collection;
-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;
@@ -122,6 +120,11 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         return jobAdvertisedMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public List<JobAdvertisedDO> list(JobAdvertisedReqVO reqVO) {
+        return jobAdvertisedMapper.list(reqVO);
+    }
+
     @Override
     public PageResult<AppJobAdvertisedHomeRespVO> getRecommendedPage(PageParam pageParam) {
 

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

@@ -77,6 +77,10 @@ public interface PositionService {
      */
     void syncBossPosition();
 
+    /**
+     * 同步最佳东方职位类型
+     */
+    void syncVeryeastPosition();
     /**
      * 根据职位id获得职位列表
      *

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

@@ -156,6 +156,12 @@ public class PositionServiceImpl implements PositionService {
 
     @Override
     @DSTransactional // 单机+多数据源方案,使用 @DSTransactional 保证本地事务,以及数据源的切换
+    @CacheEvict(cacheNames =
+            {
+                    RedisKeyConstants.MDE_POSITION_CHILDREN,
+                    RedisKeyConstants.MDE_POSITION_TREE
+            },
+            allEntries = true)
     public void syncBossPosition() {
         log.info(" ========== 开始解析同步BOSS职业类型到数据库 ========== ");
         String url = "https://www.zhipin.com/wapi/zpCommon/data/getCityShowPosition";
@@ -180,6 +186,79 @@ public class PositionServiceImpl implements PositionService {
         log.info(" ========== 同步BOSS职业类型完成 ========== ");
     }
 
+    @Override
+    @DSTransactional // 单机+多数据源方案,使用 @DSTransactional 保证本地事务,以及数据源的切换
+    @CacheEvict(cacheNames =
+            {
+                    RedisKeyConstants.MDE_POSITION_CHILDREN,
+                    RedisKeyConstants.MDE_POSITION_TREE
+            },
+            allEntries = true)
+    public void syncVeryeastPosition() {
+        log.info(" ========== 开始解析同步最佳东方职业类型到数据库 ========== ");
+        String url = "https://dfws-file.veimg.cn/dict/ve/cn/common/job.json";
+        ResponseEntity<Map> responseEntity = restTemplate.getForEntity(url, Map.class);
+        log.debug("[httpRequest][RequestType({}) 的响应结果({})", responseEntity);
+        if (!responseEntity.getStatusCode().is2xxSuccessful()) {
+            log.error("同步最佳东方职位类型错误");
+            return;
+        }
+        // 获取响应体中的数据
+        Map<String, Object> responseBody = responseEntity.getBody();
+
+        LinkedHashMap<String, Object> resultMap = (LinkedHashMap<String, Object>) responseBody.get("data");
+        // 职位分类
+        List<Map<String, Object>> jobList = (List<Map<String, Object>>) resultMap.get("job");
+
+        // 清空数据
+        positionMapper.truncate();
+
+        // 获取一级职位分类
+        List<Map<String, Object>> positionList = jobList.stream()
+                .filter(map -> map.get("parent_id").toString().equals("0"))
+                .collect(Collectors.toList());
+
+        for (Map<String, Object> position : positionList) {
+
+            PositionDO obj = PositionDO.builder()
+                    .nameCn(position.get("value").toString())
+                    .parentId(0L)
+                    .level(1).build();
+            positionMapper.insert(obj);
+
+            // 递归处理子分类
+            parseAndSavePosition(position,jobList, obj.getId(), obj.getLevel() + 1);
+
+        }
+
+        log.info(" ========== 同步最佳东方职业类型完成 ========== ");
+
+    }
+
+    public void parseAndSavePosition(Map<String, Object> position,
+                                     List<Map<String, Object>> jobList,
+                                     Long parentId,
+                                     int level) {
+        if (null == parentId) {
+            parentId = 0L;
+        }
+
+        List<Map<String, Object>> childList = jobList.stream()
+                .filter(map -> map.get("parent_id").toString().equals(position.get("code").toString()))
+                .collect(Collectors.toList());
+        for (Map<String, Object> child : childList) {
+            PositionDO childObj = PositionDO.builder()
+                    .nameCn(child.get("value").toString())
+                    .parentId(parentId)
+                    .level(level).build();
+            positionMapper.insert(childObj); // 假设insertReturnId方法返回新插入记录的ID
+
+            // 继续递归处理更深层次的子分类
+            parseAndSavePosition(child,jobList, childObj.getId(), level + 1);
+        }
+
+    }
+
     @Override
     @Cacheable(cacheNames = RedisKeyConstants.MDE_POSITION_TREE, key = "#reqVO", unless = "#result.size==0")
     public List<AppPositionChildrenRespVO> getPosition(AppPositionListReqVO reqVO) {
@@ -291,7 +370,7 @@ public class PositionServiceImpl implements PositionService {
         List<AppPositionSimpleRespVO> list = PositionConvert.INSTANCE.convertList2(positionDOList);
         // 将埋点数据按照埋点次数排序
         list.sort(Comparator.comparingInt((AppPositionSimpleRespVO o) -> {
-            if(!idMap.containsKey(o.getId())) {
+            if (!idMap.containsKey(o.getId())) {
                 return 0;
             }
             return idMap.get(o.getId());