瀏覽代碼

Merge remote-tracking branch 'origin/master' into develop_zqc

DESKTOP-VAEGFGM\zqc 11 月之前
父節點
當前提交
82c196835d
共有 86 個文件被更改,包括 2157 次插入240 次删除
  1. 8 1
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java
  2. 10 0
      citu-module-infra/citu-module-infra-biz/src/main/java/com/citu/module/infra/dal/dataobject/logger/ApiAccessLogDO.java
  3. 14 1
      citu-module-infra/citu-module-infra-biz/src/main/java/com/citu/module/infra/service/logger/ApiAccessLogServiceImpl.java
  4. 1 1
      citu-module-infra/citu-module-infra-biz/src/main/resources/application.yaml
  5. 1 1
      menduner/menduner-im-biz/src/main/resources/i18n/messages_zh_CN.properties
  6. 17 1
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/ErrorCodeConstants.java
  7. 3 1
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/account/BalanceBizTypeEnum.java
  8. 1 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/account/PointBizTypeEnum.java
  9. 4 5
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/cv/ConversationStatusEnum.java
  10. 1 1
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/cv/JobCvRelStatusEnum.java
  11. 22 9
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/eduexp/EducationTypeEnum.java
  12. 19 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/enterprise/EnterpriseAuthStatusEnum.java
  13. 3 3
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/interview/InterviewInviteStatusEnum.java
  14. 17 0
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/person/PersonSexEnum.java
  15. 23 1
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/workexp/ExpTypeEnum.java
  16. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseAccountController.java
  17. 113 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseAuthController.java
  18. 4 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseUserApplyController.java
  19. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/hire/HireCommissionRatioController.java
  20. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/enterprise/vo/apply/AppEnterpriseUserApplyRespVO.java
  21. 2 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/enterprise/vo/register/AppEnterpriseRegisterReqVO.java
  22. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/interview/AppInterviewInviteController.java
  23. 33 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/interview/vo/AppInterviewInvitePageReqVO.java
  24. 62 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/analysis/AppAdminAnalysisController.java
  25. 26 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/analysis/vo/AppAdminAnalysisReqVO.java
  26. 22 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/enterprise/AppAdminEnterpriseController.java
  27. 16 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/enterprise/auth/AppAdminEnterpriseAuthRespVO.java
  28. 31 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/enterprise/auth/AppAdminEnterpriseAuthSaveReqVO.java
  29. 29 5
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/AppAdminInterviewInviteController.java
  30. 2 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/vo/AppAdminInterviewInviteCancellationReqVO.java
  31. 15 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/vo/AppAdminInterviewInviteFeedbackReqVO.java
  32. 10 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/vo/AppAdminInterviewInviteNotAttendedReqVO.java
  33. 3 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/vo/AppAdminInterviewInviteReqPageVO.java
  34. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/AppAdminJobAdvertisedController.java
  35. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/vo/AppAdminJobSimpleRespVO.java
  36. 22 17
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/AppAdminPersonCvController.java
  37. 9 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/cv/AppAdminJobCvRelPageReqVO.java
  38. 7 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/cv/AppAdminJobCvRelRespVO.java
  39. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/apply/EnterpriseUserApplyAuditReqVO.java
  40. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/apply/EnterpriseUserApplyPageReqVO.java
  41. 2 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/apply/EnterpriseUserApplyRespVO.java
  42. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/apply/EnterpriseUserApplySaveReqVO.java
  43. 18 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/auth/EnterpriseAuthAuditReqVO.java
  44. 49 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/auth/EnterpriseAuthPageReqVO.java
  45. 56 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/auth/EnterpriseAuthRespVO.java
  46. 47 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/auth/EnterpriseAuthSaveReqVO.java
  47. 5 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/interview/InterviewInvitePageReqVO.java
  48. 15 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/interview/InterviewInviteReqOperateVO.java
  49. 10 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/interview/InterviewInviteRespVO.java
  50. 7 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/interview/InterviewInviteSaveReqVO.java
  51. 3 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/EnterpriseConvert.java
  52. 64 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseAuthDO.java
  53. 14 8
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/interview/InterviewInviteDO.java
  54. 36 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseAuthMapper.java
  55. 9 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseMapper.java
  56. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserApplyMapper.java
  57. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserBindMapper.java
  58. 3 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/industry/IndustryMapper.java
  59. 37 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/interview/InterviewInviteMapper.java
  60. 1 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobAdvertisedMapper.java
  61. 138 52
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobCvRelMapper.java
  62. 2 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/position/PositionMapper.java
  63. 15 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/school/SchoolMapper.java
  64. 57 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/scheduled/InterviewInviteScheduled.java
  65. 3 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/apply/EnterpriseUserApplyService.java
  66. 4 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/apply/EnterpriseUserApplyServiceImpl.java
  67. 90 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/auth/EnterpriseAuthService.java
  68. 140 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/auth/EnterpriseAuthServiceImpl.java
  69. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindServiceImpl.java
  70. 1 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioService.java
  71. 7 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioServiceImpl.java
  72. 43 5
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/interview/InterviewInviteService.java
  73. 263 6
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/interview/InterviewInviteServiceImpl.java
  74. 0 8
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/HireJobIntegrationService.java
  75. 21 35
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/HireJobIntegrationServiceImpl.java
  76. 1 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedService.java
  77. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  78. 39 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelService.java
  79. 177 9
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelServiceImpl.java
  80. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoServiceImpl.java
  81. 10 0
      menduner/menduner-system-biz/src/main/resources/i18n/messages_en_US.properties
  82. 12 2
      menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties
  83. 158 0
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/enterprise/EnterpriseAuthServiceImplTest.java
  84. 3 3
      menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/enterprise/EnterpriseUserApplyServiceImplTest.java
  85. 3 1
      menduner/menduner-system-biz/src/test/resources/sql/clean.sql
  86. 17 0
      menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

+ 8 - 1
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/apilog/core/service/ApiAccessLogFrameworkServiceImpl.java

@@ -3,6 +3,7 @@ package com.citu.framework.apilog.core.service;
 import com.citu.module.infra.api.logger.ApiAccessLogApi;
 import com.citu.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
 
 /**
@@ -12,6 +13,7 @@ import org.springframework.scheduling.annotation.Async;
  *
  * @author 芋道源码
  */
+@Slf4j
 @RequiredArgsConstructor
 public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkService {
 
@@ -20,7 +22,12 @@ public class ApiAccessLogFrameworkServiceImpl implements ApiAccessLogFrameworkSe
     @Override
     @Async
     public void createApiAccessLog(ApiAccessLogCreateReqDTO reqDTO) {
-        apiAccessLogApi.createApiAccessLog(reqDTO);
+        try {
+            apiAccessLogApi.createApiAccessLog(reqDTO);
+        } catch (Throwable ex) {
+            // 由于 @Async 异步调用,这里打印下日志,更容易跟进
+            log.error("[createApiAccessLog][url({}) log({}) 发生异常]", reqDTO.getRequestUrl(), reqDTO, ex);
+        }
     }
 
 }

+ 10 - 0
citu-module-infra/citu-module-infra-biz/src/main/java/com/citu/module/infra/dal/dataobject/logger/ApiAccessLogDO.java

