Переглянути джерело

1、更改点数比例
2、增加后台管理统计接口
3、增加职位删除接口
4、优化保存简要简历信息接口
5、优化订单接口
6、优化增加职位发布付款逻辑
7、优化VipEntitlementCheck逻辑

rayson 8 місяців тому
батько
коміт
289f295219
37 змінених файлів з 520 додано та 192 видалено
  1. 8 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/channel/PayChannelController.java
  2. 6 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/channel/PayChannelMapper.java
  3. 8 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/service/channel/PayChannelService.java
  4. 5 0
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/service/channel/PayChannelServiceImpl.java
  5. 5 3
      citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/service/currency/PayCurrencyRechargeServiceImpl.java
  6. 24 0
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/dto/TimeRange.java
  7. 2 7
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/dto/TimeRangeBasePageReqVO.java
  8. 2 7
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/dto/TimeRangeBaseReqVO.java
  9. 28 35
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/util/TimeUtils.java
  10. 3 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java
  11. 1 1
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/TradeOrderTypeMq.java
  12. 2 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheck.java
  13. 51 90
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheckAspect.java
  14. 72 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/analysis/HomeController.java
  15. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/job/JobAdvertisedController.java
  16. 10 4
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/AppPersonResumeController.java
  17. 5 5
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/job/AppJobInterestedSaveReqVO.java
  18. 16 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/resume/AppPersonInfoSaveSimpleReqVO.java
  19. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/workexp/AppWorkExpSaveReqVO.java
  20. 1 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/order/AppRecruitTradeOrderController.java
  21. 21 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/enterprise/EnterpriseUserBindMapper.java
  22. 3 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/job/JobAdvertisedMapper.java
  23. 21 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/person/PersonInfoMapper.java
  24. 22 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/MdeUserMapper.java
  25. 2 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/auth/MdeEnterpriseAuthServiceImpl.java
  26. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseService.java
  27. 16 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseServiceImpl.java
  28. 9 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindService.java
  29. 22 3
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindServiceImpl.java
  30. 24 20
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobAdvertisedServiceImpl.java
  31. 1 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/job/JobCvRelServiceImpl.java
  32. 3 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/order/TradeOrderServiceImpl.java
  33. 10 1
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoService.java
  34. 24 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/person/info/PersonInfoServiceImpl.java
  35. 7 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserService.java
  36. 20 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserServiceImpl.java
  37. 47 2
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/util/RecruitAnalysisUtils.java

+ 8 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/controller/admin/channel/PayChannelController.java

@@ -79,4 +79,12 @@ public class PayChannelController {
         return success(convertSet(channels, PayChannelDO::getCode));
     }
 
+    @GetMapping("/get-enable-code-list2")
+    @Operation(summary = "获得指定应用的开启的支付渠道编码列表")
+    @Parameter(name = "appId", description = "应用编号", required = true, example = "1")
+    public CommonResult<Set<String>> getEnableChannelCodeList(@RequestParam("code") String code) {
+        List<PayChannelDO> channels = channelService.getEnableChannelList(code);
+        return success(convertSet(channels, PayChannelDO::getCode));
+    }
+
 }

+ 6 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/dal/mysql/channel/PayChannelMapper.java

@@ -25,4 +25,10 @@ public interface PayChannelMapper extends BaseMapperX<PayChannelDO> {
                 .eq(PayChannelDO::getStatus, status));
     }
 
+    default List<PayChannelDO> selectListByCode(String code, Integer status) {
+        return selectList(new LambdaQueryWrapperX<PayChannelDO>()
+                .eq(PayChannelDO::getCode, code)
+                .eq(PayChannelDO::getStatus, status));
+    }
+
 }

+ 8 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/service/channel/PayChannelService.java

