Преглед изворни кода

1、优化职位的保存逻辑

rayson пре 4 месеци
родитељ
комит
0690036e62
27 измењених фајлова са 646 додато и 159 уклоњено
  1. 3 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  2. 29 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/sync/OperateTypeEnum.java
  3. 35 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/fair/FairController.java
  4. 13 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/fair/AppRecruitFairController.java
  5. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/fair/FairWhiteDetailRespVO.java
  6. 17 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/fair/admission/FairAdmissionDetailRespVO.java
  7. 6 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/fair/admission/FairAdmissionPageReqVO.java
  8. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/fair/admission/FairAdmissionRespVO.java
  9. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/fair/admission/FairAdmissionSaveReqVO.java
  10. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/fair/FairAdmissionDO.java
  11. 40 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/fair/FairAdmissionMapper.java
  12. 27 12
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairAdmissionService.java
  13. 45 5
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairAdmissionServiceImpl.java
  14. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairService.java
  15. 6 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairServiceImpl.java
  16. 58 114
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  17. 60 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobDefaultOperateHandler.java
  18. 38 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobEntitlementOperateHandler.java
  19. 31 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobEsOperateHandler.java
  20. 52 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobFairOperateHandler.java
  21. 41 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobGraphOperateHandler.java
  22. 45 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobHireOperateHandler.java
  23. 58 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobOperateHandler.java
  24. 24 14
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoServiceImpl.java
  25. 1 0
      menduner/menduner-system-biz/src/main/resources/i18n/messages_en_GB.properties
  26. 1 0
      menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties
  27. 1 0
      menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties

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

