Forráskód Böngészése

1、增加招聘职位同步es逻辑
2、优化企业登录授权令牌逻辑
3、增加淘汰接口

rayson 1 éve
szülő
commit
aa3f5918df
29 módosított fájl, 312 hozzáadás és 91 törlés
  1. 1 1
      citu-framework/citu-spring-boot-starter-mq/pom.xml
  2. 0 1
      citu-framework/citu-spring-boot-starter-security/src/main/java/com/citu/framework/security/core/filter/TokenAuthenticationFilter.java
  3. 8 1
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/web/core/handler/GlobalExceptionHandler.java
  4. 1 0
      citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/controller/app/auth/AppAuthController.java
  5. 6 1
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/oauth2/OAuth2TokenApi.java
  6. 2 0
      citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/enums/oauth2/OAuth2ClientConstants.java
  7. 6 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/api/oauth2/OAuth2TokenApiImpl.java
  8. 1 0
      citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/oauth2/OAuth2TokenService.java
  9. 1 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  10. 22 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/cv/JobCvRelStatusEnum.java
  11. 4 1
      menduner/menduner-system-biz/pom.xml
  12. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/auth/AppMdeAuthController.java
  13. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/AppJobAdvertisedController.java
  14. 7 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/auth/AppAdminEnterpriseAuthController.java
  15. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/AppAdminJobAdvertisedController.java
  16. 1 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/vo/AppAdminJobSaveReqVO.java
  17. 15 5
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/AppAdminPersonCvController.java
  18. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/JobAdvertisedConvert.java
  19. 123 17
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/consumer/ESConsumer.java
  20. 6 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/message/ESJobAdvertisedMergeSendMessage.java
  21. 34 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/producer/ESProducer.java
  22. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeEnterpriseAuthService.java
  23. 12 8
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeEnterpriseAuthServiceImpl.java
  24. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java
  25. 8 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  26. 16 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelService.java
  27. 20 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelServiceImpl.java
  28. 4 35
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/sync/ESDataSyncServiceImpl.java
  29. 4 0
      menduner/menduner-system-biz/src/main/resources/application.yaml

+ 1 - 1
citu-framework/citu-spring-boot-starter-mq/pom.xml

@@ -36,7 +36,7 @@
         <dependency>
             <groupId>org.apache.rocketmq</groupId>
             <artifactId>rocketmq-spring-boot-starter</artifactId>
-            <optional>true</optional>
+<!--            <optional>true</optional>-->
         </dependency>
     </dependencies>
 

+ 0 - 1
citu-framework/citu-spring-boot-starter-security/src/main/java/com/citu/framework/security/core/filter/TokenAuthenticationFilter.java

@@ -145,7 +145,6 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
             return JsonUtils.parseObject(loginUserStr, LoginUser.class);
         } catch (Exception ex) {
             log.error("[buildLoginUserByHeader][解析 LoginUser({}) 发生异常]", loginUserStr, ex);
-            ;
             throw ex;
         }
     }

+ 8 - 1
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/web/core/handler/GlobalExceptionHandler.java

@@ -17,7 +17,6 @@ import com.citu.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.InvalidPropertyException;
-import org.springframework.beans.NullValueInNestedPathException;
 import org.springframework.context.MessageSource;
 import org.springframework.context.i18n.LocaleContextHolder;
 import org.springframework.security.access.AccessDeniedException;
@@ -37,6 +36,7 @@ import javax.validation.ConstraintViolation;
 import javax.validation.ConstraintViolationException;
 import javax.validation.ValidationException;
 import java.time.LocalDateTime;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
@@ -122,6 +122,13 @@ public class GlobalExceptionHandler {
             // 国际化关闭
             return CommonResult.error(code, msg);
         }
+        // 系统错误码存在自定义错误内容的情况
+        if (LocaleContextHolder.getLocale().equals(Locale.CHINA)
+                && code.toString().length() < 10) {
+            // TODO 有部分系统错误码+自定义错误内容的逻辑 待更改,暂时先限制中文才返回
+            return CommonResult.error(code, msg);
+        }
+
         // 国际化开启
         String i18nMsg = messageSource.getMessage(StrUtils.formatNumberWithUnderscores(code, 10),
                 null, LocaleContextHolder.getLocale());

+ 1 - 0
citu-module-member/citu-module-member-biz/src/main/java/com/citu/module/member/controller/app/auth/AppAuthController.java

@@ -60,6 +60,7 @@ public class AppAuthController {
         return success(true);
     }
 
