Browse Source

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

rayson 11 tháng trước cách đây
mục cha
commit
289f295219
37 tập tin đã thay đổi với 520 bổ sung192 xóa
  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;
+
+        }
+
+
+    }
 }