@@ -26,6 +26,16 @@ import java.time.LocalDateTime;
 @AllArgsConstructor
 public class ApiAccessLogDO extends BaseDO {
 
+    /**
+     * {@link #requestParams} 的最大长度
+     */
+    public static final Integer REQUEST_PARAMS_MAX_LENGTH = 8000;
+
+    /**
+     * {@link #resultMsg} 的最大长度
+     */
+    public static final Integer RESULT_MSG_MAX_LENGTH = 512;
+
     /**
      * 编号
      */

+ 14 - 1
citu-module-infra/citu-module-infra-biz/src/main/java/com/citu/module/infra/service/logger/ApiAccessLogServiceImpl.java

@@ -1,7 +1,10 @@
 package com.citu.module.infra.service.logger;
 
+import cn.hutool.core.util.StrUtil;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.tenant.core.context.TenantContextHolder;
+import com.citu.framework.tenant.core.util.TenantUtils;
 import com.citu.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO;
 import com.citu.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO;
 import com.citu.module.infra.dal.dataobject.logger.ApiAccessLogDO;
@@ -13,6 +16,9 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 
+import static com.citu.module.infra.dal.dataobject.logger.ApiAccessLogDO.REQUEST_PARAMS_MAX_LENGTH;
+import static com.citu.module.infra.dal.dataobject.logger.ApiAccessLogDO.RESULT_MSG_MAX_LENGTH;
+
 /**
  * API 访问日志 Service 实现类
  *
@@ -29,7 +35,14 @@ public class ApiAccessLogServiceImpl implements ApiAccessLogService {
     @Override
     public void createApiAccessLog(ApiAccessLogCreateReqDTO createDTO) {
         ApiAccessLogDO apiAccessLog = BeanUtils.toBean(createDTO, ApiAccessLogDO.class);
-        apiAccessLogMapper.insert(apiAccessLog);
+        apiAccessLog.setRequestParams(StrUtil.maxLength(apiAccessLog.getRequestParams(), REQUEST_PARAMS_MAX_LENGTH));
+        apiAccessLog.setResultMsg(StrUtil.maxLength(apiAccessLog.getResultMsg(), RESULT_MSG_MAX_LENGTH));
+        if (TenantContextHolder.getTenantId() != null) {
+            apiAccessLogMapper.insert(apiAccessLog);
+        } else {
+            // 极端情况下,上下文中没有租户时,此时忽略租户上下文,避免插入失败!
+            TenantUtils.executeIgnore(() -> apiAccessLogMapper.insert(apiAccessLog));
+        }
     }
 
     @Override

+ 1 - 1
citu-module-infra/citu-module-infra-biz/src/main/resources/application.yaml

@@ -122,7 +122,7 @@ citu:
     admin-ui:
       url: http://dashboard.citu.iocoder.cn # Admin 管理后台 UI 的地址
   access-log:
-    enable: true
+    enable: false
   websocket:
     enable: true # websocket的开关
     path: /infra/ws # 路径

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

@@ -167,7 +167,7 @@
 1_100_021_007=未上传营业执照
 1_100_021_008=统一社会信用代码不能为空
 1_100_021_009=企业已注册
-1_100_021_010=企业申请审核中,请勿重复提交
+1_100_021_010=企业申请审核中,请勿重复提交
 # ========== 企业地址 1_100_022_001 ==========
 1_100_022_001=企业地址不存在
 # ========== 企业登录用户 1_100_023_000 ==========

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

@@ -213,7 +213,10 @@ public interface ErrorCodeConstants {
     ErrorCode MDE_ENTERPRISE_REGISTER_DUPLICATE = new ErrorCode(1_100_021_009, "企业已注册");
 
     ErrorCode MDE_ENTERPRISE_REGISTER_APPLY_DUPLICATE
-            = new ErrorCode(1_100_021_010, "企业已申请审核中,请勿重复提交");
+            = new ErrorCode(1_100_021_010, "企业申请审核中,请勿重复提交");
+
+    ErrorCode MDE_ENTERPRISE_REGISTER_CREDIT_CODE_FORMAT_ERROR
+            = new ErrorCode(1_100_021_011, "统一社会信用代码格式不正确");
 
     // ========== 企业地址 1_100_022_001 ==========
     ErrorCode MDE_ENTERPRISE_ADDRESS_NOT_EXISTS = new ErrorCode(1_100_022_001, "企业地址不存在");
@@ -292,6 +295,9 @@ public interface ErrorCodeConstants {
     ErrorCode INTERVIEW_INVITE_ADDRESS_NOT_NULL = new ErrorCode(1_100_033_009, "面试地址不能为空");
     ErrorCode INTERVIEW_INVITE_STATUS_NOT_NULL = new ErrorCode(1_100_033_010, "面试状态不能为空");
 
+    ErrorCode INTERVIEW_INVITE_STATUS_NOT_COMPLETED = new ErrorCode(1_100_033_011, "当前面试未完成");
+    ErrorCode INTERVIEW_INVITE_STATUS_NOT_ENTRY = new ErrorCode(1_100_033_012, "当前员工还未入职,无法结算");
+
     // ========== 企业用户申请 1_100_034_000 ==========
     ErrorCode ENTERPRISE_USER_APPLY_NOT_EXISTS = new ErrorCode(1_100_034_001, "企业用户申请不存在");
     ErrorCode ENTERPRISE_USER_APPLY_APPROVED = new ErrorCode(1_100_034_002, "用户申请已审批");
@@ -390,4 +396,14 @@ public interface ErrorCodeConstants {
     ErrorCode UNFIT_CANDIDATE_JOB_ID_NOT_NULL = new ErrorCode(1_100_042_003, "发布的职位id不能为空");
     ErrorCode UNFIT_CANDIDATE_TYPE_NOT_NULL = new ErrorCode(1_100_042_004, "类型不能为空");
     ErrorCode UNFIT_CANDIDATE_BUSINESS_ID_NOT_NULL = new ErrorCode(1_100_042_005, "业务id不能为空");
+
+
+    // ========== 企业实名认证 1_100_043_000 ==========
+    ErrorCode ENTERPRISE_AUTH_NOT_EXISTS = new ErrorCode(1_100_043_001, "企业实名认证不存在");
+    ErrorCode ENTERPRISE_AUTH_USER_ID_NOT_NULL = new ErrorCode(1_100_043_002, "认证用户id不能为空");
+    ErrorCode ENTERPRISE_AUTH_NAME_NOT_NULL = new ErrorCode(1_100_043_003, "姓名不能为空");
+    ErrorCode ENTERPRISE_AUTH_IDENTITY_NO_NOT_NULL = new ErrorCode(1_100_043_004, "身份证号码不能为空");
+    ErrorCode ENTERPRISE_AUTH_FRONT_URL_NOT_NULL = new ErrorCode(1_100_043_005, "身份证正面未上传");
+    ErrorCode ENTERPRISE_AUTH_BACK_URL_NOT_NULL = new ErrorCode(1_100_043_006, "身份证反面未上传");
+
 }

+ 3 - 1
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/account/BalanceBizTypeEnum.java

@@ -22,7 +22,9 @@ public enum BalanceBizTypeEnum {
     PLATFORM_COMMISSION(4, "平台抽成", "平台抽取 {} ", true),
     RECOMMENDED_POSITIONS(5, "推荐职位", "推荐职位,获得 {}", true),
     DELIVERY_PERSON(6, "投递人", "投递人,获得 {}", true),
-    GIFT(7, "赠与", "赠与,获得 {}", true)
+    GIFT(7, "赠与", "赠与,获得 {}", true),
+    NOT_RECOMMENDED(8,"无推荐人,推荐人佣金给到平台","推荐职位,获得 {}",true),
+
     ;
 
 

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

@@ -23,6 +23,7 @@ public enum PointBizTypeEnum {
     RECOMMENDED_POSITIONS(5, "推荐职位", "推荐职位,获得 {}", true),
     DELIVERY_PERSON(6, "投递人", "投递人,获得 {}", true),
     GIFT(7, "赠与", "赠与,获得 {}", true),
+    NOT_RECOMMENDED(8,"无推荐人,推荐人佣金给到平台","推荐职位,获得 {}",true),
     SIGN(98, "签到", "签到获得 {} 积分", true),
     EVENT(99, "事件跟踪", "访问[{}],{}{} 积分", true),
     ;

+ 4 - 5
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/cv/ConversationStatusEnum.java

@@ -4,16 +4,15 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 
 /**
- * 会话状态(0 邀约 | 1 已发offer 2 已入职 | 3 已结算 )
+ * 会话状态(0 邀约 | 已入职 | 已结算 )
  **/
 @Getter
 @AllArgsConstructor
 public enum ConversationStatusEnum {
 
-    INVITE("0", "已邀约"),
-    OFFER("1", "已发offer"),
-    ENTRY("2", "已入职"),
-    SETTLEMENT("3", "已结算"),
+    INVITE("0", "邀约"),
+    ENTRY("1", "已入职"),
+    SETTLEMENT("2", "已结算"),
     ;
 
     private final String status;

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

@@ -4,7 +4,7 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 
 /**
- * 简历投递状态(0 新投递 | 1 已查看 | 2 已邀约 | 3 已发offer 4 已入职 | 99 不合适 已淘汰
+ * 简历投递状态(0 新投递 | 1 已查看 )
  **/
 @Getter
 @AllArgsConstructor

+ 22 - 9
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/eduexp/EducationTypeEnum.java

@@ -11,17 +11,30 @@ import lombok.Getter;
 public enum EducationTypeEnum {
 
 
-    PRIMARY_SCHOOL(0),
-    JUNIOR_HIGH_SCHOOL(1),
-    HIGH_SCHOOL(2),
-    COLLEGE(3),
-    BACHELOR(4),
-    MASTER(5),
-    DOCTOR(6),
-    OTHER(99);
+    PRIMARY_SCHOOL("0","初中及以下"),
+    JUNIOR_HIGH_SCHOOL("1","中专/中技"),
+    HIGH_SCHOOL("2","高中"),
+    COLLEGE("3","大专"),
+    BACHELOR("4","本科"),
+    MASTER("5","硕士"),
+    DOCTOR("6","博士"),
+    OTHER("99","其他");
 
     /**
      * 类型
      */
-    private final Integer type;
+    private final String type;
+
+    private final String name;
+
+    // 根据name获取枚举
+    public static EducationTypeEnum getEnumByName(String name) {
+        for (EducationTypeEnum educationTypeEnum : EducationTypeEnum.values()) {
+            if (educationTypeEnum.getName().equals(name)) {
+                return educationTypeEnum;
+            }
+        }
+        return PRIMARY_SCHOOL;
+    }
+
 }

+ 19 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/enterprise/EnterpriseAuthStatusEnum.java

@@ -0,0 +1,19 @@
+package com.citu.module.menduner.system.enums.enterprise;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 企业实名制审核状态 0审核中 1审核通过 2审核不通过
+ **/
+@Getter
+@AllArgsConstructor
+public enum EnterpriseAuthStatusEnum {
+
+    AUDITING("0", "审核中"),
+    APPROVED("1", "审核通过"),
+    REJECT("2", "审核不通过");
+
+    private final String status;
+    private final String name;
+}

+ 3 - 3
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/interview/InterviewInviteStatusEnum.java

@@ -5,7 +5,7 @@ import lombok.Getter;
 
 /**
  * 面试状态 
- * 0待接受|1待面试|2即将面试|3已完成|4待反馈|5已反馈|98拒绝|99已取消
+ * 0待接受|1待面试|2即将面试|3已完成|4已反馈|5未能爽约|98拒绝|99已取消
  **/
 @Getter
 @AllArgsConstructor
@@ -15,8 +15,8 @@ public enum InterviewInviteStatusEnum {
     PENDING_INTERVIEW("1", "待面试"),
     APPROACHING_INTERVIEW("2", "即将面试"),
     COMPLETED("3", "已完成"),
-    AWAITING_FEEDBACK("4", "待反馈"),
-    FEEDBACK_PROVIDED("5", "已反馈"),
+    FEEDBACK_PROVIDED("4", "已反馈"),
+    NOT_ATTENDED("5", "未能爽约"),
     REJECTED("98", "拒绝"),
     CANCELLED("99", "已取消");
 

+ 17 - 0
menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/person/PersonSexEnum.java

@@ -0,0 +1,17 @@
+package com.citu.module.menduner.system.enums.person;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 人才性别(0未知 | 1男 | 2女)
+ **/
+@Getter
+@AllArgsConstructor
+public enum PersonSexEnum {
+    UNKNOWN("0", "未知"),
+    MALE("1", "男"),
+    FEMALE("2", "女");
+    private final String type;
+    private final String name;
+}

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

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.system.enums.workexp;
 
+import com.citu.module.menduner.system.enums.eduexp.EducationTypeEnum;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -8,6 +9,27 @@ import lombok.Getter;
  **/
 @Getter
 @AllArgsConstructor
-public class ExpTypeEnum {
+public enum ExpTypeEnum {
+    IN_SCHOOL("0","在校生"),
+    NEW_GRADUATE("1","应届生"),
+    NO_LIMIT("2","经验不限"),
+    LESS_THAN_ONE_YEAR("3","1年以内"),
+    ONE_TO_THREE_YEARS("4","1-3年"),
+    THREE_TO_FIVE_YEARS("5","3-5年"),
+    FIVE_TO_TEN_YEARS("6","5-10年"),
+    MORE_THAN_TEN_YEARS("7","10年以上");
 
+    private final String type;
+
+    private final String name;
+
+    // 根据name获取枚举
+    public static ExpTypeEnum getEnumByName(String name) {
+        for (ExpTypeEnum enumEnum : ExpTypeEnum.values()) {
+            if (enumEnum.getName().equals(name)) {
+                return enumEnum;
+            }
+        }
+        return IN_SCHOOL;
+    }
 }

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseAccountController.java

@@ -47,7 +47,7 @@ public class EnterpriseAccountController {
     
     @GetMapping("/page")
     @Operation(summary = "获得企业账户分页")
-    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-account-record:query')")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-account:query')")
     public CommonResult<PageResult<EnterpriseAccountPageRespVO>> getEnterpriseAccountPage
             (@Valid EnterpriseAccountPageReqVO pageReqVO) {
         PageResult<EnterpriseAccountPageRespVO> pageResult = enterpriseAccountService.page2(pageReqVO);

+ 113 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseAuthController.java

@@ -0,0 +1,113 @@
+package com.citu.module.menduner.system.controller.admin.enterprise;
+
+
+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.base.enterprise.auth.EnterpriseAuthAuditReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAuthDO;
+import com.citu.module.menduner.system.service.enterprise.auth.EnterpriseAuthService;
+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/enterprise-auth")
+@Validated
+public class EnterpriseAuthController {
+
+    @Resource
+    private EnterpriseAuthService enterpriseAuthService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建企业实名认证")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-auth:create')")
+    public CommonResult<Long> createEnterpriseAuth(@Valid @RequestBody EnterpriseAuthSaveReqVO createReqVO) {
+        return success(enterpriseAuthService.createEnterpriseAuth(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新企业实名认证")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-auth:update')")
+    public CommonResult<Boolean> updateEnterpriseAuth(@Valid @RequestBody EnterpriseAuthSaveReqVO updateReqVO) {
+        enterpriseAuthService.updateEnterpriseAuth(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除企业实名认证")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-auth:delete')")
+    public CommonResult<Boolean> deleteEnterpriseAuth(@RequestParam("id") Long id) {
+        enterpriseAuthService.deleteEnterpriseAuth(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得企业实名认证")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-auth:query')")
+    public CommonResult<EnterpriseAuthRespVO> getEnterpriseAuth(@RequestParam("id") Long id) {
+        EnterpriseAuthDO enterpriseAuth = enterpriseAuthService.getEnterpriseAuth(id);
+        return success(BeanUtils.toBean(enterpriseAuth, EnterpriseAuthRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得企业实名认证分页")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-auth:query')")
+    public CommonResult<PageResult<EnterpriseAuthRespVO>> getEnterpriseAuthPage(@Valid EnterpriseAuthPageReqVO pageReqVO) {
+        PageResult<EnterpriseAuthDO> pageResult = enterpriseAuthService.getEnterpriseAuthPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, EnterpriseAuthRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出企业实名认证 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-auth:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportEnterpriseAuthExcel(@Valid EnterpriseAuthPageReqVO pageReqVO,
+                                          HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<EnterpriseAuthDO> list = enterpriseAuthService.getEnterpriseAuthPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "企业实名认证.xls", "数据", EnterpriseAuthRespVO.class,
+                BeanUtils.toBean(list, EnterpriseAuthRespVO.class));
+    }
+
+    @PutMapping("/approved")
+    @Operation(summary = "审核通过")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-auth:update')")
+    public CommonResult<Boolean> approved(@Valid @RequestBody EnterpriseAuthAuditReqVO reqVO) {
+        enterpriseAuthService.approved(reqVO);
+        return success(true);
+    }
+
+    @PutMapping("/reject")
+    @Operation(summary = "审核拒绝驳回")
+    @PreAuthorize("@ss.hasPermission('menduner:system:enterprise-auth:update')")
+    public CommonResult<Boolean> reject(@Valid @RequestBody EnterpriseAuthAuditReqVO reqVO) {
+        enterpriseAuthService.reject(reqVO);
+        return success(true);
+    }
+
+
+}

+ 4 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/enterprise/EnterpriseUserApplyController.java

@@ -6,10 +6,10 @@ 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.base.enterprise.user.EnterpriseUserApplyAuditReqVO;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplyPageReqVO;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplyRespVO;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplySaveReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyAuditReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplySaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserApplyDO;
 import com.citu.module.menduner.system.service.enterprise.EnterpriseUserApplyService;
 import io.swagger.v3.oas.annotations.Operation;

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/hire/HireCommissionRatioController.java

@@ -68,7 +68,7 @@ public class HireCommissionRatioController {
     @Operation(summary = "获得众聘-佣金比例")
     // @PreAuthorize("@ss.hasPermission('menduner:system:hire-commission-ratio:query')")
     public CommonResult<HireCommissionRatioRespVO> get() {
-        HireCommissionRatioDO hireCommissionRatio = hireCommissionRatioService.get();
+        HireCommissionRatioDO hireCommissionRatio = hireCommissionRatioService.getHireCommissionRatio();
         return success(BeanUtils.toBean(hireCommissionRatio, HireCommissionRatioRespVO.class));
     }
 

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/enterprise/vo/apply/AppEnterpriseUserApplyRespVO.java

@@ -1,6 +1,6 @@
 package com.citu.module.menduner.system.controller.app.enterprise.vo.apply;
 
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplyRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyRespVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 

+ 2 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/enterprise/vo/register/AppEnterpriseRegisterReqVO.java

@@ -3,6 +3,7 @@ package com.citu.module.menduner.system.controller.app.enterprise.vo.register;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotBlank;
 
@@ -23,6 +24,7 @@ public class AppEnterpriseRegisterReqVO {
     private String email;
 
     @NotBlank(message = "{1_100_021_006}")
+    @Length(min = 18, max = 18, message = "{1_100_021_011}")
     @Schema(description = "统一社会信用代码")
     private String code;
 

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/interview/AppInterviewInviteController.java

@@ -4,8 +4,8 @@ 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.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.system.controller.app.interview.vo.AppInterviewInvitePageReqVO;
 import com.citu.module.menduner.system.controller.app.interview.vo.AppInterviewInviteRespVO;
-import com.citu.module.menduner.system.controller.appadmin.interview.vo.AppAdminInterviewInviteReqCancellationVO;
 import com.citu.module.menduner.system.controller.appadmin.interview.vo.AppAdminInterviewInviteReqConsentVO;
 import com.citu.module.menduner.system.service.interview.InterviewInviteService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -39,7 +39,7 @@ public class AppInterviewInviteController {
     @PreAuthenticated
     @GetMapping("/page")
     @Operation(summary = "获取面试日程分页")
-    public CommonResult<PageResult<AppInterviewInviteRespVO>> page(@Valid PageParam reqVO) {
+    public CommonResult<PageResult<AppInterviewInviteRespVO>> page(@Valid AppInterviewInvitePageReqVO reqVO) {
         return success(service.page(reqVO));
     }
 

+ 33 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/interview/vo/AppInterviewInvitePageReqVO.java

@@ -0,0 +1,33 @@
+package com.citu.module.menduner.system.controller.app.interview.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 = "menduner - 面试邀请分页查询 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AppInterviewInvitePageReqVO extends PageParam {
+
+
+    @Schema(description = "类型 0 线上面试| 1 线下面试", example = "1")
+    private String type;
+
+    @Schema(description = "面试时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] time;
+
+    @Schema(description = "状态(0待接受|1待面试|2即将面试|3已完成|4已反馈|5未能爽约|98拒绝|99已取消)", example = "2")
+    private String status;
+
+    @Schema(description = "会话状态(0邀约|1入职|2结算)")
+    private String conversationStatus;
+}

+ 62 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/analysis/AppAdminAnalysisController.java

@@ -0,0 +1,62 @@
+package com.citu.module.menduner.system.controller.appadmin.analysis;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.system.controller.appadmin.analysis.vo.AppAdminAnalysisReqVO;
+import com.citu.module.menduner.system.controller.base.CommonRespVO;
+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 lombok.extern.slf4j.Slf4j;
+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.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "招聘端 - 统计分析")
+@RestController
+@RequestMapping("/menduner/system/analysis")
+@Validated
+@Slf4j
+public class AppAdminAnalysisController {
+
+    @Resource
+    private JobCvRelService jobCvcRelService;
+
+    @GetMapping("/get/job/cv/sex/count")
+    @Operation(summary = "获取投递简历的性别分布")
+    @PreAuthenticated
+    public CommonResult<List<CommonRespVO>> getJobCvSexCount(@Valid AppAdminAnalysisReqVO reqVO) {
+        return success(jobCvcRelService.getJobCvSexCount(reqVO));
+    }
+
+    @GetMapping("/get/job/cv/age/count")
+    @Operation(summary = "获取投递简历的年龄分布")
+    @PreAuthenticated
+    public CommonResult<Map<String, Object[]>> getJobCvAgeCount(@Valid AppAdminAnalysisReqVO reqVO) {
+        return success(jobCvcRelService.getJobCvAgeCount(reqVO));
+    }
+
+    @GetMapping("/get/job/cv/edu/count")
+    @Operation(summary = "获取投递简历的学历分布")
+    @PreAuthenticated
+    public CommonResult<Map<String, Object[]>> getJobCvEduCount(@Valid AppAdminAnalysisReqVO reqVO) {
+        return success(jobCvcRelService.getJobCvEduCount(reqVO));
+    }
+
+    @GetMapping("/get/job/cv/exp/count")
+    @Operation(summary = "获取投递简历的工作经验分布")
+    @PreAuthenticated
+    public CommonResult<Map<String, Object[]>> getJobCvExpCount(@Valid AppAdminAnalysisReqVO reqVO) {
+        return success(jobCvcRelService.getJobCvExpCount(reqVO));
+    }
+
+
+}

+ 26 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/analysis/vo/AppAdminAnalysisReqVO.java

@@ -0,0 +1,26 @@
+package com.citu.module.menduner.system.controller.appadmin.analysis.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+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 = "menduner - 统计分析 Request VO")
+@Data
+public class AppAdminAnalysisReqVO {
+
+    public static final String TYPE_RECENT_7_DAYS = "0";
+    public static final String TYPE_LAST_MONTH = "1";
+    public static final String TYPE_LAST_QUARTER = "2";
+    public static final String TYPE_CUSTOM = "99";
+
+    @Schema(description = "统计类型 0最近7天|1上个月|2上季度|99自定义",required = true)
+    private String type;
+
+    @Schema(description = "自定义时间范围")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] time;
+}

+ 22 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/enterprise/AppAdminEnterpriseController.java

@@ -3,8 +3,11 @@ package com.citu.module.menduner.system.controller.appadmin.enterprise;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.appadmin.enterprise.auth.AppAdminEnterpriseAuthRespVO;
+import com.citu.module.menduner.system.controller.appadmin.enterprise.auth.AppAdminEnterpriseAuthSaveReqVO;
 import com.citu.module.menduner.system.controller.appadmin.enterprise.vo.*;
 import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
+import com.citu.module.menduner.system.service.enterprise.auth.EnterpriseAuthService;
 import com.citu.module.menduner.system.service.enterprise.business.EnterpriseBusinessService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -14,7 +17,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
-import java.util.List;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
 
@@ -31,6 +33,9 @@ public class AppAdminEnterpriseController {
     @Resource
     private EnterpriseBusinessService enterpriseBusinessService;
 
+    @Resource
+    private EnterpriseAuthService enterpriseAuthService;
+
 
     @PreAuthenticated
     @GetMapping("/get/tree")
@@ -39,6 +44,22 @@ public class AppAdminEnterpriseController {
         return success(enterpriseService.getTree(LoginUserContext.getEnterpriseId()));
     }
 
+    @PreAuthenticated
+    @GetMapping("/get/auth")
+    @Operation(summary = "获取企业实名认证")
+    public CommonResult<AppAdminEnterpriseAuthRespVO> getAuth() {
+        return success(enterpriseAuthService.get());
+    }
+
+    @PreAuthenticated
+    @PostMapping("/auth/save")
+    @Operation(summary = "提交企业实名认证")
+    public CommonResult<Boolean> saveAuth(
+            @Valid @RequestBody AppAdminEnterpriseAuthSaveReqVO reqVO) {
+        enterpriseAuthService.save(reqVO);
+        return success(true);
+    }
+
     @PreAuthenticated
     @PostMapping("/logo/update")
     @Operation(summary = "修改企业logo")

+ 16 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/enterprise/auth/AppAdminEnterpriseAuthRespVO.java

@@ -0,0 +1,16 @@
+package com.citu.module.menduner.system.controller.appadmin.enterprise.auth;
+
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "menduner - 企业实名制 Response VO")
+@Data
+public class AppAdminEnterpriseAuthRespVO extends EnterpriseAuthRespVO {
+
+    @Schema(description = "更新时间")
+    private LocalDateTime updateTime;
+
+}

+ 31 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/enterprise/auth/AppAdminEnterpriseAuthSaveReqVO.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.system.controller.appadmin.enterprise.auth;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Schema(description = "menduner - 企业实名制保存 Request VO")
+@Data
+public class AppAdminEnterpriseAuthSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17583")
+    private Long id;
+
+    @NotBlank(message = "{1_100_043_003}")
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+    private String name;
+
+    @NotBlank(message = "{1_100_043_004}")
+    @Schema(description = "身份证号码", requiredMode = Schema.RequiredMode.REQUIRED)
+    private String identityNo;
+
+    @NotBlank(message = "{1_100_043_005}")
+    @Schema(description = "正面", example = "https://www.iocoder.cn")
+    private String frontUrl;
+
+    @NotBlank(message = "{1_100_043_006}")
+    @Schema(description = "反面", example = "https://www.iocoder.cn")
+    private String backUrl;
+
+}

+ 29 - 5
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/AppAdminInterviewInviteController.java

@@ -3,10 +3,7 @@ package com.citu.module.menduner.system.controller.appadmin.interview;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
-import com.citu.module.menduner.system.controller.appadmin.interview.vo.AppAdminInterviewInviteReqCancellationVO;
-import com.citu.module.menduner.system.controller.appadmin.interview.vo.AppAdminInterviewInviteReqPageVO;
-import com.citu.module.menduner.system.controller.appadmin.interview.vo.AppAdminInterviewInviteReqSaveVO;
-import com.citu.module.menduner.system.controller.appadmin.interview.vo.AppAdminInterviewInviteRespVO;
+import com.citu.module.menduner.system.controller.appadmin.interview.vo.*;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.service.interview.InterviewInviteService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -57,10 +54,37 @@ public class AppAdminInterviewInviteController {
     @PostMapping("/cancellation")
     @Operation(summary = "取消面试")
     public CommonResult<Boolean> cancellation
-            (@RequestBody @Valid AppAdminInterviewInviteReqCancellationVO reqVO) {
+            (@RequestBody @Valid AppAdminInterviewInviteCancellationReqVO reqVO) {
         service.cancellation(reqVO);
         return success(true);
     }
 
+    @PreAuthenticated
+    @PostMapping("/completed")
+    @Operation(summary = "完成面试")
+    public CommonResult<Boolean> completed
+            (@RequestParam("id") Long id) {
+        service.completed(id);
+        return success(true);
+    }
+
+    @PreAuthenticated
+    @PostMapping("/not/attended")
+    @Operation(summary = "未能爽约面试")
+    public CommonResult<Boolean> notAttended
+            (@RequestBody @Valid AppAdminInterviewInviteNotAttendedReqVO reqVO) {
+        service.notAttended(reqVO);
+        return success(true);
+    }
+
+    @PreAuthenticated
+    @PostMapping("/feedback")
+    @Operation(summary = "面试反馈")
+    public CommonResult<Boolean> feedback
+            (@RequestBody @Valid AppAdminInterviewInviteFeedbackReqVO reqVO) {
+        service.feedback(reqVO);
+        return success(true);
+    }
+
 
 }

+ 2 - 6
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/vo/AppAdminInterviewInviteReqCancellationVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/vo/AppAdminInterviewInviteCancellationReqVO.java

@@ -1,17 +1,13 @@
 package com.citu.module.menduner.system.controller.appadmin.interview.vo;
 
 
+import com.citu.module.menduner.system.controller.base.interview.InterviewInviteReqOperateVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 @Schema(description = "menduner - 面试取消 Request VO")
 @Data
-public class AppAdminInterviewInviteReqCancellationVO {
+public class AppAdminInterviewInviteCancellationReqVO extends InterviewInviteReqOperateVO {
 
-    @Schema(description = "id")
-    private Long id;
-
-    @Schema(description = "原因")
-    private String reason;
 
 }

+ 15 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/vo/AppAdminInterviewInviteFeedbackReqVO.java

@@ -0,0 +1,15 @@
+package com.citu.module.menduner.system.controller.appadmin.interview.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "menduner - 面试反馈 Request VO")
+@Data
+public class AppAdminInterviewInviteFeedbackReqVO {
+
+    @Schema(description = "id")
+    private Long id;
+
+    @Schema(description = "反馈评价")
+    private String evaluate;
+}

+ 10 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/vo/AppAdminInterviewInviteNotAttendedReqVO.java

@@ -0,0 +1,10 @@
+package com.citu.module.menduner.system.controller.appadmin.interview.vo;
+
+import com.citu.module.menduner.system.controller.base.interview.InterviewInviteReqOperateVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "menduner - 面试未能爽约 Request VO")
+@Data
+public class AppAdminInterviewInviteNotAttendedReqVO extends InterviewInviteReqOperateVO {
+}

+ 3 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/interview/vo/AppAdminInterviewInviteReqPageVO.java

@@ -33,8 +33,10 @@ public class AppAdminInterviewInviteReqPageVO extends AppAdminPersonPageReqVO {
     @Schema(description = "受邀方联系电话|冗余")
     private String phone;
 
-    @Schema(description = "状态(0待接受|1待面试|2即将面试|3已完成|4待反馈|5已反馈|98拒绝|99已取消)", example = "2")
+    @Schema(description = "状态(0待接受|1待面试|2即将面试|3已完成|4已反馈|5未能爽约|98拒绝|99已取消)", example = "2")
     private String status;
 
+    @Schema(description = "会话状态(0邀约|1入职|2结算)")
+    private String conversationStatus;
 
 }

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

@@ -50,8 +50,8 @@ public class AppAdminJobAdvertisedController {
     @PreAuthenticated
     @GetMapping("/list")
     @Operation(summary = "获取发布的职位列表")
-    public CommonResult<List<AppAdminJobSimpleRespVO>> getList(@RequestParam("hire") boolean hire) {
-        return success(jobAdvertisedService.getList(hire));
+    public CommonResult<List<AppAdminJobSimpleRespVO>> getList() {
+        return success(jobAdvertisedService.getList());
     }
 
 

+ 9 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/job/vo/AppAdminJobSimpleRespVO.java

@@ -9,4 +9,13 @@ import lombok.Data;
 @Data
 public class AppAdminJobSimpleRespVO extends JobAdvertisedSimpleRespVO {
 
+    @Schema(description = "工作地址")
+    private String address;
+
+    @Schema(description = "经度")
+    private String longitude;
+
+    @Schema(description = "维度")
+    private String latitude;
+
 }

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

@@ -12,6 +12,8 @@ import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPer
 import com.citu.module.menduner.system.controller.appadmin.unfit.AppAdminUnfitCandidatePageReqVO;
 import com.citu.module.menduner.system.controller.appadmin.unfit.AppAdminUnfitCandidateRespVO;
 import com.citu.module.menduner.system.controller.appadmin.unfit.AppAdminUnfitCandidateSaveReqVO;
+import com.citu.module.menduner.system.service.interview.InterviewInviteService;
+import com.citu.module.menduner.system.service.interview.InterviewInviteServiceImpl;
 import com.citu.module.menduner.system.service.job.HireJobIntegrationService;
 import com.citu.module.menduner.system.service.job.JobCvRelService;
 import com.citu.module.menduner.system.service.job.JobIntegrationService;
@@ -40,15 +42,15 @@ public class AppAdminPersonCvController {
     @Resource
     private PersonIntegrationService personIntegrationService;
 
-    @Resource
-    private HireJobIntegrationService hireJobIntegrationService;
-
     @Resource
     private JobCvRelService jobCvRelService;
 
     @Resource
     private UnfitCandidateService unfitCandidateService;
 
+    @Resource
+    private InterviewInviteService interviewInviteService;
+
 
     @PreAuthenticated
     @GetMapping("/page")
@@ -65,20 +67,14 @@ public class AppAdminPersonCvController {
         return success(jobIntegrationService.unfitPage(pageReqVO));
     }
 
-    @PreAuthenticated
-    @GetMapping("/hire/page")
-    @Operation(summary = "获得赏金投递职位分页")
-    public CommonResult<PageResult<AppAdminHireJobCvRelRespVO>> page
-            (@Valid AppAdminHireJobCvRelPageReqVO pageReqVO) {
-        return success(hireJobIntegrationService.page(pageReqVO));
-    }
+//    @PreAuthenticated
+//    @GetMapping("/hire/page")
+//    @Operation(summary = "获得赏金投递职位分页")
+//    public CommonResult<PageResult<AppAdminHireJobCvRelRespVO>> page
+//            (@Valid AppAdminHireJobCvRelPageReqVO pageReqVO) {
+//        return success(hireJobIntegrationService.page(pageReqVO));
+//    }
 
-    @PreAuthenticated
-    @GetMapping("/hire/recommend/list")
-    @Operation(summary = "获取赏金职位推荐人的用户列表")
-    public CommonResult<List<AppAdminPersonSimpleRespVO>> getRecommendUser() {
-        return success(hireJobIntegrationService.getRecommendUser());
-    }
 
     @PreAuthenticated
     @GetMapping("/detail")
@@ -108,11 +104,20 @@ public class AppAdminPersonCvController {
         return success(unfitCandidateService.cancellation(id));
     }
 
+    @PreAuthenticated
+    @PostMapping("/entry")
+    @Operation(summary = "入职")
+    public CommonResult<Boolean> entry(@RequestParam("id") Long id) {
+        interviewInviteService.entry(id);
+        return success(true);
+    }
+
 
     @PreAuthenticated
     @PostMapping("/settlement")
     @Operation(summary = "赏金职位结算")
     public CommonResult<Boolean> settlement(@RequestParam("id") Long id) {
-        return success(hireJobIntegrationService.settlement(id));
+        interviewInviteService.settlement(id);
+        return success(true);
     }
 }

+ 9 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/cv/AppAdminJobCvRelPageReqVO.java

@@ -8,7 +8,6 @@ import lombok.Data;
 @Data
 public class AppAdminJobCvRelPageReqVO extends AppAdminPersonPageReqVO {
 
-
     @Schema(description = "简历投递类型",example = "1")
     private String type;
 
@@ -18,4 +17,13 @@ public class AppAdminJobCvRelPageReqVO extends AppAdminPersonPageReqVO {
     @Schema(description = "投递的岗位", example = "1")
     private Long jobId;
 
+    @Schema(description = "推荐人", example = "21239")
+    private Long recommendUserId;
+
+    @Schema(description = "投递人名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "投递人联系电话")
+    private String phone;
+
 }

+ 7 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/appadmin/person/cv/AppAdminJobCvRelRespVO.java

@@ -24,15 +24,21 @@ public class AppAdminJobCvRelRespVO {
     @Schema(description = "投递用户id")
     private Long userId;
 
+    @Schema(description = "投递类型(0 平台投递 | 1 赏金投递)")
+    private String type;
+
     @Schema(description = "简历状态")
     private String status;
 
     @Schema(description = "更新时间")
     private LocalDateTime updateTime;
 
-    @Schema(description = "人才信息")
+    @Schema(description = "投递人员信息")
     private AppAdminPersonSimpleRespVO person;
 
+    @Schema(description = "推荐的人员信息")
+    private AppAdminPersonSimpleRespVO recommendPerson;
+
     @Schema(description = "招聘信息")
     private AppAdminJobSimpleRespVO job;
 

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/user/EnterpriseUserApplyAuditReqVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/apply/EnterpriseUserApplyAuditReqVO.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.system.controller.base.enterprise.user;
+package com.citu.module.menduner.system.controller.base.enterprise.apply;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/user/EnterpriseUserApplyPageReqVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/apply/EnterpriseUserApplyPageReqVO.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.system.controller.base.enterprise.user;
+package com.citu.module.menduner.system.controller.base.enterprise.apply;
 
 import com.citu.framework.common.pojo.PageParam;
 import io.swagger.v3.oas.annotations.media.Schema;

+ 2 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/user/EnterpriseUserApplyRespVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/apply/EnterpriseUserApplyRespVO.java

@@ -1,10 +1,8 @@
-package com.citu.module.menduner.system.controller.base.enterprise.user;
+package com.citu.module.menduner.system.controller.base.enterprise.apply;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
-import java.util.*;
-import java.util.*;
-import org.springframework.format.annotation.DateTimeFormat;
+
 import java.time.LocalDateTime;
 import com.alibaba.excel.annotation.*;
 

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/user/EnterpriseUserApplySaveReqVO.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/apply/EnterpriseUserApplySaveReqVO.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.system.controller.base.enterprise.user;
+package com.citu.module.menduner.system.controller.base.enterprise.apply;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;

+ 18 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/auth/EnterpriseAuthAuditReqVO.java

@@ -0,0 +1,18 @@
+package com.citu.module.menduner.system.controller.base.enterprise.auth;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "企业实名制审核 Request VO")
+@Data
+public class EnterpriseAuthAuditReqVO {
+
+    @NotNull(message = "{1_099_000_005}" )
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "9045")
+    private Long id;
+
+    @Schema(description = "原因")
+    private String reason;
+}

+ 49 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/auth/EnterpriseAuthPageReqVO.java

@@ -0,0 +1,49 @@
+package com.citu.module.menduner.system.controller.base.enterprise.auth;
+
+
+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 EnterpriseAuthPageReqVO extends PageParam {
+
+    @Schema(description = "企业id", example = "11519")
+    private Long enterpriseId;
+
+    @Schema(description = "认证用户id", example = "21301")
+    private Long userId;
+
+    @Schema(description = "姓名", example = "赵六")
+    private String name;
+
+    @Schema(description = "身份证号码")
+    private String identityNo;
+
+    @Schema(description = "正面", example = "https://www.iocoder.cn")
+    private String frontUrl;
+
+    @Schema(description = "反面", example = "https://www.iocoder.cn")
+    private String backUrl;
+
+    @Schema(description = "审核状态(0审核中 1审核通过 2审核不通过)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    private String status;
+
+    @Schema(description = "审核原因", example = "不香")
+    private String reason;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 56 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/auth/EnterpriseAuthRespVO.java

@@ -0,0 +1,56 @@
+package com.citu.module.menduner.system.controller.base.enterprise.auth;
+
+
+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 EnterpriseAuthRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17583")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11519")
+    @ExcelProperty("企业id")
+    private Long enterpriseId;
+
+    @Schema(description = "认证用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "21301")
+    @ExcelProperty("认证用户id")
+    private Long userId;
+
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+    @ExcelProperty("姓名")
+    private String name;
+
+    @Schema(description = "身份证号码", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("身份证号码")
+    private String identityNo;
+
+    @Schema(description = "正面", example = "https://www.iocoder.cn")
+    @ExcelProperty("身份证正面")
+    private String frontUrl;
+
+    @Schema(description = "反面", example = "https://www.iocoder.cn")
+    @ExcelProperty("身份证反面")
+    private String backUrl;
+
+    @Schema(description = "审核状态(0审核中 1审核通过 2审核不通过)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("审核状态")
+    private String status;
+
+    @Schema(description = "审核原因", example = "不香")
+    @ExcelProperty("审核原因")
+    private String reason;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 47 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/enterprise/auth/EnterpriseAuthSaveReqVO.java

@@ -0,0 +1,47 @@
+package com.citu.module.menduner.system.controller.base.enterprise.auth;
+
+
+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 EnterpriseAuthSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "17583")
+    private Long id;
+
+    @Schema(description = "企业id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11519")
+    @NotNull(message = "{1_099_000_007}")
+    private Long enterpriseId;
+
+    @Schema(description = "认证用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "21301")
+    @NotNull(message = "{1_100_043_002}")
+    private Long userId;
+
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+    @NotEmpty(message = "{1_100_043_003}")
+    private String name;
+
+    @Schema(description = "身份证号码", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "{1_100_043_004}")
+    private String identityNo;
+
+    @Schema(description = "正面", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @NotEmpty(message = "{1_100_043_005}")
+    private String frontUrl;
+
+    @Schema(description = "反面", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @NotEmpty(message = "{1_100_043_006}")
+    private String backUrl;
+
+    @Schema(description = "审核状态(0审核中 1审核通过 2审核不通过)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    private String status;
+
+    @Schema(description = "审核原因", example = "不香")
+    private String reason;
+
+}

+ 5 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/interview/InterviewInvitePageReqVO.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.system.controller.base.interview;
 
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.citu.framework.common.pojo.PageParam;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -43,9 +44,12 @@ public class InterviewInvitePageReqVO extends PageParam {
     @Schema(description = "邀请方联系电话|冗余")
     private String invitePhone;
 
-    @Schema(description = "(0待接受|1待面试|2即将面试|3已完成|4待反馈|5已反馈|98拒绝|99已取消)", example = "2")
+    @Schema(description = "(0待接受|1待面试|2即将面试|3已完成|4已反馈|5未能爽约|98拒绝|99已取消)", example = "2")
     private String status;
 
+    @Schema(description = "会话状态(0邀约|1入职|2结算)")
+    private String conversationStatus;
+
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;

+ 15 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/interview/InterviewInviteReqOperateVO.java

@@ -0,0 +1,15 @@
+package com.citu.module.menduner.system.controller.base.interview;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "menduner - 面试操作 Request VO")
+@Data
+public class InterviewInviteReqOperateVO {
+
+    @Schema(description = "id")
+    private Long id;
+
+    @Schema(description = "原因")
+    private String reason;
+}

+ 10 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/interview/InterviewInviteRespVO.java

@@ -61,10 +61,14 @@ public class InterviewInviteRespVO {
     @ExcelProperty("维度")
     private String latitude;
 
-    @Schema(description = "(0待接受|1待面试|2即将面试|3已完成|4待反馈|5已反馈|98拒绝|99已取消)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
-    @ExcelProperty("(0待接受|1待面试|2即将面试|3已完成|4待反馈|5已反馈|98拒绝|99已取消)")
+    @Schema(description = "(0待接受|1待面试|2即将面试|3已完成|4已反馈|5未能爽约|98拒绝|99已取消)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("(0待接受|1待面试|2即将面试|3已完成|4已反馈|5未能爽约|98拒绝|99已取消)")
     private String status;
 
+    @Schema(description = "会话状态(0邀约|1入职|2结算)")
+    @ExcelProperty("会话状态(0邀约|1入职|2结算)")
+    private String conversationStatus;
+
     @Schema(description = "原因")
     @ExcelProperty("原因")
     private String reason;
@@ -73,6 +77,10 @@ public class InterviewInviteRespVO {
     @ExcelProperty("备注")
     private String remark;
 
+    @Schema(description = "反馈评价")
+    @ExcelProperty("反馈评价")
+    private String evaluate;
+
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;

+ 7 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/base/interview/InterviewInviteSaveReqVO.java

@@ -63,8 +63,14 @@ public class InterviewInviteSaveReqVO {
     @Schema(description = "备注")
     private String remark;
 
-    @Schema(description = "状态(0待接受|1待面试|2即将面试|3已完成|4待反馈|5已反馈|98拒绝|99已取消)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @Schema(description = "反馈评价")
+    private String evaluate;
+
+    @Schema(description = "状态(0待接受|1待面试|2即将面试|3已完成|4已反馈|5未能爽约|98拒绝|99已取消)", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @NotEmpty(message = "{1_100_033_010}")
     private String status;
 
+    @Schema(description = "会话状态(0邀约|1入职|2结算)")
+    private String conversationStatus;
+
 }

+ 3 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/convert/EnterpriseConvert.java

@@ -5,6 +5,7 @@ import com.citu.module.menduner.system.controller.app.enterprise.vo.apply.AppEnt
 import com.citu.module.menduner.system.controller.app.enterprise.vo.apply.AppEnterpriseUserApplyRespVO;
 import com.citu.module.menduner.system.controller.app.enterprise.vo.register.AppEnterpriseRegisterReqVO;
 import com.citu.module.menduner.system.controller.app.enterprise.vo.register.AppEnterpriseRegisterRespVO;
+import com.citu.module.menduner.system.controller.appadmin.enterprise.auth.AppAdminEnterpriseAuthRespVO;
 import com.citu.module.menduner.system.controller.appadmin.enterprise.vo.*;
 import com.citu.module.menduner.system.controller.appadmin.user.vo.AppAdminEnterpriseAccountRespVO;
 import com.citu.module.menduner.system.controller.appadmin.user.vo.AppAdminUserRespVO;
@@ -61,4 +62,6 @@ public interface EnterpriseConvert {
     AppAdminEnterpriseTreeRespVO convert17(EnterpriseDO bean);
 
     List<AppAdminEnterpriseTreeRespVO> convertList3(List<EnterpriseDO> list);
+
+    AppAdminEnterpriseAuthRespVO convert18(EnterpriseAuthDO bean);
 }

+ 64 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/enterprise/EnterpriseAuthDO.java

@@ -0,0 +1,64 @@
+package com.citu.module.menduner.system.dal.dataobject.enterprise;
+
+
+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 io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+/**
+ * 企业实名认证 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_enterprise_auth")
+@KeySequence("mde_enterprise_auth_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class EnterpriseAuthDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 企业id
+     */
+    private Long enterpriseId;
+    /**
+     * 认证用户id
+     */
+    private Long userId;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 身份证号码
+     */
+    private String identityNo;
+    /**
+     * 正面
+     */
+    private String frontUrl;
+    /**
+     * 反面
+     */
+    private String backUrl;
+    /**
+     * 审核状态(0审核中 1审核通过 2审核不通过)
+     */
+    private String status;
+    /**
+     * 审核原因
+     */
+    private String reason;
+
+}

+ 14 - 8
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/interview/InterviewInviteDO.java

@@ -1,15 +1,13 @@
 package com.citu.module.menduner.system.dal.dataobject.interview;
 
 
-import com.alibaba.excel.annotation.ExcelProperty;
-import io.swagger.v3.oas.annotations.media.Schema;
+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.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
+
 import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
-import com.citu.framework.mybatis.core.dataobject.BaseDO;
 
 /**
  * 面试邀请 DO
@@ -76,13 +74,21 @@ public class InterviewInviteDO extends BaseDO {
      */
     private String latitude;
     /**
-     * (0待接受|1待面试|2即将面试|3已完成|4待反馈|5已反馈|98拒绝|99已取消)
+     * (0待接受|1待面试|2即将面试|3已完成|4已反馈|5未能爽约|98拒绝|99已取消)
      */
     private String status;
+    /**
+     * 会话状态(0邀约|1入职|2结算)
+     */
+    private String conversationStatus;
     /**
      * 原因
      */
     private String reason;
+    /**
+     * 反馈评价
+     */
+    private String evaluate;
     /**
      * 备注
      */

+ 36 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseAuthMapper.java

@@ -0,0 +1,36 @@
+package com.citu.module.menduner.system.dal.mysql.enterprise;
+
+
+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.base.enterprise.auth.EnterpriseAuthPageReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAuthDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 企业实名认证 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface EnterpriseAuthMapper extends BaseMapperX<EnterpriseAuthDO> {
+
+    default PageResult<EnterpriseAuthDO> selectPage(EnterpriseAuthPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<EnterpriseAuthDO>()
+                .eqIfPresent(EnterpriseAuthDO::getEnterpriseId, reqVO.getEnterpriseId())
+                .eqIfPresent(EnterpriseAuthDO::getUserId, reqVO.getUserId())
+                .likeIfPresent(EnterpriseAuthDO::getName, reqVO.getName())
+                .eqIfPresent(EnterpriseAuthDO::getIdentityNo, reqVO.getIdentityNo())
+                .eqIfPresent(EnterpriseAuthDO::getFrontUrl, reqVO.getFrontUrl())
+                .eqIfPresent(EnterpriseAuthDO::getBackUrl, reqVO.getBackUrl())
+                .betweenIfPresent(EnterpriseAuthDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(EnterpriseAuthDO::getId));
+    }
+
+    default EnterpriseAuthDO selectByEnterprise(Long enterpriseId) {
+        return selectOne(new LambdaQueryWrapperX<EnterpriseAuthDO>()
+                .eq(EnterpriseAuthDO::getEnterpriseId, enterpriseId));
+    }
+
+}

+ 9 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseMapper.java

@@ -6,8 +6,8 @@ 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.app.enterprise.vo.AppEnterpriseSearchPageReqVO;
-import com.citu.module.menduner.system.controller.base.enterprise.vo.EnterpriseBaseSimpleRespVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
+import com.citu.module.menduner.system.controller.base.enterprise.vo.EnterpriseBaseSimpleRespVO;
 import com.citu.module.menduner.system.controller.base.enterprise.vo.EnterpriseListReqVO;
 import com.citu.module.menduner.system.controller.base.enterprise.vo.EnterprisePageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseBusinessDO;
@@ -81,7 +81,14 @@ public interface EnterpriseMapper extends BaseMapperX<EnterpriseDO> {
         return selectList(EnterpriseDO::getParentId, parentIds);
     }
 
-    List<CommonRespVO> searchByName(String name);
+    default List<CommonRespVO> searchByName(String name) {
+        MPJLambdaWrapperX<EnterpriseDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAs(EnterpriseDO::getId, "`key`");
+        wrapper.selectAs(EnterpriseDO::getName, CommonRespVO::getValue);
+        wrapper.like(EnterpriseDO::getName, name);
+        wrapper.eq(EnterpriseDO::getStatus, MendunerStatusEnum.ENABLE.getStatus());
+        return selectJoinList(CommonRespVO.class, wrapper);
+    }
 
 
     default EnterpriseDO selectListById(Long id) {

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserApplyMapper.java

@@ -3,7 +3,7 @@ package com.citu.module.menduner.system.dal.mysql.enterprise;
 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.base.enterprise.user.EnterpriseUserApplyPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserApplyDO;
 import org.apache.ibatis.annotations.Mapper;
 

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserBindMapper.java

@@ -140,7 +140,7 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
 
     default UserInfoRespDTO selectUserInfo(Long enterpriseId, Long userId) {
         MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();
-        wrapper.selectAsClass(EnterpriseDO.class, UserInfoRespDTO.class);
+        wrapper.selectAsClass(EnterpriseUserBindDO.class, UserInfoRespDTO.class);
 
         wrapper.selectAs(EnterpriseDO::getId, UserInfoRespDTO::getEnterpriseId);
         wrapper.selectAs(EnterpriseDO::getName, UserInfoRespDTO::getEnterpriseName);

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

@@ -3,11 +3,12 @@ package com.citu.module.menduner.system.dal.mysql.industry;
 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.app.industry.vo.AppIndustryListReqVO;
 import com.citu.module.menduner.system.controller.base.industry.IndustryListReqVO;
 import com.citu.module.menduner.system.controller.base.industry.IndustryPageReqVO;
-import com.citu.module.menduner.system.controller.app.industry.vo.AppIndustryListReqVO;
 import com.citu.module.menduner.system.dal.dataobject.industry.IndustryDO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Update;
 
 import java.util.Collection;
 import java.util.List;
@@ -52,6 +53,7 @@ public interface IndustryMapper extends BaseMapperX<IndustryDO> {
     /**
      * 清空行业数据
      **/
+    @Update("TRUNCATE TABLE mde_industry")
     Integer truncate();
 
 }

+ 37 - 6
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/interview/InterviewInviteMapper.java

@@ -1,24 +1,25 @@
 package com.citu.module.menduner.system.dal.mysql.interview;
 
 
-import com.citu.framework.common.pojo.PageParam;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.app.interview.vo.AppInterviewInvitePageReqVO;
 import com.citu.module.menduner.system.controller.app.interview.vo.AppInterviewInviteRespVO;
 import com.citu.module.menduner.system.controller.appadmin.interview.vo.AppAdminInterviewInviteReqPageVO;
 import com.citu.module.menduner.system.controller.appadmin.interview.vo.AppAdminInterviewInviteRespVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.interview.InterviewInvitePageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
-import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterprisePostDO;
-import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;
 import com.citu.module.menduner.system.dal.dataobject.interview.InterviewInviteDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
+import com.citu.module.menduner.system.enums.interview.InterviewInviteStatusEnum;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -43,7 +44,7 @@ public interface InterviewInviteMapper extends BaseMapperX<InterviewInviteDO> {
                 .orderByDesc(InterviewInviteDO::getId));
     }
 
-    default PageResult<AppInterviewInviteRespVO> page(PageParam reqVO, Long userId) {
+    default PageResult<AppInterviewInviteRespVO> page(AppInterviewInvitePageReqVO reqVO, Long userId) {
         MPJLambdaWrapperX<InterviewInviteDO> query = new MPJLambdaWrapperX<>();
         query.selectAll(InterviewInviteDO.class);
         query.selectAssociation(JobAdvertisedDO.class, AppInterviewInviteRespVO::getJob);
@@ -54,6 +55,15 @@ public interface InterviewInviteMapper extends BaseMapperX<InterviewInviteDO> {
 
         query.eq(InterviewInviteDO::getUserId, userId);
 
+        query
+                .eqIfPresent(InterviewInviteDO::getType, reqVO.getType())
+                .betweenIfPresent(InterviewInviteDO::getTime, reqVO.getTime())
+                .eqIfPresent(InterviewInviteDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(InterviewInviteDO::getStatus, reqVO.getConversationStatus());
+
+
+        query.orderByDesc(InterviewInviteDO::getUpdateTime);
+
         return selectJoinPage(reqVO, AppInterviewInviteRespVO.class, query);
     }
 
@@ -74,17 +84,21 @@ public interface InterviewInviteMapper extends BaseMapperX<InterviewInviteDO> {
 
         query.innerJoin(JobAdvertisedDO.class, JobAdvertisedDO::getId, InterviewInviteDO::getJobId);
         query.eq(InterviewInviteDO::getEnterpriseId, enterpriseId);
-        query.eq(InterviewInviteDO::getUserId, userId);
+        query.eq(InterviewInviteDO::getInviteUserId, userId);
         query
                 .eqIfPresent(InterviewInviteDO::getJobId, reqVO.getJobId())
                 .eqIfPresent(InterviewInviteDO::getType, reqVO.getType())
                 .betweenIfPresent(InterviewInviteDO::getTime, reqVO.getTime())
                 .eqIfPresent(InterviewInviteDO::getPhone, reqVO.getPhone())
-                .eqIfPresent(InterviewInviteDO::getStatus, reqVO.getStatus());
+                .eqIfPresent(InterviewInviteDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(InterviewInviteDO::getConversationStatus, reqVO.getConversationStatus());
+
+        query.orderByDesc(InterviewInviteDO::getUpdateTime);
 
         return selectJoinPage(reqVO, AppAdminInterviewInviteRespVO.class, query);
     }
 
+    /** 按时间分组统计面试邀请的数量 **/
     default List<CommonRespVO> getCountByTime(Long enterpriseId, Long userId) {
         MPJLambdaWrapperX<InterviewInviteDO> query = new MPJLambdaWrapperX<>();
         query.selectFunc("DATE(%s)", arg -> arg.accept(InterviewInviteDO::getTime), "`key`");
@@ -96,4 +110,21 @@ public interface InterviewInviteMapper extends BaseMapperX<InterviewInviteDO> {
         return selectJoinList(CommonRespVO.class, query);
     }
 
+
+    default List<InterviewInviteDO> getApproachingInterviewList(){
+        // 获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+
+        // 计算三个小时前的时间
+        LocalDateTime threeHoursAgo = now.minusHours(3);
+
+        MPJLambdaWrapperX<InterviewInviteDO> query = new MPJLambdaWrapperX<>();
+        // 设置查询条件,筛选time在threeHoursAgo和now之间的记录
+        query.ge(InterviewInviteDO::getTime, threeHoursAgo);
+        query.le(InterviewInviteDO::getTime, now);
+        query.eq(InterviewInviteDO::getStatus, InterviewInviteStatusEnum.PENDING_INTERVIEW.getStatus());
+
+        return selectJoinList(InterviewInviteDO.class, query);
+    }
+
 }

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

@@ -175,10 +175,9 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
         return selectPage(reqVO, query);
     }
 
-    default List<AppAdminJobSimpleRespVO> list(boolean hire) {
+    default List<AppAdminJobSimpleRespVO> list() {
         MPJLambdaWrapperX<JobAdvertisedDO> query = new MPJLambdaWrapperX<>();
         query.selectAll(JobAdvertisedDO.class);
-        query.eqIfPresent(JobAdvertisedDO::getHire, hire);
         query.orderByDesc(JobAdvertisedDO::getUpdateTime);
         return selectJoinList(AppAdminJobSimpleRespVO.class, query);
     }

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

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.system.dal.mysql.job;
 
+import cn.hutool.core.collection.CollUtil;
 import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
@@ -11,7 +12,7 @@ import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJob
 import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.appadmin.person.hire.AppAdminHireJobCvRelPageReqVO;
 import com.citu.module.menduner.system.controller.appadmin.person.hire.AppAdminHireJobCvRelRespVO;
-import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;
+import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobCvRelPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobAdvertisedDO;
@@ -24,7 +25,10 @@ import com.citu.module.menduner.system.enums.unfit.UnfitTypeEnum;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 招聘职位简历投递 Mapper
@@ -47,27 +51,31 @@ public interface JobCvRelMapper extends BaseMapperX<JobCvRelDO> {
 
 
     default PageResult<AppAdminJobCvRelRespVO> selectPage(AppAdminJobCvRelPageReqVO reqVO) {
-        // 职位投递userId inner 招聘职位userId and 职位投递userId inner 人才信息userId
         MPJLambdaWrapperX<JobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
         wrapper.selectAsClass(JobCvRelDO.class, AppAdminJobCvRelRespVO.class);
         wrapper.selectAssociation(JobAdvertisedDO.class, AppAdminJobCvRelRespVO::getJob);
-        wrapper.selectAssociation(PersonInfoDO.class, AppAdminJobCvRelRespVO::getPerson);
+        wrapper.selectAssociation("person", PersonInfoDO.class, AppAdminJobCvRelRespVO::getPerson);
+        wrapper.selectAssociation("recommend", PersonInfoDO.class, AppAdminJobCvRelRespVO::getRecommendPerson);
 
         // 投递的职位 inner 招聘职位
         wrapper.innerJoin(JobAdvertisedDO.class, JobAdvertisedDO::getId, JobCvRelDO::getJobId);
         // 招聘职位的条件
         wrapper.eqIfExists(JobCvRelDO::getJobId, reqVO.getJobId());
-        wrapper.eqIfPresent(JobCvRelDO::getStatus, reqVO.getStatus());
+        wrapper.eqIfExists(JobCvRelDO::getStatus, reqVO.getStatus());
         wrapper.eqIfExists(JobCvRelDO::getType, reqVO.getType());
+        wrapper.eqIfExists(JobCvRelDO::getRecommendUserId, reqVO.getRecommendUserId());
+        wrapper.likeIfExists(JobCvRelDO::getName, reqVO.getName());
+        wrapper.likeIfExists(JobCvRelDO::getPhone, reqVO.getPhone());
 
-        // 投递的职位 inner 人才信息
-        wrapper.innerJoin(PersonInfoDO.class, PersonInfoDO::getUserId, JobCvRelDO::getUserId);
+        // 投递的职位 inner 人才信息 (投递人)
+        wrapper.innerJoin(PersonInfoDO.class, "person", PersonInfoDO::getUserId, JobCvRelDO::getUserId);
+        // 人才相关的条件
+        wrapper.likeIfExists("person.name", reqVO.getName());
+
+        // 投递的职位 inner 人才信息 (推荐人)
+        wrapper.leftJoin(PersonInfoDO.class, "recommend", PersonInfoDO::getUserId, JobCvRelDO::getRecommendUserId);
         // 人才相关的条件
-        wrapper.eqIfExists(PersonInfoDO::getJobStatus, reqVO.getJobStatus());
-        wrapper.eqIfExists(PersonInfoDO::getEduType, reqVO.getEduType());
-        wrapper.eqIfExists(PersonInfoDO::getExpType, reqVO.getExpType());
-        wrapper.likeIfExists(PersonInfoDO::getName, reqVO.getName());
-        wrapper.likeIfExists(PersonInfoDO::getUserId, reqVO.getUserId());
+        wrapper.likeIfExists("recommend.name", reqVO.getName());
 
         setUnfitCandidate(wrapper);
 
@@ -76,6 +84,39 @@ public interface JobCvRelMapper extends BaseMapperX<JobCvRelDO> {
     }
 
 
+    /**
+     * 获得赏金投递职位分页
+     **/
+    default PageResult<AppAdminHireJobCvRelRespVO> page(AppAdminHireJobCvRelPageReqVO reqVO) {
+        // 职位投递userId inner 招聘职位userId and 职位投递userId inner 人才信息userId
+        MPJLambdaWrapperX<JobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAsClass(JobCvRelDO.class, AppAdminHireJobCvRelRespVO.class);
+        wrapper.selectAssociation(JobAdvertisedDO.class, AppAdminJobCvRelRespVO::getJob);
+        wrapper.selectAssociation("person", PersonInfoDO.class, AppAdminHireJobCvRelRespVO::getPerson);
+        wrapper.selectAssociation("recommend", PersonInfoDO.class, AppAdminHireJobCvRelRespVO::getRecommendPerson);
+
+        // 投递的职位 inner 招聘职位
+        wrapper.innerJoin(JobAdvertisedDO.class, JobAdvertisedDO::getId, JobCvRelDO::getJobId);
+        // 招聘职位的条件
+        wrapper.eqIfExists(JobCvRelDO::getJobId, reqVO.getJobId());
+        wrapper.eqIfExists(JobCvRelDO::getStatus, reqVO.getStatus());
+
+        // 投递的职位 inner 人才信息 (投递人)
+        wrapper.innerJoin(PersonInfoDO.class, "person", PersonInfoDO::getUserId, JobCvRelDO::getUserId);
+        // 人才相关的条件
+        wrapper.likeIfExists("person.name", reqVO.getName());
+
+        // 投递的职位 inner 人才信息 (推荐人)
+        wrapper.innerJoin(PersonInfoDO.class, "recommend", PersonInfoDO::getUserId, JobCvRelDO::getRecommendUserId);
+        // 人才相关的条件
+        wrapper.likeIfExists("recommend.name", reqVO.getName());
+
+        setUnfitCandidate(wrapper);
+
+        wrapper.orderByDesc(JobCvRelDO::getUpdateTime);
+        return selectJoinPage(reqVO, AppAdminHireJobCvRelRespVO.class, wrapper);
+    }
+
     default PageResult<AppHireJobCvRelRespVO> page(AppHireJobCvRelQueryReqVO reqVO, Long userId) {
         // 职位投递userId inner 招聘职位userId and 职位投递userId inner 人才信息userId
         MPJLambdaWrapperX<JobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
@@ -95,11 +136,11 @@ public interface JobCvRelMapper extends BaseMapperX<JobCvRelDO> {
 
         setUnfitCandidate(wrapper);
 
-
         wrapper.orderByDesc(JobCvRelDO::getUpdateTime);
         return selectJoinPage(reqVO, AppHireJobCvRelRespVO.class, wrapper);
     }
 
+
     /**
      * 过滤不合适的候选人
      **/
@@ -113,39 +154,6 @@ public interface JobCvRelMapper extends BaseMapperX<JobCvRelDO> {
         wrapper.isNull(UnfitCandidateDO::getId);
     }
 
-    /**
-     * 获得赏金投递职位分页
-     **/
-    default PageResult<AppAdminHireJobCvRelRespVO> page(AppAdminHireJobCvRelPageReqVO reqVO) {
-        // 职位投递userId inner 招聘职位userId and 职位投递userId inner 人才信息userId
-        MPJLambdaWrapperX<JobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
-        wrapper.selectAsClass(JobCvRelDO.class, AppAdminHireJobCvRelRespVO.class);
-        wrapper.selectAssociation(JobAdvertisedDO.class, AppAdminJobCvRelRespVO::getJob);
-        wrapper.selectAssociation("person", PersonInfoDO.class, AppAdminHireJobCvRelRespVO::getPerson);
-        wrapper.selectAssociation("recommend", PersonInfoDO.class, AppAdminHireJobCvRelRespVO::getRecommendPerson);
-
-        // 投递的职位 inner 招聘职位
-        wrapper.innerJoin(JobAdvertisedDO.class, JobAdvertisedDO::getId, JobCvRelDO::getJobId);
-        // 招聘职位的条件
-        wrapper.eqIfExists(JobCvRelDO::getJobId, reqVO.getJobId());
-        wrapper.eqIfExists(JobCvRelDO::getStatus, reqVO.getStatus());
-
-        // 投递的职位 inner 人才信息 (投递人)
-        wrapper.innerJoin(PersonInfoDO.class, "person", PersonInfoDO::getUserId, JobCvRelDO::getUserId);
-        // 人才相关的条件
-        wrapper.likeIfExists("person.name", reqVO.getName());
-
-        // 投递的职位 inner 人才信息 (推荐人)
-        wrapper.innerJoin(PersonInfoDO.class, "recommend", PersonInfoDO::getUserId, JobCvRelDO::getRecommendUserId);
-        // 人才相关的条件
-        wrapper.likeIfExists("recommend.name", reqVO.getName());
-
-        setUnfitCandidate(wrapper);
-
-        wrapper.orderByDesc(JobCvRelDO::getUpdateTime);
-        return selectJoinPage(reqVO, AppAdminHireJobCvRelRespVO.class, wrapper);
-    }
-
 
     // 根据用户ID和职位id判断15天内是否有数据,如果有返回true
     default Boolean checkDataWithin15Day(Long userId, Long jobId) {
@@ -155,6 +163,16 @@ public interface JobCvRelMapper extends BaseMapperX<JobCvRelDO> {
                 .ge(JobCvRelDO::getCreateTime, LocalDateTime.now().minusDays(15))) > 0;
     }
 
+    // 根据用户id和职位id获取投递简历信息
+    default JobCvRelDO selectByUserIdAndJobId(Long userId, Long jobId) {
+        return selectOne(new LambdaQueryWrapperX<JobCvRelDO>()
+                .eq(JobCvRelDO::getUserId, userId)
+                .eq(JobCvRelDO::getJobId, jobId)
+                // 大于15天内投递的
+                .ge(JobCvRelDO::getCreateTime, LocalDateTime.now().minusDays(15))
+        );
+    }
+
     default List<JobCvRelDO> selectByJobIdList(List<Long> jobIdList) {
         return selectList(new LambdaQueryWrapperX<JobCvRelDO>()
                 .in(JobCvRelDO::getJobId, jobIdList)
@@ -167,13 +185,6 @@ public interface JobCvRelMapper extends BaseMapperX<JobCvRelDO> {
     }
 
 
-    /**
-     * 获取投递简历中的推荐人列表
-     **/
-    default List<AppAdminPersonSimpleRespVO> getRecommendUser() {
-        return null;
-    }
-
     /**
      * 查询用户被看过的简历
      **/
@@ -190,4 +201,79 @@ public interface JobCvRelMapper extends BaseMapperX<JobCvRelDO> {
         return selectJoinPage(pageParam, JobCvRelDO.class, wrapper);
     }
 
+    // ========== 统计 ==========
+
+    /**
+     * 投递简历的性别比例
+     **/
+    default List<CommonRespVO> getJobCvSexCount(LocalDateTime startTime, LocalDateTime endTime) {
+        MPJLambdaWrapperX<JobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAs(PersonInfoDO::getSex, "`key`");
+        wrapper.selectCount(JobCvRelDO::getId, CommonRespVO::getValue);
+        wrapper.innerJoin(PersonInfoDO.class, PersonInfoDO::getUserId, JobCvRelDO::getUserId);
+        wrapper.between(JobCvRelDO::getCreateTime, startTime, endTime);
+        wrapper.groupBy(PersonInfoDO::getSex);
+        wrapper.orderByDesc("`key`");
+        return selectJoinList(CommonRespVO.class, wrapper);
+    }
+
+
+
+    /**
+     * 投递简历的年龄分布
+     **/
+    default List<CommonRespVO> getJobCvAgeCount(LocalDateTime startTime, LocalDateTime endTime) {
+        MPJLambdaWrapperX<JobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
+
+        String sql = "CASE \n" +
+                "        WHEN YEAR(CURDATE()) - YEAR(birthday) BETWEEN 18 AND 22 THEN '18-22岁'\n" +
+                "        WHEN YEAR(CURDATE()) - YEAR(birthday) BETWEEN 23 AND 30 THEN '23-30岁'\n" +
+                "        WHEN YEAR(CURDATE()) - YEAR(birthday) BETWEEN 31 AND 39 THEN '31-39岁'\n" +
+                "        WHEN YEAR(CURDATE()) - YEAR(birthday) BETWEEN 40 AND 49 THEN '40-49岁'\n" +
+                "        WHEN YEAR(CURDATE()) - YEAR(birthday) BETWEEN 50 AND 59 THEN '50-59岁'\n" +
+                "        ELSE '其他年龄段'\n" +
+                "    END";
+        wrapper.selectFunc(() -> sql, PersonInfoDO::getBirthday, "`key`");
+        wrapper.selectCount(JobCvRelDO::getId, CommonRespVO::getValue);
+
+
+        wrapper.innerJoin(PersonInfoDO.class, PersonInfoDO::getUserId, JobCvRelDO::getUserId);
+        wrapper.between(JobCvRelDO::getCreateTime, startTime, endTime);
+        wrapper.groupBy("`key`");
+        wrapper.orderByDesc("`key`");
+        return selectJoinList(CommonRespVO.class, wrapper);
+    }
+
+    /**
+     * 投递简历的工作经验分布
+     **/
+    default List<CommonRespVO> getJobCvExpCount(LocalDateTime startTime, LocalDateTime endTime) {
+        MPJLambdaWrapperX<JobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAs(PersonInfoDO::getExpType, "`key`");
+        wrapper.selectCount(JobCvRelDO::getId, CommonRespVO::getValue);
+
+        wrapper.innerJoin(PersonInfoDO.class, PersonInfoDO::getUserId, JobCvRelDO::getUserId);
+        wrapper.between(JobCvRelDO::getCreateTime, startTime, endTime);
+        wrapper.groupBy(PersonInfoDO::getExpType);
+        wrapper.orderByDesc("`key`");
+        return selectJoinList(CommonRespVO.class, wrapper);
+    }
+
+    /**
+     * 投递简历的学历分布
+     **/
+    default List<CommonRespVO> getJobCvEduCount(LocalDateTime startTime, LocalDateTime endTime) {
+        MPJLambdaWrapperX<JobCvRelDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectAs(PersonInfoDO::getEduType, "`key`");
+        wrapper.selectCount(JobCvRelDO::getId, CommonRespVO::getValue);
+
+        wrapper.innerJoin(PersonInfoDO.class, PersonInfoDO::getUserId, JobCvRelDO::getUserId);
+        wrapper.between(JobCvRelDO::getCreateTime, startTime, endTime);
+        wrapper.groupBy(PersonInfoDO::getEduType);
+        wrapper.orderByDesc("`key`");
+
+        return selectJoinList(CommonRespVO.class, wrapper);
+    }
+
+
 }

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

@@ -9,6 +9,7 @@ import com.citu.module.menduner.system.controller.app.position.vo.AppPositionLis
 import com.citu.module.menduner.system.dal.dataobject.position.PositionDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 
 import java.util.Collection;
 import java.util.List;
@@ -62,6 +63,7 @@ public interface PositionMapper extends BaseMapperX<PositionDO> {
     /**
      * 清空职位数据
      **/
+    @Update("TRUNCATE TABLE mde_position")
     Integer truncate();
 
     /**

+ 15 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/school/SchoolMapper.java

@@ -3,10 +3,15 @@ package com.citu.module.menduner.system.dal.mysql.school;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.MPJLambdaWrapperX;
 import com.citu.module.menduner.system.controller.base.school.SchoolPageReqVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
+import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
+import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
 import com.citu.module.menduner.system.dal.dataobject.school.SchoolDO;
+import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Update;
 
 import java.util.List;
 
@@ -34,7 +39,16 @@ public interface SchoolMapper extends BaseMapperX<SchoolDO> {
     /**
      * 清空职位数据
      **/
+    @Update("TRUNCATE TABLE mde_school")
     Integer truncate();
 
-    List<CommonRespVO> searchByName(String name);
+
+   default List<CommonRespVO> searchByName(String name){
+       MPJLambdaWrapperX<SchoolDO> wrapper = new MPJLambdaWrapperX<>();
+       wrapper.selectAs(SchoolDO::getId, "`key`");
+       wrapper.selectAs(SchoolDO::getName, CommonRespVO::getValue);
+       wrapper.like(SchoolDO::getName, name);
+       wrapper.eq(SchoolDO::getStatus, MendunerStatusEnum.ENABLE.getStatus());
+       return selectJoinList(CommonRespVO.class, wrapper);
+   }
 }

+ 57 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/scheduled/InterviewInviteScheduled.java

@@ -0,0 +1,57 @@
+package com.citu.module.menduner.system.scheduled;
+
+import cn.hutool.core.collection.CollUtil;
+import com.citu.framework.tenant.core.aop.TenantIgnore;
+import com.citu.module.menduner.system.dal.dataobject.interview.InterviewInviteDO;
+import com.citu.module.menduner.system.dal.mysql.interview.InterviewInviteMapper;
+import com.citu.module.menduner.system.enums.interview.InterviewInviteStatusEnum;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.util.StopWatch;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author rayson
+ * 面试定时任务
+ * @create 2024/7/24 下午2:28
+ **/
+@Slf4j
+@Configuration
+@RequiredArgsConstructor
+public class InterviewInviteScheduled {
+
+    @Resource
+    private InterviewInviteMapper mapper;
+
+    /**
+     * 即将到达的面试提醒
+     * 每隔5分钟扫描一遍
+     **/
+    @Async
+    @TenantIgnore
+    @Scheduled(cron = "0 */5 * * * ?")
+    public void approachingInterview() {
+        List<InterviewInviteDO> list = mapper.getApproachingInterviewList();
+
+        if (CollUtil.isEmpty(list)) {
+            return;
+        }
+
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start("即将到达的面试提醒");
+
+        for (InterviewInviteDO inviteDO : list) {
+            inviteDO.setStatus(InterviewInviteStatusEnum.APPROACHING_INTERVIEW.getStatus());
+            mapper.updateById(inviteDO);
+            // TODO 发送消息提醒
+
+        }
+        stopWatch.stop();
+        stopWatch.prettyPrint();
+    }
+}

+ 3 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/user/EnterpriseUserApplyService.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/apply/EnterpriseUserApplyService.java

@@ -1,9 +1,9 @@
 package com.citu.module.menduner.system.service.enterprise;
 
 import com.citu.framework.common.pojo.PageResult;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplyAuditReqVO;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplyPageReqVO;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplySaveReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyAuditReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplySaveReqVO;
 import com.citu.module.menduner.system.controller.app.enterprise.vo.apply.AppEnterpriseUserApplyReqVO;
 import com.citu.module.menduner.system.controller.app.enterprise.vo.apply.AppEnterpriseUserApplyRespVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserApplyDO;

+ 4 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/user/EnterpriseUserApplyServiceImpl.java → menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/apply/EnterpriseUserApplyServiceImpl.java

@@ -1,13 +1,13 @@
-package com.citu.module.menduner.system.service.enterprise.user;
+package com.citu.module.menduner.system.service.enterprise.apply;
 
 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.app.enterprise.vo.apply.AppEnterpriseUserApplyReqVO;
 import com.citu.module.menduner.system.controller.app.enterprise.vo.apply.AppEnterpriseUserApplyRespVO;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplyAuditReqVO;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplyPageReqVO;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplySaveReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyAuditReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplySaveReqVO;
 import com.citu.module.menduner.system.convert.EnterpriseConvert;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserApplyDO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;

+ 90 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/auth/EnterpriseAuthService.java

@@ -0,0 +1,90 @@
+package com.citu.module.menduner.system.service.enterprise.auth;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.appadmin.enterprise.auth.AppAdminEnterpriseAuthRespVO;
+import com.citu.module.menduner.system.controller.appadmin.enterprise.auth.AppAdminEnterpriseAuthSaveReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthAuditReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthSaveReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyAuditReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAuthDO;
+
+import javax.validation.Valid;
+
+/**
+ * 企业实名认证 Service 接口
+ *
+ * @author Rayson
+ */
+public interface EnterpriseAuthService {
+
+    /**
+     * 创建企业实名认证
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createEnterpriseAuth(@Valid EnterpriseAuthSaveReqVO createReqVO);
+
+    /**
+     * 更新企业实名认证
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateEnterpriseAuth(@Valid EnterpriseAuthSaveReqVO updateReqVO);
+
+    /**
+     * 删除企业实名认证
+     *
+     * @param id 编号
+     */
+    void deleteEnterpriseAuth(Long id);
+
+    /**
+     * 获得企业实名认证
+     *
+     * @param id 编号
+     * @return 企业实名认证
+     */
+    EnterpriseAuthDO getEnterpriseAuth(Long id);
+
+    /**
+     * 获得企业实名认证分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 企业实名认证分页
+     */
+    PageResult<EnterpriseAuthDO> getEnterpriseAuthPage(EnterpriseAuthPageReqVO pageReqVO);
+
+    /**
+     * 通过
+     *
+     * @param reqVO
+     * @return boolean
+     **/
+    void approved(EnterpriseAuthAuditReqVO reqVO);
+
+    /**
+     * 拒绝
+     *
+     * @param reqVO
+     * @return boolean
+     **/
+    void reject(EnterpriseAuthAuditReqVO reqVO);
+
+    /**
+     * 获取企业实名认证
+     *
+     * @return 企业实名制信息
+     */
+    AppAdminEnterpriseAuthRespVO get();
+
+    /**
+     * 保存
+     *
+     * @param reqVO 实名制对象
+     */
+    void save(AppAdminEnterpriseAuthSaveReqVO reqVO);
+
+}

+ 140 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/auth/EnterpriseAuthServiceImpl.java

@@ -0,0 +1,140 @@
+package com.citu.module.menduner.system.service.enterprise.auth;
+
+
+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.framework.security.core.LoginUser;
+import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.appadmin.enterprise.auth.AppAdminEnterpriseAuthRespVO;
+import com.citu.module.menduner.system.controller.appadmin.enterprise.auth.AppAdminEnterpriseAuthSaveReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthAuditReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthSaveReqVO;
+import com.citu.module.menduner.system.convert.EnterpriseConvert;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAuthDO;
+import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseAuthMapper;
+import com.citu.module.menduner.system.enums.enterprise.EnterpriseAuthStatusEnum;
+import com.citu.module.menduner.system.enums.enterprise.EnterpriseUserApplyAuditStatusEnum;
+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.ENTERPRISE_AUTH_NOT_EXISTS;
+
+
+/**
+ * 企业实名认证 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class EnterpriseAuthServiceImpl implements EnterpriseAuthService {
+
+    @Resource
+    private EnterpriseAuthMapper mapper;
+
+    @Override
+    public Long createEnterpriseAuth(EnterpriseAuthSaveReqVO createReqVO) {
+        // 插入
+        EnterpriseAuthDO enterpriseAuth = BeanUtils.toBean(createReqVO, EnterpriseAuthDO.class);
+        mapper.insert(enterpriseAuth);
+        // 返回
+        return enterpriseAuth.getId();
+    }
+
+    @Override
+    public void updateEnterpriseAuth(EnterpriseAuthSaveReqVO updateReqVO) {
+        // 校验存在
+        validateEnterpriseAuthExists(updateReqVO.getId());
+        // 更新
+        EnterpriseAuthDO updateObj = BeanUtils.toBean(updateReqVO, EnterpriseAuthDO.class);
+        mapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteEnterpriseAuth(Long id) {
+        // 校验存在
+        validateEnterpriseAuthExists(id);
+        // 删除
+        mapper.deleteById(id);
+    }
+
+    private EnterpriseAuthDO validateEnterpriseAuthExists(Long id) {
+        EnterpriseAuthDO enterpriseAuth = mapper.selectById(id);
+        if (null == enterpriseAuth) {
+            throw exception(ENTERPRISE_AUTH_NOT_EXISTS);
+        }
+        return enterpriseAuth;
+    }
+
+    @Override
+    public EnterpriseAuthDO getEnterpriseAuth(Long id) {
+        return mapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<EnterpriseAuthDO> getEnterpriseAuthPage(EnterpriseAuthPageReqVO pageReqVO) {
+        return mapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    @DSTransactional
+    public void approved(EnterpriseAuthAuditReqVO reqVO) {
+        EnterpriseAuthDO enterpriseAuth = validateEnterpriseAuthExists(reqVO.getId());
+        enterpriseAuth.setStatus(EnterpriseAuthStatusEnum.APPROVED.getStatus());
+        enterpriseAuth.setReason(reqVO.getReason());
+        mapper.updateById(enterpriseAuth);
+    }
+
+    @Override
+    @DSTransactional
+    public void reject(EnterpriseAuthAuditReqVO reqVO) {
+        EnterpriseAuthDO enterpriseAuth = validateEnterpriseAuthExists(reqVO.getId());
+        enterpriseAuth.setStatus(EnterpriseAuthStatusEnum.REJECT.getStatus());
+        enterpriseAuth.setReason(reqVO.getReason());
+        mapper.updateById(enterpriseAuth);
+    }
+
+    @Override
+    public AppAdminEnterpriseAuthRespVO get() {
+        return EnterpriseConvert.INSTANCE.convert18(mapper.
+                selectByEnterprise(LoginUserContext.getEnterpriseId()));
+    }
+
+    @Override
+    @DSTransactional
+    public void save(AppAdminEnterpriseAuthSaveReqVO reqVO) {
+        LoginUser loginUser = LoginUserContext.get();
+
+        Long userId = LoginUserContext.getUserId(loginUser);
+        Long enterpriseId = LoginUserContext.getEnterpriseId(loginUser);
+
+        EnterpriseAuthDO entity = mapper.
+                selectByEnterprise(enterpriseId);
+
+        if (null == entity) {
+            EnterpriseAuthDO auth = BeanUtils.toBean(reqVO, EnterpriseAuthDO.class);
+            auth.setId(null);
+            auth.setEnterpriseId(enterpriseId);
+            auth.setUserId(userId);
+            auth.setStatus(EnterpriseAuthStatusEnum.AUDITING.getStatus());
+            mapper.insert(auth);
+        } else {
+            // 重新提交
+            entity.setName(reqVO.getName());
+            entity.setIdentityNo(reqVO.getIdentityNo());
+            entity.setFrontUrl(reqVO.getFrontUrl());
+            entity.setBackUrl(reqVO.getBackUrl());
+            entity.setStatus(EnterpriseAuthStatusEnum.AUDITING.getStatus());
+            entity.setReason("");
+            mapper.updateById(entity);
+
+        }
+
+
+    }
+}

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

@@ -325,7 +325,8 @@ public class EnterpriseUserBindServiceImpl implements EnterpriseUserBindService
         if (null == userBindDO) {
             throw exception(MDE_ENTERPRISE_USER_BIND_NOT_EXISTS);
         }
-        if (userBindDO.getPostId().equals(postId)) {
+        if (null != userBindDO.getPostId() &&
+                userBindDO.getPostId().equals(postId)) {
             return true;
         }
         userBindDO.setPostId(postId);

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

@@ -39,10 +39,9 @@ public interface HireCommissionRatioService {
     /**
      * 获得众聘-佣金比例
      *
-     * @param id 编号
      * @return 众聘-佣金比例
      */
-    HireCommissionRatioDO getHireCommissionRatio(Long id);
+    HireCommissionRatioDO getHireCommissionRatio();
 
     /**
      * 获得众聘-佣金比例分页

+ 7 - 3
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/hire/HireCommissionRatioServiceImpl.java

@@ -64,8 +64,8 @@ public class HireCommissionRatioServiceImpl implements HireCommissionRatioServic
     }
 
     @Override
-    public HireCommissionRatioDO getHireCommissionRatio(Long id) {
-        return mapper.selectById(id);
+    public HireCommissionRatioDO getHireCommissionRatio() {
+        return mapper.selectByOne();
     }
 
     @Override
@@ -75,7 +75,11 @@ public class HireCommissionRatioServiceImpl implements HireCommissionRatioServic
 
     @Override
     public HireCommissionRatioDO get() {
-        return mapper.selectByOne();
+        HireCommissionRatioDO ratio =  mapper.selectByOne();
+        if (null == ratio) {
+            throw exception(HIRE_COMMISSION_RATIO_NOT_EXISTS);
+        }
+        return ratio;
     }
 
     @Override

+ 43 - 5
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/interview/InterviewInviteService.java

@@ -1,8 +1,8 @@
 package com.citu.module.menduner.system.service.interview;
 
 
-import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.system.controller.app.interview.vo.AppInterviewInvitePageReqVO;
 import com.citu.module.menduner.system.controller.app.interview.vo.AppInterviewInviteRespVO;
 import com.citu.module.menduner.system.controller.appadmin.interview.vo.*;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
@@ -12,7 +12,6 @@ import com.citu.module.menduner.system.dal.dataobject.interview.InterviewInviteD
 
 import javax.validation.Valid;
 import java.util.List;
-import java.util.Map;
 
 /**
  * 面试邀请 Service 接口
@@ -60,12 +59,14 @@ public interface InterviewInviteService {
     PageResult<InterviewInviteDO> getInterviewInvitePage(InterviewInvitePageReqVO pageReqVO);
 
     // ========== 求职端 ==========
+
     /**
      * 同意邀约面试
      *
      * @param reqVO 同意邀约
      */
     void consent(AppAdminInterviewInviteReqConsentVO reqVO);
+
     /**
      * 拒绝邀约面试
      *
@@ -79,9 +80,10 @@ public interface InterviewInviteService {
      * @param reqVO 分页查询
      * @return 面试日程分页
      */
-    PageResult<AppInterviewInviteRespVO> page(PageParam reqVO);
+    PageResult<AppInterviewInviteRespVO> page(AppInterviewInvitePageReqVO reqVO);
 
     // ========== 招聘端 ==========
+
     /**
      * 获取当前企业面试日期的面试数量
      */
@@ -95,17 +97,53 @@ public interface InterviewInviteService {
      */
     PageResult<AppAdminInterviewInviteRespVO> page(AppAdminInterviewInviteReqPageVO reqVO);
 
-
     /**
      * 保存面试
+     *
      * @param reqVO
      **/
     void save(AppAdminInterviewInviteReqSaveVO reqVO);
 
     /**
      * 取消面试
+     *
      * @param reqVO 面试取消
      **/
-    void cancellation(AppAdminInterviewInviteReqCancellationVO reqVO);
+    void cancellation(AppAdminInterviewInviteCancellationReqVO reqVO);
+
+    /**
+     * 完成面试
+     *
+     * @param id 面试id
+     **/
+    void completed(Long id);
+
+    /**
+     * 未能爽约面试
+     *
+     * @param reqVO
+     */
+    void notAttended(AppAdminInterviewInviteNotAttendedReqVO reqVO);
+
+    /**
+     * 面试反馈
+     *
+     * @param reqVO 面试反馈
+     **/
+    void feedback(AppAdminInterviewInviteFeedbackReqVO reqVO);
+
+    /**
+     * 结算
+     *
+     * @param id id
+     */
+    void settlement(Long id);
+
+    /**
+     * 入职
+     *
+     * @param id id
+     */
+    void entry(Long id);
 
 }

+ 263 - 6
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/interview/InterviewInviteServiceImpl.java

@@ -2,34 +2,43 @@ package com.citu.module.menduner.system.service.interview;
 
 
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
-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.security.core.LoginUser;
 import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.system.controller.app.interview.vo.AppInterviewInvitePageReqVO;
 import com.citu.module.menduner.system.controller.app.interview.vo.AppInterviewInviteRespVO;
 import com.citu.module.menduner.system.controller.appadmin.interview.vo.*;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.contact.EnterpriseUserContactRespVO;
 import com.citu.module.menduner.system.controller.base.interview.InterviewInvitePageReqVO;
 import com.citu.module.menduner.system.controller.base.interview.InterviewInviteSaveReqVO;
-import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterprisePostDO;
+import com.citu.module.menduner.system.dal.dataobject.hire.HireCommissionRatioDO;
 import com.citu.module.menduner.system.dal.dataobject.interview.InterviewInviteDO;
+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.interview.InterviewInviteMapper;
 import com.citu.module.menduner.system.dal.mysql.job.JobAdvertisedMapper;
+import com.citu.module.menduner.system.enums.MathOperationEnum;
+import com.citu.module.menduner.system.enums.account.BalanceBizTypeEnum;
+import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
+import com.citu.module.menduner.system.enums.cv.ConversationStatusEnum;
 import com.citu.module.menduner.system.enums.interview.InterviewInviteStatusEnum;
 import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
 import com.citu.module.menduner.system.service.hire.HireCommissionRatioService;
+import com.citu.module.menduner.system.service.job.JobCvRelService;
 import com.citu.module.menduner.system.service.record.EnterpriseAccountRecordService;
 import com.citu.module.menduner.system.service.record.UserAccountRecordService;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.List;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.citu.module.menduner.system.enums.ErrorCodeConstants.INTERVIEW_INVITE_NOT_EXISTS;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 
 /**
  * 面试邀请 Service 实现类
@@ -49,6 +58,10 @@ public class InterviewInviteServiceImpl implements InterviewInviteService {
     @Resource
     private HireCommissionRatioService ratioService;
 
+    @Resource
+    private JobCvRelService jobCvRelService;
+
+
     @Resource
     private UserAccountRecordService userAccountRecordService;
 
@@ -123,6 +136,7 @@ public class InterviewInviteServiceImpl implements InterviewInviteService {
 
     public void setStatus(InterviewInviteDO interviewInvite, InterviewInviteStatusEnum statusEnum) {
         interviewInvite.setStatus(statusEnum.getStatus());
+        interviewInvite.setConversationStatus(ConversationStatusEnum.INVITE.getStatus());
     }
 
     @Override
@@ -135,8 +149,8 @@ public class InterviewInviteServiceImpl implements InterviewInviteService {
     }
 
     @Override
-    public PageResult<AppInterviewInviteRespVO> page(PageParam reqVO) {
-        PageResult<AppInterviewInviteRespVO> result =  mapper.page(reqVO, LoginUserContext.getUserId());
+    public PageResult<AppInterviewInviteRespVO> page(AppInterviewInvitePageReqVO reqVO) {
+        PageResult<AppInterviewInviteRespVO> result = mapper.page(reqVO, LoginUserContext.getUserId());
         result.getList().forEach(resp -> {
             EnterpriseUserContactRespVO contactRespVO = userBindService
                     .getContact(resp.getEnterpriseId(), resp.getInviteUserId());
@@ -177,11 +191,254 @@ public class InterviewInviteServiceImpl implements InterviewInviteService {
 
     @Override
     @DSTransactional
-    public void cancellation(AppAdminInterviewInviteReqCancellationVO reqVO) {
+    public void cancellation(AppAdminInterviewInviteCancellationReqVO reqVO) {
         InterviewInviteDO interviewInvite = validateInterviewInviteExists(reqVO.getId());
         setStatus(interviewInvite, InterviewInviteStatusEnum.CANCELLED);
         interviewInvite.setReason(reqVO.getReason());
         mapper.updateById(interviewInvite);
     }
 
+    @Override
+    @DSTransactional
+    public void completed(Long id) {
+        InterviewInviteDO interviewInvite = validateInterviewInviteExists(id);
+        setStatus(interviewInvite, InterviewInviteStatusEnum.COMPLETED);
+        mapper.updateById(interviewInvite);
+    }
+
+    @Override
+    @DSTransactional
+    public void feedback(AppAdminInterviewInviteFeedbackReqVO reqVO) {
+        InterviewInviteDO interviewInvite = validateInterviewInviteExists(reqVO.getId());
+        setStatus(interviewInvite, InterviewInviteStatusEnum.FEEDBACK_PROVIDED);
+        interviewInvite.setEvaluate(reqVO.getEvaluate());
+        mapper.updateById(interviewInvite);
+    }
+
+    @Override
+    @DSTransactional
+    public void notAttended(AppAdminInterviewInviteNotAttendedReqVO reqVO) {
+        InterviewInviteDO interviewInvite = validateInterviewInviteExists(reqVO.getId());
+        setStatus(interviewInvite, InterviewInviteStatusEnum.NOT_ATTENDED);
+        interviewInvite.setReason(reqVO.getReason());
+        mapper.updateById(interviewInvite);
+    }
+
+    /**
+     * 状态检查
+     */
+    public void checkStatusIsCompleted(InterviewInviteDO interviewInvite) {
+        if (Integer.parseInt(interviewInvite.getStatus())
+                < Integer.parseInt(InterviewInviteStatusEnum.COMPLETED.getStatus())) {
+            // 状态不是面试完成后的
+            throw exception(INTERVIEW_INVITE_STATUS_NOT_COMPLETED);
+        }
+
+    }
+
+    @Override
+    @DSTransactional
+    public void entry(Long id) {
+        InterviewInviteDO interviewInvite = validateInterviewInviteExists(id);
+
+        checkStatusIsCompleted(interviewInvite);
+        // 标记为入职
+        interviewInvite.setConversationStatus(ConversationStatusEnum.ENTRY.getStatus());
+        mapper.updateById(interviewInvite);
+
+        //TODO 发送推送消息
+    }
+
+    @Override
+    @DSTransactional
+    public void settlement(Long id) {
+
+        InterviewInviteDO interviewInvite = validateInterviewInviteExists(id);
+
+        checkStatusIsCompleted(interviewInvite);
+
+        if (!interviewInvite.getConversationStatus()
+                .equals(ConversationStatusEnum.ENTRY.getStatus())) {
+            // 不是已入职状态
+            throw exception(INTERVIEW_INVITE_STATUS_NOT_ENTRY);
+        }
+        // 标记为结算
+        interviewInvite.setConversationStatus(ConversationStatusEnum.SETTLEMENT.getStatus());
+        mapper.updateById(interviewInvite);
+
+        // 获取 面试的求职者投递的简历信息
+        JobCvRelDO cv = jobCvRelService
+                .selectByUserIdAndJobId(interviewInvite.getUserId(), interviewInvite.getJobId());
+
+        // 猎头、 推荐人、投递人
+        // 获取比例配置
+        HireCommissionRatioDO ratio = ratioService.get();
+
+        JobAdvertisedDO job = jobAdvertisedMapper.selectById(cv.getJobId());
+
+        if (null != job.getHirePrice()) {
+            // 余额结算
+            priceSettlement(job, ratio, cv);
+        }
+
+        if (null != job.getHirePoint()) {
+            // 积分结算
+            pointSettlement(job, ratio, cv);
+        }
+        //TODO 发送推送消息
+    }
+
+    /**
+     * 余额结算
+     *
+     * @param job   职位信息
+     * @param ratio 佣金比例
+     * @param cv    投递信息
+     **/
+    public void priceSettlement(JobAdvertisedDO job, HireCommissionRatioDO ratio, JobCvRelDO cv) {
+        BigDecimal hirePrice = job.getHirePrice();
+        // 总比例
+        BigDecimal totalRate = BigDecimal.valueOf(100);
+        // 猎头佣金
+        BigDecimal headhuntPrice = hirePrice.multiply(ratio.getHeadhuntRate())
+                .divide(totalRate, 2, RoundingMode.HALF_UP);
+        // 推荐人佣金
+        BigDecimal recommendPrice = hirePrice.multiply(ratio.getRecommendRate())
+                .divide(totalRate, 2, RoundingMode.HALF_UP);
+        // 投递人佣金
+        BigDecimal cvPrice = hirePrice.multiply(ratio.getCvRate())
+                .divide(totalRate, 2, RoundingMode.HALF_UP);
+
+        // 猎头 (平台自己)
+        if (headhuntPrice.compareTo(BigDecimal.ZERO) > 0) {
+            enterpriseAccountRecordService.createBalanceRecord(
+                    1L,
+                    1L,
+                    BalanceBizTypeEnum.PLATFORM_COMMISSION.getName(),
+                    MathOperationEnum.ADD,
+                    headhuntPrice,
+                    BalanceBizTypeEnum.PLATFORM_COMMISSION,
+                    String.valueOf(job.getId())
+            );
+        }
+
+        // 如果推荐人ID为空,则将推荐人的佣金也给到猎头
+        if (null == cv.getRecommendUserId()) {
+            enterpriseAccountRecordService.createBalanceRecord(
+                    1L,
+                    1L,
+                    BalanceBizTypeEnum.NOT_RECOMMENDED.getName(),
+                    MathOperationEnum.ADD,
+                    recommendPrice,
+                    BalanceBizTypeEnum.NOT_RECOMMENDED,
+                    String.valueOf(job.getId())
+            );
+        }
+
+        // 推荐人
+        if (headhuntPrice.compareTo(BigDecimal.ZERO) > 0
+                && null != cv.getRecommendUserId()) {
+            userAccountRecordService.createBalanceRecord(
+                    cv.getRecommendUserId(),
+                    BalanceBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
+                    MathOperationEnum.ADD,
+                    recommendPrice,
+                    BalanceBizTypeEnum.RECOMMENDED_POSITIONS,
+                    String.valueOf(job.getId())
+            );
+        }
+
+        // 投递人
+        if (headhuntPrice.compareTo(BigDecimal.ZERO) > 0) {
+            userAccountRecordService.createBalanceRecord(
+                    cv.getUserId(),
+                    BalanceBizTypeEnum.DELIVERY_PERSON.getName(),
+                    MathOperationEnum.ADD,
+                    cvPrice,
+                    BalanceBizTypeEnum.DELIVERY_PERSON,
+                    String.valueOf(job.getId())
+            );
+        }
+    }
+
+    /**
+     * 积分结算
+     *
+     * @param job   职位信息
+     * @param ratio 佣金比例
+     * @param cv    投递信息
+     **/
+    public void pointSettlement(JobAdvertisedDO job, HireCommissionRatioDO ratio, JobCvRelDO cv) {
+        Integer hirePoint = job.getHirePoint();
+        int totalRate = 100; // 总比例
+
+        // 猎头佣金
+        int headhuntPoint = (int) (hirePoint * ratio.getHeadhuntRate().intValue() / (long) totalRate);
+
+        // 推荐人佣金
+        int recommendPoint = (int) (hirePoint * ratio.getRecommendRate().intValue() / (long) totalRate);
+
+        // 投递人佣金
+        int cvPoint = (int) (hirePoint * ratio.getCvRate().intValue() / (long) totalRate);
+
+        // 由于比例之和可能不等于100%,剩余的点数可能需要进行分配或处理
+        int remainingPoint = hirePoint - (headhuntPoint + recommendPoint + cvPoint);
+
+        // 这里你可以选择将剩余点数分配给任意一方,或者按照比例再次分配
+        // 将剩余点数全部分配给猎头
+        headhuntPoint += remainingPoint;
+
+        // 猎头 (平台自己)
+        if (headhuntPoint > 0) {
+            enterpriseAccountRecordService.createPointRecord(
+                    1L,
+                    1L,
+                    PointBizTypeEnum.PLATFORM_COMMISSION.getName(),
+                    MathOperationEnum.ADD,
+                    headhuntPoint,
+                    PointBizTypeEnum.PLATFORM_COMMISSION,
+                    String.valueOf(job.getId())
+            );
+        }
+
+        // 如果推荐人ID为空,则将推荐人的佣金也给到猎头
+        if (null == cv.getRecommendUserId()) {
+            enterpriseAccountRecordService.createPointRecord(
+                    1L,
+                    1L,
+                    PointBizTypeEnum.NOT_RECOMMENDED.getName(),
+                    MathOperationEnum.ADD,
+                    recommendPoint,
+                    PointBizTypeEnum.NOT_RECOMMENDED,
+                    String.valueOf(job.getId())
+            );
+        }
+
+        // 推荐人
+        if (headhuntPoint > 0 && null!= cv.getRecommendUserId()) {
+            userAccountRecordService.createPointRecord(
+                    cv.getRecommendUserId(),
+                    "",
+                    PointBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
+                    MathOperationEnum.ADD,
+                    recommendPoint,
+                    PointBizTypeEnum.RECOMMENDED_POSITIONS,
+                    String.valueOf(job.getId())
+            );
+        }
+
+        // 投递人
+        if (headhuntPoint > 0) {
+            userAccountRecordService.createPointRecord(
+                    cv.getUserId(),
+                    "",
+                    PointBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
+                    MathOperationEnum.ADD,
+                    cvPoint,
+                    PointBizTypeEnum.RECOMMENDED_POSITIONS,
+                    String.valueOf(job.getId())
+            );
+        }
+    }
+
 }

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

@@ -23,14 +23,6 @@ public interface HireJobIntegrationService {
      **/
     PageResult<AppAdminHireJobCvRelRespVO> page(AppAdminHireJobCvRelPageReqVO reqVO);
 
-
-    /**
-     * 获取推荐人的用户列表
-     * @return PageResult<AppAdminHireJobCvRelRespVO>
-     **/
-    List<AppAdminPersonSimpleRespVO> getRecommendUser();
-
-
     /**
      * 结算
      *

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

@@ -1,22 +1,18 @@
 package com.citu.module.menduner.system.service.job;
 
-import cn.hutool.core.collection.CollUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.system.controller.appadmin.person.hire.AppAdminHireJobCvRelPageReqVO;
 import com.citu.module.menduner.system.controller.appadmin.person.hire.AppAdminHireJobCvRelRespVO;
-import com.citu.module.menduner.system.controller.appadmin.person.vo.AppAdminPersonSimpleRespVO;
 import com.citu.module.menduner.system.dal.dataobject.hire.HireCommissionRatioDO;
+import com.citu.module.menduner.system.dal.dataobject.interview.InterviewInviteDO;
 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.interview.InterviewInviteMapper;
 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.MathOperationEnum;
 import com.citu.module.menduner.system.enums.account.BalanceBizTypeEnum;
 import com.citu.module.menduner.system.enums.account.PointBizTypeEnum;
-import com.citu.module.menduner.system.enums.cv.ConversationStatusEnum;
-import com.citu.module.menduner.system.enums.cv.JobCvRelStatusEnum;
 import com.citu.module.menduner.system.service.hire.HireCommissionRatioService;
 import com.citu.module.menduner.system.service.interview.InterviewInviteService;
 import com.citu.module.menduner.system.service.record.EnterpriseAccountRecordService;
@@ -28,10 +24,8 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.List;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.citu.module.menduner.system.enums.ErrorCodeConstants.HIRE_COMMISSION_RATIO_NOT_EXISTS;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.HIRE_JOB_CV_REL_NOT_EXISTS;
 
 @Slf4j
@@ -39,14 +33,15 @@ import static com.citu.module.menduner.system.enums.ErrorCodeConstants.HIRE_JOB_
 @Validated
 public class HireJobIntegrationServiceImpl implements HireJobIntegrationService {
 
-
     @Resource
-    private JobCvRelMapper jobCvRelMapper;
-
+    private JobCvRelService jobCvRelService;
 
     @Resource
     private JobAdvertisedMapper jobAdvertisedMapper;
 
+    @Resource
+    private InterviewInviteService interviewInviteService;
+
     @Resource
     private HireCommissionRatioService ratioService;
 
@@ -59,34 +54,25 @@ public class HireJobIntegrationServiceImpl implements HireJobIntegrationService
 
     @Override
     public PageResult<AppAdminHireJobCvRelRespVO> page(AppAdminHireJobCvRelPageReqVO reqVO) {
-        PageResult<AppAdminHireJobCvRelRespVO> pageResult = jobCvRelMapper.page(reqVO);
-        if (CollUtil.isEmpty(pageResult.getList())) {
-            return PageResult.empty();
-        }
-        return pageResult;
-    }
-
-    @Override
-    public List<AppAdminPersonSimpleRespVO> getRecommendUser() {
-        return jobCvRelMapper.getRecommendUser();
+        return jobCvRelService.page(reqVO);
     }
 
     @Override
     @DSTransactional
     public boolean settlement(Long id) {
-        JobCvRelDO cv = jobCvRelMapper.selectById(id);
-        if (null == cv) {
-            throw exception(HIRE_JOB_CV_REL_NOT_EXISTS);
-        }
-        cv.setStatus(ConversationStatusEnum.SETTLEMENT.getStatus());
-        jobCvRelMapper.updateById(cv);
+
+        InterviewInviteDO interviewInvite = interviewInviteService.getInterviewInvite(id);
+
+        // 标记结算
+        interviewInviteService.settlement(id);
+
+        // 获取 面试的求职者投递的简历信息
+        JobCvRelDO cv = jobCvRelService
+                .selectByUserIdAndJobId(interviewInvite.getUserId(), interviewInvite.getJobId());
 
         // 猎头、 推荐人、投递人
         // 获取比例配置
         HireCommissionRatioDO ratio = ratioService.get();
-        if (null == ratio) {
-            throw exception(HIRE_COMMISSION_RATIO_NOT_EXISTS);
-        }
 
         JobAdvertisedDO job = jobAdvertisedMapper.selectById(cv.getJobId());
 
@@ -124,7 +110,7 @@ public class HireJobIntegrationServiceImpl implements HireJobIntegrationService
                 .divide(totalRate, 2, RoundingMode.HALF_UP);
 
         // 猎头 (平台自己)
-        if(headhuntPrice.compareTo(BigDecimal.ZERO)>0) {
+        if (headhuntPrice.compareTo(BigDecimal.ZERO) > 0) {
             enterpriseAccountRecordService.createBalanceRecord(
                     1L,
                     1L,
@@ -137,7 +123,7 @@ public class HireJobIntegrationServiceImpl implements HireJobIntegrationService
         }
 
         // 推荐人
-        if(headhuntPrice.compareTo(BigDecimal.ZERO)>0) {
+        if (headhuntPrice.compareTo(BigDecimal.ZERO) > 0) {
             userAccountRecordService.createBalanceRecord(
                     cv.getRecommendUserId(),
                     BalanceBizTypeEnum.RECOMMENDED_POSITIONS.getName(),
@@ -149,7 +135,7 @@ public class HireJobIntegrationServiceImpl implements HireJobIntegrationService
         }
 
         // 投递人
-        if(headhuntPrice.compareTo(BigDecimal.ZERO)>0) {
+        if (headhuntPrice.compareTo(BigDecimal.ZERO) > 0) {
             userAccountRecordService.createBalanceRecord(
                     cv.getUserId(),
                     BalanceBizTypeEnum.DELIVERY_PERSON.getName(),
@@ -189,7 +175,7 @@ public class HireJobIntegrationServiceImpl implements HireJobIntegrationService
         headhuntPoint += remainingPoint;
 
         // 猎头 (平台自己)
-        if(headhuntPoint>0) {
+        if (headhuntPoint > 0) {
             enterpriseAccountRecordService.createPointRecord(
                     1L,
                     1L,
@@ -202,7 +188,7 @@ public class HireJobIntegrationServiceImpl implements HireJobIntegrationService
         }
 
         // 推荐人
-        if(headhuntPoint>0) {
+        if (headhuntPoint > 0) {
             userAccountRecordService.createPointRecord(
                     cv.getRecommendUserId(),
                     "",
@@ -215,7 +201,7 @@ public class HireJobIntegrationServiceImpl implements HireJobIntegrationService
         }
 
         // 投递人
-        if(headhuntPoint>0) {
+        if (headhuntPoint > 0) {
             userAccountRecordService.createPointRecord(
                     cv.getUserId(),
                     "",

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

@@ -153,10 +153,9 @@ public interface JobAdvertisedService {
 
     /**
      * 获取发布的职位
-     * @param hire 是否雇佣(众聘)
      * @return 简易职位信息的集合
      **/
-    List<AppAdminJobSimpleRespVO> getList(boolean hire);
+    List<AppAdminJobSimpleRespVO> getList();
 
     /**
      * 置顶职位

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

@@ -472,8 +472,8 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
     }
 
     @Override
-    public List<AppAdminJobSimpleRespVO> getList(boolean hire) {
-        return jobAdvertisedMapper.list(hire);
+    public List<AppAdminJobSimpleRespVO> getList() {
+        return jobAdvertisedMapper.list();
     }
 
     @Override

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

@@ -5,7 +5,10 @@ import com.citu.module.menduner.system.controller.app.job.hire.AppHireJobCvRelQu
 import com.citu.module.menduner.system.controller.app.job.hire.AppHireJobCvRelReqVO;
 import com.citu.module.menduner.system.controller.app.job.hire.AppHireJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobCvRelReqVO;
+import com.citu.module.menduner.system.controller.appadmin.analysis.vo.AppAdminAnalysisReqVO;
 import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelInviteReqVO;
+import com.citu.module.menduner.system.controller.appadmin.person.hire.AppAdminHireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.person.hire.AppAdminHireJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobCvRelPageReqVO;
 import com.citu.module.menduner.system.controller.base.job.JobCvRelSaveReqVO;
@@ -13,6 +16,7 @@ import com.citu.module.menduner.system.dal.dataobject.job.JobCvRelDO;
 
 import javax.validation.Valid;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 招聘职位简历投递 Service 接口
@@ -59,6 +63,16 @@ public interface JobCvRelService {
      */
     PageResult<JobCvRelDO> getJobCvRelPage(JobCvRelPageReqVO pageReqVO);
 
+    /**
+     * 根据用户id和招聘职位id查询投递简历
+     *
+     * @param userId 用户id
+     * @param jobId  职位id
+     * @return 投递简历
+     */
+    JobCvRelDO selectByUserIdAndJobId(Long userId, Long jobId);
+
+
     // ========== 求职端 ==========
 
     /**
@@ -102,4 +116,29 @@ public interface JobCvRelService {
      * @param id 投递简历id
      */
     boolean look(Long id);
+
+    /**
+     * 获取发布的众聘职位分页
+     * @param reqVO 条件
+     * @return PageResult<AppAdminHireJobCvRelRespVO>
+     **/
+    PageResult<AppAdminHireJobCvRelRespVO> page(AppAdminHireJobCvRelPageReqVO reqVO);
+
+    // ========== 统计分析 ==========
+    /**
+     * 投递简历的性别比例
+     **/
+    List<CommonRespVO> getJobCvSexCount(AppAdminAnalysisReqVO reqVO);
+    /**
+     * 投递简历的年龄分布
+     **/
+    Map<String, Object[]> getJobCvAgeCount(AppAdminAnalysisReqVO reqVO);
+    /**
+     * 投递简历的工作经验分布
+     **/
+    Map<String, Object[]> getJobCvEduCount(AppAdminAnalysisReqVO reqVO);
+    /**
+     * 投递简历的学历分布
+     **/
+    Map<String, Object[]> getJobCvExpCount(AppAdminAnalysisReqVO reqVO);
 }

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

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.system.service.job;
 
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
@@ -8,24 +9,26 @@ import com.citu.module.menduner.system.controller.app.job.hire.AppHireJobCvRelQu
 import com.citu.module.menduner.system.controller.app.job.hire.AppHireJobCvRelReqVO;
 import com.citu.module.menduner.system.controller.app.job.hire.AppHireJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.app.job.vo.AppJobCvRelReqVO;
-import com.citu.module.menduner.system.controller.appadmin.person.cv.AppAdminJobCvRelInviteReqVO;
+import com.citu.module.menduner.system.controller.appadmin.analysis.vo.AppAdminAnalysisReqVO;
+import com.citu.module.menduner.system.controller.appadmin.person.hire.AppAdminHireJobCvRelPageReqVO;
+import com.citu.module.menduner.system.controller.appadmin.person.hire.AppAdminHireJobCvRelRespVO;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.job.JobCvRelPageReqVO;
 import com.citu.module.menduner.system.controller.base.job.JobCvRelSaveReqVO;
 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 com.citu.module.menduner.system.enums.cv.JobCvRelStatusEnum;
-import com.citu.module.menduner.system.service.interview.InterviewInviteService;
+import com.citu.module.menduner.system.enums.eduexp.EducationTypeEnum;
+import com.citu.module.menduner.system.enums.person.PersonSexEnum;
+import com.citu.module.menduner.system.enums.workexp.ExpTypeEnum;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.time.LocalDateTime;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -47,8 +50,6 @@ public class JobCvRelServiceImpl implements JobCvRelService {
     @Resource
     private JobAdvertisedService jobAdvertisedService;
 
-    @Resource
-    private InterviewInviteService interviewInviteService;
 
     @Override
     public Long createJobCvRel(JobCvRelSaveReqVO createReqVO) {
@@ -94,6 +95,15 @@ public class JobCvRelServiceImpl implements JobCvRelService {
         return jobCvRelMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public JobCvRelDO selectByUserIdAndJobId(Long userId, Long jobId) {
+        JobCvRelDO cv = jobCvRelMapper.selectByUserIdAndJobId(userId, jobId);
+        if (null == cv) {
+            throw exception(HIRE_JOB_CV_REL_NOT_EXISTS);
+        }
+        return cv;
+    }
+
     @Override
     @DSTransactional
     public void send(AppJobCvRelReqVO reqVO) {
@@ -182,7 +192,7 @@ public class JobCvRelServiceImpl implements JobCvRelService {
 
     @Override
     public PageResult<AppHireJobCvRelRespVO> page(AppHireJobCvRelQueryReqVO reqVO) {
-        return jobCvRelMapper.page(reqVO,LoginUserContext.getUserId());
+        return jobCvRelMapper.page(reqVO, LoginUserContext.getUserId());
     }
 
     @Override
@@ -195,4 +205,162 @@ public class JobCvRelServiceImpl implements JobCvRelService {
         jobCvRel.setStatus(JobCvRelStatusEnum.LOOK.getStatus());
         return jobCvRelMapper.updateById(jobCvRel) == 1;
     }
+
+    @Override
+    public PageResult<AppAdminHireJobCvRelRespVO> page(AppAdminHireJobCvRelPageReqVO reqVO) {
+        return jobCvRelMapper.page(reqVO);
+    }
+
+    @Override
+    public List<CommonRespVO> getJobCvSexCount(AppAdminAnalysisReqVO reqVO) {
+        LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
+        List<CommonRespVO> result = jobCvRelMapper.getJobCvSexCount(timeRange[0], timeRange[1]);
+        for (PersonSexEnum value : PersonSexEnum.values()) {
+            CommonRespVO respVO = result.stream()
+                    .filter(c -> c.getKey().equals(value.getType())).findFirst().orElse(null);
+            if (null == respVO) {
+                CommonRespVO newResp = new CommonRespVO();
+                newResp.setKey(value.getName());
+                newResp.setValue(0L);
+                result.add(newResp);
+            } else {
+                respVO.setKey(value.getName());
+            }
+        }
+        return result;
+    }
+
+
+    @Override
+    public Map<String, Object[]> getJobCvAgeCount(AppAdminAnalysisReqVO reqVO) {
+        LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
+        List<CommonRespVO> result = jobCvRelMapper.getJobCvAgeCount(timeRange[0], timeRange[1]);
+        // 填充
+        String[] ageArr = new String[]{"18-22岁", "23-30岁", "31-39岁", "40-49岁", "50-59岁", "其他年龄段"};
+        for (String age : ageArr) {
+            CommonRespVO respVO = result.stream()
+                    .filter(c -> c.getKey().equals(age)).findFirst().orElse(null);
+            if (null == respVO) {
+                CommonRespVO newResp = new CommonRespVO();
+                newResp.setKey(age);
+                newResp.setValue(0L);
+                result.add(newResp);
+            }
+        }
+        // 对 result 的 key 进行排序
+        List<CommonRespVO> sortedResult = result.stream()
+                .sorted(Comparator.comparing(CommonRespVO::getKey))
+                .collect(Collectors.toList());
+        // 对result的key进行排序
+        return packBarCount(sortedResult);
+    }
+
+    @Override
+    public Map<String, Object[]> getJobCvEduCount(AppAdminAnalysisReqVO reqVO) {
+        LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
+        List<CommonRespVO> result = jobCvRelMapper.getJobCvEduCount(timeRange[0], timeRange[1]);
+        // 填充
+        for (EducationTypeEnum value : EducationTypeEnum.values()) {
+            CommonRespVO respVO = result.stream()
+                    .filter(c -> c.getKey().equals(value.getType())).findFirst().orElse(null);
+            if (null == respVO) {
+                CommonRespVO newResp = new CommonRespVO();
+                newResp.setKey(value.getName());
+                newResp.setValue(0L);
+                result.add(newResp);
+            } else {
+                respVO.setKey(value.getName());
+            }
+        }
+        // 对 result 的 key 进行排序
+        List<CommonRespVO> sortedResult = result.stream()
+                .sorted(Comparator.comparing(s->
+                        EducationTypeEnum.getEnumByName(s.getKey()).getType())
+                )
+                .collect(Collectors.toList());
+        return packBarCount(sortedResult);
+    }
+
+    @Override
+    public Map<String, Object[]> getJobCvExpCount(AppAdminAnalysisReqVO reqVO) {
+        LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
+        List<CommonRespVO> result = jobCvRelMapper.getJobCvExpCount(timeRange[0], timeRange[1]);
+        // 填充
+        for (ExpTypeEnum value : ExpTypeEnum.values()) {
+            CommonRespVO respVO = result.stream()
+                    .filter(c -> c.getKey().equals(value.getType())).findFirst().orElse(null);
+            if (null == respVO) {
+                CommonRespVO newResp = new CommonRespVO();
+                newResp.setKey(value.getName());
+                newResp.setValue(0L);
+                result.add(newResp);
+            } else {
+                respVO.setKey(value.getName());
+            }
+        }
+        // 对 result 的 key 进行排序
+        List<CommonRespVO> sortedResult = result.stream()
+                .sorted(Comparator.comparing(s->
+                        EducationTypeEnum.getEnumByName(s.getKey()).getType())
+                )
+                .collect(Collectors.toList());
+        return packBarCount(sortedResult);
+    }
+
+
+    /**
+     * 包装柱状图格式
+     **/
+    public Map<String, Object[]> packBarCount(List<CommonRespVO> result) {
+        if (CollUtil.isEmpty(result)) {
+            return null;
+        }
+
+        Map<String, Object[]> map = new LinkedHashMap<>();
+        String[] keys = result.stream()
+                .map(CommonRespVO::getKey)
+                .toArray(String[]::new);
+        map.put("x", keys);
+
+        Object[] values = result.stream()
+                .map(CommonRespVO::getValue)
+                .toArray();
+
+        map.put("y", values);
+
+        return map;
+    }
+
+    /**
+     * 生成时间范围
+     **/
+    public LocalDateTime[] generateDateTimeRange(AppAdminAnalysisReqVO reqVO) {
+        if (AppAdminAnalysisReqVO.TYPE_CUSTOM.equals(reqVO.getType())) {
+            return reqVO.getTime();
+        }
+        LocalDateTime[] dateTimeRange = new LocalDateTime[2];
+        LocalDateTime now = LocalDateTime.now();
+        switch (reqVO.getType()) {
+            case AppAdminAnalysisReqVO.TYPE_RECENT_7_DAYS:
+                // 最新7天内
+                dateTimeRange[0] = now.minusDays(7);
+                dateTimeRange[1] = now;
+                break;
+            case AppAdminAnalysisReqVO.TYPE_LAST_MONTH:
+                // 上个月
+                dateTimeRange[0] = now.minusMonths(1).withDayOfMonth(1);
+                dateTimeRange[1] = now.withDayOfMonth(1).minusNanos(1);
+                break;
+            case AppAdminAnalysisReqVO.TYPE_LAST_QUARTER:
+                // 上季度
+                int currentMonth = now.getMonthValue();
+                // 计算上一季度的起始月份
+                int quarterStartMonth = ((currentMonth - 1) / 3) * 3 + 1;
+                int lastQuarterStartMonth = quarterStartMonth - 3;
+                dateTimeRange[0] = now.withMonth(lastQuarterStartMonth).withDayOfMonth(1);
+                dateTimeRange[1] = now.withMonth(quarterStartMonth).withDayOfMonth(1).minusNanos(1);
+                break;
+        }
+        return dateTimeRange;
+    }
 }

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

@@ -104,7 +104,8 @@ public class PersonInfoServiceImpl implements PersonInfoService {
         Long userId = LoginUserContext.getUserId();
         PersonInfoDO info = personInfoMapper.selectOne(PersonInfoDO::getUserId, userId);
         if (null == info) {
-            throw exception(MDE_USER_INFO_NOT_EXISTS);
+            personInfoMapper.insert(PersonInfoDO.builder().userId(userId).avatar(avatar).build());
+            return;
         }
         info.setAvatar(avatar);
         personInfoMapper.updateById(info);

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

@@ -168,6 +168,7 @@
 1_100_021_008=Unified social credit code cannot be empty
 1_100_021_009=Enterprise registered
 1_100_021_010=The enterprise has applied for review, please do not resubmit
+1_100_021_011=Incorrect format of unified social credit code
 # ========== 企业地址 1_100_022_001 ==========
 1_100_022_001=The company address does not exist
 # ========== 企业登录用户 1_100_023_000 ==========
@@ -230,6 +231,8 @@
 1_100_033_008=The contact phone number of the inviting party cannot be empty
 1_100_033_009=Interview address cannot be empty
 1_100_033_010=Interview status cannot be empty
+1_100_033_011=The current interview has not been completed
+1_100_033_012=The current employee has not yet joined and cannot be settled
 # ========== 企业用户申请 1_100_034_000 ==========
 1_100_034_001=Enterprise user application does not exist
 1_100_034_002=User application has been approved
@@ -284,3 +287,10 @@
 1_100_041_010=Already joined the enterprise and cannot be operated repeatedly
 1_100_041_011=Please complete personal basic information first
 1_100_041_012=Cannot join the same enterprise
+# ========== 企业实名认证 1_100_043_000 ==========
+1_100_043_001=Enterprise real name authentication does not exist
+1_100_043_002=Authentication user ID cannot be empty
+1_100_043_003=Name cannot be empty
+1_100_043_004=ID card number cannot be empty
+1_100_043_005=ID card front not uploaded
+1_100_043_006=ID card reverse not uploaded

+ 12 - 2
menduner/menduner-system-biz/src/main/resources/i18n/messages_zh_CN.properties

@@ -167,7 +167,8 @@
 1_100_021_007=未上传营业执照
 1_100_021_008=统一社会信用代码不能为空
 1_100_021_009=企业已注册
-1_100_021_010=企业已申请审核中,请勿重复提交
+1_100_021_010=企业申请审核中,请勿重复提交
+1_100_021_011=统一社会信用代码格式不正确
 # ========== 企业地址 1_100_022_001 ==========
 1_100_022_001=企业地址不存在
 # ========== 企业登录用户 1_100_023_000 ==========
@@ -230,6 +231,8 @@
 1_100_033_008=邀请方联系电话不能为空
 1_100_033_009=面试地址不能为空
 1_100_033_010=面试状态不能为空
+1_100_033_011=当前面试未完成
+1_100_033_012=当前员工还未入职,无法结算
 # ========== 企业用户申请 1_100_034_000 ==========
 1_100_034_001=企业用户申请不存在
 1_100_034_002=用户申请已审批
@@ -286,4 +289,11 @@
 1_100_041_009=公司已存在所属上级,不能操作成为子公司
 1_100_041_010=已加入该企业不可重复操作
 1_100_041_011=请先完善个人基本信息
-1_100_041_012=无法加入相同的企业
+1_100_041_012=无法加入相同的企业
+# ========== 企业实名认证 1_100_043_000 ==========
+1_100_043_001=企业实名认证不存在
+1_100_043_002=认证用户id不能为空
+1_100_043_003=姓名不能为空
+1_100_043_004=身份证号码不能为空
+1_100_043_005=身份证正面未上传
+1_100_043_006=身份证反面未上传

+ 158 - 0
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/enterprise/EnterpriseAuthServiceImplTest.java

@@ -0,0 +1,158 @@
+package com.citu.module.menduner.system.service.enterprise;
+
+
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.auth.EnterpriseAuthSaveReqVO;
+import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseAuthDO;
+import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseAuthMapper;
+import com.citu.module.menduner.system.service.enterprise.auth.EnterpriseAuthServiceImpl;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.mock.mockito.MockBean;
+
+import javax.annotation.Resource;
+
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+
+
+import com.citu.framework.common.pojo.PageResult;
+
+import javax.annotation.Resource;
+import org.springframework.context.annotation.Import;
+import java.util.*;
+import java.time.LocalDateTime;
+
+import static cn.hutool.core.util.RandomUtil.*;
+import static com.citu.framework.test.core.util.AssertUtils.*;
+import static com.citu.framework.test.core.util.RandomUtils.*;
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.*;
+import static com.citu.framework.common.util.object.ObjectUtils.*;
+import static com.citu.framework.common.util.date.DateUtils.*;
+import static com.citu.module.menduner.system.enums.ErrorCodeConstants.ENTERPRISE_AUTH_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+/**
+ * {@link EnterpriseAuthServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(EnterpriseAuthServiceImpl.class)
+public class EnterpriseAuthServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private EnterpriseAuthServiceImpl enterpriseAuthService;
+
+    @Resource
+    private EnterpriseAuthMapper enterpriseAuthMapper;
+
+    @Test
+    public void testCreateEnterpriseAuth_success() {
+        // 准备参数
+        EnterpriseAuthSaveReqVO createReqVO = randomPojo(EnterpriseAuthSaveReqVO.class).setId(null);
+
+        // 调用
+        Long enterpriseAuthId = enterpriseAuthService.createEnterpriseAuth(createReqVO);
+        // 断言
+        assertNotNull(enterpriseAuthId);
+        // 校验记录的属性是否正确
+        EnterpriseAuthDO enterpriseAuth = enterpriseAuthMapper.selectById(enterpriseAuthId);
+        assertPojoEquals(createReqVO, enterpriseAuth, "id");
+    }
+
+    @Test
+    public void testUpdateEnterpriseAuth_success() {
+        // mock 数据
+        EnterpriseAuthDO dbEnterpriseAuth = randomPojo(EnterpriseAuthDO.class);
+        enterpriseAuthMapper.insert(dbEnterpriseAuth);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        EnterpriseAuthSaveReqVO updateReqVO = randomPojo(EnterpriseAuthSaveReqVO.class, o -> {
+            o.setId(dbEnterpriseAuth.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        enterpriseAuthService.updateEnterpriseAuth(updateReqVO);
+        // 校验是否更新正确
+        EnterpriseAuthDO enterpriseAuth = enterpriseAuthMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, enterpriseAuth);
+    }
+
+    @Test
+    public void testUpdateEnterpriseAuth_notExists() {
+        // 准备参数
+        EnterpriseAuthSaveReqVO updateReqVO = randomPojo(EnterpriseAuthSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> enterpriseAuthService.updateEnterpriseAuth(updateReqVO), ENTERPRISE_AUTH_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteEnterpriseAuth_success() {
+        // mock 数据
+        EnterpriseAuthDO dbEnterpriseAuth = randomPojo(EnterpriseAuthDO.class);
+        enterpriseAuthMapper.insert(dbEnterpriseAuth);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbEnterpriseAuth.getId();
+
+        // 调用
+        enterpriseAuthService.deleteEnterpriseAuth(id);
+        // 校验数据不存在了
+        assertNull(enterpriseAuthMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteEnterpriseAuth_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> enterpriseAuthService.deleteEnterpriseAuth(id), ENTERPRISE_AUTH_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetEnterpriseAuthPage() {
+        // mock 数据
+        EnterpriseAuthDO dbEnterpriseAuth = randomPojo(EnterpriseAuthDO.class, o -> { // 等会查询到
+            o.setEnterpriseId(null);
+            o.setUserId(null);
+            o.setName(null);
+            o.setIdentityNo(null);
+            o.setFrontUrl(null);
+            o.setBackUrl(null);
+            o.setCreateTime(null);
+        });
+        enterpriseAuthMapper.insert(dbEnterpriseAuth);
+        // 测试 enterpriseId 不匹配
+        enterpriseAuthMapper.insert(cloneIgnoreId(dbEnterpriseAuth, o -> o.setEnterpriseId(null)));
+        // 测试 userId 不匹配
+        enterpriseAuthMapper.insert(cloneIgnoreId(dbEnterpriseAuth, o -> o.setUserId(null)));
+        // 测试 name 不匹配
+        enterpriseAuthMapper.insert(cloneIgnoreId(dbEnterpriseAuth, o -> o.setName(null)));
+        // 测试 identityNo 不匹配
+        enterpriseAuthMapper.insert(cloneIgnoreId(dbEnterpriseAuth, o -> o.setIdentityNo(null)));
+        // 测试 frontUrl 不匹配
+        enterpriseAuthMapper.insert(cloneIgnoreId(dbEnterpriseAuth, o -> o.setFrontUrl(null)));
+        // 测试 backUrl 不匹配
+        enterpriseAuthMapper.insert(cloneIgnoreId(dbEnterpriseAuth, o -> o.setBackUrl(null)));
+        // 测试 createTime 不匹配
+        enterpriseAuthMapper.insert(cloneIgnoreId(dbEnterpriseAuth, o -> o.setCreateTime(null)));
+        // 准备参数
+        EnterpriseAuthPageReqVO reqVO = new EnterpriseAuthPageReqVO();
+        reqVO.setEnterpriseId(null);
+        reqVO.setUserId(null);
+        reqVO.setName(null);
+        reqVO.setIdentityNo(null);
+        reqVO.setFrontUrl(null);
+        reqVO.setBackUrl(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<EnterpriseAuthDO> pageResult = enterpriseAuthService.getEnterpriseAuthPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbEnterpriseAuth, pageResult.getList().get(0));
+    }
+
+}

+ 3 - 3
menduner/menduner-system-biz/src/test/java/com/citu/module/menduner/system/service/enterprise/EnterpriseUserApplyServiceImplTest.java

@@ -2,11 +2,11 @@ package com.citu.module.menduner.system.service.enterprise;
 
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.test.core.ut.BaseDbUnitTest;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplyPageReqVO;
-import com.citu.module.menduner.system.controller.base.enterprise.user.EnterpriseUserApplySaveReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplyPageReqVO;
+import com.citu.module.menduner.system.controller.base.enterprise.apply.EnterpriseUserApplySaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserApplyDO;
 import com.citu.module.menduner.system.dal.mysql.enterprise.EnterpriseUserApplyMapper;
-import com.citu.module.menduner.system.service.enterprise.user.EnterpriseUserApplyServiceImpl;
+import com.citu.module.menduner.system.service.enterprise.apply.EnterpriseUserApplyServiceImpl;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.Import;

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

@@ -33,4 +33,6 @@ DELETE FROM "mde_user_account";
 DELETE FROM "mde_enterprise_invite";
 DELETE FROM "mde_enterprise_invite_record";
 
-DELETE FROM "mde_interview_invite";
+DELETE FROM "mde_interview_invite";
+
+DELETE FROM "mde_enterprise_auth";

+ 17 - 0
menduner/menduner-system-biz/src/test/resources/sql/create_tables.sql

@@ -607,3 +607,20 @@ CREATE TABLE IF NOT EXISTS "mde_interview_invite" (
     "tenant_id" bigint NOT NULL,
     PRIMARY KEY ("id")
 ) COMMENT '面试邀请表';
+
+CREATE TABLE IF NOT EXISTS "mde_enterprise_auth" (
+    "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+    "enterprise_id" bigint NOT NULL,
+    "user_id" bigint NOT NULL,
+    "name" varchar NOT NULL,
+    "identity_no" int NOT NULL,
+    "front_url" varchar NOT NULL,
+    "back_url" 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 '企业实名认证';