@@ -613,6 +613,9 @@ public interface ErrorCodeConstants {
 
     ErrorCode JOB_FAIR_NOT_START = new ErrorCode(1_100_056_006, "招聘会时间还未开始");
     ErrorCode JOB_FAIR_ADMISSION_NOT_EXISTS = new ErrorCode(1_100_056_007, "招聘会门票权益不存在");
+
+    ErrorCode JOB_FAIR_ADMISSION_STATUS_DISABLE = new ErrorCode(1_100_056_008, "您的招聘会门票许可已被禁用,请联系工作人员");
+
     // ========== 招聘职位扩展 1_100_057_000 ==========
     ErrorCode JOB_EXTEND_JOB_ID_NOT_NULL = new ErrorCode(1_100_057_001, "招聘职位id不能为空");
 

+ 29 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/sync/OperateTypeEnum.java

@@ -0,0 +1,29 @@
+package com.citu.module.menduner.system.enums.sync;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 数据操作类型(sync_all 同步所有|add 新增|update 修改|delete 删除)
+ *
+ * @author Rayson
+ */
+@Getter
+@AllArgsConstructor
+public enum OperateTypeEnum {
+    SYNC_ALL("sync_all"),
+    ADD("add"),
+    UPDATE("update"),
+    DELETE("delete");
+
+    private final String type;
+
+    public static String getEnum(String type) {
+        for (OperateTypeEnum operateTypeEnum : OperateTypeEnum.values()) {
+            if (operateTypeEnum.getType().equals(type)) {
+                return operateTypeEnum.type;
+            }
+        }
+        return null;
+    }
+}

+ 35 - 6
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/fair/FairController.java

@@ -9,8 +9,11 @@ import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.common.util.string.StrUtils;
 import com.citu.framework.excel.core.util.ExcelUtils;
 import com.citu.module.menduner.system.controller.base.fair.*;
+import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionDetailRespVO;
+import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.fair.FairDO;
-import com.citu.module.menduner.system.dal.dataobject.fair.FairWhiteDO;
+import com.citu.module.menduner.system.enums.MendunerStatusEnum;
+import com.citu.module.menduner.system.service.fair.FairAdmissionService;
 import com.citu.module.menduner.system.service.fair.FairService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -23,7 +26,6 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
-import java.util.Collections;
 import java.util.List;
 
 import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
@@ -39,6 +41,9 @@ public class FairController {
     @Resource
     private FairService fairService;
 
+    @Resource
+    private FairAdmissionService fairAdmissionService;
+
     @PostMapping("/create")
     @Operation(summary = "创建招聘会")
     @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:create')")
@@ -94,7 +99,7 @@ public class FairController {
     }
 
     @PostMapping("/enable")
-    @Operation(summary = "开启")
+    @Operation(summary = "开启招聘会")
     @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:update')")
     public CommonResult<Boolean> enable(@RequestParam("ids") String ids) {
         fairService.enable(StrUtils.splitToLong(ids));
@@ -102,7 +107,7 @@ public class FairController {
     }
 
     @PostMapping("/disable")
-    @Operation(summary = "关闭")
+    @Operation(summary = "关闭招聘会")
     @PreAuthorize("@ss.hasPermission('menduner:system:job-fair:update')")
     public CommonResult<Boolean> disable(@RequestParam("ids") String ids) {
         fairService.disable(StrUtils.splitToLong(ids));
@@ -143,8 +148,8 @@ public class FairController {
     }
 
     @GetMapping("/detail/page")
-    @Operation(summary = "分页查询参加双选会职位")
-    public CommonResult<PageResult<JobFairDetailRespVO>> jobFairDetailPage(@Valid JobFairDetailPageReqVO reqVO)  {
+    @Operation(summary = "分页查询参加招聘会职位")
+    public CommonResult<PageResult<JobFairDetailRespVO>> jobFairDetailPage(@Valid JobFairDetailPageReqVO reqVO) {
         return success(fairService.getJobFairDetailPage(reqVO));
     }
 
@@ -155,4 +160,28 @@ public class FairController {
         return success(true);
     }
 
+    @GetMapping("/admission/page")
+    @Operation(summary = "分页查询招聘会门票权益")
+    public CommonResult<PageResult<FairAdmissionDetailRespVO>> getFairAdmissionPage
+            (FairAdmissionPageReqVO reqVO) {
+        return success(fairAdmissionService.getFairAdmissionPage(reqVO));
+    }
+
+    @PostMapping("/admission/enable")
+    @Operation(summary = "开启招聘会门票")
+    public CommonResult<Boolean> enableAdmission(@RequestParam("id") String id) {
+        fairAdmissionService.updateAdmissionStatus(id, MendunerStatusEnum.ENABLE.getStatus());
+        return success(true);
+    }
+
+    @PostMapping("/admission/disable")
+    @Operation(summary = "禁用招聘会门票")
+    public CommonResult<Boolean> disableAdmission(@RequestParam("id") String id) {
+        fairAdmissionService.updateAdmissionStatus(id, MendunerStatusEnum.DISABLE.getStatus());
+        return success(true);
+    }
+
+
+
+
 }

+ 13 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/fair/AppRecruitFairController.java

@@ -8,7 +8,10 @@ import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.AppRecruitJobRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.joinJobFairReqVO;
 import com.citu.module.menduner.system.controller.base.fair.JobFairRespVO;
+import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionRespVO;
+import com.citu.module.menduner.system.dal.dataobject.fair.FairAdmissionDO;
 import com.citu.module.menduner.system.service.area.AreaService;
+import com.citu.module.menduner.system.service.fair.FairAdmissionService;
 import com.citu.module.menduner.system.service.fair.FairService;
 import com.citu.module.menduner.system.service.job.JobAdvertisedService;
 import com.citu.module.menduner.system.service.job.JobCvRelService;
@@ -34,6 +37,9 @@ public class AppRecruitFairController {
     @Resource
     private FairService fairService;
 
+    @Resource
+    private FairAdmissionService fairAdmissionService;
+
     @Resource
     private AreaService areaService;
 
@@ -108,4 +114,11 @@ public class AppRecruitFairController {
         return success(true);
     }
 
+    @PreAuthenticated
+    @GetMapping("/admission/get")
+    @Operation(summary = "获取招聘会门票权益")
+    public CommonResult<FairAdmissionRespVO> getAdmission(@RequestParam("jobFairId") Long jobFairId) {
+        FairAdmissionDO fairAdmission = fairAdmissionService.get(LoginUserContext.getEnterpriseId(), jobFairId);
+        return success(BeanUtils.toBean(fairAdmission, FairAdmissionRespVO.class));
+    }
 }

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/fair/FairWhiteDetailRespVO.java

@@ -10,7 +10,7 @@ import lombok.Data;
 @ExcelIgnoreUnannotated
 public class FairWhiteDetailRespVO extends FairWhiteRespVO{
 
-    @Schema(description = "id", example = "1")
+    @Schema(description = "企业信息")
     private EnterpriseSimpleRespVO enterprise;
 
 }

+ 17 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/fair/admission/FairAdmissionDetailRespVO.java

@@ -0,0 +1,17 @@
+package com.citu.module.menduner.system.controller.base.fair.admission;
+
+import com.citu.module.menduner.system.controller.base.enterprise.vo.EnterpriseSimpleRespVO;
+import com.citu.module.menduner.system.controller.base.fair.JobFairRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 招聘会门票权益详情 Response VO")
+@Data
+public class FairAdmissionDetailRespVO extends FairAdmissionRespVO{
+
+    @Schema(description = "企业信息")
+    private EnterpriseSimpleRespVO enterprise;
+
+    @Schema(description = "招聘会信息")
+    private JobFairRespVO jobFair;
+}

+ 6 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/fair/admission/FairAdmissionPageReqVO.java

@@ -27,6 +27,12 @@ public class FairAdmissionPageReqVO extends PageParam {
     @Schema(description = "用户id", example = "7780")
     private Long userId;
 
+    @Schema(description = "企业名称", example = "1")
+    private String name;
+
+    @Schema(description = "状态(0启用|1禁用)", example = "0")
+    private String status;
+
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/fair/admission/FairAdmissionRespVO.java

@@ -37,6 +37,10 @@ public class FairAdmissionRespVO {
     @ExcelProperty("原本允许发布的职位数量")
     private Integer originNum;
 
+    @Schema(description = "状态(0启用|1禁用)", example = "0")
+    @ExcelProperty("状态(0启用|1禁用)")
+    private String status;
+
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/fair/admission/FairAdmissionSaveReqVO.java

@@ -30,4 +30,7 @@ public class FairAdmissionSaveReqVO {
     @NotNull(message = "原本允许发布的职位数量不能为空")
     private Integer originNum;
 
+    @Schema(description = "状态(0启用|1禁用)", example = "0")
+    private String status;
+
 }

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

@@ -46,5 +46,9 @@ public class FairAdmissionDO extends TenantBaseDO {
      * 原本允许发布的职位数量
      */
     private Integer originNum;
+    /**
+     * 状态(0启用|1禁用)
+     */
+    private String status;
 
 }

+ 40 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/fair/FairAdmissionMapper.java

@@ -1,11 +1,19 @@
 package com.citu.module.menduner.system.dal.mysql.fair;
 
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
 import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.framework.mybatis.core.query.MPJLambdaWrapperX;
+import com.citu.module.menduner.system.controller.base.fair.FairWhiteDetailRespVO;
+import com.citu.module.menduner.system.controller.base.fair.FairWhitePageReqVO;
+import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionDetailRespVO;
 import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 import com.citu.module.menduner.system.dal.dataobject.fair.FairAdmissionDO;
+import com.citu.module.menduner.system.dal.dataobject.fair.FairDO;
+import com.citu.module.menduner.system.dal.dataobject.fair.FairWhiteDO;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
@@ -26,11 +34,39 @@ public interface FairAdmissionMapper extends BaseMapperX<FairAdmissionDO> {
     }
 
 
-    default FairAdmissionDO selectByJobFairId(Long jobFairId) {
-        return selectOne(FairAdmissionDO::getJobFairId, jobFairId);
-    }
-
     default FairAdmissionDO selectByEnterpriseIdAndJobFairId(Long enterpriseId,Long jobFairId) {
         return selectOne(FairAdmissionDO::getEnterpriseId, enterpriseId,FairAdmissionDO::getJobFairId,jobFairId);
     }
+
+
+    default PageResult<FairAdmissionDetailRespVO> selectPageRetResp(FairAdmissionPageReqVO reqVO) {
+        MPJLambdaWrapperX<FairAdmissionDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAll(FairAdmissionDO.class);
+        wrapper.selectAssociation(EnterpriseDO.class, FairAdmissionDetailRespVO::getEnterprise);
+        wrapper.selectAssociation(FairDO.class, FairAdmissionDetailRespVO::getJobFair);
+        wrapper.innerJoin(EnterpriseDO.class, EnterpriseDO::getId, FairAdmissionDO::getEnterpriseId);
+        wrapper.innerJoin(FairDO.class, FairDO::getId, FairAdmissionDO::getJobFairId);
+        wrapper.eqIfPresent(FairAdmissionDO::getJobFairId, reqVO.getJobFairId());
+        wrapper.likeIfExists(EnterpriseDO::getName, reqVO.getName());
+        wrapper.eqIfPresent(FairAdmissionDO::getStatus, reqVO.getStatus());
+        return selectJoinPage(reqVO, FairAdmissionDetailRespVO.class, wrapper);
+    }
+
+    default int deduct(Long enterpriseId, Long jobFairId, Integer num) {
+        LambdaUpdateWrapper<FairAdmissionDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<FairAdmissionDO>()
+                .setSql("num = num - " + num)
+                .eq(FairAdmissionDO::getEnterpriseId, enterpriseId)
+                .eq(FairAdmissionDO::getJobFairId, jobFairId)
+                .ge(FairAdmissionDO::getNum, num); // cas 逻辑
+        return update(null, lambdaUpdateWrapper);
+    }
+
+    default int increase(Long enterpriseId, Long jobFairId, Integer num) {
+        LambdaUpdateWrapper<FairAdmissionDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<FairAdmissionDO>()
+                .setSql(" num = num + " + num)
+                .eq(FairAdmissionDO::getEnterpriseId, enterpriseId)
+                .eq(FairAdmissionDO::getJobFairId, jobFairId)
+                .ge(FairAdmissionDO::getNum, num);  // cas 逻辑
+        return update(null, lambdaUpdateWrapper);
+    }
 }

+ 27 - 12
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairAdmissionService.java

@@ -2,6 +2,7 @@ package com.citu.module.menduner.system.service.fair;
 
 
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionDetailRespVO;
 import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionPageReqVO;
 import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.fair.FairAdmissionDO;
@@ -46,18 +47,32 @@ public interface FairAdmissionService {
     FairAdmissionDO getFairAdmission(Long id);
 
     /**
-     * 获得招聘会门票权益分页
-     *
-     * @param pageReqVO 分页查询
-     * @return 招聘会门票权益分页
-     */
-    PageResult<FairAdmissionDO> getFairAdmissionPage(FairAdmissionPageReqVO pageReqVO);
+     * 招聘会门票查询
+     **/
+    FairAdmissionDO get(Long enterpriseId,Long jobFairId);
 
     /**
-     * 获得招聘会门票权益
-     *
-     * @param jobFairId 招聘会id
-     * @return 招聘会门票权益
-     */
-    FairAdmissionDO get(Long jobFairId);
+     * 招聘会门票分页查询
+     **/
+    PageResult<FairAdmissionDetailRespVO> getFairAdmissionPage(FairAdmissionPageReqVO reqVO);
+
+    /**
+     * 更改招聘会门票状态
+     **/
+    void updateAdmissionStatus(String id,String status);
+
+    /**
+     * 校验招聘会门票权益
+     **/
+    void checkAdmission(FairAdmissionDO fairAdmission);
+
+    /**
+     * 扣除: 招聘会门票权益的可发布职位的数量
+     **/
+    void deductAdmissionNum(Long enterpriseId, Long jobFairId);
+
+    /**
+     * 增加: 招聘会门票权益的可发布职位的数量
+     **/
+    void increaseAdmissionNum(Long enterpriseId, Long jobFairId);
 }

+ 45 - 5
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairAdmissionServiceImpl.java

@@ -1,19 +1,22 @@
 package com.citu.module.menduner.system.service.fair;
 
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionDetailRespVO;
 import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionPageReqVO;
 import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.fair.FairAdmissionDO;
 import com.citu.module.menduner.system.dal.mysql.fair.FairAdmissionMapper;
+import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.citu.module.menduner.system.enums.ErrorCodeConstants.JOB_FAIR_ADMISSION_NOT_EXISTS;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 
 /**
  * 招聘会门票权益 Service 实现类
@@ -65,12 +68,49 @@ public class FairAdmissionServiceImpl implements FairAdmissionService {
     }
 
     @Override
-    public PageResult<FairAdmissionDO> getFairAdmissionPage(FairAdmissionPageReqVO pageReqVO) {
-        return fairAdmissionMapper.selectPage(pageReqVO);
+    public FairAdmissionDO get(Long enterpriseId, Long jobFairId) {
+        return fairAdmissionMapper.selectByEnterpriseIdAndJobFairId(enterpriseId, jobFairId);
     }
 
     @Override
-    public FairAdmissionDO get(Long jobFairId) {
-        return fairAdmissionMapper.selectByJobFairId(jobFairId);
+    public PageResult<FairAdmissionDetailRespVO> getFairAdmissionPage(FairAdmissionPageReqVO reqVO) {
+        return fairAdmissionMapper.selectPageRetResp(reqVO);
+    }
+
+    @Override
+    public void updateAdmissionStatus(String id, String status) {
+        FairAdmissionDO admission = fairAdmissionMapper.selectById(id);
+        if (null == admission) {
+            return;
+        }
+        fairAdmissionMapper.update(admission, new LambdaUpdateWrapper<FairAdmissionDO>()
+                .eq(FairAdmissionDO::getId, id)
+                .set(FairAdmissionDO::getStatus, status)
+        );
+    }
+
+    @Override
+    public void checkAdmission(FairAdmissionDO fairAdmission) {
+        if (null == fairAdmission) {
+            return;
+        }
+        if (fairAdmission.getNum() - 1 < 0) {
+            throw exception(JOB_FAIR_NO_PERMISSION);
+        }
+        if ((MendunerStatusEnum.DISABLE.getStatus().equals(fairAdmission.getStatus()))) {
+            throw exception(JOB_FAIR_ADMISSION_STATUS_DISABLE);
+        }
+    }
+
+    @Override
+    public void deductAdmissionNum(Long enterpriseId, Long jobFairId) {
+        FairAdmissionDO fairAdmission = get(enterpriseId, jobFairId);
+        checkAdmission(fairAdmission);
+        fairAdmissionMapper.deduct(enterpriseId, jobFairId, 1);
+    }
+
+    @Override
+    public void increaseAdmissionNum(Long enterpriseId, Long jobFairId) {
+        fairAdmissionMapper.increase(enterpriseId, jobFairId, 1);
     }
 }

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairService.java

@@ -6,6 +6,9 @@ import com.citu.module.menduner.system.controller.app.jobhunt.flame.AppFlameJobP
 import com.citu.module.menduner.system.controller.app.jobhunt.flame.AppFlameJobRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.job.vo.joinJobFairReqVO;
 import com.citu.module.menduner.system.controller.base.fair.*;
+import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionDetailRespVO;
+import com.citu.module.menduner.system.controller.base.fair.admission.FairAdmissionPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.fair.FairAdmissionDO;
 import com.citu.module.menduner.system.dal.dataobject.fair.FairDO;
 import com.citu.module.menduner.system.dal.dataobject.fair.FairWhiteDO;
 

+ 6 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/fair/FairServiceImpl.java

@@ -76,7 +76,7 @@ public class FairServiceImpl implements FairService {
     private FairWhiteMapper fairWhiteMapper;
 
     @Resource
-    private FairAdmissionMapper fairAdmissionMapper;
+    private FairAdmissionService fairAdmissionService;
 
     @Resource
     private AreaService areaService;
@@ -190,10 +190,12 @@ public class FairServiceImpl implements FairService {
                 .selectByJobFairIdAndEnterpriseId(jobFairId, enterpriseDO.getId());
         if (null == white) {
             FairAdmissionDO fairAdmission =
-                    fairAdmissionMapper.selectByEnterpriseIdAndJobFairId(enterpriseDO.getId(), jobFairId);
-            if (null == fairAdmission || fairAdmission.getNum() - 1 < 0) {
+                    fairAdmissionService.get(enterpriseDO.getId(), jobFairId);
+            if (null == fairAdmission) {
                 throw exception(JOB_FAIR_NO_PERMISSION);
             }
+            fairAdmissionService.checkAdmission(fairAdmission);
+
         }
 
     }
@@ -436,4 +438,5 @@ public class FairServiceImpl implements FairService {
                 .set(FairDO::getAllowedJobNum, reqVO.getAllowedJobNum())
         );
     }
+
 }

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

@@ -33,11 +33,13 @@ import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedExtendMapper;
 import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
 import com.citu.module.menduner.system.enums.job.JobSourceEnum;
 import com.citu.module.menduner.system.enums.job.JobStatusEnum;
+import com.citu.module.menduner.system.enums.sync.OperateTypeEnum;
 import com.citu.module.menduner.system.enums.sync.SyncConstants;
 import com.citu.module.menduner.system.mq.producer.ESProducer;
 import com.citu.module.menduner.system.mq.producer.GraphProducer;
 import com.citu.module.menduner.system.service.area.AreaService;
 import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
+import com.citu.module.menduner.system.service.job.handler.JobOperateHandler;
 import com.citu.module.menduner.system.service.share.ShareService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -48,7 +50,10 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -57,6 +62,8 @@ import static com.citu.module.menduner.common.util.TimeUtils.generateDateTimeRan
 import static com.citu.module.menduner.system.dal.redis.RedisKeyConstants.JOB_SHARE;
 import static com.citu.module.menduner.system.enums.DictTypeConstants.*;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
+import static com.citu.module.menduner.system.service.job.handler.JobDefaultOperateHandler.DEFAULT_ENTERPRISE_ID;
+import static com.citu.module.menduner.system.service.job.handler.JobOperateHandler.DEFAULT_USER_ID;
 import static com.citu.module.menduner.system.util.RecruitAnalysisUtils.packBarCount;
 
 /**
@@ -70,11 +77,7 @@ import static com.citu.module.menduner.system.util.RecruitAnalysisUtils.packBarC
 @Validated
 public class JobAdvertisedServiceImpl implements JobAdvertisedService {
 
-    /**
-     * 默认管理员的企业id和用户id
-     **/
-    private static final Long DEFAULT_ENTERPRISE_ID = 1L;
-    private static final Long DEFAULT_USER_ID = 1L;
+
     @Resource
     private JobAdvertisedMapper mapper;
     @Resource
@@ -95,6 +98,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
     private RedisTemplate<String, Object> redisTemplate;
     @Resource
     private VipEntitlementCheckAspect vipEntitlementCheckAspect;
+    @Resource
+    private List<JobOperateHandler> jobOperateHandlers;
 
     @Override
     public Long createJobAdvertised(JobAdvertisedSaveReqVO createReqVO) {
@@ -103,9 +108,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         jobAdvertised.setStatus(JobStatusEnum.ENABLE.getStatus());
         jobAdvertised.setTop(false);
         jobAdvertised.setHire(true);
-        jobAdvertised.setEnterpriseId(DEFAULT_ENTERPRISE_ID);
-        jobAdvertised.setUserId(DEFAULT_USER_ID);
-        return save(jobAdvertised, DEFAULT_ENTERPRISE_ID, DEFAULT_USER_ID, false);
+        return save(jobAdvertised);
     }
 
     @Override
@@ -114,12 +117,10 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         JobAdvertisedDO jobAdvertised = validateJobAdvertisedExists(updateReqVO.getId());
         // 更新
         JobAdvertisedDO updateObj = BeanUtils.toBean(updateReqVO, JobAdvertisedDO.class);
-        updateObj.setEnterpriseId(DEFAULT_ENTERPRISE_ID);
-        updateObj.setUserId(DEFAULT_USER_ID);
         updateObj.setHire(jobAdvertised.getHire());
         updateObj.setTop(jobAdvertised.getTop());
         updateObj.setStatus(jobAdvertised.getStatus());
-        save(updateObj, DEFAULT_ENTERPRISE_ID, DEFAULT_USER_ID, false);
+        save(updateObj);
     }
 
     @Override
@@ -128,7 +129,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         JobAdvertisedDO jobAdvertised = validateJobAdvertisedExists(id);
         // 删除
         mapper.deleteById(id);
-        jobDataSync(jobAdvertised, SyncConstants.DELETE);
+        // 数据同步逻辑
+        jobOperateHandlers.forEach(handler -> handler.dataSync(jobAdvertised, OperateTypeEnum.DELETE));
     }
 
     private JobAdvertisedDO validateJobAdvertisedExists(Long id) {
@@ -194,82 +196,11 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
 
         AppJobAdvertisedPageReqVO pageReqVO =
                 new AppJobAdvertisedPageReqVO(pageParam, AppJobAdvertisedPageReqVO.RECOMMEND);
-//        pageReqVO.setTop(true);
-//        pageReqVO.setHire(false);
-//        Long userId = LoginUserContext.getUserId2();
-//        if (null == userId) {
-//            // 未登录
-//            PageResult<AppJobAdvertisedHomeRespVO> result = mapper.selectPage(pageReqVO);
-//            if (CollUtil.isEmpty(result.getList())) {
-//                // 没有数据, 再算一遍
-//                pageReqVO.setTop(null);
-//                return mapper.selectPage(pageReqVO);
-//            }
-//        }
-//
-//        // 基于求职意向计算
-//        List<JobInterestedDO> interestList = jobInterestedMapper.selectByUserIdList(userId);
-//        if (CollUtil.isEmpty(interestList)) {
-//            return mapper.selectPage(pageReqVO);
-//        }
-//        // 感兴趣的职位
-//        List<Long> positionIds = interestList.stream()
-//                .map(JobInterestedDO::getPositionId).collect(Collectors.toList());
-//        // 希望工作的城市
-//        List<Long> workAreaIds = interestList.stream()
-//                .map(JobInterestedDO::getWorkAreaId).collect(Collectors.toList());
-//        // 感兴趣的城市
-//        List<Long> interestedAreaIds = interestList.stream()
-//                .map(JobInterestedDO::getInterestedAreaIdList)
-//                .filter(CollUtil::isNotEmpty)
-//                .flatMap(Collection::stream) // 将嵌套列表展平为一个流
-//                .map(Long::valueOf)
-//                .distinct()
-//                .collect(Collectors.toList());
-//        // 感兴趣的行业
-//        List<Long> inductionIds = interestList.stream()
-//                .map(JobInterestedDO::getIndustryIdList)
-//                .filter(CollUtil::isNotEmpty)
-//                .flatMap(Collection::stream) // 将嵌套列表展平为一个流
-//                .map(Long::valueOf)
-//                .distinct()
-//                .collect(Collectors.toList());
-//
-//        pageReqVO.setJobTypes(interestList
-//                .stream()
-//                .map(JobInterestedDO::getJobType)
-//                .collect(Collectors.toList())
-//        );
-//        pageReqVO.setPositionIds(positionIds);
-//        pageReqVO.setIndustryIds(inductionIds);
-//        pageReqVO.setAreaIds(
-//                CollUtil.union(workAreaIds, interestedAreaIds)
-//                        .stream().distinct()
-//                        .collect(Collectors.toList())
-//        );
-//        pageReqVO.setAcquainted(true);
-//        pageReqVO.setTop(false);
-        try {
-//            if (null != LoginUserContext.getUserId2()) {
-//                Long[] ids = graphApi.queryRecommendJob(GraphQueryPageDTO
-//                        .builder()
-//                        .id(pageReqVO.getId())
-//                        .type(GraphQueryPageDTO.JOB)
-//                        .current(pageReqVO.getPageNo())
-//                        .size(pageReqVO.getPageSize())
-//                        .userId(LoginUserContext.getUserId2())
-//                        .build()
-//                ).getCheckedData();
-//                pageReqVO.setIds(ids);
-//            } else {
-            // 取最多发布职位的职位类型id
-            pageReqVO.setPositionIds(mapper.selectTopPositionIdsByFrequency(pageParam.getPageSize()));
-            pageReqVO.setNotNameList(List.of("厨师", "预订员", "实习生", "拉面师", "前台接待", "空调工", "楼层服务员", "礼宾员", "销售协调员"));
-            pageReqVO.setHire(false);
-//            }
-        } catch (Exception ex) {
-            ex.printStackTrace();
-        }
+        // 取最多发布职位的职位类型id
+        pageReqVO.setPositionIds(mapper.selectTopPositionIdsByFrequency(pageParam.getPageSize()));
+        pageReqVO.setNotNameList(List.of("厨师", "预订员", "实习生", "拉面师", "前台接待", "空调工", "楼层服务员", "礼宾员", "销售协调员"));
+        pageReqVO.setHire(false);
+
         PageResult<AppJobAdvertisedHomeRespVO> result = mapper.selectPage2(pageReqVO);
         fillArea(result);
         return result;
@@ -427,32 +358,36 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
     @DSTransactional
     public Long save(AppRecruitJobSaveReqVO reqVO) {
         JobAdvertisedDO job = JobAdvertisedConvert.INSTANCE.convert3(reqVO);
-        Long userId = LoginUserContext.getUserId();
-        Long enterpriseId = LoginUserContext.getEnterpriseId();
-        return save(job, enterpriseId, userId, reqVO.isFair());
+        return save(job);
     }
 
     /**
-     * 保存或更新职位信息
+     * 保存或更新职位信息
      *
-     * @param job          职位信息对象
-     * @param enterpriseId 企业ID
-     * @param userId       用户ID
+     * @param job 职位信息对象
      * @return 保存或更新后的职位ID
      * @throws RuntimeException 如果职位名称重复或其他验证失败
      */
-    public Long save(JobAdvertisedDO job, Long enterpriseId, Long userId, boolean fair) {
-        // 检查职位名称是否重复
-        if (mapper.existByName(enterpriseId, userId, job.getId(), job.getName())) {
-            throw exception(MDE_JOB_ADVERTISED_NAME_DUPLICATE, job.getName());
-        }
-
+    public Long save(JobAdvertisedDO job) {
         if (null == job.getId()) {
-            // 新增职位
-            processNewJob(job, enterpriseId, userId, fair);
+            // 职位创建前的逻辑
+            jobOperateHandlers.forEach(handler -> handler.beforeCreate(job));
+            // 执行
+            mapper.insert(job);
+            // 职位创建后的逻辑
+            jobOperateHandlers.forEach(handler -> handler.afterCreate(job));
+            // 数据同步逻辑
+            jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.ADD));
         } else {
-            // 修改职位
-            processExistingJob(job, enterpriseId, userId, fair);
+            JobAdvertisedDO oldJob = get(job.getId());
+            // 职位修改前的逻辑
+            jobOperateHandlers.forEach(handler -> handler.beforeUpdate(job, oldJob));
+            // 执行
+            mapper.updateById(job);
+            // 职位创建后的逻辑
+            jobOperateHandlers.forEach(handler -> handler.afterUpdate(job, oldJob));
+            // 数据同步逻辑
+            jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
         }
 
         return job.getId();
@@ -473,11 +408,14 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             // 扣除额度
             vipEntitlementCheckAspect.deductQuota(VipEntitlementCheck.OPERATE_PUBLISH_JOB, triggerVip);
         }
+        // 职位从哪个模块新增
         if (null == job.getSource()) {
             job.setSource(JobSourceEnum.MANAGER.getType());
         } else {
-            if (null == job.getBizId() && JobSourceEnum.FAIR.getType().equals(job.getSource())) {
-                throw exception(MDE_JOB_ADVERTISED_SOURCE_ID_NOT_NULL);
+            if (JobSourceEnum.FAIR.getType().equals(job.getSource())) {
+                if (null == job.getBizId()) {
+                    throw exception(MDE_JOB_ADVERTISED_SOURCE_ID_NOT_NULL);
+                }
             }
         }
 
@@ -568,7 +506,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         job.setStatus(JobStatusEnum.ENABLE.getStatus());
         job.setUpdateTime(LocalDateTime.now());
         mapper.updateById(job);
-        jobDataSync(job, SyncConstants.UPDATE);
+        // 数据同步逻辑
+        jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
     }
 
     @Override
@@ -584,7 +523,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         }
         job.setUpdateTime(LocalDateTime.now());
         mapper.updateById(job);
-        jobDataSync(job, SyncConstants.UPDATE);
+        // 数据同步逻辑
+        jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
     }
 
     @Override
@@ -605,7 +545,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         job.setStatus(JobStatusEnum.DISABLE.getStatus());
         job.setUpdateTime(LocalDateTime.now());
         mapper.updateById(job);
-        jobDataSync(job, SyncConstants.UPDATE);
+        // 数据同步逻辑
+        jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
     }
 
     @Override