+    @PermitAll
     @PostMapping("/refresh-token")
     @Operation(summary = "刷新令牌")
     @Parameter(name = "refreshToken", description = "刷新令牌", required = true)

+ 6 - 1
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/api/oauth2/OAuth2TokenApi.java

@@ -36,6 +36,11 @@ public interface OAuth2TokenApi {
     @Parameter(name = "accessToken", description = "访问令牌", required = true, example = "tudou")
     CommonResult<OAuth2AccessTokenCheckRespDTO> checkAccessToken(@RequestParam("accessToken") String accessToken);
 
+    @GetMapping(PREFIX + "/get")
+    @Operation(summary = "获取访问令牌")
+    @Parameter(name = "accessToken", description = "访问令牌", required = true, example = "tudou")
+    CommonResult<OAuth2AccessTokenCheckRespDTO> getAccessToken(@RequestParam("accessToken") String accessToken);
+
     @DeleteMapping(PREFIX + "/remove")
     @Operation(summary = "移除访问令牌")
     @Parameter(name = "accessToken", description = "访问令牌", required = true, example = "tudou")
@@ -59,6 +64,6 @@ public interface OAuth2TokenApi {
     })
     CommonResult<OAuth2AccessTokenRespDTO> refreshAccessToken2(@RequestParam("refreshToken") String refreshToken,
                                                                @RequestParam("clientId") String clientId,
-                                                               @RequestParam(value = "userInfo", required = false) Map<String, String> userInfo);
+                                                               @RequestBody(required = false) Map<String, String> userInfo);
 
 }

+ 2 - 0
citu-module-system/citu-module-system-api/src/main/java/com/citu/module/system/enums/oauth2/OAuth2ClientConstants.java

@@ -12,4 +12,6 @@ public interface OAuth2ClientConstants {
 
     String CLIENT_ID_MENDUNER = "menduner";
 
+    String CLIENT_ID_MENDUNER_ADMIN = "menduner_admin";
+
 }

+ 6 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/api/oauth2/OAuth2TokenApiImpl.java

@@ -45,6 +45,12 @@ public class OAuth2TokenApiImpl implements OAuth2TokenApi {
         return success(BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenCheckRespDTO.class));
     }
 
