浏览代码

1、增加招聘职位投递,招聘职位效验接口

rayson 1 年之前
父节点
当前提交
6c948b4623
共有 18 个文件被更改,包括 775 次插入13 次删除
  1. 10 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  2. 93 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobCvRelController.java
  3. 39 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/vo/JobCvRelPageReqVO.java
  4. 51 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/vo/JobCvRelRespVO.java
  5. 44 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/vo/JobCvRelSaveReqVO.java
  6. 6 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/person/PersonEnterpriseSubscribeController.java
  7. 41 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/AppJobCvRelController.java
  8. 25 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/job/vo/AppJobCvRelReqVO.java
  9. 58 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/job/JobCvRelDO.java
  10. 41 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobCvRelMapper.java
  11. 6 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindServiceImpl.java
  12. 67 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelService.java
  13. 114 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelServiceImpl.java
  14. 8 1
      menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties
  15. 8 1
      menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties
  16. 143 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/job/JobCvRelServiceImplTest.java
  17. 2 1
      menduner/menduner-system-biz/src/test/resources/sql/clean.sql
  18. 19 1
      menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

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

@@ -254,4 +254,14 @@ public interface ErrorCodeConstants {
     ErrorCode ENTERPRISE_USER_APPLY_APPROVED_SUCCESS = new ErrorCode(1_200_019_003, "用户申请申请已审批通过,无法拒绝");
     ErrorCode ENTERPRISE_USER_APPLY_ENTERPRISE_ID_NOT_NULL = new ErrorCode(1_200_019_004, "企业id不能为空");
     ErrorCode ENTERPRISE_USER_APPLY_APPLYING = new ErrorCode(1_200_019_005, "已申请审核中,请勿重复提交");
+
+
+    // ========== 门墩儿-招聘职位简历投递 1_200_020_000 ==========
+    ErrorCode JOB_CV_REL_NOT_EXISTS = new ErrorCode(1_200_020_001, "招聘职位简历投递不存在");
+    ErrorCode JOB_CV_REL_EXISTS = new ErrorCode(1_200_020_002, "该职位已投递");
+    ErrorCode JOB_CV_REL_RESUME_ID_NOT_NULL = new ErrorCode(1_200_020_003, "未选择简历附件");
+    ErrorCode JOB_CV_REL_JOB_ID_NOT_NULL = new ErrorCode(1_200_020_004, "招聘职位id不能为空");
+    ErrorCode JOB_CV_REL_JOB_NOT_ALLOW_DELIVERY = new ErrorCode(1_200_020_005, "该职位暂不允许投递");
+    ErrorCode JOB_CV_REL_JOB_STOP_DELIVERY = new ErrorCode(1_200_020_006, "该职位停止招聘");
+
 }

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