@@ -617,7 +558,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             job.setRefreshTime(time);
             job.setUpdateTime(time);
             mapper.updateById(job);
-            jobDataSync(job, SyncConstants.UPDATE);
+            // 数据同步逻辑
+            jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
         }
     }
 
@@ -657,7 +599,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             job.setUpdateTime(LocalDateTime.now());
             job.setTop(true);
             mapper.updateById(job);
-            jobDataSync(job, SyncConstants.UPDATE);
+            // 数据同步逻辑
+            jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
         }
     }
 
@@ -673,7 +616,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
             job.setUpdateTime(LocalDateTime.now());
             job.setTop(false);
             mapper.updateById(job);
-            jobDataSync(job, SyncConstants.UPDATE);
+            // 数据同步逻辑
+            jobOperateHandlers.forEach(handler -> handler.dataSync(job, OperateTypeEnum.UPDATE));
         }
     }
 

+ 60 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobDefaultOperateHandler.java

@@ -0,0 +1,60 @@
+package com.citu.module.menduner.system.service.job.handler;
+
+import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
+import com.citu.module.menduner.system.enums.job.JobSourceEnum;
+import com.citu.module.menduner.system.enums.job.JobStatusEnum;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_JOB_ADVERTISED_NAME_DUPLICATE;
+
+
+/**
+ * 招聘职位默认 逻辑处理 {@link JobOperateHandler} 实现类
+ *
+ * @author Rayson
+ */
+@Component
+public class JobDefaultOperateHandler implements JobOperateHandler {
+
+
+    @Resource
+    @Lazy
+    private JobAdvertisedMapper mapper;
+
+    @Override
+    public void beforeCreate(JobAdvertisedDO job) {
+
+        //默认开启
+        job.setStatus(JobStatusEnum.ENABLE.getStatus());
+        if (LoginUserContext.checkIsSystemUser()) {
+            // 系统后台操作
+            job.setUserId(DEFAULT_USER_ID);
+            job.setEnterpriseId(DEFAULT_ENTERPRISE_ID);
+        } else {
+            job.setUserId(LoginUserContext.getUserId());
+            job.setEnterpriseId(LoginUserContext.getEnterpriseId());
+        }
+        job.setTop(false);
+
+        if (null == job.getSource()) {
+            job.setSource(JobSourceEnum.MANAGER.getType());
+        }
+
+        // 检查职位名称是否重复
+        if (mapper.existByName(LoginUserContext.getEnterpriseId(), LoginUserContext.getUserId(), job.getId(), job.getName())) {
+            throw exception(MDE_JOB_ADVERTISED_NAME_DUPLICATE, job.getName());
+        }
+    }
+
+    @Override
+    public void beforeUpdate(JobAdvertisedDO job, JobAdvertisedDO oldJob) {
+        // 赋值id
+        job.setId(oldJob.getId());
+    }
+}