+    @Override
+    public CommonResult<OAuth2AccessTokenCheckRespDTO> getAccessToken(String accessToken) {
+        OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.getAccessToken(accessToken);
+        return success(BeanUtils.toBean(accessTokenDO, OAuth2AccessTokenCheckRespDTO.class));
+    }
+
     @Override
     public CommonResult<OAuth2AccessTokenRespDTO> removeAccessToken(String accessToken) {
         OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.removeAccessToken(accessToken);

+ 1 - 0
citu-module-system/citu-module-system-biz/src/main/java/com/citu/module/system/service/oauth2/OAuth2TokenService.java

@@ -79,6 +79,7 @@ public interface OAuth2TokenService {
      */
     OAuth2AccessTokenDO checkAccessToken(String accessToken);
 
+
     /**
      * 移除访问令牌
      * 注意:该流程中,会移除相关的刷新令牌

+ 1 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java

@@ -159,6 +159,7 @@ public interface ErrorCodeConstants {
     ErrorCode MDE_AUTH_TOKEN_NOT_NULL = new ErrorCode(1_200_002_018, "访问令牌不能为空");
 
 
+
     // ========== 角色模块 1_200_003_000 ==========
     ErrorCode MDE_ROLE_NOT_EXISTS = new ErrorCode(1_200_003_001, "角色不存在");
     ErrorCode MDE_ROLE_NAME_DUPLICATE = new ErrorCode(1_200_003_002, "已经存在名为【{}】的角色");

+ 22 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/cv/JobCvRelStatusEnum.java

@@ -0,0 +1,22 @@
+package com.citu.module.menduner.system.enums.cv;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 简历投递状态(0 新投递 | 1 已查看 | 2 已邀约 | 3 已发offer 4 已入职 | 99 不合适 已淘汰)
+ **/
+@Getter
+@AllArgsConstructor
+public enum JobCvRelStatusEnum {
+    NEW("0", "新投递"),
+    LOOK("1", "已查看"),
+    INVITE("2", "已邀约"),
+    OFFER("3", "已发offer"),
+    ENTRY("4", "已入职"),
+    ELIMINATE("99", "不合适");
+
+    private final String status;
+
+    private final String name;
+}

+ 4 - 1
menduner/menduner-system-biz/pom.xml

@@ -58,6 +58,10 @@
             <artifactId>spring-boot-starter-captcha-plus</artifactId> <!-- 验证码,一般用于登录使用 -->
         </dependency>
 
+        <dependency>
+            <groupId>com.citu</groupId>
+            <artifactId>citu-spring-boot-starter-mq</artifactId>
+        </dependency>
 
         <!-- Web 相关 -->
         <dependency>
@@ -113,7 +117,6 @@
             <scope>test</scope>
         </dependency>
 
-
     </dependencies>
 
     <build>

+ 2 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/auth/AppMdeAuthController.java

@@ -20,6 +20,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.annotation.security.PermitAll;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 
@@ -62,7 +63,7 @@ public class AppMdeAuthController {
         return success(true);
     }
 
-
+    @PermitAll
     @PostMapping("/refresh-token")
     @Operation(summary = "刷新令牌")
     @Parameter(name = "refreshToken", description = "刷新令牌", required = true)

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

@@ -79,7 +79,7 @@ public class AppJobAdvertisedController {
     }
 
     @GetMapping("/search")
-    @Operation(summary = "根据条件搜索招聘职位")
+    @Operation(summary = "搜索")
     public CommonResult<PageResult<AppJobAdvertisedRespVO>> search(@Valid AppJobAdvertisedSearchPageReqVO pageReqVO) {
         PageResult<AppJobAdvertisedRespVO> respVO = jobIntegrationService.search(pageReqVO);
         return success(respVO);

+ 7 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/auth/AppAdminEnterpriseAuthController.java

@@ -56,11 +56,16 @@ public class AppAdminEnterpriseAuthController {
         return success(true);
     }
 
+    // 特殊接口需带上token,但是不进行token是否有效的效验
+    @PermitAll
     @PostMapping("/refresh-token")
     @Operation(summary = "刷新令牌")
     @Parameter(name = "refreshToken", description = "刷新令牌", required = true)
-    public CommonResult<AppMdeAuthLoginRespVO> refreshToken(@RequestParam("refreshToken") String refreshToken) {
-        return success(enterpriseAuthService.refreshToken(refreshToken));
+    public CommonResult<AppMdeAuthLoginRespVO> refreshToken(HttpServletRequest request,
+                                                            @RequestParam("refreshToken") String refreshToken) {
+        String accessToken = SecurityFrameworkUtils.obtainAuthorization(request,
+                securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
+        return success(enterpriseAuthService.refreshToken(accessToken,refreshToken));
     }
 
     // ========== 企业登录相关 ==========

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/AppAdminJobAdvertisedController.java

@@ -58,7 +58,7 @@ public class AppAdminJobAdvertisedController {
     @PreAuthenticated
     @PostMapping("/save")
     @Operation(summary = "保存职位(发布/编辑)")
-    public CommonResult<Boolean> save(@RequestBody @Valid AppAdminJobReqVO pageReqVO) {
+    public CommonResult<Boolean> save(@RequestBody @Valid AppAdminJobSaveReqVO pageReqVO) {
         jobAdvertisedService.save(pageReqVO);
         return success(true);
     }

+ 1 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/vo/AppAdminJobReqVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/vo/AppAdminJobSaveReqVO.java

@@ -12,7 +12,7 @@ import java.util.List;
 
 @Schema(description = "招聘者 - 招聘职位新增/修改 Request VO")
 @Data
-public class AppAdminJobReqVO {
+public class AppAdminJobSaveReqVO {
 
     @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "4770")
     private Long id;
@@ -62,8 +62,6 @@ public class AppAdminJobReqVO {
     @Schema(description = "过期时间")
     private LocalDateTime expireTime;
 
-    @Schema(description = "是否置顶")
-    private Boolean top;
 
     @Schema(description = "工作地址")
     private String address;

+ 15 - 5
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/AppAdminPersonCvController.java

@@ -6,15 +6,13 @@ import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.system.controller.appadmin.cv.AppAdminJobCvRelPageReqVO;
 import com.citu.module.menduner.system.controller.appadmin.cv.AppAdminJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonDetailRespVO;
+import com.citu.module.menduner.system.service.job.JobCvRelService;
 import com.citu.module.menduner.system.service.job.JobIntegrationService;
 import com.citu.module.menduner.system.service.person.PersonIntegrationService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
@@ -33,6 +31,9 @@ public class AppAdminPersonCvController {
     @Resource
     private PersonIntegrationService personIntegrationService;
 
+    @Resource
+    private JobCvRelService jobCvRelService;
+
 
     @PreAuthenticated
     @GetMapping("/page")
@@ -44,10 +45,19 @@ public class AppAdminPersonCvController {
     @PreAuthenticated
     @GetMapping("/detail")
     @Operation(summary = "根据userId获取人才在线简历详情")
-    public CommonResult<AppAdminPersonDetailRespVO> detail(@RequestParam("userId") Long userId) {
+    public CommonResult<AppAdminPersonDetailRespVO> detail(
+            @RequestParam("id") Long id,
+            @RequestParam("userId") Long userId) {
+        jobCvRelService.look(id);
         return success(personIntegrationService.detail(userId));
     }
 
+    @PreAuthenticated
+    @PostMapping("/eliminate")
+    @Operation(summary = "淘汰,不合适")
+    public CommonResult<Boolean> eliminate(@RequestParam("id") Long id) {
+        return success(jobCvRelService.eliminate(id));
+    }
 
 
 }

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/JobAdvertisedConvert.java

@@ -3,7 +3,7 @@ package com.citu.module.menduner.system.convert;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedDetailRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedSimpleRespVO;
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobDetailRespVO;
-import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobReqVO;
+import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobSaveReqVO;
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobRespVO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.es.job.ESJobAdvertisedMergeDO;
@@ -32,7 +32,7 @@ public interface JobAdvertisedConvert {
 
     ESJobAdvertisedMergeDO convert2(JobAdvertisedDO bean);
 
-    JobAdvertisedDO convert3(AppAdminJobReqVO bean);
+    JobAdvertisedDO convert3(AppAdminJobSaveReqVO bean);
 
     @Named("convert4")
     AppAdminJobRespVO convert4(JobAdvertisedDO bean);

+ 123 - 17
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/consumer/ESConsumer.java

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.system.mq.consumer;
 
+import cn.hutool.core.collection.CollUtil;
 import com.citu.module.menduner.system.convert.JobAdvertisedConvert;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
@@ -9,19 +10,32 @@ import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
 import com.citu.module.menduner.system.dal.repository.ESJobAdvertisedMergeRepository;
 import com.citu.module.menduner.system.mq.message.ESJobAdvertisedMergeSendMessage;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.event.EventListener;
-import org.springframework.scheduling.annotation.Async;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.context.ApplicationContext;
+import org.springframework.data.elasticsearch.annotations.Document;
+import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
+import org.springframework.data.elasticsearch.core.IndexOperations;
 import org.springframework.stereotype.Component;
+import org.springframework.util.StopWatch;
 
 import javax.annotation.Resource;
-import java.util.Optional;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 /**
  * es 消费
+ * 不需要强一致性
+ * 通过 双写 + 数据定时同步补偿 来保证一致性
  **/
 @Slf4j
 @Component
-public class ESConsumer {
+@RocketMQMessageListener(
+        topic = ESJobAdvertisedMergeSendMessage.TOPIC,
+        consumerGroup = ESJobAdvertisedMergeSendMessage.TOPIC + "_CONSUMER"
+)
+public class ESConsumer implements RocketMQListener<ESJobAdvertisedMergeSendMessage> {
 
     @Resource
     private ESJobAdvertisedMergeRepository repository;
@@ -32,23 +46,27 @@ public class ESConsumer {
     @Resource
     private JobAdvertisedMapper jobAdvertisedMapper;
 
+    @Resource
+    private ElasticsearchRestTemplate template;
+
+    @Resource
+    private ApplicationContext applicationContext;
 
-    @Async
-    @EventListener
-    public synchronized void onMessage(ESJobAdvertisedMergeSendMessage message) {
 
+    @Override
+    public void onMessage(ESJobAdvertisedMergeSendMessage message) {
         switch (message.getOperate()) {
             case SYNC_ALL:
+                sync();
                 break;
             case ADD:
-//                repository.save(message.getData());
+                jobAdd(message.getId());
                 break;
             case UPDATE:
-//                repository.save(message.getData());
                 jobUpdate(message.getId());
                 break;
             case DELETE:
-//                repository.deleteById(message.getId());
+                jobDel(message.getId());
                 break;
             case ENTERPRISE_ADD:
 //                repository.save(message.getData());
@@ -62,29 +80,117 @@ public class ESConsumer {
             default:
                 break;
         }
-        // 删除
-        Optional<ESJobAdvertisedMergeDO> mergeDO = repository.findById(message.getId());
+
 
     }
 
+    /**
+     * 招聘职位的修改
+     *
+     * @param id 招聘职位id
+     **/
     public void jobUpdate(Long id) {
-        Optional<ESJobAdvertisedMergeDO> mergeOptional = repository.findById(id);
-        if (!mergeOptional.isPresent()) {
-            log.error("ES找不到招聘职位信息 {} ", id);
+        //        Optional<ESJobAdvertisedMergeDO> mergeOptional = repository.findById(id);
+        //        if (!mergeOptional.isPresent()) {
+        //            log.error("ES找不到招聘职位信息 {} ", id);
+        //            return;
+        //        }
+        //        ESJobAdvertisedMergeDO merge = mergeOptional.get();
+        JobAdvertisedDO job = jobAdvertisedMapper.selectById(id);
+        if (null == job) {
+            log.error("找不到招聘职位信息 {} ", id);
             return;
         }
-        ESJobAdvertisedMergeDO merge = mergeOptional.get();
+        EnterpriseDO enterpriseDO = enterpriseMapper.selectById(job.getEnterpriseId());
+
+        repository.save(build(job, enterpriseDO));
+    }
+
+    /**
+     * 招聘职位的新增
+     *
+     * @param id 招聘职位id
+     **/
+    public void jobAdd(Long id) {
         JobAdvertisedDO job = jobAdvertisedMapper.selectById(id);
         if (null == job) {
             log.error("找不到招聘职位信息 {} ", id);
             return;
         }
         EnterpriseDO enterpriseDO = enterpriseMapper.selectById(job.getEnterpriseId());
-
         repository.save(build(job, enterpriseDO));
+    }
 
+    /**
+     * 招聘职位的删除
+     *
+     * @param id 招聘职位的id
+     **/
+    public void jobDel(Long id) {
+        repository.deleteById(id);
     }
 
+    public void sync() {
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start("ES 数据同步");
+        // 清空数据
+        repository.deleteAll();
+        List<Class<?>> documentClasses = getDocumentAnnotatedClasses();
+        if (CollUtil.isEmpty(documentClasses)) {
+            return;
+        }
+        // 删除索引
+        deleteAllIndexes(documentClasses);
+        // 新增索引
+        recreateIndexes(documentClasses);
+
+        List<JobAdvertisedDO> jobAdvertisedList = jobAdvertisedMapper.selectList();
+        for (JobAdvertisedDO job : jobAdvertisedList) {
+            EnterpriseDO enterpriseDO = enterpriseMapper.selectById(job.getEnterpriseId());
+            repository.save(build(job, enterpriseDO));
+        }
+        stopWatch.stop();
+        stopWatch.prettyPrint();
+    }
+
+    /**
+     * 获取带有 @Document 注解的实体类
+     */
+    public List<Class<?>> getDocumentAnnotatedClasses() {
+        Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(Document.class);
+        List<Class<?>> documentClasses = new ArrayList<>();
+        for (Object bean : beansWithAnnotation.values()) {
+            documentClasses.add(bean.getClass());
+        }
+        return documentClasses;
+    }
+
+    /**
+     * 清空索引
+     **/
+    public void deleteAllIndexes(List<Class<?>> documentClasses) {
+
+        for (Class<?> indexClass : documentClasses) {
+            boolean exists = template.indexOps(indexClass).exists();
+            if (exists) {
+                template.indexOps(indexClass).delete();
+            }
+        }
+    }
+
+    /**
+     * 重新增加索引
+     **/
+    public void recreateIndexes(List<Class<?>> documentClasses) {
+
+        for (Class<?> indexClass : documentClasses) {
+            IndexOperations indexOps = template.indexOps(indexClass);
+            indexOps.create();
+            indexOps.putMapping(indexOps.createMapping());
+        }
+    }
+
+
     public ESJobAdvertisedMergeDO build(JobAdvertisedDO job, EnterpriseDO enterpriseDO) {
 
         ESJobAdvertisedMergeDO mergeDO = JobAdvertisedConvert.INSTANCE.convert2(job);

+ 6 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/message/ESJobAdvertisedMergeSendMessage.java

@@ -16,6 +16,12 @@ import lombok.NoArgsConstructor;
 @Schema(description = "ES 招聘职位")
 public class ESJobAdvertisedMergeSendMessage {
 
+    public static final String TOPIC = "ES_JOB_ADVERTISED_MERGE_TOPIC";
+
+    // messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
+    // 10s
+    public static final int LEVEL = 3;
+
     private Long id;
 
     private ESOperateEnum operate;

+ 34 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/mq/producer/ESProducer.java

@@ -3,7 +3,10 @@ package com.citu.module.menduner.system.mq.producer;
 import com.citu.module.menduner.system.mq.message.ESJobAdvertisedMergeSendMessage;
 import com.citu.module.menduner.system.util.ESOperateEnum;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.springframework.context.ApplicationContext;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -18,12 +21,39 @@ import javax.annotation.Resource;
 public class ESProducer {
 
     @Resource
-    private ApplicationContext applicationContext;
+    private RocketMQTemplate rocketMQTemplate;
 
-    public void send(Long id, ESOperateEnum operateEnum) {
-        applicationContext.publishEvent(ESJobAdvertisedMergeSendMessage.builder()
+    public void sync() {
+        ESJobAdvertisedMergeSendMessage content = ESJobAdvertisedMergeSendMessage.builder()
+                .operate(ESOperateEnum.SYNC_ALL)
+                .build();
+        send(content);
+    }
+
+    public void send(ESOperateEnum operateEnum, Long id) {
+        ESJobAdvertisedMergeSendMessage content = ESJobAdvertisedMergeSendMessage.builder()
                 .id(id)
                 .operate(operateEnum)
-                .build());
+                .build();
+        send(content);
+    }
+
+    public void sendDel(Long id) {
+        ESJobAdvertisedMergeSendMessage content = ESJobAdvertisedMergeSendMessage.builder()
+                .id(id)
+                .operate(ESOperateEnum.DELETE)
+                .build();
+        send(content);
+    }
+
+    public void send(ESJobAdvertisedMergeSendMessage content) {
+        Message<?> message = MessageBuilder.withPayload(content).build();
+        rocketMQTemplate.syncSend(
+                ESJobAdvertisedMergeSendMessage.TOPIC,
+                message,
+                10000,
+                ESJobAdvertisedMergeSendMessage.LEVEL
+        );
     }
+
 }

+ 2 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeEnterpriseAuthService.java

@@ -49,10 +49,11 @@ public interface MdeEnterpriseAuthService {
     /**
      * 刷新访问令牌
      *
+     * @param accessToken 访问令牌
      * @param refreshToken 刷新令牌
      * @return 登录结果
      */
-    AppMdeAuthLoginRespVO refreshToken(String refreshToken);
+    AppMdeAuthLoginRespVO refreshToken(String accessToken,String refreshToken);
 
 
 }

+ 12 - 8
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeEnterpriseAuthServiceImpl.java

@@ -23,6 +23,7 @@ import com.citu.module.menduner.system.service.user.MdeUserService;
 import com.citu.module.system.api.logger.LoginLogApi;
 import com.citu.module.system.api.logger.dto.LoginLogCreateReqDTO;
 import com.citu.module.system.api.oauth2.OAuth2TokenApi;
+import com.citu.module.system.api.oauth2.dto.OAuth2AccessTokenCheckRespDTO;
 import com.citu.module.system.api.oauth2.dto.OAuth2AccessTokenCreateReqDTO;
 import com.citu.module.system.api.oauth2.dto.OAuth2AccessTokenRespDTO;
 import com.citu.module.system.api.social.SocialUserApi;
@@ -226,7 +227,7 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
         // 创建 Token 令牌
         OAuth2AccessTokenRespDTO accessTokenRespDTO = oauth2TokenApi.createAccessToken(new OAuth2AccessTokenCreateReqDTO()
                 .setUserId(user.getId()).setUserType(getUserType().getValue())
-                .setClientId(OAuth2ClientConstants.CLIENT_ID_MENDUNER)
+                .setClientId(OAuth2ClientConstants.CLIENT_ID_MENDUNER_ADMIN)
                 .setUserInfo(MapUtil.builder(LoginUser.INFO_KEY_DATA_ID, enterpriseId.toString()).build())
         ).getCheckedData();
         // 构建返回结果
@@ -277,17 +278,20 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
         reqDTO.setResult(LoginResultEnum.SUCCESS.getResult());
         loginLogApi.createLoginLog(reqDTO);
     }
-    
-    @Override
-    public AppMdeAuthLoginRespVO refreshToken(String refreshToken) {
-        LoginUser loginUser = getLoginUser();
 
+    @Override
+    public AppMdeAuthLoginRespVO refreshToken(String accessToken, String refreshToken) {
+        // 获取令牌的基础信息
+        OAuth2AccessTokenCheckRespDTO token = oauth2TokenApi.getAccessToken(accessToken).getCheckedData();
+        if(null == token) {
+            throw exception(MDE_AUTH_TOKEN_EXPIRED);
+        }
         OAuth2AccessTokenRespDTO accessTokenDO = oauth2TokenApi.refreshAccessToken2(
                 refreshToken,
-                OAuth2ClientConstants.CLIENT_ID_MENDUNER,
-                loginUser.getInfo()
+                OAuth2ClientConstants.CLIENT_ID_MENDUNER_ADMIN,
+                // 解析出过期令牌的 userInfo 信息,放入新令牌
+                token.getUserInfo()
         ).getCheckedData();
-
         return MdeAuthConvert.INSTANCE.convert(accessTokenDO, null);
     }
 }

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

@@ -7,7 +7,7 @@ import com.citu.module.menduner.system.controller.app.job.vo.AppEnterpriseJobHom
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedDetailRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedHomeRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedPageReqVO;
-import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobReqVO;
+import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobSaveReqVO;
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobSimpleRespVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobAdvertisedPageReqVO;
@@ -133,7 +133,7 @@ public interface JobAdvertisedService {
     /**
      * 保存职位
      **/
-    boolean save(AppAdminJobReqVO reqVO);
+    boolean save(AppAdminJobSaveReqVO reqVO);
 
     /**
      * 开启职位

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

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.system.service.job;
 
 
+
 import cn.hutool.core.collection.ListUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.pojo.PageParam;
@@ -12,7 +13,7 @@ import com.citu.module.menduner.system.controller.app.job.vo.AppEnterpriseJobHom
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedDetailRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedHomeRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobAdvertisedPageReqVO;
-import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobReqVO;
+import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobSaveReqVO;
 import com.citu.module.menduner.system.controller.appadmin.job.vo.AppAdminJobSimpleRespVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.contact.AppEnterpriseUserContactRespVO;
@@ -390,7 +391,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
 
     @Override
     @DSTransactional
-    public boolean save(AppAdminJobReqVO reqVO) {
+    public boolean save(AppAdminJobSaveReqVO reqVO) {
         LoginUser loginUser = getLoginUser();
         if (null == loginUser
                 || null == loginUser.getInfo()) {
@@ -408,7 +409,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             job.setStatus(MendunerStatusEnum.ENABLE.getStatus());
 
             jobAdvertisedMapper.insert(job);
-            esProducer.send(job.getId(), ESOperateEnum.ADD);
+            esProducer.send(ESOperateEnum.ADD,job.getId());
 
         } else {
             // 修改
@@ -421,7 +422,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             }
             job.setId(entity.getId());
             jobAdvertisedMapper.updateById(job);
-            esProducer.send(job.getId(), ESOperateEnum.UPDATE);
+            esProducer.send(ESOperateEnum.UPDATE,job.getId());
         }
         return true;
     }
@@ -445,6 +446,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             }
             job.setStatus(MendunerStatusEnum.ENABLE.getStatus());
             jobAdvertisedMapper.updateById(job);
+            esProducer.send(ESOperateEnum.UPDATE,job.getId());
         }
         return true;
     }
@@ -460,6 +462,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             }
             job.setStatus(MendunerStatusEnum.DISABLE.getStatus());
             jobAdvertisedMapper.updateById(job);
+            esProducer.send(ESOperateEnum.UPDATE,job.getId());
         }
         return true;
     }
@@ -471,6 +474,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             JobAdvertisedDO job = get(id);
             job.setUpdateTime(LocalDateTime.now());
             jobAdvertisedMapper.updateById(job);
+            esProducer.send(ESOperateEnum.UPDATE,job.getId());
         }
     }
 

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

@@ -57,14 +57,30 @@ public interface JobCvRelService {
 
     /**
      * 简历投递
+     *
      * @param reqVO
      */
     void send(AppJobCvRelReqVO reqVO);
 
     /**
      * 效验是否投递了该职位
+     *
      * @param jobId 职位id
      */
     boolean checkSend(Long jobId);
 
+    /**
+     * 查看投递简历
+     *
+     * @param id 投递简历id
+     */
+    boolean look(Long id);
+
+    /**
+     * 淘汰 不合适
+     *
+     * @param id 投递简历id
+     */
+    boolean eliminate(Long id);
+
 }

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

@@ -11,6 +11,7 @@ import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
 import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
 import com.citu.module.menduner.system.dal.mysql.job.JobCvRelMapper;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
+import com.citu.module.menduner.system.enums.cv.JobCvRelStatusEnum;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -111,4 +112,23 @@ public class JobCvRelServiceImpl implements JobCvRelService {
         // 效验某段时间是否投递过
         return jobCvRelMapper.checkDataWithin15Day(userId, jobId);
     }
+
+    @Override
+    @DSTransactional
+    public boolean look(Long id) {
+        JobCvRelDO jobCvRel = jobCvRelMapper.selectById(id);
+        if (JobCvRelStatusEnum.LOOK.getStatus().equals(jobCvRel.getStatus())) {
+            return true;
+        }
+        jobCvRel.setStatus(JobCvRelStatusEnum.LOOK.getStatus());
+        return jobCvRelMapper.updateById(jobCvRel) == 1;
+    }
+
+    @Override
+    @DSTransactional
+    public boolean eliminate(Long id) {
+        JobCvRelDO jobCvRel = jobCvRelMapper.selectById(id);
+        jobCvRel.setStatus(JobCvRelStatusEnum.ELIMINATE.getStatus());
+        return jobCvRelMapper.updateById(jobCvRel) == 1;
+    }
 }

+ 4 - 35
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/sync/ESDataSyncServiceImpl.java

@@ -7,6 +7,8 @@ import com.citu.module.menduner.system.dal.es.job.ESJobAdvertisedMergeDO;
 import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseMapper;
 import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
 import com.citu.module.menduner.system.dal.repository.ESJobAdvertisedMergeRepository;
+import com.citu.module.menduner.system.mq.producer.ESProducer;
+import com.citu.module.menduner.system.util.ESOperateEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -22,46 +24,13 @@ import java.util.List;
 public class ESDataSyncServiceImpl implements ESDataSyncService {
 
     @Resource
-    private ESJobAdvertisedMergeRepository repository;
-
-    @Resource
-    private EnterpriseMapper enterpriseMapper;
-
-    @Resource
-    private JobAdvertisedMapper jobAdvertisedMapper;
+    private ESProducer esProducer;
 
 
     @Async
     @Override
     public void syncEnterprise() {
-        // 清空
-        repository.deleteAll();
-
-        List<JobAdvertisedDO> jobAdvertisedList = jobAdvertisedMapper.selectList();
-        for (JobAdvertisedDO job : jobAdvertisedList) {
-
-            ESJobAdvertisedMergeDO jobAdvertisedMergeDO = JobAdvertisedConvert.INSTANCE.convert2(job);
-
-            EnterpriseDO enterpriseDO = enterpriseMapper.selectById(job.getEnterpriseId());
-
-            jobAdvertisedMergeDO.setEnterpriseName(enterpriseDO.getName());
-            jobAdvertisedMergeDO.setEnterpriseAnotherName(enterpriseDO.getAnotherName());
-            jobAdvertisedMergeDO.setIndustryId(enterpriseDO.getIndustryId());
-            jobAdvertisedMergeDO.setLogoUrl(enterpriseDO.getLogoUrl());
-            jobAdvertisedMergeDO.setScale(enterpriseDO.getScale());
-            jobAdvertisedMergeDO.setWebsite(enterpriseDO.getWebsite());
-            jobAdvertisedMergeDO.setFinancingStatus(enterpriseDO.getFinancingStatus());
-            jobAdvertisedMergeDO.setPhone(enterpriseDO.getPhone());
-            jobAdvertisedMergeDO.setDevelopHistory(enterpriseDO.getDevelopHistory());
-            jobAdvertisedMergeDO.setContact(enterpriseDO.getContact());
-            jobAdvertisedMergeDO.setWelfareList(enterpriseDO.getWelfareList());
-            jobAdvertisedMergeDO.setAlbumList(enterpriseDO.getAlbumList());
-            jobAdvertisedMergeDO.setWorkTime(enterpriseDO.getWorkTime());
-            jobAdvertisedMergeDO.setReceivedHonors(enterpriseDO.getReceivedHonors());
-            jobAdvertisedMergeDO.setIntroduce(enterpriseDO.getIntroduce());
-            repository.save(jobAdvertisedMergeDO);
-        }
-
+        esProducer.sync();
     }
 
     @Async

+ 4 - 0
menduner/menduner-system-biz/src/main/resources/application.yaml

@@ -95,6 +95,10 @@ easy-trans:
 --- #################### RPC 远程调用相关配置 ####################
 
 --- #################### MQ 消息队列相关配置 ####################
+rocketmq:
+  producer:
+    #生产者分组
+    group: ${spring.application.name}_PRODUCER
 
 --- #################### 定时任务相关配置 ####################