@@ -0,0 +1,93 @@
+package com.citu.module.menduner.system.controller.admin.job;
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.system.controller.admin.job.vo.JobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.admin.job.vo.JobCvRelRespVO;
+import com.citu.module.menduner.system.controller.admin.job.vo.JobCvRelSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
+import com.citu.module.menduner.system.service.job.JobCvRelService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 门墩儿-招聘职位简历投递")
+@RestController
+@RequestMapping("/menduner/system/job-cv-rel")
+@Validated
+public class JobCvRelController {
+
+    @Resource
+    private JobCvRelService jobCvRelService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建门墩儿-招聘职位简历投递")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-cv-rel:create')")
+    public CommonResult<Long> createJobCvRel(@Valid @RequestBody JobCvRelSaveReqVO createReqVO) {
+        return success(jobCvRelService.createJobCvRel(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新门墩儿-招聘职位简历投递")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-cv-rel:update')")
+    public CommonResult<Boolean> updateJobCvRel(@Valid @RequestBody JobCvRelSaveReqVO updateReqVO) {
+        jobCvRelService.updateJobCvRel(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除门墩儿-招聘职位简历投递")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-cv-rel:delete')")
+    public CommonResult<Boolean> deleteJobCvRel(@RequestParam("id") Long id) {
+        jobCvRelService.deleteJobCvRel(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得门墩儿-招聘职位简历投递")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-cv-rel:query')")
+    public CommonResult<JobCvRelRespVO> getJobCvRel(@RequestParam("id") Long id) {
+        JobCvRelDO jobCvRel = jobCvRelService.getJobCvRel(id);
+        return success(BeanUtils.toBean(jobCvRel, JobCvRelRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得门墩儿-招聘职位简历投递分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-cv-rel:query')")
+    public CommonResult<PageResult<JobCvRelRespVO>> getJobCvRelPage(@Valid JobCvRelPageReqVO pageReqVO) {
+        PageResult<JobCvRelDO> pageResult = jobCvRelService.getJobCvRelPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, JobCvRelRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出门墩儿-招聘职位简历投递 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-cv-rel:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportJobCvRelExcel(@Valid JobCvRelPageReqVO pageReqVO,
+                                    HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<JobCvRelDO> list = jobCvRelService.getJobCvRelPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "门墩儿-招聘职位简历投递.xls", "数据", JobCvRelRespVO.class,
+                BeanUtils.toBean(list, JobCvRelRespVO.class));
+    }
+
+}

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

@@ -0,0 +1,39 @@
+package com.citu.module.menduner.system.controller.admin.job.vo;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 门墩儿-招聘职位简历投递分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class JobCvRelPageReqVO extends PageParam {
+
+    @Schema(description = "企业id", example = "20026")
+    private Long enterpriseId;
+
+    @Schema(description = "发布的职位id", example = "19402")
+    private Long jobId;
+
+    @Schema(description = "发布职位的用户id", example = "6227")
+    private Long publishUserId;
+
+    @Schema(description = "投递用户id", example = "7769")
+    private Long userId;
+
+    @Schema(description = "投递的简历状态", example = "2")
+    private String status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

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

@@ -0,0 +1,51 @@
+package com.citu.module.menduner.system.controller.admin.job.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 门墩儿-招聘职位简历投递 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class JobCvRelRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24200")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20026")
+    @ExcelProperty("企业id")
+    private Long enterpriseId;
+
+    @Schema(description = "发布的职位id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19402")
+    @ExcelProperty("发布的职位id")
+    private Long jobId;
+
+    @Schema(description = "发布职位的用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6227")
+    @ExcelProperty("发布职位的用户id")
+    private Long publishUserId;
+
+    @Schema(description = "投递用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "7769")
+    @ExcelProperty("投递用户id")
+    private Long userId;
+
+    @Schema(description = "简历附件标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("简历附件标题")
+    private String title;
+
+    @Schema(description = "简历附件地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @ExcelProperty("简历附件地址")
+    private String url;
+
+    @Schema(description = "投递的简历状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("投递的简历状态")
+    private String status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

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

@@ -0,0 +1,44 @@
+package com.citu.module.menduner.system.controller.admin.job.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 门墩儿-招聘职位简历投递新增/修改 Request VO")
+@Data
+public class JobCvRelSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "24200")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20026")
+    @NotNull(message = "企业id不能为空")
+    private Long enterpriseId;
+
+    @Schema(description = "发布的职位id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19402")
+    @NotNull(message = "发布的职位id不能为空")
+    private Long jobId;
+
+    @Schema(description = "发布职位的用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "6227")
+    @NotNull(message = "发布职位的用户id不能为空")
+    private Long publishUserId;
+
+    @Schema(description = "投递用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "7769")
+    @NotNull(message = "投递用户id不能为空")
+    private Long userId;
+
+    @Schema(description = "简历附件标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "简历附件标题不能为空")
+    private String title;
+
+    @Schema(description = "简历附件地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @NotEmpty(message = "简历附件地址不能为空")
+    private String url;
+
+    @Schema(description = "投递的简历状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotEmpty(message = "投递的简历状态不能为空")
+    private String status;
+
+}

+ 6 - 6
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/person/PersonEnterpriseSubscribeController.java

@@ -38,14 +38,14 @@ public class PersonEnterpriseSubscribeController {
 
     @PostMapping("/create")
     @Operation(summary = "创建门墩儿-人才-企业关注订阅")
-    @PreAuthorize("@ss.hasPermission('menduner.system:person-enterprise-subscribe:create')")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-enterprise-subscribe:create')")
     public CommonResult<Long> createPersonEnterpriseSubscribe(@Valid @RequestBody PersonEnterpriseSubscribeSaveReqVO createReqVO) {
         return success(personEnterpriseSubscribeService.createPersonEnterpriseSubscribe(createReqVO));
     }
 
     @PutMapping("/update")
     @Operation(summary = "更新门墩儿-人才-企业关注订阅")
-    @PreAuthorize("@ss.hasPermission('menduner.system:person-enterprise-subscribe:update')")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-enterprise-subscribe:update')")
     public CommonResult<Boolean> updatePersonEnterpriseSubscribe(@Valid @RequestBody PersonEnterpriseSubscribeSaveReqVO updateReqVO) {
         personEnterpriseSubscribeService.updatePersonEnterpriseSubscribe(updateReqVO);
         return success(true);
@@ -54,7 +54,7 @@ public class PersonEnterpriseSubscribeController {
     @DeleteMapping("/delete")
     @Operation(summary = "删除门墩儿-人才-企业关注订阅")
     @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('menduner.system:person-enterprise-subscribe:delete')")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-enterprise-subscribe:delete')")
     public CommonResult<Boolean> deletePersonEnterpriseSubscribe(@RequestParam("id") Long id) {
         personEnterpriseSubscribeService.deletePersonEnterpriseSubscribe(id);
         return success(true);
@@ -63,7 +63,7 @@ public class PersonEnterpriseSubscribeController {
     @GetMapping("/get")
     @Operation(summary = "获得门墩儿-人才-企业关注订阅")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('menduner.system:person-enterprise-subscribe:query')")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-enterprise-subscribe:query')")
     public CommonResult<PersonEnterpriseSubscribeRespVO> getPersonEnterpriseSubscribe(@RequestParam("id") Long id) {
         PersonEnterpriseSubscribeDO personEnterpriseSubscribe = personEnterpriseSubscribeService.getPersonEnterpriseSubscribe(id);
         return success(BeanUtils.toBean(personEnterpriseSubscribe, PersonEnterpriseSubscribeRespVO.class));
@@ -71,7 +71,7 @@ public class PersonEnterpriseSubscribeController {
 
     @GetMapping("/page")
     @Operation(summary = "获得门墩儿-人才-企业关注订阅分页")
-    @PreAuthorize("@ss.hasPermission('menduner.system:person-enterprise-subscribe:query')")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-enterprise-subscribe:query')")
     public CommonResult<PageResult<PersonEnterpriseSubscribeRespVO>> getPersonEnterpriseSubscribePage(@Valid PersonEnterpriseSubscribePageReqVO pageReqVO) {
         PageResult<PersonEnterpriseSubscribeDO> pageResult = personEnterpriseSubscribeService.getPersonEnterpriseSubscribePage(pageReqVO);
         return success(BeanUtils.toBean(pageResult, PersonEnterpriseSubscribeRespVO.class));
@@ -79,7 +79,7 @@ public class PersonEnterpriseSubscribeController {
 
     @GetMapping("/export-excel")
     @Operation(summary = "导出门墩儿-人才-企业关注订阅 Excel")
-    @PreAuthorize("@ss.hasPermission('menduner.system:person-enterprise-subscribe:export')")
+    @PreAuthorize("@ss.hasPermission('menduner:system:person-enterprise-subscribe:export')")
     @ApiAccessLog(operateType = EXPORT)
     public void exportPersonEnterpriseSubscribeExcel(@Valid PersonEnterpriseSubscribePageReqVO pageReqVO,
                                                      HttpServletResponse response) throws IOException {

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

@@ -0,0 +1,41 @@
+package com.citu.module.menduner.system.controller.app.job;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.system.controller.app.job.vo.AppJobCvRelReqVO;
+import com.citu.module.menduner.system.service.job.JobCvRelService;
+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.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "用户端 - 招聘职位简历投递")
+@RestController
+@RequestMapping("/menduner/system/job-cv-rel")
+@Validated
+public class AppJobCvRelController {
+
+    @Resource
+    private JobCvRelService jobCvRelService;
+
+    @PostMapping("/send")
+    @PreAuthenticated
+    @Operation(summary = "投递简历")
+    public CommonResult<Boolean> send(@Valid @RequestBody AppJobCvRelReqVO reqVO) {
+        jobCvRelService.send(reqVO);
+        return success(true);
+    }
+
+    @GetMapping("/check/send")
+    @PreAuthenticated
+    @Operation(summary = "效验招聘职位是否投递")
+    public CommonResult<Boolean> checkSend(@RequestParam("jobId") Long jobId) {
+        return success(jobCvRelService.checkSend(jobId));
+    }
+
+}

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

@@ -0,0 +1,25 @@
+package com.citu.module.menduner.system.controller.app.job.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "menduner - 招聘职位简历投递 Request VO")
+@Data
+public class AppJobCvRelReqVO {
+
+    @Schema(description = "发布的职位id", requiredMode = Schema.RequiredMode.REQUIRED, example = "19402")
+    @NotNull(message = "{1_200_020_004}")
+    private Long jobId;
+
+    @Schema(description = "简历附件标题", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "{1_200_020_003}")
+    private String title;
+
+    @Schema(description = "简历附件地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @NotEmpty(message = "{1_200_020_003}")
+    private String url;
+
+}

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

@@ -0,0 +1,58 @@
+package com.citu.module.menduner.system.dal.dataobject.job;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+/**
+ * 门墩儿-招聘职位简历投递 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_job_cv_rel")
+@KeySequence("mde_job_cv_rel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class JobCvRelDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 企业id
+     */
+    private Long enterpriseId;
+    /**
+     * 发布的职位id
+     */
+    private Long jobId;
+    /**
+     * 发布职位的用户id
+     */
+    private Long publishUserId;
+    /**
+     * 投递用户id
+     */
+    private Long userId;
+    /**
+     * 简历附件标题
+     */
+    private String title;
+    /**
+     * 简历附件地址
+     */
+    private String url;
+    /**
+     * 投递的简历状态
+     */
+    private String status;
+
+}

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

@@ -0,0 +1,41 @@
+package com.citu.module.menduner.system.dal.mysql.job;
+
+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.module.menduner.system.controller.admin.job.vo.JobCvRelPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.time.LocalDateTime;
+
+/**
+ * 门墩儿-招聘职位简历投递 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface JobCvRelMapper extends BaseMapperX<JobCvRelDO> {
+
+    default PageResult<JobCvRelDO> selectPage(JobCvRelPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<JobCvRelDO>()
+                .eqIfPresent(JobCvRelDO::getEnterpriseId, reqVO.getEnterpriseId())
+                .eqIfPresent(JobCvRelDO::getJobId, reqVO.getJobId())
+                .eqIfPresent(JobCvRelDO::getPublishUserId, reqVO.getPublishUserId())
+                .eqIfPresent(JobCvRelDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(JobCvRelDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(JobCvRelDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(JobCvRelDO::getId));
+    }
+
+    // 根据用户ID和职位id判断15天内是否有数据,如果有返回true
+    default Boolean checkDataWithin15Day(Long userId, Long jobId){
+        return selectCount(new LambdaQueryWrapperX<JobCvRelDO>()
+                .eq(JobCvRelDO::getUserId, userId)
+                .eq(JobCvRelDO::getJobId, jobId)
+                .ge(JobCvRelDO::getCreateTime, LocalDateTime.now().minusDays(15))) > 0;
+    }
+
+
+
+}

+ 6 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindServiceImpl.java

@@ -14,7 +14,6 @@ import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterprisePostD
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;
 import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseMapper;
 import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseUserBindMapper;
-import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import com.citu.module.menduner.system.service.enterprise.post.EnterprisePostService;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
@@ -136,9 +135,13 @@ public class EnterpriseUserBindServiceImpl implements EnterpriseUserBindService
     @Override
     public AppAdminEnterpriseUserBindRespVO getEnterpriseUserBind() {
         LoginUser loginUser = getLoginUser();
+        if (null != loginUser
+                && loginUser.getInfo().containsKey(LoginUser.INFO_KEY_DATA_ID)) {
+            throw exception(MDE_ENTERPRISE_USER_BIND_NOT_EXISTS);
+        }
         EnterpriseUserBindDO userBindDO = enterpriseUserBindMapper
-                .selectByEnterpriseIdAndUserId(loginUser.getId(),
-                        Long.valueOf(loginUser.getInfo().get(LoginUser.INFO_KEY_DATA_ID)));
+                .selectByEnterpriseIdAndUserId(
+                        Long.valueOf(loginUser.getInfo().get(LoginUser.INFO_KEY_DATA_ID)), loginUser.getId());
         if (null == userBindDO) {
             throw exception(MDE_ENTERPRISE_USER_BIND_NOT_EXISTS);
         }

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

@@ -0,0 +1,67 @@
+package com.citu.module.menduner.system.service.job;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.admin.job.vo.JobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.admin.job.vo.JobCvRelSaveReqVO;
+import com.citu.module.menduner.system.controller.app.job.vo.AppJobCvRelReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
+
+import javax.validation.Valid;
+
+/**
+ * 门墩儿-招聘职位简历投递 Service 接口
+ *
+ * @author Rayson
+ */
+public interface JobCvRelService {
+
+    /**
+     * 创建门墩儿-招聘职位简历投递
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createJobCvRel(@Valid JobCvRelSaveReqVO createReqVO);
+
+    /**
+     * 更新门墩儿-招聘职位简历投递
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateJobCvRel(@Valid JobCvRelSaveReqVO updateReqVO);
+
+    /**
+     * 删除门墩儿-招聘职位简历投递
+     *
+     * @param id 编号
+     */
+    void deleteJobCvRel(Long id);
+
+    /**
+     * 获得门墩儿-招聘职位简历投递
+     *
+     * @param id 编号
+     * @return 门墩儿-招聘职位简历投递
+     */
+    JobCvRelDO getJobCvRel(Long id);
+
+    /**
+     * 获得门墩儿-招聘职位简历投递分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 门墩儿-招聘职位简历投递分页
+     */
+    PageResult<JobCvRelDO> getJobCvRelPage(JobCvRelPageReqVO pageReqVO);
+
+    /**
+     * 简历投递
+     * @param reqVO
+     */
+    void send(AppJobCvRelReqVO reqVO);
+
+    /**
+     * 效验是否投递了该职位
+     * @param jobId 职位id
+     */
+    boolean checkSend(Long jobId);
+}

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

@@ -0,0 +1,114 @@
+package com.citu.module.menduner.system.service.job;
+
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.system.controller.admin.job.vo.JobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.admin.job.vo.JobCvRelSaveReqVO;
+import com.citu.module.menduner.system.controller.app.job.vo.AppJobCvRelReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
+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 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.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
+
+/**
+ * 门墩儿-招聘职位简历投递 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class JobCvRelServiceImpl implements JobCvRelService {
+
+    @Resource
+    private JobCvRelMapper jobCvRelMapper;
+
+    @Resource
+    private JobAdvertisedMapper jobAdvertisedMapper;
+
+    @Override
+    public Long createJobCvRel(JobCvRelSaveReqVO createReqVO) {
+        // 插入
+        JobCvRelDO jobCvRel = BeanUtils.toBean(createReqVO, JobCvRelDO.class);
+        jobCvRelMapper.insert(jobCvRel);
+        // 返回
+        return jobCvRel.getId();
+    }
+
+    @Override
+    public void updateJobCvRel(JobCvRelSaveReqVO updateReqVO) {
+        // 校验存在
+        validateJobCvRelExists(updateReqVO.getId());
+        // 更新
+        JobCvRelDO updateObj = BeanUtils.toBean(updateReqVO, JobCvRelDO.class);
+        jobCvRelMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteJobCvRel(Long id) {
+        // 校验存在
+        validateJobCvRelExists(id);
+        // 删除
+        jobCvRelMapper.deleteById(id);
+    }
+
+    private void validateJobCvRelExists(Long id) {
+        if (jobCvRelMapper.selectById(id) == null) {
+            throw exception(JOB_CV_REL_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public JobCvRelDO getJobCvRel(Long id) {
+        return jobCvRelMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<JobCvRelDO> getJobCvRelPage(JobCvRelPageReqVO pageReqVO) {
+        return jobCvRelMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    @DSTransactional
+    public void send(AppJobCvRelReqVO reqVO) {
+        // 效验职位是否关闭
+        JobAdvertisedDO job = jobAdvertisedMapper.selectById(reqVO.getJobId());
+        if (MendunerStatusEnum.DISABLE.getStatus().equals(job.getStatus())) {
+            throw exception(JOB_CV_REL_JOB_STOP_DELIVERY);
+        }
+        Long userId = getLoginUserId();
+        // 效验某段时间是否投递过
+        if (jobCvRelMapper.checkDataWithin15Day(userId, reqVO.getJobId())) {
+            throw exception(JOB_CV_REL_EXISTS);
+        }
+        // 赋值
+        JobCvRelDO jobCvRel = BeanUtils.toBean(reqVO, JobCvRelDO.class);
+        jobCvRel.setUserId(userId);
+        jobCvRel.setPublishUserId(job.getUserId());
+        jobCvRel.setEnterpriseId(job.getEnterpriseId());
+        // 暂时不知道有什么状态
+        jobCvRel.setStatus(MendunerStatusEnum.ENABLE.getStatus());
+        // 保存
+        jobCvRelMapper.insert(jobCvRel);
+    }
+
+    @Override
+    public boolean checkSend(Long jobId) {
+        Long userId = getLoginUserId();
+        if(null == userId) {
+            // 没登录
+            return false;
+        }
+        // 效验某段时间是否投递过
+        return jobCvRelMapper.checkDataWithin15Day(userId, jobId);
+    }
+}

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

@@ -208,4 +208,11 @@
 1_200_019_002=User application has been approved
 1_200_019_003=The user's application has been approved and cannot be rejected
 1_200_019_004=Enterprise ID cannot be empty
-1_200_019_005=Applied for review, please do not resubmit
+1_200_019_005=Applied for review, please do not resubmit
+# ========== 招聘职位简历投递 1_200_019_000 ==========
+1_200_020_001=Recruitment position resume submission does not exist
+1_200_020_002=The position has been submitted
+1_200_020_003=No resume attachment selected
+1_200_020_004=Recruitment position ID cannot be empty
+1_200_020_005=This position is currently not allowed for delivery
+1_200_020_006=Recruitment for this position has been suspended

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

@@ -209,4 +209,11 @@
 1_200_019_002=用户申请已审批
 1_200_019_003=用户申请申请已审批通过,无法拒绝
 1_200_019_004=企业id不能为空
-1_200_019_005=已申请审核中,请勿重复提交
+1_200_019_005=已申请审核中,请勿重复提交
+# ========== 招聘职位简历投递 1_200_019_000 ==========
+1_200_020_001=招聘职位简历投递不存在
+1_200_020_002=该职位已投递
+1_200_020_003=未选择简历附件
+1_200_020_004=招聘职位id不能为空
+1_200_020_005=该职位暂不允许投递
+1_200_020_006=该职位停止招聘

+ 143 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/job/JobCvRelServiceImplTest.java

@@ -0,0 +1,143 @@
+package com.citu.module.menduner.system.service.job;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.system.controller.admin.job.vo.JobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.admin.job.vo.JobCvRelSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
+import com.citu.module.menduner.system.dal.mysql.job.JobCvRelMapper;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
+import static com.citu.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static com.citu.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static com.citu.framework.test.core.util.AssertUtils.assertServiceException;
+import static com.citu.framework.test.core.util.RandomUtils.randomLongId;
+import static com.citu.framework.test.core.util.RandomUtils.randomPojo;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.JOB_CV_REL_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link JobCvRelServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(JobCvRelServiceImpl.class)
+public class JobCvRelServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private JobCvRelServiceImpl jobCvRelService;
+
+    @Resource
+    private JobCvRelMapper jobCvRelMapper;
+
+    @Test
+    public void testCreateJobCvRel_success() {
+        // 准备参数
+        JobCvRelSaveReqVO createReqVO = randomPojo(JobCvRelSaveReqVO.class).setId(null);
+
+        // 调用
+        Long jobCvRelId = jobCvRelService.createJobCvRel(createReqVO);
+        // 断言
+        assertNotNull(jobCvRelId);
+        // 校验记录的属性是否正确
+        JobCvRelDO jobCvRel = jobCvRelMapper.selectById(jobCvRelId);
+        assertPojoEquals(createReqVO, jobCvRel, "id");
+    }
+
+    @Test
+    public void testUpdateJobCvRel_success() {
+        // mock 数据
+        JobCvRelDO dbJobCvRel = randomPojo(JobCvRelDO.class);
+        jobCvRelMapper.insert(dbJobCvRel);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        JobCvRelSaveReqVO updateReqVO = randomPojo(JobCvRelSaveReqVO.class, o -> {
+            o.setId(dbJobCvRel.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        jobCvRelService.updateJobCvRel(updateReqVO);
+        // 校验是否更新正确
+        JobCvRelDO jobCvRel = jobCvRelMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, jobCvRel);
+    }
+
+    @Test
+    public void testUpdateJobCvRel_notExists() {
+        // 准备参数
+        JobCvRelSaveReqVO updateReqVO = randomPojo(JobCvRelSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> jobCvRelService.updateJobCvRel(updateReqVO), JOB_CV_REL_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteJobCvRel_success() {
+        // mock 数据
+        JobCvRelDO dbJobCvRel = randomPojo(JobCvRelDO.class);
+        jobCvRelMapper.insert(dbJobCvRel);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbJobCvRel.getId();
+
+        // 调用
+        jobCvRelService.deleteJobCvRel(id);
+        // 校验数据不存在了
+        assertNull(jobCvRelMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteJobCvRel_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> jobCvRelService.deleteJobCvRel(id), JOB_CV_REL_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetJobCvRelPage() {
+        // mock 数据
+        JobCvRelDO dbJobCvRel = randomPojo(JobCvRelDO.class, o -> { // 等会查询到
+            o.setEnterpriseId(null);
+            o.setJobId(null);
+            o.setPublishUserId(null);
+            o.setUserId(null);
+            o.setStatus(null);
+            o.setCreateTime(null);
+        });
+        jobCvRelMapper.insert(dbJobCvRel);
+        // 测试 enterpriseId 不匹配
+        jobCvRelMapper.insert(cloneIgnoreId(dbJobCvRel, o -> o.setEnterpriseId(null)));
+        // 测试 jobId 不匹配
+        jobCvRelMapper.insert(cloneIgnoreId(dbJobCvRel, o -> o.setJobId(null)));
+        // 测试 publishUserId 不匹配
+        jobCvRelMapper.insert(cloneIgnoreId(dbJobCvRel, o -> o.setPublishUserId(null)));
+        // 测试 userId 不匹配
+        jobCvRelMapper.insert(cloneIgnoreId(dbJobCvRel, o -> o.setUserId(null)));
+        // 测试 status 不匹配
+        jobCvRelMapper.insert(cloneIgnoreId(dbJobCvRel, o -> o.setStatus(null)));
+        // 测试 createTime 不匹配
+        jobCvRelMapper.insert(cloneIgnoreId(dbJobCvRel, o -> o.setCreateTime(null)));
+        // 准备参数
+        JobCvRelPageReqVO reqVO = new JobCvRelPageReqVO();
+        reqVO.setEnterpriseId(null);
+        reqVO.setJobId(null);
+        reqVO.setPublishUserId(null);
+        reqVO.setUserId(null);
+        reqVO.setStatus(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<JobCvRelDO> pageResult = jobCvRelService.getJobCvRelPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbJobCvRel, pageResult.getList().get(0));
+    }
+
+}

+ 2 - 1
menduner/menduner-system-biz/src/test/resources/sql/clean.sql

@@ -24,4 +24,5 @@ DELETE FROM "mde_person_job_collection";
 DELETE FROM "mde_train_exp";
 DELETE FROM "mde_project_exp";
 DELETE FROM "mde_skill";
-DELETE FROM "mde_enterprise_user_apply";
+DELETE FROM "mde_enterprise_user_apply";
+DELETE FROM "mde_job_cv_rel";

+ 19 - 1
menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

@@ -488,4 +488,22 @@ CREATE TABLE IF NOT EXISTS "mde_enterprise_user_apply" (
     "deleted" bit NOT NULL DEFAULT FALSE,
     "tenant_id" bigint NOT NULL,
     PRIMARY KEY ("id")
-) COMMENT '门墩儿-企业用户申请';
+) COMMENT '门墩儿-企业用户申请';
+
+CREATE TABLE IF NOT EXISTS "mde_job_cv_rel" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "enterprise_id" bigint NOT NULL,
+    "job_id" bigint NOT NULL,
+    "publish_user_id" bigint NOT NULL,
+    "user_id" bigint NOT NULL,
+    "title" varchar NOT NULL,
+    "url" varchar NOT NULL,
+    "status" varchar NOT NULL,
+    "creator" varchar DEFAULT '',
+    "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+    "updater" varchar DEFAULT '',
+    "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    "deleted" bit NOT NULL DEFAULT FALSE,
+    "tenant_id" bigint NOT NULL,
+    PRIMARY KEY ("id")
+) COMMENT '门墩儿-招聘职位简历投递表';