+ 38 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobEntitlementOperateHandler.java

@@ -0,0 +1,38 @@
+package com.citu.module.menduner.system.service.job.handler;
+
+import com.citu.module.menduner.system.aop.VipEntitlementCheck;
+import com.citu.module.menduner.system.aop.VipEntitlementCheckAspect;
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+import com.citu.module.menduner.system.enums.job.JobSourceEnum;
+import com.citu.module.menduner.system.enums.job.JobStatusEnum;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+
+/**
+ * 企业vip权益 逻辑处理 {@link JobOperateHandler} 实现类
+ *
+ * @author Rayson
+ */
+@Component
+public class JobEntitlementOperateHandler implements JobOperateHandler {
+
+    @Resource
+    @Lazy
+    private VipEntitlementCheckAspect vipEntitlementCheckAspect;
+
+    @Override
+    public void beforeCreate(JobAdvertisedDO job) {
+        if (JobSourceEnum.FAIR.getType().equals(job.getSource())) {
+            // 招聘会来源不做处理
+            return;
+        }
+        // 不是众聘职位 和 不是待开启的职位才需要权益
+        boolean triggerVip = !job.getHire() && !JobStatusEnum.WAIT_ENABLE.getStatus().equals(job.getStatus());
+        // 扣除额度
+        vipEntitlementCheckAspect.deductQuota(VipEntitlementCheck.OPERATE_PUBLISH_JOB, triggerVip);
+
+    }
+}