@@ -93,6 +93,14 @@ public interface PayChannelService {
      */
     List<PayChannelDO> getEnableChannelList(Long appId);
 
+    /**
+     * 获得指定应用的开启的渠道列表
+     *
+     * @param code 应用编码
+     * @return 渠道列表
+     */
+    List<PayChannelDO> getEnableChannelList(String code);
+
     /**
      * 获得指定编号的支付客户端
      *

+ 5 - 0
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/service/channel/PayChannelServiceImpl.java

@@ -163,6 +163,11 @@ public class PayChannelServiceImpl implements PayChannelService {
         return payChannelMapper.selectListByAppId(appId, CommonStatusEnum.ENABLE.getStatus());
     }
 
+    @Override
+    public List<PayChannelDO> getEnableChannelList(String code) {
+        return payChannelMapper.selectListByCode(code, CommonStatusEnum.ENABLE.getStatus());
+    }
+
     @Override
     public PayClient getPayClient(Long id) {
         PayChannelDO channel = validPayChannel(id);

+ 5 - 3
citu-module-pay/citu-module-pay-biz/src/main/java/com/citu/module/pay/service/currency/PayCurrencyRechargeServiceImpl.java

@@ -60,7 +60,7 @@ public class PayCurrencyRechargeServiceImpl implements PayCurrencyRechargeServic
     /**
      * 比例倍数 1:10
      **/
-    private static final Integer RATIO_MULTIPLE = 10;
+//    private static final Integer RATIO_MULTIPLE = 10;
     @Resource
     public SocialClientApi socialClientApi;
     @Resource
@@ -80,7 +80,8 @@ public class PayCurrencyRechargeServiceImpl implements PayCurrencyRechargeServic
      * @return Long
      **/
     public static Long convertPriceRatio(Long price) {
-        return (price / 100) * RATIO_MULTIPLE;
+//        return (price / 100) * RATIO_MULTIPLE;
+        return price ;
     }
 
     /**
@@ -90,7 +91,8 @@ public class PayCurrencyRechargeServiceImpl implements PayCurrencyRechargeServic
      * @return Long 原始金额
      */
     public static Long revertConvertPriceRatio(Long convertedPrice) {
-        return (convertedPrice / RATIO_MULTIPLE) * 100;
+//        return (convertedPrice / RATIO_MULTIPLE) * 100;
+        return convertedPrice;
     }
 
     @Override

+ 24 - 0
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/dto/TimeRange.java

@@ -0,0 +1,24 @@
+package com.citu.module.menduner.common.dto;
+
+/**
+ * 时间范围常量
+ **/
+public interface TimeRange {
+
+    /** 全部 **/
+    String ALL = "-1";
+    /** 最近7天 **/
+    String TYPE_RECENT_7_DAYS = "0";
+    /** 上个月 **/
+    String TYPE_LAST_MONTH = "1";
+    /** 上个季度 **/
+    String TYPE_LAST_QUARTER = "2";
+    /** 最近24小时 **/
+    String TYPE_24_HOURS = "3";
+    /** 最近30天 **/
+    String TYPE_MONTH = "4";
+    /** 最近一年 **/
+    String TYPE_YEAR = "5";
+    /** 自定义 **/
+    String TYPE_CUSTOM = "99";
+}

+ 2 - 7
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/dto/TimeRangeBasePageReqVO.java

@@ -13,13 +13,8 @@ import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DA
 @Data
 public class TimeRangeBasePageReqVO extends PageParam {
 
-    public static final String ALL = "-1";
-    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 = "统计类型 -1全部|0最近7天|1上个月|2上季度|99自定义", required = true)
+    /** {@link com.citu.module.menduner.common.dto.TimeRange} **/
+    @Schema(description = "统计类型 -1全部|0最近7天|1上个月|2上季度|3 24小时|4每月|5每年|99自定义", required = true)
     private String type;
 
     @Schema(description = "自定义时间范围")

+ 2 - 7
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/dto/TimeRangeBaseReqVO.java

@@ -18,13 +18,8 @@ import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DA
 @Data
 public class TimeRangeBaseReqVO {
 
-    public static final String ALL = "-1";
-    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 = "统计类型 -1全部|0最近7天|1上个月|2上季度|99自定义", required = true)
+    /** {@link com.citu.module.menduner.common.dto.TimeRange} **/
+    @Schema(description = "统计类型 -1全部|0最近7天|1上个月|2上季度|3 24小时|4每月|5每年|99自定义", required = true)
     private String type;
 
     @Schema(description = "自定义时间范围")

+ 28 - 35
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/util/TimeUtils.java

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.common.util;
 
+import com.citu.module.menduner.common.dto.TimeRange;
 import com.citu.module.menduner.common.dto.TimeRangeBasePageReqVO;
 import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 
@@ -14,64 +15,41 @@ public class TimeUtils {
      * 生成时间范围
      **/
     public static LocalDateTime[] generateDateTimeRange(TimeRangeBasePageReqVO reqVO) {
-        if (TimeRangeBasePageReqVO.TYPE_CUSTOM.equals(reqVO.getType())) {
+        if (TimeRange.TYPE_CUSTOM.equals(reqVO.getType())) {
             return reqVO.getTime();
         }
-        LocalDateTime[] dateTimeRange = new LocalDateTime[2];
-        LocalDateTime now = LocalDateTime.now();
-        switch (reqVO.getType()) {
-            case TimeRangeBasePageReqVO.ALL:
-                dateTimeRange[0] = null;
-                dateTimeRange[1] = null;
-                break;
-            case TimeRangeBasePageReqVO.TYPE_RECENT_7_DAYS:
-                // 最新7天内
-                dateTimeRange[0] = now.minusDays(7);
-                dateTimeRange[1] = now;
-                break;
-            case TimeRangeBasePageReqVO.TYPE_LAST_MONTH:
-                // 上个月
-                dateTimeRange[0] = now.minusMonths(1).withDayOfMonth(1);
-                dateTimeRange[1] = now.withDayOfMonth(1).minusNanos(1);
-                break;
-            case TimeRangeBasePageReqVO.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;
+        return generateDateTimeRange(reqVO.getType());
     }
 
     /**
      * 生成时间范围
      **/
     public static LocalDateTime[] generateDateTimeRange(TimeRangeBaseReqVO reqVO) {
-        if (TimeRangeBasePageReqVO.TYPE_CUSTOM.equals(reqVO.getType())) {
+        if (TimeRange.TYPE_CUSTOM.equals(reqVO.getType())) {
             return reqVO.getTime();
         }
+        return generateDateTimeRange(reqVO.getType());
+    }
+
+    private static LocalDateTime[] generateDateTimeRange(String type) {
         LocalDateTime[] dateTimeRange = new LocalDateTime[2];
         LocalDateTime now = LocalDateTime.now();
-        switch (reqVO.getType()) {
-            case TimeRangeBasePageReqVO.ALL:
+        switch (type) {
+            case TimeRange.ALL:
                 dateTimeRange[0] = null;
                 dateTimeRange[1] = null;
                 break;
-            case TimeRangeBasePageReqVO.TYPE_RECENT_7_DAYS:
+            case TimeRange.TYPE_RECENT_7_DAYS:
                 // 最新7天内
                 dateTimeRange[0] = now.minusDays(7);
                 dateTimeRange[1] = now;
                 break;
-            case TimeRangeBasePageReqVO.TYPE_LAST_MONTH:
+            case TimeRange.TYPE_LAST_MONTH:
                 // 上个月
                 dateTimeRange[0] = now.minusMonths(1).withDayOfMonth(1);
                 dateTimeRange[1] = now.withDayOfMonth(1).minusNanos(1);
                 break;
-            case TimeRangeBasePageReqVO.TYPE_LAST_QUARTER:
+            case TimeRange.TYPE_LAST_QUARTER:
                 // 上季度
                 int currentMonth = now.getMonthValue();
                 // 计算上一季度的起始月份
@@ -80,6 +58,21 @@ public class TimeUtils {
                 dateTimeRange[0] = now.withMonth(lastQuarterStartMonth).withDayOfMonth(1);
                 dateTimeRange[1] = now.withMonth(quarterStartMonth).withDayOfMonth(1).minusNanos(1);
                 break;
+            case TimeRange.TYPE_24_HOURS:
+                // 最近24小时
+                dateTimeRange[0] = now.minusHours(24);
+                dateTimeRange[1] = now;
+                break;
+            case TimeRange.TYPE_MONTH:
+                // 最近一个月
+                dateTimeRange[0] = now.minusDays(30);
+                dateTimeRange[1] = now;
+                break;
+            case TimeRange.TYPE_YEAR:
+                // 最近一年
+                dateTimeRange[0] = now.minusMonths(12);
+                dateTimeRange[1] = now;
+                break;
         }
         return dateTimeRange;
     }

+ 3 - 2
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java

@@ -3,6 +3,7 @@ package com.citu.module.menduner.reward.service.event;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.security.core.LoginUser;
+import com.citu.module.menduner.common.dto.TimeRange;
 import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.common.enums.PointBizTypeEnum;
 import com.citu.module.menduner.common.util.LoginUserContext;
@@ -111,13 +112,13 @@ public class EventTrackServiceImpl implements EventTrackService {
     public List<TaskRespVO> getMarkTask(TaskReqVO reqVO) {
         LocalDateTime[] timeRange = null;
         if (TaskReqVO.TYPE_RECOMMEND.equals(reqVO.getType())) {
-            timeRange = generateDateTimeRange(TimeRangeBaseReqVO.builder().type(TimeRangeBaseReqVO.ALL).build());
+            timeRange = generateDateTimeRange(TimeRangeBaseReqVO.builder().type(TimeRange.ALL).build());
         } else {
             LocalDate today = LocalDate.now();
             LocalDateTime startOfDay = today.atStartOfDay();  // 当天的开始时间
             LocalDateTime endOfDay = today.atTime(23, 59, 59);  // 当天的结束时间
             timeRange = generateDateTimeRange(TimeRangeBaseReqVO.builder()
-                    .type(TimeRangeBaseReqVO.TYPE_CUSTOM)
+                    .type(TimeRange.TYPE_CUSTOM)
                     // time 是数组,第一个元素是开始时间,第二个元素是结束时间,改为当天的起始和结束
                     .time(new LocalDateTime[]{startOfDay, endOfDay})
                     .build());

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

@@ -23,7 +23,7 @@ public class TradeOrderTypeMq {
     public static final String PUBLISH_JOB_ORDER_TOPIC = "PUBLISH_JOB_ORDER_TOPIC";
 
     /** 发布众聘职位订单 **/
-    public static final String PUBLISH_JOB_HIRE_ORDER_TOPIC = "PUBLISH_JOB_ORDER_TOPIC";
+    public static final String PUBLISH_JOB_HIRE_ORDER_TOPIC = "PUBLISH_JOB_HIRE_ORDER_TOPIC";
 
     /** 用户会员套餐订单 **/
     public static final String USER_MEMBER_ORDER_TOPIC = "USER_MEMBER_ORDER_TOPIC";

+ 2 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheck.java

@@ -60,7 +60,7 @@ public @interface VipEntitlementCheck {
     /**
      * 操作
      **/
-    OperationType operate();
+    OperationType operate() default OperationType.DEDUCT;
 
     /**
      * 是否后台管理员操作
@@ -68,6 +68,6 @@ public @interface VipEntitlementCheck {
     boolean system() default false;
 
     enum OperationType {
-        ADD, DEDUCT
+        DEDUCT
     }
 }

+ 51 - 90
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/aop/VipEntitlementCheckAspect.java

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.system.aop;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.base.enterprise.vip.EnterpriseEntitlementRespVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseEntitlementDO;
@@ -14,6 +15,9 @@ import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
 
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
 import static com.citu.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN;
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.module.menduner.system.aop.VipEntitlementCheck.*;
@@ -34,18 +38,16 @@ public class VipEntitlementCheckAspect {
     @Lazy
     private EnterpriseEntitlementService enterpriseEntitlementService;
 
-
+    @DSTransactional
     @Around("@annotation(vipEntitlementCheck)")
     public Object around(ProceedingJoinPoint joinPoint, VipEntitlementCheck vipEntitlementCheck) {
 
         boolean isEnterprise = VipEntitlementCheck.ENTERPRISE.equals(vipEntitlementCheck.userType());
         Long userId = LoginUserContext.getUserId();
         Long enterpriseId = LoginUserContext.getEnterpriseId3();
-        validate(isEnterprise, enterpriseId, userId, vipEntitlementCheck.type(), vipEntitlementCheck.operate());
         try {
-            Object result = joinPoint.proceed();
-            process(isEnterprise, enterpriseId, userId, vipEntitlementCheck.type(), vipEntitlementCheck.operate());
-            return result;
+            deductQuota(isEnterprise, enterpriseId, userId, vipEntitlementCheck.type(), vipEntitlementCheck.operate());
+            return joinPoint.proceed();
         } catch (Throwable e) {
             e.getStackTrace();
             throw exception(FORBIDDEN);
@@ -55,46 +57,23 @@ public class VipEntitlementCheckAspect {
     /**
      * 验证权限
      */
-    public void validate(String type) {
+    public void deductQuota(String type) {
         Long enterpriseId = LoginUserContext.getEnterpriseId3();
-        validate(null != enterpriseId, enterpriseId, LoginUserContext.getUserId(), type, null);
+        deductQuota(null != enterpriseId, enterpriseId, LoginUserContext.getUserId(), type, OperationType.DEDUCT);
     }
 
-    public void validate(String type, VipEntitlementCheck.OperationType operator) {
-        Long enterpriseId = LoginUserContext.getEnterpriseId3();
-        validate(null != enterpriseId, enterpriseId, LoginUserContext.getUserId(), type, operator);
-    }
 
-    public void validate(String type, boolean isTrigger) {
+    public void deductQuota(String type, boolean isTrigger) {
         if (!isTrigger) {
             // 如果为false则不执行
             return;
         }
-        validate(type);
+        deductQuota(type);
     }
 
 
-    /**
-     * 权益处理
-     *
-     * @param type     权益类型
-     * @param operator 操作
-     */
-    public void process(String type, VipEntitlementCheck.OperationType operator) {
-        Long enterpriseId = LoginUserContext.getEnterpriseId3();
-        process(null != enterpriseId, enterpriseId, LoginUserContext.getUserId(), type, operator);
-    }
-
-    public void process(String type, VipEntitlementCheck.OperationType operator, boolean isTrigger) {
-        if (!isTrigger) {
-            // 如果为false则不执行
-            return;
-        }
-        process(type, operator);
-    }
-
 
-    private void validate(boolean isEnterprise, Long enterpriseId,
+    private void deductQuota(boolean isEnterprise, Long enterpriseId,
                           Long userId, String type,
                           VipEntitlementCheck.OperationType operator) {
 
@@ -111,75 +90,36 @@ public class VipEntitlementCheckAspect {
             // 没有权限
             throw exception(FORBIDDEN);
         }
-        if (null == operator || VipEntitlementCheck.OperationType.ADD.equals(operator)) {
-            // 新增不做效验
-            return;
-        }
-        switch (type) {
-            case OPERATE_PUBLISH_JOB:
-                if (entitlementRespVO.getPublishJobCount() <= 0) {
-                    throw exception(ENTERPRISE_ENTITLEMENT_QUOTA_OVERFLOW);
-                }
-                break;
-            case OPERATE_SEARCH:
-                if (entitlementRespVO.getSearchCount() <= 0) {
-                    throw exception(ENTERPRISE_ENTITLEMENT_QUOTA_OVERFLOW);
-                }
-            case OPERATE_LOOK_CV:
-                if (entitlementRespVO.getLookCvCount() <= 0) {
-                    throw exception(ENTERPRISE_ENTITLEMENT_QUOTA_OVERFLOW);
-                }
-                break;
-            default:
-                throw exception(FORBIDDEN);
-        }
+//        if (null == operator || VipEntitlementCheck.OperationType.ADD.equals(operator)) {
+//            // 新增不做效验
+//            return;
+//        }
+        deductQuota(type, entitlementRespVO,operator);
     }
 
-    private void process(boolean isEnterprise,
-                         Long enterpriseId, Long userId,
-                         String type, VipEntitlementCheck.OperationType operator) {
-        if (!isEnterprise || LoginUserContext.checkIsSystemUser()) {
-            // 用户
-            return;
-        }
-        // TODO 设计业务的应该通过业务查询计数,但是如果按照这种办法,旧数据那些发布了很多职位的怎么办?
-        // TODO 目前只单纯写个加减1,还未沟通具体逻辑
+    /**
+     * 扣减额度
+     */
+    private void deductQuota(String type, EnterpriseEntitlementRespVO entitlementRespVO, VipEntitlementCheck.OperationType operator) {
+        int amount =  -1;
 
-        // 企业
-        EnterpriseEntitlementRespVO entitlementRespVO =
-                enterpriseEntitlementService.getByEnterpriseIdAndUserId(enterpriseId, userId);
-        int amount = VipEntitlementCheck.OperationType.ADD.equals(operator) ? 1 : -1;
-        int num = 0;
         switch (type) {
             case OPERATE_PUBLISH_JOB:
-                num = entitlementRespVO.getPublishJobCount() + amount;
-                if (num > entitlementRespVO.getPackageInfo().getPublishJobCount()) {
-                    // 用户持有的额度大于套餐的额度
-                    // TODO 1、管理员给用户加的额度 ,要不要扣额度?
-                    // TODO 2、如果旧职位是开启状态的,现在操作关闭会计算累加
-                    // return;
-                }
-                entitlementRespVO.setPublishJobCount(num);
+                validateAndUpdateQuota(entitlementRespVO::getPublishJobCount, entitlementRespVO::setPublishJobCount,
+                        entitlementRespVO.getPackageInfo().getPublishJobCount(), amount, operator);
                 break;
             case OPERATE_SEARCH:
-                num = entitlementRespVO.getSearchCount() + amount;
-                if (num > entitlementRespVO.getPackageInfo().getPublishJobCount()) {
-                    // 用户持有的额度大于套餐的额度
-                    // return;
-                }
-                entitlementRespVO.setSearchCount(num);
+                validateAndUpdateQuota(entitlementRespVO::getSearchCount, entitlementRespVO::setSearchCount,
+                        entitlementRespVO.getPackageInfo().getSearchCount(), amount, operator);
                 break;
             case OPERATE_LOOK_CV:
-                num = entitlementRespVO.getLookCvCount() + amount;
-                if (num > entitlementRespVO.getPackageInfo().getLookCvCount()) {
-                    // 用户持有的额度大于套餐的额度
-                    // return;
-                }
-                entitlementRespVO.setLookCvCount(num);
+                validateAndUpdateQuota(entitlementRespVO::getLookCvCount, entitlementRespVO::setLookCvCount,
+                        entitlementRespVO.getPackageInfo().getLookCvCount(), amount, operator);
                 break;
             default:
-                return;
+                throw exception(FORBIDDEN);
         }
+
         enterpriseEntitlementService.update(EnterpriseEntitlementDO.builder()
                 .id(entitlementRespVO.getId())
                 .publishJobCount(entitlementRespVO.getPublishJobCount())
@@ -188,4 +128,25 @@ public class VipEntitlementCheckAspect {
                 .build());
     }
 
+    /**
+     * 校验并更新额度
+     */
+    private void validateAndUpdateQuota(Supplier<Integer> getCurrentCount, Consumer<Integer> setNewCount,
+                                        int maxCount, int amount, VipEntitlementCheck.OperationType operator) {
+        int currentCount = getCurrentCount.get();
+        int newCount = currentCount + amount;
+         if (VipEntitlementCheck.OperationType.DEDUCT.equals(operator) && currentCount <= 0) {
+            throw exception(ENTERPRISE_ENTITLEMENT_QUOTA_OVERFLOW);
+        }
+
+        if (newCount > maxCount) {
+            // 用户持有的额度大于套餐的额度
+            // TODO 1、管理员给用户加的额度 ,要不要扣额度?
+            // TODO 2、如果旧职位是开启状态的,现在操作关闭会计算累加
+            // return;
+        }
+
+        setNewCount.accept(newCount);
+    }
+
 }

+ 72 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/analysis/HomeController.java

@@ -0,0 +1,72 @@
+package com.citu.module.menduner.system.controller.admin.analysis;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
+import com.citu.module.menduner.system.service.enterprise.EnterpriseService;
+import com.citu.module.menduner.system.service.enterprise.bind.EnterpriseUserBindService;
+import com.citu.module.menduner.system.service.person.info.PersonInfoService;
+import com.citu.module.menduner.system.service.user.MdeUserService;
+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.Map;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 首页统计")
+@RestController
+@RequestMapping("/menduner/system/home")
+@Validated
+@Slf4j
+public class HomeController {
+
+    @Resource
+    private PersonInfoService personInfoService;
+
+    @Resource
+    private MdeUserService mdeUserService;
+
+    @Resource
+    private EnterpriseService enterpriseService;
+
+    @Resource
+    private EnterpriseUserBindService enterpriseUserBindService;
+
+    @GetMapping("/get/person/count")
+    @Operation(summary = "统计新增加人才简历数量")
+    @PreAuthenticated
+    public CommonResult<Map<String, Object[]>> getPersonCount(@Valid TimeRangeBaseReqVO reqVO) {
+        return success(personInfoService.getPersonCount(reqVO));
+    }
+
+    @GetMapping("/get/user/count")
+    @Operation(summary = "统计新用户数量")
+    @PreAuthenticated
+    public CommonResult<Map<String, Object[]>> getUserCount(@Valid TimeRangeBaseReqVO reqVO) {
+        return success(mdeUserService.getUserCount(reqVO));
+    }
+
+    @GetMapping("/get/enterprise/count")
+    @Operation(summary = "统计新注册企业数量")
+    @PreAuthenticated
+    public CommonResult<Map<String, Object[]>> getEnterpriseCount(@Valid TimeRangeBaseReqVO reqVO) {
+        return success(enterpriseService.getEnterpriseCount(reqVO));
+    }
+
+    @GetMapping("/get/enterprise-user/count")
+    @Operation(summary = "统计新企业用户数量")
+    @PreAuthenticated
+    public CommonResult<Map<String, Object[]>> getEnterpriseUserCount(@Valid TimeRangeBaseReqVO reqVO) {
+        return success(enterpriseUserBindService.getEnterpriseUserCount(reqVO));
+    }
+
+
+}

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

@@ -63,6 +63,15 @@ public class JobAdvertisedController {
         return success(BeanUtils.toBean(pageResult, JobAdvertisedRespVO.class));
     }
 
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除招聘职位")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:delete')")
+    public CommonResult<Boolean> deleteJobAdvertised(@RequestParam("id") Long id) {
+        jobAdvertisedService.deleteJobAdvertised(id);
+        return success(true);
+    }
+
     @GetMapping("/list")
     @Operation(summary = "获得招聘职位列表")
     @PreAuthorize("@ss.hasPermission('menduner:system:job-advertised:query')")

+ 10 - 4
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/AppPersonResumeController.java

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.system.controller.app.jobhunt.person;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.idempotent.core.annotation.Idempotent;
 import com.citu.framework.idempotent.core.keyresolver.impl.UserIdempotentKeyResolver;
@@ -17,13 +18,12 @@ import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppP
 import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppPersonInfoSaveReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppPersonInfoSaveSimpleReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppPersonInfoTagReqVO;
-import com.citu.module.menduner.system.controller.app.jobhunt.person.trainexp.AppTrainExpRespVO;
-import com.citu.module.menduner.system.controller.app.jobhunt.person.trainexp.AppTrainExpSaveReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.skill.AppPersonSkillRespVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.skill.AppPersonSkillSaveReqVO;
+import com.citu.module.menduner.system.controller.app.jobhunt.person.trainexp.AppTrainExpRespVO;
+import com.citu.module.menduner.system.controller.app.jobhunt.person.trainexp.AppTrainExpSaveReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.workexp.AppWorkExpRespVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.workexp.AppWorkExpSaveReqVO;
-import com.citu.module.menduner.system.controller.app.recruit.enterprise.vo.AppRecruitEnterpriseTagReqVO;
 import com.citu.module.menduner.system.convert.*;
 import com.citu.module.menduner.system.dal.dataobject.cvattachment.CvAttachmentDO;
 import com.citu.module.menduner.system.dal.dataobject.eduexp.EduExpDO;
@@ -103,7 +103,6 @@ public class AppPersonResumeController {
     }
 
 
-
     @PreAuthenticated
     @PostMapping("/avatar/update")
     @Operation(summary = "修改人才头像")
@@ -118,7 +117,14 @@ public class AppPersonResumeController {
     @Operation(summary = "保存简易基本信息")
     @Idempotent(keyResolver = UserIdempotentKeyResolver.class)
     public CommonResult<Boolean> saveSimple(@Valid @RequestBody AppPersonInfoSaveSimpleReqVO reqVO) {
+        if (ObjectUtil.isNotEmpty(reqVO.getInterestedList())) {
+            reqVO.getInterestedList().forEach(interested -> jobInterestedService.saveJobInterested(interested));
+        }
+        if (null != reqVO.getWorkExpList()) {
+            reqVO.getWorkExpList().forEach(workExp -> workExpService.saveWorkExp(workExp));
+        }
         return success(personInfoService.saveSimple(reqVO));
+
     }
 
     @PreAuthenticated

+ 5 - 5
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/job/AppJobInterestedSaveReqVO.java

@@ -19,23 +19,23 @@ public class AppJobInterestedSaveReqVO {
     @Schema(description = "期望职位", example = "20359")
     private Long positionId;
 
-    @NotNull(message = "{1_100_007_003}")
+//    @NotNull(message = "{1_100_007_003}")
     @Schema(description = "期望行业")
     private List<String> industryIdList;
 
-    @NotBlank(message = "{1_100_007_004}")
+//    @NotBlank(message = "{1_100_007_004}")
     @Schema(description = "求职类型(0全职 1兼职 2临时 3实习)", example = "2")
     private String jobType;
 
-    @NotNull(message = "{1_100_007_005}")
+//    @NotNull(message = "{1_100_007_005}")
     @Schema(description = "薪酬最低要求")
     private BigDecimal payFrom;
 
-    @NotNull(message = "{1_100_007_006}")
+//    @NotNull(message = "{1_100_007_006}")
     @Schema(description = "薪酬最高要求")
     private BigDecimal payTo;
 
-    @NotNull(message = "{1_100_007_007}")
+//    @NotNull(message = "{1_100_007_007}")
     @Schema(description = "工作城市", example = "15253")
     private Long workAreaId;
 

+ 16 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/resume/AppPersonInfoSaveSimpleReqVO.java

@@ -1,9 +1,13 @@
 package com.citu.module.menduner.system.controller.app.jobhunt.person.resume;
 
+import com.citu.module.menduner.system.controller.app.jobhunt.person.job.AppJobInterestedSaveReqVO;
+import com.citu.module.menduner.system.controller.app.jobhunt.person.workexp.AppWorkExpSaveReqVO;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
+import java.time.LocalDateTime;
+import java.util.List;
 
 @Data
 @Schema(description = "menduner 人才简历-简易基本信息 Request VO")
@@ -28,8 +32,20 @@ public class AppPersonInfoSaveSimpleReqVO {
     @Schema(description = "工作经验", example = "1")
     private String expType;
 
+    @Schema(description = "出生日期")
+    private LocalDateTime birthday;
+
     @NotBlank(message = "{1_100_001_007}")
     @Schema(description = "学历", example = "2")
     private String eduType;
 
+    @Schema(description = "邮箱")
+    private String email;
+
+    @Schema(description = "求职意向")
+    private List<AppJobInterestedSaveReqVO> interestedList;
+
+    @Schema(description = "工作经历")
+    private List<AppWorkExpSaveReqVO> workExpList;
+
 }

+ 1 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/jobhunt/person/workexp/AppWorkExpSaveReqVO.java

@@ -35,7 +35,7 @@ public class AppWorkExpSaveReqVO {
     @Schema(description = "职位名称(没有选择系统职位时可自定义)", example = "赵六")
     private String positionName;
 
-    @NotNull(message = "{1_100_012_002}")
+//    @NotNull(message = "{1_100_012_002}")
     @Schema(description = "在职开始日期")
     private LocalDateTime startTime;
 

+ 1 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/app/recruit/order/AppRecruitTradeOrderController.java

@@ -45,15 +45,14 @@ public class AppRecruitTradeOrderController {
     @PreAuthenticated
     @ApiSignature(timeout = 30)
     public CommonResult<Long> create(@RequestBody @Valid AppTradeOrderCreateReqVO reqVO) {
-        TradeOrderTypeEnum type = TradeOrderTypeEnum.getByType(reqVO.getType());
         TradeOrderCreateReqVO dto = new TradeOrderCreateReqVO();
         dto.setUserType(String.valueOf(MdeUserTypeEnum.ENTERPRISE_USER.getType()));
         dto.setEnterpriseId(LoginUserContext.getEnterpriseId());
         dto.setUserId(LoginUserContext.getUserId());
         dto.setType(reqVO.getType());
         dto.setSpuId(reqVO.getSpuId());
-        dto.setSpuName(type.getName() + ": " + reqVO.getSpuName());
         dto.setPrice(reqVO.getPrice());
+        dto.setSpuName(reqVO.getSpuName());
         return success(tradeOrderService.createOrder(dto,PAY_APP_ENTERPRISE_KEY));
     }
 

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

@@ -5,11 +5,13 @@ 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.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.system.api.user.UserInfoRespDTO;
 import com.citu.module.menduner.system.controller.app.jobhunt.job.vo.AppJobCvLookRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitEnterpriseUserRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitUserPageReqVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitUserRespVO;
+import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.contact.EnterpriseUserSummaryRespVO;
 import com.citu.module.menduner.system.controller.base.enterprise.bind.EnterpriseUserBindDetailRespVO;
 import com.citu.module.menduner.system.controller.base.enterprise.bind.EnterpriseUserBindPageReqVO;
@@ -18,8 +20,10 @@ import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserBindDO;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import com.citu.module.menduner.system.enums.enterprise.EnterpriseUserTypeEnum;
+import com.citu.module.menduner.system.util.RecruitAnalysisUtils;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -212,7 +216,24 @@ public interface EnterpriseUserBindMapper extends BaseMapperX<EnterpriseUserBind
 
         return selectJoinOne(UserInfoRespDTO.class, wrapper);
 
+    }
+
+
+    /**
+     * 企业用户的统计
+     **/
+    default List<CommonRespVO> getEnterpriseUserCount(TimeRangeBaseReqVO reqVO,
+                                                  LocalDateTime startTime, LocalDateTime endTime) {
+
+        MPJLambdaWrapperX<EnterpriseUserBindDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectCount(EnterpriseUserBindDO::getId, CommonRespVO::getValue);
+
+        wrapper.betweenIfPresent(EnterpriseUserBindDO::getCreateTime, startTime, endTime);
+
+        RecruitAnalysisUtils.applyTimeGrouping(wrapper, EnterpriseUserBindDO::getCreateTime, reqVO.getType());
+        wrapper.orderByDesc("`key`");
 
+        return selectJoinList(CommonRespVO.class, wrapper);
     }
 
 

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

@@ -269,8 +269,8 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
                 .eqIfPresent(JobAdvertisedDO::getEduType, reqVO.getEduType())
                 .eqIfPresent(JobAdvertisedDO::getStatus, reqVO.getStatus())
                 .eqIfPresent(JobAdvertisedDO::getHire, reqVO.getHire())
-                .betweenIfPresent(JobAdvertisedDO::getCreateTime, reqVO.getCreateTime())
-                .orderByDesc(JobAdvertisedDO::getTop, JobAdvertisedDO::getUpdateTime);
+                .betweenIfPresent(JobAdvertisedDO::getCreateTime, reqVO.getCreateTime());
+
 
         query.eq(JobAdvertisedDO::getEnterpriseId, enterpriseId);
         query.eq(JobAdvertisedDO::getUserId, userId);
@@ -281,6 +281,7 @@ public interface JobAdvertisedMapper extends BaseMapperX<JobAdvertisedDO> {
         } else {
             notExpireTime(query);
         }
+        query.orderByDesc(JobAdvertisedDO::getTop, JobAdvertisedDO::getUpdateTime);
         return selectPage(reqVO, query);
     }
 

+ 21 - 1
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/person/PersonInfoMapper.java

@@ -6,20 +6,23 @@ 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.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.vo.AppInvitePersonRespVO;
+import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.person.PersonMapQueryReqVO;
 import com.citu.module.menduner.system.controller.base.person.PersonQueryReqVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoPageReqVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoRespVO;
-import com.citu.module.menduner.system.controller.base.person.info.PersonSimpleRespVO;
 import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseTalentPoolDO;
 import com.citu.module.menduner.system.dal.dataobject.job.JobInterestedDO;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
 import com.citu.module.menduner.system.util.JoinHelper;
+import com.citu.module.menduner.system.util.RecruitAnalysisUtils;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.List;
 
@@ -233,4 +236,21 @@ public interface PersonInfoMapper extends BaseMapperX<PersonInfoDO> {
         return selectJoinPage(pageParam, AppInvitePersonRespVO.class, query);
     }
 
+    /**
+     * 新创建的简历的统计
+     **/
+    default List<CommonRespVO> getNewPersonCount(TimeRangeBaseReqVO reqVO,
+                                                 LocalDateTime startTime, LocalDateTime endTime) {
+
+        MPJLambdaWrapperX<PersonInfoDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectCount(PersonInfoDO::getId, CommonRespVO::getValue);
+
+        wrapper.betweenIfPresent(PersonInfoDO::getCreateTime, startTime, endTime);
+
+        RecruitAnalysisUtils.applyTimeGrouping(wrapper, PersonInfoDO::getCreateTime, reqVO.getType());
+        wrapper.orderByDesc("`key`");
+
+        return selectJoinList(CommonRespVO.class, wrapper);
+    }
+
 }

+ 22 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/user/MdeUserMapper.java

@@ -3,10 +3,15 @@ package com.citu.module.menduner.system.dal.mysql.user;
 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.common.dto.TimeRangeBaseReqVO;
+import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserPageReqVO;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
+import com.citu.module.menduner.system.util.RecruitAnalysisUtils;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.time.LocalDateTime;
 import java.util.List;
 
 /**
@@ -43,4 +48,21 @@ public interface MdeUserMapper extends BaseMapperX<MdeUserDO> {
     default List<MdeUserDO> selectListByStatus(String status) {
         return selectList(MdeUserDO::getStatus, status);
     }
+
+    /**
+     * 用户的统计
+     **/
+    default List<CommonRespVO> getUserCount(TimeRangeBaseReqVO reqVO,
+                                            LocalDateTime startTime, LocalDateTime endTime) {
+
+        MPJLambdaWrapperX<MdeUserDO> wrapper = new MPJLambdaWrapperX<>();
+        wrapper.selectCount(MdeUserDO::getId, CommonRespVO::getValue);
+
+        wrapper.betweenIfPresent(MdeUserDO::getCreateTime, startTime, endTime);
+
+        RecruitAnalysisUtils.applyTimeGrouping(wrapper, MdeUserDO::getCreateTime, reqVO.getType());
+        wrapper.orderByDesc("`key`");
+
+        return selectJoinList(CommonRespVO.class, wrapper);
+    }
 }

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

@@ -128,7 +128,8 @@ public class MdeEnterpriseAuthServiceImpl implements MdeEnterpriseAuthService {
         final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_EMAIL;
         // 校验账号是否存在
         EnterpriseUserBindDO user = userBindService.getByEmail(email);
-        if (null == user) {
+        // 数据库表是utf8mb4_general_ci,不区分大小写都能查询出来的,所以要再次对比
+        if (null == user || !email.equals(user.getEmail())) {
             // 如果用户为空,则效验是否存在企业注册申请
             registerService.validateApplyByEmail(email);
             // 邮箱存在注册申请则直接抛出异常不走下面

+ 9 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/EnterpriseService.java

@@ -2,6 +2,7 @@ package com.citu.module.menduner.system.service.enterprise;
 
 import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.enterprise.vo.AppEnterpriseClickReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.enterprise.vo.AppEnterpriseDetailRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.enterprise.vo.*;
@@ -11,6 +12,7 @@ import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseDO;
 
 import javax.validation.Valid;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -135,6 +137,13 @@ public interface EnterpriseService {
      * @param reqVO
      **/
     void updatePubJobTypePerm(EnterprisePubJobTypePermUpdateReqVO reqVO);
+
+    /**
+     * 企业统计
+     *
+     * @param reqVO
+     **/
+    Map<String, Object[]> getEnterpriseCount(TimeRangeBaseReqVO reqVO);
     // ========== 求职端 ==========
 
     /**

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

@@ -7,6 +7,7 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.datapermission.core.annotation.DataPermission;
 import com.citu.framework.dict.core.DictFrameworkUtils;
+import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.api.python.GraphSendDTO;
 import com.citu.module.menduner.system.controller.app.jobhunt.enterprise.vo.AppEnterpriseClickReqVO;
@@ -37,13 +38,16 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.framework.common.util.collection.CollectionUtils.convertSet;
+import static com.citu.module.menduner.common.util.TimeUtils.generateDateTimeRange;
 import static com.citu.module.menduner.system.enums.DictTypeConstants.*;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.MDE_ENTERPRISE_NOT_EXISTS;
+import static com.citu.module.menduner.system.util.RecruitAnalysisUtils.packBarCount;
 
 /**
  * 企业信息 Service 实现类
@@ -237,6 +241,18 @@ public class EnterpriseServiceImpl implements EnterpriseService {
         enterpriseMapper.updateById(enterprise);
     }
 
+    @Override
+    public Map<String, Object[]> getEnterpriseCount(TimeRangeBaseReqVO reqVO) {
+        LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
+        List<CommonRespVO> result = enterpriseMapper.getEnterpriseCount(reqVO, timeRange[0], timeRange[1]);
+        List<CommonRespVO> sortedResult = result.stream()
+                .sorted(Comparator.comparing(CommonRespVO::getKey))
+                .collect(Collectors.toList());
+        return packBarCount(sortedResult.stream()
+                .filter(c -> null != c.getKey())
+                .collect(Collectors.toList())
+        );
+    }
 
     @Override
     public void click(AppEnterpriseClickReqVO reqVO) {

+ 9 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/enterprise/bind/EnterpriseUserBindService.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.system.service.enterprise.bind;
 
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.enterprise.vo.AppEnterpriseUserBindRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.*;
 import com.citu.module.menduner.system.controller.base.contact.EnterpriseUserContactRespVO;
@@ -10,6 +11,7 @@ import com.citu.module.menduner.system.dal.dataobject.enterprise.EnterpriseUserB
 
 import javax.validation.Valid;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 企业登录用户 Service 接口
@@ -159,6 +161,13 @@ public interface EnterpriseUserBindService {
      **/
     void updateEmail(Long id,String email);
 
+    /**
+     * 企业用户统计
+     *
+     * @param reqVO 查询条件
+     **/
+    Map<String, Object[]> getEnterpriseUserCount(TimeRangeBaseReqVO reqVO);
+
     // ========== 求职端 ==========
 
     /**

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

@@ -6,12 +6,14 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.common.util.validation.ValidationUtils;
 import com.citu.framework.security.core.LoginUser;
+import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.controller.app.jobhunt.enterprise.vo.AppEnterpriseUserBindRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitEnterpriseUserRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitUserPageReqVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitUserRespVO;
 import com.citu.module.menduner.system.controller.app.recruit.user.vo.AppRecruitUserSaveReqVO;
+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.contact.EnterpriseUserSummaryRespVO;
 import com.citu.module.menduner.system.controller.base.enterprise.bind.*;
@@ -33,15 +35,16 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.citu.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN;
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.module.menduner.common.util.LoginUserContext.checkIsEnterpriseUser;
+import static com.citu.module.menduner.common.util.TimeUtils.generateDateTimeRange;
 import static com.citu.module.menduner.system.dal.redis.RedisKeyConstants.MDE_AUTH_ENTERPRISE_USER_PWD_LOCK;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
+import static com.citu.module.menduner.system.util.RecruitAnalysisUtils.packBarCount;
 
 /**
  * 企业登录用户 Service 实现类
@@ -211,6 +214,9 @@ public class EnterpriseUserBindServiceImpl implements EnterpriseUserBindService
 
     @Override
     public EnterpriseUserBindDO getByEmail(String email) {
+        if(!ValidationUtils.isEmail(email)) {
+            throw exception(MDE_ENTERPRISE_USER_BIND_EMAIL_FORMAT_ERROR);
+        }
         return mapper.selectByEmail(email);
     }
 
@@ -248,6 +254,19 @@ public class EnterpriseUserBindServiceImpl implements EnterpriseUserBindService
                 .email(email).build());
     }
 
+    @Override
+    public Map<String, Object[]> getEnterpriseUserCount(TimeRangeBaseReqVO reqVO) {
+        LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
+        List<CommonRespVO> result = mapper.getEnterpriseUserCount(reqVO, timeRange[0], timeRange[1]);
+        List<CommonRespVO> sortedResult = result.stream()
+                .sorted(Comparator.comparing(CommonRespVO::getKey))
+                .collect(Collectors.toList());
+        return packBarCount(sortedResult.stream()
+                .filter(c -> null != c.getKey())
+                .collect(Collectors.toList())
+        );
+    }
+
     @Override
     public EnterpriseUserContactRespVO getContact(Long enterpriseId, Long userId) {
         EnterpriseUserBindDO userBindDO = mapper.selectByEnterpriseIdAndUserId(enterpriseId, userId);

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

@@ -115,9 +115,10 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
     @Override
     public void deleteJobAdvertised(Long id) {
         // 校验存在
-        validateJobAdvertisedExists(id);
+        JobAdvertisedDO jobAdvertised = validateJobAdvertisedExists(id);
         // 删除
         mapper.deleteById(id);
+        jobDataSync(jobAdvertised, SyncConstants.DELETE);
     }
 
     private JobAdvertisedDO validateJobAdvertisedExists(Long id) {
@@ -408,10 +409,10 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
      * @param userId       用户ID
      */
     private void processNewJob(JobAdvertisedDO job, Long enterpriseId, Long userId) {
-
-        boolean triggerVip = !job.getHire() || JobStatusEnum.WAIT_ENABLE.getStatus().equals(job.getStatus());
-        // 验证权益
-        vipEntitlementCheckAspect.validate(VipEntitlementCheck.OPERATE_PUBLISH_JOB, triggerVip);
+        // 不是众聘职位 和 不是待开启的职位才需要权益
+        boolean triggerVip = !job.getHire() && !JobStatusEnum.WAIT_ENABLE.getStatus().equals(job.getStatus());
+        // 扣除额度
+        vipEntitlementCheckAspect.deductQuota(VipEntitlementCheck.OPERATE_PUBLISH_JOB, triggerVip);
 
         if (job.getHire() || JobStatusEnum.WAIT_ENABLE.getStatus().equals(job.getStatus())) {
             // 众聘职位||待开启,还需要给钱才能开启
@@ -429,9 +430,6 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
         // 后置处理
         jobOperateAfter(job, SyncConstants.ADD);
 
-        // 处理权益
-        vipEntitlementCheckAspect
-                .process(VipEntitlementCheck.OPERATE_PUBLISH_JOB, VipEntitlementCheck.OperationType.DEDUCT, triggerVip);
     }
 
     /**
@@ -483,14 +481,13 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
                 // 已经是开启状态
                 throw exception(MDE_JOB_ADVERTISED_STATUS_ENABLE_ERROR);
             }
-            vipEntitlementCheckAspect.validate(VipEntitlementCheck.OPERATE_PUBLISH_JOB, VipEntitlementCheck.OperationType.DEDUCT);
+            boolean exec = job.getCreateTime().isAfter(LocalDateTime.of(2024, 11, 1, 0, 0));
+            // 扣除额度 20241101之后的数据才做处理
+            vipEntitlementCheckAspect.deductQuota(VipEntitlementCheck.OPERATE_PUBLISH_JOB, exec);
             job.setStatus(JobStatusEnum.ENABLE.getStatus());
             mapper.updateById(job);
             jobDataSync(job, SyncConstants.UPDATE);
-            // 20241101之后的数据才做处理
-            boolean exec = job.getCreateTime().isAfter(LocalDateTime.of(2024, 11, 1, 0, 0));
-            vipEntitlementCheckAspect
-                    .process(VipEntitlementCheck.OPERATE_PUBLISH_JOB, VipEntitlementCheck.OperationType.DEDUCT, exec);
+
         }
     }
 
@@ -515,15 +512,9 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
                 // 已经是关闭状态
                 throw exception(MDE_JOB_ADVERTISED_STATUS_CLOSE_ERROR);
             }
-            vipEntitlementCheckAspect.validate(VipEntitlementCheck.OPERATE_PUBLISH_JOB, VipEntitlementCheck.OperationType.ADD);
             job.setStatus(JobStatusEnum.DISABLE.getStatus());
             mapper.updateById(job);
             jobDataSync(job, SyncConstants.UPDATE);
-            // 20241101之后的数据才做处理
-            boolean exec = job.getCreateTime().isAfter(LocalDateTime.of(2024, 11, 1, 0, 0));
-            vipEntitlementCheckAspect
-                    .process(VipEntitlementCheck.OPERATE_PUBLISH_JOB, VipEntitlementCheck.OperationType.ADD,
-                            exec);
         }
     }
 
@@ -687,7 +678,7 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
                                     JobAdvertisedConvert.INSTANCE.convert(job)
                             )
             );
-        } else {
+        } else if (SyncConstants.UPDATE.equals(operate)){
             // es
             esProducer.send(SyncConstants.JOB, SyncConstants.UPDATE, job.getId());
             // 图数据库
@@ -699,6 +690,19 @@ public class JobAdvertisedServiceImpl implements JobAdvertisedService {
                                     JobAdvertisedConvert.INSTANCE.convert(job)
                             )
             );
+        }else {
+            // es
+            esProducer.send(SyncConstants.JOB, SyncConstants.DELETE, job.getId());
+            // 图数据库
+            producer.send(
+                    new GraphSendDTO
+                            (
+                                    SyncConstants.DELETE,
+                                    SyncConstants.JOB,
+                                    job.getId()
+                            )
+            );
+
         }
     }
 

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

@@ -193,7 +193,7 @@ public class JobCvRelServiceImpl implements JobCvRelService {
 
     @Override
     @DSTransactional
-    @VipEntitlementCheck(type = VipEntitlementCheck.OPERATE_LOOK_CV, operate = VipEntitlementCheck.OperationType.DEDUCT)
+    @VipEntitlementCheck(type = VipEntitlementCheck.OPERATE_LOOK_CV)
     public boolean look(Long id) {
         JobCvRelDO jobCvRel = validateJobCvRelExists(id);
         if (JobCvRelStatusEnum.LOOK.getStatus().equals(jobCvRel.getStatus())) {

+ 3 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/order/TradeOrderServiceImpl.java

@@ -80,12 +80,13 @@ public class TradeOrderServiceImpl implements TradeOrderService {
 
     @Override
     public Long createOrder(TradeOrderCreateReqVO createReqVO,String payKey) {
+        TradeOrderTypeEnum type = TradeOrderTypeEnum.getByType(createReqVO.getType());
         // 1.1 获得商品
         // 1.2 插入 订单
         TradeOrderDO tradeOrderDO = new TradeOrderDO().setUserId(createReqVO.getUserId())
                 .setUserType(createReqVO.getUserType()).setEnterpriseId(createReqVO.getEnterpriseId())
                 .setAppKey(payKey)
-                .setSpuId(createReqVO.getSpuId()).setSpuName(createReqVO.getSpuName())
+                .setSpuId(createReqVO.getSpuId()).setSpuName(type.getName() + "-" + createReqVO.getSpuName())
                 .setPrice(createReqVO.getPrice()).setPayStatus(false).setRefundPrice(0L);
         // 初始化默认
         buildDefaultOrder(tradeOrderDO, null == createReqVO.getType() ?
@@ -97,7 +98,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         Long payOrderId = payOrderApi.createOrder(new PayOrderCreateReqDTO()
                 .setAppKey(payKey).setUserIp(getClientIP()) // 支付应用
                 .setMerchantOrderId(tradeOrderDO.getId().toString()) // 业务的订单编号
-                .setSubject(createReqVO.getSpuName()).setBody("")
+                .setSubject(type.getName()).setBody(type.getName() + "-" + createReqVO.getSpuName())
                 .setPrice(Math.toIntExact(createReqVO.getPrice())) // 价格信息
                 .setExpireTime(addTime(Duration.ofHours(2L)))).getCheckedData(); // 支付的过期时间
         // 2.2 更新支付单到 订单

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

@@ -2,6 +2,7 @@ package com.citu.module.menduner.system.service.person.info;
 
 import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppPersonAdvantageSaveReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppPersonInfoSaveReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppPersonInfoSaveSimpleReqVO;
@@ -9,11 +10,11 @@ import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppP
 import com.citu.module.menduner.system.controller.app.jobhunt.person.vo.AppInvitePersonRespVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoPageReqVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoSaveReqVO;
-import com.citu.module.menduner.system.controller.base.person.info.PersonSimpleRespVO;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
 import org.springframework.web.bind.annotation.RequestBody;
 
 import javax.validation.Valid;
+import java.util.Map;
 
 /**
  * 人才信息-人才档案 Service 接口
@@ -68,6 +69,14 @@ public interface PersonInfoService {
      */
     PersonInfoDO getUserInfoByUserId(Long userId);
 
+
+    /**
+     * 人才简历统计
+     */
+    Map<String, Object[]> getPersonCount(TimeRangeBaseReqVO reqVO);
+
+    // ========== 求职端 ==========
+
     /**
      * 保存简历基本信息
      *

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

@@ -5,6 +5,7 @@ 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.common.util.validation.ValidationUtils;
+import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.common.util.LoginUserContext;
 import com.citu.module.menduner.system.api.python.GraphSendDTO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppPersonAdvantageSaveReqVO;
@@ -12,10 +13,12 @@ import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppP
 import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppPersonInfoSaveSimpleReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.resume.AppPersonInfoTagReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.person.vo.AppInvitePersonRespVO;
+import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoPageReqVO;
 import com.citu.module.menduner.system.controller.base.person.info.PersonInfoSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.person.PersonInfoDO;
 import com.citu.module.menduner.system.dal.mysql.person.PersonInfoMapper;
+import com.citu.module.menduner.system.enums.eduexp.EducationTypeEnum;
 import com.citu.module.menduner.system.enums.sync.SyncConstants;
 import com.citu.module.menduner.system.mq.producer.GraphProducer;
 import org.springframework.stereotype.Service;
@@ -24,8 +27,16 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 
+import java.time.LocalDateTime;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.common.util.TimeUtils.generateDateTimeRange;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
+import static com.citu.module.menduner.system.util.RecruitAnalysisUtils.packBarCount;
 
 /**
  * 人才信息-人才档案 Service 实现类
@@ -93,6 +104,19 @@ public class PersonInfoServiceImpl implements PersonInfoService {
         return personInfoMapper.getByUserId(userId);
     }
 
+    @Override
+    public Map<String, Object[]> getPersonCount(TimeRangeBaseReqVO reqVO) {
+        LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
+        List<CommonRespVO> result = personInfoMapper.getNewPersonCount(reqVO, timeRange[0], timeRange[1]);
+        List<CommonRespVO> sortedResult = result.stream()
+                .sorted(Comparator.comparing(CommonRespVO::getKey))
+                .collect(Collectors.toList());
+        return packBarCount(sortedResult.stream()
+                .filter(c -> null != c.getKey())
+                .collect(Collectors.toList())
+        );
+    }
+
     @Override
     @DSTransactional // 单机+多数据源方案,使用 @DSTransactional 保证本地事务,以及数据源的切换
     public boolean saveInfo(AppPersonInfoSaveReqVO reqVO) {

+ 7 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/user/MdeUserService.java

@@ -4,6 +4,7 @@ package com.citu.module.menduner.system.service.user;
 import com.citu.framework.common.enums.TerminalEnum;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.validation.Mobile;
+import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.user.vo.*;
 import com.citu.module.menduner.system.controller.base.user.MdeUserPageReqVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserSaveReqVO;
@@ -12,6 +13,7 @@ import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
 import javax.validation.Valid;
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 用户登录 Service 接口
@@ -189,4 +191,9 @@ public interface MdeUserService {
      * 禁用用户
      **/
     void disable(List<Long> ids);
+
+    /**
+     * 获取用户统计
+     **/
+    Map<String, Object[]> getUserCount(TimeRangeBaseReqVO reqVO);
 }

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

@@ -10,7 +10,9 @@ import com.citu.framework.common.enums.UserTypeEnum;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.datapermission.core.util.DataPermissionUtils;
+import com.citu.module.menduner.common.dto.TimeRangeBaseReqVO;
 import com.citu.module.menduner.system.controller.app.jobhunt.user.vo.*;
+import com.citu.module.menduner.system.controller.base.CommonRespVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserPageReqVO;
 import com.citu.module.menduner.system.controller.base.user.MdeUserSaveReqVO;
 import com.citu.module.menduner.system.dal.dataobject.user.MdeUserDO;
@@ -35,14 +37,19 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.framework.common.util.servlet.ServletUtils.getClientIP;
 import static com.citu.framework.web.core.util.WebFrameworkUtils.getTerminal;
+import static com.citu.module.menduner.common.util.TimeUtils.generateDateTimeRange;
 import static com.citu.module.menduner.system.dal.redis.RedisKeyConstants.MDE_AUTH_USER_PWD_LOCK;
 import static com.citu.module.menduner.system.enums.ErrorCodeConstants.*;
 import static com.citu.module.menduner.system.enums.MdeLogRecordConstants.*;
+import static com.citu.module.menduner.system.util.RecruitAnalysisUtils.packBarCount;
 import static com.citu.module.system.enums.ErrorCodeConstants.USER_USERNAME_EXISTS;
 
 /**
@@ -428,4 +435,17 @@ public class MdeUserServiceImpl implements MdeUserService {
                     .updateById(MdeUserDO.builder().id(id).status(MendunerStatusEnum.DISABLE.getStatus()).build());
         }
     }
+
+    @Override
+    public Map<String, Object[]> getUserCount(TimeRangeBaseReqVO reqVO) {
+        LocalDateTime[] timeRange = generateDateTimeRange(reqVO);
+        List<CommonRespVO> result = mdeUserMapper.getUserCount(reqVO, timeRange[0], timeRange[1]);
+        List<CommonRespVO> sortedResult = result.stream()
+                .sorted(Comparator.comparing(CommonRespVO::getKey))
+                .collect(Collectors.toList());
+        return packBarCount(sortedResult.stream()
+                .filter(c -> null != c.getKey())
+                .collect(Collectors.toList())
+        );
+    }
 }

+ 47 - 2
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/util/RecruitAnalysisUtils.java

@@ -1,12 +1,17 @@
 package com.citu.module.menduner.system.util;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ArrayUtil;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.citu.framework.mybatis.core.query.MPJLambdaWrapperX;
 import com.citu.module.menduner.system.controller.base.CommonRespVO;
 
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import static com.citu.module.menduner.common.dto.TimeRange.*;
+
 /**
  * 招聘分析工具类
  **/
@@ -16,11 +21,14 @@ public class RecruitAnalysisUtils {
      * 包装柱状图格式
      **/
     public static Map<String, Object[]> packBarCount(List<CommonRespVO> result) {
+        Map<String, Object[]> map = new LinkedHashMap<>();
         if (CollUtil.isEmpty(result)) {
-            return null;
+            map.put("x", ArrayUtil.newArray(String.class, 0));
+            map.put("y", ArrayUtil.newArray(String.class, 0));
+            return map;
         }
 
-        Map<String, Object[]> map = new LinkedHashMap<>();
+
         String[] keys = result.stream()
                 .map(CommonRespVO::getKey)
                 .toArray(String[]::new);
@@ -36,4 +44,41 @@ public class RecruitAnalysisUtils {
     }
 
 
+    /**
+     * 时间分组
+     *
+     * @param wrapper 条件构造器
+     * @param column  字段
+     * @param type    {@link com.citu.module.menduner.common.dto.TimeRange}
+     **/
+    public static <R> void applyTimeGrouping(MPJLambdaWrapperX<?> wrapper,
+                                             SFunction<R, ?> column,
+                                             String type) {
+        switch (type) {
+            case TYPE_24_HOURS:
+                wrapper.selectFunc("DATE_FORMAT(%s, '%%m-%%d %%H:00')", arg -> arg.accept(column), "`key`");
+                wrapper.groupBy("DATE_FORMAT(create_time, '%Y-%m-%d-%H')");
+                break;
+            case ALL:
+            case TYPE_RECENT_7_DAYS:
+            case TYPE_LAST_MONTH:
+            case TYPE_LAST_QUARTER:
+            case TYPE_MONTH:
+            case TYPE_CUSTOM:
+                wrapper.selectFunc("DATE_FORMAT(%s, '%%m-%%d')", arg -> arg.accept(column), "`key`");
+                wrapper.groupBy("DATE_FORMAT(create_time, '%Y-%m-%d')");
+                break;
+            case TYPE_YEAR:
+                wrapper.selectFunc("DATE_FORMAT(%s, '%%y年%%m月')", arg -> arg.accept(column), "`key`");
+                wrapper.groupBy("DATE_FORMAT(create_time, '%y-%m')");
+                break;
+            default:
+                // wrapper.selectFunc("DATE_FORMAT(%s, '%%Y年')", arg -> arg.accept(column), "`key`");
+                // wrapper.groupBy("DATE_FORMAT(create_time, '%')");
+                break;
+
+        }
+
+
+    }
 }