+ 31 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobEsOperateHandler.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.system.service.job.handler;
+
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+import com.citu.module.menduner.system.enums.sync.OperateTypeEnum;
+import com.citu.module.menduner.system.enums.sync.SyncConstants;
+import com.citu.module.menduner.system.mq.producer.ESProducer;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+
+/**
+ * 招聘职位es数据同步 逻辑处理 {@link JobOperateHandler} 实现类
+ *
+ * @author Rayson
+ */
+@Component
+public class JobEsOperateHandler implements JobOperateHandler {
+
+    @Resource
+    @Lazy
+    private ESProducer esProducer;
+
+    @Override
+    @Async
+    public void dataSync(JobAdvertisedDO job, OperateTypeEnum operate) {
+        esProducer.send(SyncConstants.JOB, operate.getType(), job.getId());
+    }
+}

+ 52 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobFairOperateHandler.java

@@ -0,0 +1,52 @@
+package com.citu.module.menduner.system.service.job.handler;
+
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+import com.citu.module.menduner.system.enums.job.JobSourceEnum;
+import com.citu.module.menduner.system.enums.job.JobStatusEnum;
+import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_JOB_ADVERTISED_SOURCE_ID_NOT_NULL;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_JOB_ADVERTISED_TIME_ERROR_24;
+
+
+/**
+ * 招聘会逻辑处理 {@link JobOperateHandler} 实现类
+ *
+ * @author Rayson
+ */
+@Component
+public class JobFairOperateHandler implements JobOperateHandler {
+
+    @Resource
+    @Lazy
+    private EnterpriseService enterpriseService;
+
+    @Override
+    public void beforeCreate(JobAdvertisedDO job) {
+        if (JobSourceEnum.FAIR.getType().equals(job.getSource())
+                && null != job.getBizId()) {
+            // 没有填写来源(招聘会id)
+            throw exception(MDE_JOB_ADVERTISED_SOURCE_ID_NOT_NULL);
+
+        }
+    }
+
+    @Override
+    public void beforeUpdate(JobAdvertisedDO job, JobAdvertisedDO oldJob) {
+        if (JobSourceEnum.FAIR.getType().equals(job.getSource())){
+            // 如果发布职位的job.createTime超过了24小时则不可编辑,respVO.setEdit(false);
+            boolean isVip = enterpriseService.checkVip(oldJob.getEnterpriseId());
+            if (!isVip && JobStatusEnum.ENABLE.getStatus().equals(oldJob.getStatus())
+                    && ChronoUnit.HOURS.between(oldJob.getCreateTime(), LocalDateTime.now()) > 24) {
+                throw exception(MDE_JOB_ADVERTISED_TIME_ERROR_24);
+            }
+        }
+    }
+}

+ 41 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobGraphOperateHandler.java

@@ -0,0 +1,41 @@
+package com.citu.module.menduner.system.service.job.handler;
+
+import com.citu.module.menduner.system.api.python.GraphSendDTO;
+import com.citu.module.menduner.system.convert.JobAdvertisedConvert;
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+import com.citu.module.menduner.system.enums.sync.OperateTypeEnum;
+import com.citu.module.menduner.system.enums.sync.SyncConstants;
+import com.citu.module.menduner.system.mq.producer.ESProducer;
+import com.citu.module.menduner.system.mq.producer.GraphProducer;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+
+/**
+ * 招聘职位图数据库 逻辑处理 {@link JobOperateHandler} 实现类
+ *
+ * @author Rayson
+ */
+@Component
+public class JobGraphOperateHandler implements JobOperateHandler {
+
+    @Resource
+    @Lazy
+    private GraphProducer producer;
+
+    @Override
+    @Async
+    public void dataSync(JobAdvertisedDO job, OperateTypeEnum operate) {
+        producer.send(
+                new GraphSendDTO
+                        (
+                                operate.getType(),
+                                SyncConstants.JOB,
+                                JobAdvertisedConvert.INSTANCE.convert(job)
+                        )
+        );
+    }
+}

+ 45 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobHireOperateHandler.java

@@ -0,0 +1,45 @@
+package com.citu.module.menduner.system.service.job.handler;
+
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+import com.citu.module.menduner.system.enums.job.JobSourceEnum;
+import com.citu.module.menduner.system.enums.job.JobStatusEnum;
+import org.springframework.stereotype.Component;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_JOB_ADVERTISED_BALANCE_UPDATE;
+
+
+/**
+ * 众聘逻辑处理 {@link JobOperateHandler} 实现类
+ *
+ * @author Rayson
+ */
+@Component
+public class JobHireOperateHandler implements JobOperateHandler {
+
+    @Override
+    public void beforeCreate(JobAdvertisedDO job) {
+        if (job.getHire() || JobStatusEnum.WAIT_ENABLE.getStatus().equals(job.getStatus())) {
+            // 众聘职位||待开启,还需要给钱才能开启
+            job.setStatus(JobStatusEnum.WAIT_ENABLE.getStatus());
+            job.setSource(JobSourceEnum.HIRE.getType());
+        }
+
+    }
+
+    @Override
+    public void beforeUpdate(JobAdvertisedDO job, JobAdvertisedDO oldJob) {
+        if (job.getHire() && oldJob.getHire()) {
+            // 新提交与旧提交对比 都为众聘职位
+            if (job.getHirePrice() != null && !job.getHirePrice().equals(oldJob.getHirePrice())) {
+                throw exception(MDE_JOB_ADVERTISED_BALANCE_UPDATE);
+            }
+
+        }
+        // 如果普通职位切换成众聘职位
+        if (job.getHire() && !oldJob.getHire()) {
+            // 默认待开启
+            job.setStatus(JobStatusEnum.WAIT_ENABLE.getStatus());
+        }
+    }
+}

+ 58 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/handler/JobOperateHandler.java

@@ -0,0 +1,58 @@
+package com.citu.module.menduner.system.service.job.handler;
+
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+import com.citu.module.menduner.system.enums.sync.OperateTypeEnum;
+
+/**
+ * 招聘职位特殊逻辑处理器 handler 接口
+ * 提供职位生命周期钩子接口;职位创建前、职位创建后、职位修改前、职位修改后、数据同步
+ *
+ * @author Rayson
+ */
+public interface JobOperateHandler {
+
+    /**
+     * 默认管理员的企业id和用户id
+     **/
+     Long DEFAULT_ENTERPRISE_ID = 1L;
+     Long DEFAULT_USER_ID = 1L;
+
+    /**
+     * 职位创建前
+     *
+     * @param job 招聘职位信息
+     */
+    default void beforeCreate(JobAdvertisedDO job) {}
+
+    /**
+     * 职位创建后
+     *
+     * @param job 招聘职位信息
+     */
+    default void afterCreate(JobAdvertisedDO job) {}
+
+    /**
+     * 职位修改前
+     *
+     * @param job 招聘职位信息
+     * @param oldJob 旧的招聘职位信息
+     */
+    default void beforeUpdate(JobAdvertisedDO job,JobAdvertisedDO oldJob) {}
+
+    /**
+     * 职位修改后
+     *
+     * @param job 招聘职位信息
+     * @param oldJob 旧的招聘职位信息
+     */
+    default void afterUpdate(JobAdvertisedDO job,JobAdvertisedDO oldJob) {}
+    
+    
+    /**
+     * 职位数据同步
+     *
+     * @param job 招聘职位信息
+     * @param operate 操作类型
+     */
+    default void dataSync(JobAdvertisedDO job, OperateTypeEnum operate) {}
+}

+ 24 - 14
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoServiceImpl.java

@@ -294,20 +294,30 @@ public class PersonInfoServiceImpl implements PersonInfoService {
             if (!StringUtils.hasText(reqVO.getPhone())) {
                 throw exception(MDE_PERSON_PHONE_NOT_EXISTS);
             }
-            // 新增
-            PersonInfoDO userInfo = PersonInfoDO.builder()
-                    .userId(userId)
-                    .type(PersonTypeEnum.STUDENT.getType())
-                    .avatar(reqVO.getAvatar())
-                    .name(reqVO.getName())
-                    .sex(reqVO.getSex())
-                    .birthday(reqVO.getBirthday())
-                    .phone(reqVO.getPhone())
-                    .build();
-            personInfoMapper.insert(userInfo);
-
-
-            reqObj.setPersonId(userInfo.getId());
+            PersonInfoDO person = personInfoMapper.getByUserId(userId);
+            if(null == person) {
+                // 新增
+                PersonInfoDO userInfo = PersonInfoDO.builder()
+                        .userId(userId)
+                        .type(PersonTypeEnum.STUDENT.getType())
+                        .avatar(reqVO.getAvatar())
+                        .name(reqVO.getName())
+                        .sex(reqVO.getSex())
+                        .birthday(reqVO.getBirthday())
+                        .phone(reqVO.getPhone())
+                        .build();
+                personInfoMapper.insert(userInfo);
+                reqObj.setPersonId(userInfo.getId());
+            }else {
+                person.setType(PersonTypeEnum.STUDENT.getType());
+                person.setAvatar(reqVO.getAvatar());
+                person.setName(reqVO.getName());
+                person.setSex(reqVO.getSex());
+                person.setBirthday(reqVO.getBirthday());
+                person.setPhone(reqVO.getPhone());
+                personInfoMapper.updateById(person);
+                reqObj.setPersonId(person.getId());
+            }
 
             studentMapper.insert(reqObj);
 

+ 1 - 0
menduner/menduner-system-biz/src/main/resources/i18n/messages_en_GB.properties

@@ -417,6 +417,7 @@
 1_100_056_004=The job fair time has passed, recruitment is temporarily suspended
 1_100_056_005=You do not have permission to attend this job fair
 1_100_056_006=The job fair has not started yet
+1_100_056_008=Your recruitment fair ticket permit has been disabled, please contact the staff
 # ========== 招聘职位扩展 1_100_057_000 ==========
 1_100_057_001=Recruitment position ID cannot be empty
 # ========== 页面内容 1_100_058_000 ==========

+ 1 - 0
menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties

@@ -423,6 +423,7 @@
 1_100_056_004=The job fair time has passed, recruitment is temporarily suspended
 1_100_056_005=You do not have permission to attend this job fair
 1_100_056_006=The job fair has not started yet
+1_100_056_008=Your recruitment fair ticket permit has been disabled, please contact the staff
 # ========== 招聘职位扩展 1_100_057_000 ==========
 1_100_057_001=Recruitment position ID cannot be empty
 # ========== 页面内容 1_100_058_000 ==========

+ 1 - 0
menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties

@@ -424,6 +424,7 @@
 1_100_056_004=招聘会时间已过,暂停招聘
 1_100_056_005=您没有权限参加该招聘会
 1_100_056_006=招聘会时间还未开始
+1_100_056_008=您的招聘会门票许可已被禁用,请联系工作人员
 # ========== 招聘职位扩展 1_100_057_000 ==========
 1_100_057_001=招聘职位id不能为空
 # ========== 页面内容 1_100_058_000 ==========