Przeglądaj źródła

1、修改优化积分规则的配置
2、增加求职端积分接口

rayson 1 rok temu
rodzic
commit
7b865cae7c
27 zmienionych plików z 385 dodań i 120 usunięć
  1. 3 3
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/db/TransformDataSourceInterceptor.java
  2. 0 2
      menduner/menduner-common/src/main/java/com/citu/module/menduner/common/util/LoginUserContext.java
  3. 0 18
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/EventMetricConstants.java
  4. 40 0
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/event/EventMetricTypeEnum.java
  5. 3 3
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/record/PointBizTypeEnum.java
  6. 0 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/common/CommonController.java
  7. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventTrackController.java
  8. 11 18
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/user/UserPointController.java
  9. 51 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/record/AppPointRecordController.java
  10. 11 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/record/vo/AppPointRecordRespVO.java
  11. 37 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/user/AppUserPointController.java
  12. 8 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventTrackPointRespVO.java
  13. 3 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/user/UserPointUpdateReqVO.java
  14. 2 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/PointRecordConvert.java
  15. 2 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/config/PointRuleConfigMapper.java
  16. 2 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/event/EventRecordMapper.java
  17. 35 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/record/PointRecordMapper.java
  18. 8 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/redis/RedisKeyConstants.java
  19. 1 6
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/consumer/UserPointConsumer.java
  20. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigService.java
  21. 9 9
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigServiceImpl.java
  22. 3 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventRecordService.java
  23. 25 6
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventRecordServiceImpl.java
  24. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackService.java
  25. 85 41
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java
  26. 26 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordService.java
  27. 17 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordServiceImpl.java

+ 3 - 3
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/db/TransformDataSourceInterceptor.java

@@ -33,9 +33,9 @@ public class TransformDataSourceInterceptor implements Interceptor {
     public Object intercept(Invocation invocation) throws Throwable {
         Object[] args = invocation.getArgs();
         MappedStatement ms = (MappedStatement) args[0];
-        String pushedDataSource = null;
+        String dataSource = null;
         try {
-            String dataSource = DdConstants.MASTER;
+             dataSource = DdConstants.MASTER;
             if (SqlCommandType.SELECT == ms.getSqlCommandType()) {
                 // select
                 dataSource = DdConstants.SLAVE;
@@ -44,7 +44,7 @@ public class TransformDataSourceInterceptor implements Interceptor {
             log.info(" ----- use datasource ["+DynamicDataSourceContextHolder.peek()+"]  ----- ");
             return invocation.proceed();
         } finally {
-            if (null != pushedDataSource) {
+            if (null != dataSource) {
                 DynamicDataSourceContextHolder.poll();
             }
         }

+ 0 - 2
menduner/menduner-common/src/main/java/com/citu/module/menduner/common/util/LoginUserContext.java

@@ -7,8 +7,6 @@ import com.citu.framework.security.core.util.SecurityFrameworkUtils;
 
 import static com.citu.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN;
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.citu.framework.security.core.LoginUser.INFO_KEY_DATA_ID;
-import static com.citu.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
 
 /**
  * 登录用户上下文

+ 0 - 18
menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/EventMetricConstants.java

@@ -1,18 +0,0 @@
-package com.citu.module.menduner.reward.enums;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 事件指标 今日点击数 | 当月点击数 | 当年点击数 | 总点击数
- **/
-@Getter
-@AllArgsConstructor
-public class EventMetricConstants {
-
-    public static final String TODAY = "today_click";
-    public static final String MONTH = "month_click";
-    public static final String YEAR = "year_click";
-    public static final String TOTAL = "total_click";
-
-}

+ 40 - 0
menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/event/EventMetricTypeEnum.java

@@ -0,0 +1,40 @@
+package com.citu.module.menduner.reward.enums.event;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 事件指标 0小时 | 1今天 | 2当月 | 3当年 | 99 总数
+ **/
+@Getter
+@AllArgsConstructor
+public enum EventMetricTypeEnum {
+    HOUR(0, "小时"),
+    TODAY(1, "今天"),
+    MONTH(2, "当月"),
+    YEAR(3, "当年"),
+    TOTAL(99, "总数");
+
+    final Integer type;
+    final String name;
+
+
+    /**
+     * 根据类型获取枚举
+     *
+     * @param type: 类型
+     */
+    public static EventMetricTypeEnum getTypeEnum(Integer type) {
+        try {
+            EventMetricTypeEnum[] As = EventMetricTypeEnum.values();
+            for (EventMetricTypeEnum a : As) {
+                if (type.equals(a.type)) {
+                    return a;
+                }
+            }
+            return EventMetricTypeEnum.TOTAL;
+        } catch (Exception ex) {
+            return EventMetricTypeEnum.TOTAL;
+        }
+    }
+}

+ 3 - 3
menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/record/PointBizTypeEnum.java

@@ -8,7 +8,7 @@ import lombok.Getter;
 import java.util.Objects;
 
 /**
- * 会员积分的业务类型枚举
+ * 用户积分的业务类型枚举
  *
  * @author Rayson
  */
@@ -16,10 +16,10 @@ import java.util.Objects;
 @Getter
 public enum PointBizTypeEnum implements IntArrayValuable {
 
-    SIGN(1, "签到", "签到获得 {} 积分", true),
+    SIGN(1, "签到", "签到获得 {}积分", true),
     ADMIN(2, "管理员修改", "管理员修改 {} 积分", true),
 
-    EVENT(3, "事件跟踪", "访问 {} 事件,{}{} 积分", true);
+    EVENT(3, "事件跟踪", "访问[{}]事件,{}{} 积分", true);
 
     /**
      * 类型

+ 0 - 2
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/common/CommonController.java

@@ -2,10 +2,8 @@ package com.citu.module.menduner.reward.controller.admin.common;
 
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.security.core.annotations.PreAuthenticated;
-import com.citu.module.menduner.reward.controller.base.common.EventRespVO;
 import com.citu.module.menduner.reward.controller.base.common.OperationRespVO;
 import com.citu.module.menduner.reward.enums.OperationEnum;
-import com.citu.module.menduner.reward.enums.EventMetricConstants;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.validation.annotation.Validated;

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventTrackController.java

@@ -40,7 +40,7 @@ public class EventTrackController {
     @PreAuthenticated
     @PostMapping("/click")
     @Operation(summary = "点击")
-    public CommonResult<EventTrackPointRespVO> click(@RequestParam("url") String url) throws Exception {
+    public CommonResult<List<EventTrackPointRespVO>> click(@RequestParam("url") String url) throws Exception {
         return success(service.click(url));
     }
 

+ 11 - 18
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/user/UserPointController.java

@@ -8,6 +8,8 @@ import com.citu.module.menduner.reward.controller.base.user.UserPointRespVO;
 import com.citu.module.menduner.reward.controller.base.user.UserPointUpdateReqVO;
 import com.citu.module.menduner.reward.convert.UserPointConvert;
 import com.citu.module.menduner.reward.dal.dataobject.user.UserPointDO;
+import com.citu.module.menduner.reward.enums.MathOperationEnum;
+import com.citu.module.menduner.reward.enums.record.PointBizTypeEnum;
 import com.citu.module.menduner.reward.service.record.PointRecordService;
 import com.citu.module.menduner.reward.service.user.UserPointService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -34,30 +36,21 @@ public class UserPointController {
     @Resource
     private PointRecordService pointRecordService;
 
-    @PutMapping("/update")
-    @Operation(summary = "更新用户积分")
-    @PreAuthorize("@ss.hasPermission('menduner:reward:user-point:update')")
-    public CommonResult<Boolean> updateUser(@Valid @RequestBody UserPointUpdateReqVO updateReqVO) {
-        userService.updateUser(updateReqVO);
-        return success(true);
-    }
-
-
     @PutMapping("/update-point")
-    @Operation(summary = "更新用户积分")
+    @Operation(summary = "修改用户的积分")
     @PreAuthorize("@ss.hasPermission('menduner:reward:user-point:update')")
     public CommonResult<Boolean> updateUserPoint(@Valid @RequestBody UserPointUpdateReqVO updateReqVO) {
-
+        pointRecordService.createPointRecord(updateReqVO.getUserId(),
+                null,
+                null,
+                MathOperationEnum.ADD.getOperator().equals(updateReqVO.getOperation())
+                        ? MathOperationEnum.ADD : MathOperationEnum.SUBTRACT,
+                updateReqVO.getPoint(),
+                PointBizTypeEnum.ADMIN,
+                String.valueOf(updateReqVO.getUserId()));
         return success(true);
     }
 
-    @PutMapping("/update-balance")
-    @Operation(summary = "更新用户积分余额")
-    @PreAuthorize("@ss.hasPermission('menduner:reward:user-point:update')")
-    public CommonResult<Boolean> updateUserBalance(@Valid @RequestBody Long id) {
-        // todo @jason:增加一个【修改余额】
-        return success(true);
-    }
 
     @GetMapping("/get")
     @Operation(summary = "获得用户积分")

+ 51 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/record/AppPointRecordController.java

@@ -0,0 +1,51 @@
+package com.citu.module.menduner.reward.controller.app.record;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.reward.controller.app.record.vo.AppPointRecordRespVO;
+import com.citu.module.menduner.reward.controller.base.record.PointRecordPageReqVO;
+import com.citu.module.menduner.reward.controller.base.record.PointRecordRespVO;
+import com.citu.module.menduner.reward.convert.PointRecordConvert;
+import com.citu.module.menduner.reward.dal.dataobject.record.PointRecordDO;
+import com.citu.module.menduner.reward.service.record.PointRecordService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
+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 static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "求职者 - 积分记录")
+@RestController
+@RequestMapping("/menduner/reward/point/record")
+@Validated
+public class AppPointRecordController {
+
+    @Resource
+    private PointRecordService pointRecordService;
+
+
+    @GetMapping("/page")
+    @PreAuthenticated
+    @Operation(summary = "获得用户积分记录分页")
+    public CommonResult<PageResult<AppPointRecordRespVO>> page(PageParam pageVO) {
+        // 执行分页查询
+        PageResult<PointRecordDO> pageResult =
+                pointRecordService.page(LoginUserContext.getUserId(),pageVO);
+        if (CollectionUtils.isEmpty(pageResult.getList())) {
+            return success(PageResult.empty(pageResult.getTotal()));
+        }
+        return success(PointRecordConvert.INSTANCE.convertPage2(pageResult));
+    }
+
+}

+ 11 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/record/vo/AppPointRecordRespVO.java

@@ -0,0 +1,11 @@
+package com.citu.module.menduner.reward.controller.app.record.vo;
+
+import com.citu.module.menduner.reward.controller.base.record.PointRecordRespVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "menduner - 用户积分记录 Response VO")
+@Data
+public class AppPointRecordRespVO extends PointRecordRespVO {
+
+}

+ 37 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/app/user/AppUserPointController.java

@@ -0,0 +1,37 @@
+package com.citu.module.menduner.reward.controller.app.user;
+
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.security.core.annotations.PreAuthenticated;
+import com.citu.module.menduner.common.util.LoginUserContext;
+import com.citu.module.menduner.reward.dal.dataobject.user.UserPointDO;
+
+import com.citu.module.menduner.reward.service.user.UserPointService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "求职者 - 用户积分")
+@RestController
+@RequestMapping("/menduner/reward/user-point")
+@Validated
+public class AppUserPointController {
+
+    @Resource
+    private UserPointService userService;
+
+
+    @GetMapping("/get")
+    @Operation(summary = "获得用户积分")
+    @PreAuthenticated
+    public CommonResult<Integer> get() {
+        UserPointDO user =
+                userService.createUserPointIfAbsent(LoginUserContext.getUserId());
+        return success(user.getPoint());
+    }
+}

+ 8 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventTrackPointRespVO.java

@@ -1,10 +1,17 @@
 package com.citu.module.menduner.reward.controller.base.event;
 
 import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
+
 
-@Schema(description = "事件跟踪积分 Response VO")
 @Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Schema(description = "事件跟踪积分 Response VO")
 public class EventTrackPointRespVO {
 
     @Schema(description = "是否匹配")

+ 3 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/user/UserPointUpdateReqVO.java

@@ -15,6 +15,9 @@ public class UserPointUpdateReqVO {
     @NotNull(message = "{1_110_000_003}")
     private Long userId;
 
+    @Schema(description = "递增、递减", requiredMode = Schema.RequiredMode.REQUIRED, example = "+")
+    private String operation;
+
     @Schema(description = "变动积分,正数为增加,负数为减少", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
     @NotNull(message = "{1_110_005_003}")
     private Integer point;

+ 2 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/PointRecordConvert.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.reward.convert;
 
 import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.reward.controller.app.record.vo.AppPointRecordRespVO;
 import com.citu.module.menduner.reward.controller.base.record.PointRecordRespVO;
 import com.citu.module.menduner.reward.dal.dataobject.record.PointRecordDO;
 import org.mapstruct.Mapper;
@@ -14,5 +15,6 @@ public interface PointRecordConvert {
 
     PageResult<PointRecordRespVO> convertPage(PageResult<PointRecordDO> pageResult);
 
+    PageResult<AppPointRecordRespVO> convertPage2(PageResult<PointRecordDO> pageResult);
 
 }

+ 2 - 2
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/config/PointRuleConfigMapper.java

@@ -50,8 +50,8 @@ public interface PointRuleConfigMapper extends BaseMapperX<PointRuleConfigDO> {
         );
     }
 
-    default PointRuleConfigDO selectByUrlAndStatus(String url, PointRuleConfigStatusEnum status) {
-        return selectOne(new LambdaQueryWrapperX<PointRuleConfigDO>()
+    default List<PointRuleConfigDO> selectByUrlAndStatus(String url, PointRuleConfigStatusEnum status) {
+        return selectList(new LambdaQueryWrapperX<PointRuleConfigDO>()
                 .eq(PointRuleConfigDO::getUrl, url)
                 .eq(PointRuleConfigDO::getStatus, status.getStatus())
                 .orderByDesc(PointRuleConfigDO::getSort)

+ 2 - 2
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/event/EventRecordMapper.java

@@ -34,11 +34,11 @@ public interface EventRecordMapper extends BaseMapperX<EventRecordDO> {
                 .eq(EventRecordDO::getUrl, url);
 
         if (null != startDate) {
-            wrapperX.le(EventRecordDO::getDate, startDate);
+            wrapperX.ge(EventRecordDO::getDate, startDate);
         }
 
         if (null != endDate) {
-            wrapperX.lt(EventRecordDO::getDate, endDate);
+            wrapperX.le(EventRecordDO::getDate, endDate);
         }
 
         return selectList(wrapperX);

+ 35 - 2
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/record/PointRecordMapper.java

@@ -1,5 +1,6 @@
 package com.citu.module.menduner.reward.dal.mysql.record;
 
+import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.mybatis.core.mapper.BaseMapperX;
 import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -7,7 +8,8 @@ import com.citu.module.menduner.reward.controller.base.record.PointRecordPageReq
 import com.citu.module.menduner.reward.dal.dataobject.record.PointRecordDO;
 import org.apache.ibatis.annotations.Mapper;
 
-import java.util.Set;
+import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * 用户积分记录 Mapper
@@ -22,8 +24,39 @@ public interface PointRecordMapper extends BaseMapperX<PointRecordDO> {
                 .eqIfPresent(PointRecordDO::getUserId, reqVO.getUserId())
                 .eqIfPresent(PointRecordDO::getBizType, reqVO.getBizType())
                 .likeIfPresent(PointRecordDO::getTitle, reqVO.getTitle())
-                .orderByDesc(PointRecordDO::getId));
+                .orderByDesc(PointRecordDO::getCreateTime));
     }
 
+    /**
+     * 获取一定时间范围内的用户积分记录
+     * @param userId 用户id
+     * @param url 事件地址
+     * @param startDate 开始时间
+     * @param endDate 结束时间
+     * @return List<PointRecordDO>
+     **/
+    default List<PointRecordDO> getUserPointList(Long userId,
+                                                 String url,
+                                                 LocalDateTime startDate,
+                                                 LocalDateTime endDate) {
+        LambdaQueryWrapperX<PointRecordDO> wrapperX = new LambdaQueryWrapperX<PointRecordDO>();
+        wrapperX.eq(PointRecordDO::getUserId, userId);
+        wrapperX.eqIfPresent(PointRecordDO::getUrl, url);
+        if (null != startDate) {
+            wrapperX.ge(PointRecordDO::getCreateTime, startDate);
+        }
+
+        if (null != endDate) {
+            wrapperX.le(PointRecordDO::getCreateTime, endDate);
+        }
+
+        return selectList(wrapperX);
+    }
+
+    default PageResult<PointRecordDO> selectPageByUserId(Long userId, PageParam pageVO) {
+        return selectPage(pageVO, new LambdaQueryWrapperX<PointRecordDO>()
+                .eq(PointRecordDO::getUserId, userId)
+                .orderByDesc(PointRecordDO::getCreateTime));
+    }
 
 }

+ 8 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/redis/RedisKeyConstants.java

@@ -16,6 +16,14 @@ public interface RedisKeyConstants {
      */
     String POINT_RULE_CONFIG = "point_rule_config";
 
+    /**
+     * 点击指标数量
+     * <p>
+     * KEY 格式:click_metric_count:{userId_url_metric}
+     * VALUE 数据类型:String 事件数量统计
+     */
+    String EVENT_RECORD_COUNT = "click_metric_count";
+
 
 
 }

+ 1 - 6
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/mq/consumer/UserPointConsumer.java

@@ -29,14 +29,11 @@ public class UserPointConsumer implements RocketMQListener<UserPointSendMessage>
     @Resource
     private PointRecordService pointRecordService;
 
-    @Resource
-    private EventRecordService eventRecordService;
-
     @Override
     @DSTransactional
     public void onMessage(UserPointSendMessage message) {
         log.info("接收到队列消息[{}]", message);
-        // 增加积分
+        // 增加用户积分
         pointRecordService.createPointRecord(
                 message.getUserId(),
                 message.getUrl(),
@@ -45,8 +42,6 @@ public class UserPointConsumer implements RocketMQListener<UserPointSendMessage>
                 message.getPoint(),
                 message.getBizType(),
                 message.getBizId());
-        // 增加点击数
-        eventRecordService.createEventRecord( message.getUserId(), message.getUrl());
         log.info("消息处理完备[{}]", message);
     }
 

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigService.java

@@ -59,7 +59,7 @@ public interface PointRuleConfigService {
      * @param url 事件地址
      * @return 积分规则配置
      */
-    PointRuleConfigDO getByUrl(String url);
+    List<PointRuleConfigDO> getByUrlList(String url);
 
     /**
      * 获取已上线的积分规则配置

+ 9 - 9
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigServiceImpl.java

@@ -40,10 +40,10 @@ public class PointRuleConfigServiceImpl implements PointRuleConfigService {
         // 插入
         PointRuleConfigDO pointRuleConfig = BeanUtils.toBean(createReqVO, PointRuleConfigDO.class);
         pointRuleConfig.setStatus(PointRuleConfigStatusEnum.ENABLE.getStatus());
-        PointRuleConfigDO exist = mapper.existByUrl(pointRuleConfig.getUrl(),null);
-        if (null != exist) {
-            throw exception(POINT_RULE_CONFIG_URL_EXISTS);
-        }
+        //        PointRuleConfigDO exist = mapper.existByUrl(pointRuleConfig.getUrl(),null);
+        //        if (null != exist) {
+        //            throw exception(POINT_RULE_CONFIG_URL_EXISTS);
+        //        }
         mapper.insert(pointRuleConfig);
         // 返回
         return pointRuleConfig.getId();
@@ -56,10 +56,10 @@ public class PointRuleConfigServiceImpl implements PointRuleConfigService {
         // 校验存在
         validatePointRuleConfigExists(updateReqVO.getId());
         // 效验是否重复
-        PointRuleConfigDO exist = mapper.existByUrl(updateReqVO.getUrl(),updateReqVO.getId());
-        if (null != exist) {
-            throw exception(POINT_RULE_CONFIG_URL_EXISTS);
-        }
+        //        PointRuleConfigDO exist = mapper.existByUrl(updateReqVO.getUrl(),updateReqVO.getId());
+        //        if (null != exist) {
+        //            throw exception(POINT_RULE_CONFIG_URL_EXISTS);
+        //        }
         // 更新
         PointRuleConfigDO updateObj = BeanUtils.toBean(updateReqVO, PointRuleConfigDO.class);
         mapper.updateById(updateObj);
@@ -94,7 +94,7 @@ public class PointRuleConfigServiceImpl implements PointRuleConfigService {
     @Override
     @Cacheable(value = RedisKeyConstants.POINT_RULE_CONFIG, key = "#url",
             unless = "#result == null")
-    public PointRuleConfigDO getByUrl(String url) {
+    public List<PointRuleConfigDO> getByUrlList(String url) {
         return mapper.selectByUrlAndStatus(url, PointRuleConfigStatusEnum.ENABLE);
     }
 

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

@@ -67,8 +67,9 @@ public interface EventRecordService {
     /**
      * 创建事件记录
      *
-     * @param userId      用户id
-     * @param url         事件地址
+     * @param userId 用户id
+     * @param url    事件地址
      */
     void createEventRecord(Long userId, String url);
+
 }

+ 25 - 6
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventRecordServiceImpl.java

@@ -2,6 +2,7 @@ package com.citu.module.menduner.reward.service.event;
 
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.module.menduner.reward.controller.base.event.EventRecordPageReqVO;
@@ -9,6 +10,8 @@ import com.citu.module.menduner.reward.controller.base.event.EventRecordSaveReqV
 import com.citu.module.menduner.reward.dal.dataobject.event.EventMetricDO;
 import com.citu.module.menduner.reward.dal.dataobject.event.EventRecordDO;
 import com.citu.module.menduner.reward.dal.mysql.event.EventRecordMapper;
+import com.citu.module.menduner.reward.enums.event.EventMetricTypeEnum;
+import com.citu.module.menduner.reward.service.record.PointRecordService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
@@ -21,7 +24,6 @@ import java.util.List;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.EVENT_RECORD_NOT_EXISTS;
-import static com.citu.module.menduner.reward.enums.EventMetricConstants.*;
 
 /**
  * 事件记录 Service 实现类
@@ -39,6 +41,9 @@ public class EventRecordServiceImpl implements EventRecordService {
     @Resource
     private EventMetricService eventMetricService;
 
+    @Resource
+    private PointRecordService pointRecordService;
+
 
     @Override
     public Long createEventRecord(EventRecordSaveReqVO createReqVO) {
@@ -85,7 +90,13 @@ public class EventRecordServiceImpl implements EventRecordService {
     public LocalDateTime[] generateDateRange(EventMetricDO eventMetric) {
         LocalDateTime[] dateRange = new LocalDateTime[2];
         LocalDate date = LocalDate.now();
-        switch (eventMetric.getValue()) {
+        EventMetricTypeEnum type = EventMetricTypeEnum.getTypeEnum(eventMetric.getType());
+        switch (type) {
+            case HOUR:
+                LocalDateTime time = LocalDateTime.now();
+                dateRange[0] = time.withMinute(0).withSecond(0).withNano(0);
+                dateRange[1] = time.withMinute(59).withSecond(59).withNano(999999999);
+                break;
             case TODAY:
                 dateRange[0] = date.atStartOfDay();
                 dateRange[1] = date.atTime(LocalTime.MAX);
@@ -109,9 +120,14 @@ public class EventRecordServiceImpl implements EventRecordService {
 
     @Override
     public Integer getEventCount(Long userId, String url, String metricValue) {
-        //TODO 加上缓存 从缓存调用
+        //TODO 读多写多场景,不好使用缓存,暂时查库
         EventMetricDO eventMetric = eventMetricService.getByValue(metricValue);
         LocalDateTime[] dateRange = generateDateRange(eventMetric);
+        if (eventMetric.getValue().contains("event")) {
+            return pointRecordService.getPointCount(userId, url, dateRange[0], dateRange[1]);
+        } else if (eventMetric.getValue().contains("point")) {
+            return pointRecordService.getPointCount(userId, null, dateRange[0], dateRange[1]);
+        }
         List<EventRecordDO> list = eventRecordMapper.getList(userId, url, dateRange[0], dateRange[1]);
         if (ObjectUtil.isEmpty(list)) {
             return 0;
@@ -120,12 +136,14 @@ public class EventRecordServiceImpl implements EventRecordService {
     }
 
     @Override
+    @DSTransactional
     public void createEventRecord(Long userId, String url) {
-        //TODO 加上缓存 读写一致
+        //TODO 读多写多场景,不好使用缓存,暂时直接写库
+
         // 查询今天记录
         EventRecordDO record =
                 eventRecordMapper.get(userId, url, LocalDate.now().atStartOfDay());
-        if(null == record) {
+        if (null == record) {
             // 没有今天的记录
             //新增
             eventRecordMapper.insert(EventRecordDO.builder()
@@ -134,10 +152,11 @@ public class EventRecordServiceImpl implements EventRecordService {
                     .date(LocalDate.now().atStartOfDay())
                     .count(1)
                     .build());
-        }else {
+        } else {
             // 修改次数
             record.setCount(record.getCount() + 1);
             eventRecordMapper.updateById(record);
         }
     }
+
 }

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackService.java

@@ -21,7 +21,7 @@ public interface EventTrackService {
      * 点击事件跟踪
      * @param url
      **/
-    EventTrackPointRespVO click(String url) throws Exception;
+    List<EventTrackPointRespVO> click(String url) throws Exception;
 
     /**
      * 获取menduner相关服务的url地址

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

@@ -1,5 +1,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.util.LoginUserContext;
 import com.citu.module.menduner.reward.controller.base.common.TreeRespVO;
@@ -26,10 +28,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static com.citu.module.menduner.reward.enums.EasyRulesConstants.*;
@@ -51,7 +50,6 @@ public class EventTrackServiceImpl implements EventTrackService {
     @Resource
     private EventRecordService eventRecordService;
 
-
     @Resource
     private MendunerSystemUrlApi mendunerSystemUrlApi;
 
@@ -103,60 +101,108 @@ public class EventTrackServiceImpl implements EventTrackService {
     }
 
     @Override
-    public EventTrackPointRespVO click(String url) throws Exception {
-
-        // 初始化响应对象
-        EventTrackPointRespVO respVO = new EventTrackPointRespVO();
+    @DSTransactional
+    public List<EventTrackPointRespVO> click(String url) {
+        List<EventTrackPointRespVO> respVOList = new ArrayList<>();
         // 获取当前登录用户信息
         LoginUser loginUser = LoginUserContext.get2();
-        if (null == loginUser) {
-            // 如果用户未登录,返回空
-            return respVO;
+
+        if (loginUser == null) {
+            // 若用户未登录,返回一个空的响应对象
+            return Collections.singletonList(EventTrackPointRespVO.builder().build());
+        }
+
+        // 获取指定URL的积分规则配置列表
+        List<PointRuleConfigDO> configList = ruleConfigService.getByUrlList(url);
+
+        if (CollectionUtil.isEmpty(configList)) {
+            // 若未找到该URL的配置规则,同样返回一个空的响应对象
+            return Collections.singletonList(EventTrackPointRespVO.builder().build());
         }
 
-        // 根据URL获取积分规则配置信息
-        PointRuleConfigDO config = ruleConfigService.getByUrl(url);
-        if (null == config) {
-            // 如果配置信息不存在,返回空
-            return respVO;
+        // 遍历处理每个积分规则配置
+        for (PointRuleConfigDO config : configList) {
+            // 处理单个积分规则
+            EventTrackPointRespVO respVO = processPointRule(config, loginUser, url);
+            // 将处理结果添加到响应列表中
+            respVOList.add(respVO);
         }
 
-        // 获取触发参数映射
-        Map<String, Object> triggerMap =
-                getRuleContextMap(loginUser.getId(), config.getUrl(), config.getTriggerRule());
+        return respVOList;
+    }
 
+    /**
+     * 处理单个积分规则
+     *
+     * @param config    规则配置
+     * @param loginUser 操作用户
+     * @param url       事件地址
+     * @return EventTrackPointRespVO
+     **/
+    private EventTrackPointRespVO processPointRule(PointRuleConfigDO config, LoginUser loginUser, String url) {
+        EventTrackPointRespVO respVO = new EventTrackPointRespVO();
+        // 获取触发规则的执行上下文信息
+        Map<String, Object> triggerMap = getRuleContextMap(loginUser.getId(), config.getUrl(), config.getTriggerRule());
         // 创建积分规则对象
         PointRule pointRule = createPointRule(config, triggerMap, null);
 
-        // 设置响应对象的基本信息
+        // 设置响应对象的属性
         respVO.setTitle(config.getTitle());
         respVO.setOperation(pointRule.getOperation());
         respVO.setType(config.getType());
         respVO.setPoint(pointRule.getPoint());
 
-        // 执行规则匹配和响应处理
+        // 执行规则匹配和相关操作
+        execute(pointRule, loginUser, config, url, respVO);
+        // 调用服务记录事件访问
+        eventRecordService.createEventRecord(loginUser.getId(), url);
+
+        return respVO;
+    }
+
+    /**
+     * 执行规则匹配和相关操作
+     *
+     * @param pointRule 规则对象
+     * @param loginUser 操作用户
+     * @param config    规则配置
+     * @param url       事件地址
+     * @param respVO    响应对象
+     **/
+    private void execute(PointRule pointRule, LoginUser loginUser, PointRuleConfigDO config,
+                         String url, EventTrackPointRespVO respVO) {
         DynamicRuleAction<PointRule> action = (t) -> {
-            // 发送消息
-            userPointProducer.send(UserPointSendMessage.builder()
-                    .userId(loginUser.getId())
-                    .url(url)
-                    .title(config.getTitle())
-                    .operation(MathOperationEnum.ADD.getOperator().equals(config.getOperation())
-                            ? MathOperationEnum.ADD : MathOperationEnum.SUBTRACT)
-                    .point(t.getPoint())
-                    .bizType(PointBizTypeEnum.EVENT)
-                    .bizId(String.valueOf(config.getId()))
-                    .build()
-            );
-            // 标记匹配成功
+            // 发送用户积分变更消息
+            userPointProducer.send(buildUserPointSendMessage(loginUser, config, t, url));
+            // 标记规则匹配成功
             respVO.match();
-
         };
-        // 匹配
+        // 执行规则匹配
         match(pointRule, action);
+    }
 
-        // 返回响应对象
-        return respVO;
+
+    /**
+     * 构建用户积分变更消息对象
+     *
+     * @param loginUser 操作用户
+     * @param config    规则配置
+     * @param pointRule 规则对象
+     * @param url       事件地址
+     * @return UserPointSendMessage
+     **/
+    private UserPointSendMessage buildUserPointSendMessage(LoginUser loginUser, PointRuleConfigDO config,
+                                                           PointRule pointRule, String url) {
+        return UserPointSendMessage.builder()
+                .userId(loginUser.getId())
+                .url(url)
+                .title(config.getTitle())
+                .operation(MathOperationEnum.ADD.getOperator().equals(config.getOperation())
+                        ? MathOperationEnum.ADD : MathOperationEnum.SUBTRACT) // 确定操作类型(加法或减法)
+                .point(pointRule.getPoint())
+                .bizType(PointBizTypeEnum.EVENT)
+                .bizId(String.valueOf(config.getId()))
+                .build();
     }
 
 
@@ -211,9 +257,7 @@ public class EventTrackServiceImpl implements EventTrackService {
 
     /**
      * 执行匹配
-     *
      * @param pointRule 积分规则对象
-     * @return void
      **/
     private void match(PointRule pointRule,
                        DynamicRuleAction<PointRule> action) {

+ 26 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordService.java

@@ -1,11 +1,15 @@
 package com.citu.module.menduner.reward.service.record;
 
+import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.reward.controller.base.record.PointRecordPageReqVO;
 import com.citu.module.menduner.reward.dal.dataobject.record.PointRecordDO;
 import com.citu.module.menduner.reward.enums.MathOperationEnum;
 import com.citu.module.menduner.reward.enums.record.PointBizTypeEnum;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
 
 /**
  * 用户积分记录 Service 接口
@@ -42,4 +46,26 @@ public interface PointRecordService {
                            PointBizTypeEnum bizType,
                            String bizId);
 
+
+    /**
+     * 获取一段时间内的用户积分获得的数量
+     * @author Rayson
+     * @param userId 用户id
+     * @param url 事件地址
+     * @param startDate 开始时间
+     * @param endDate 结束时间
+     * @date 2024/6/28 上午10:06
+     * @return Integer
+     **/
+    Integer getPointCount(Long userId,String url, LocalDateTime startDate, LocalDateTime endDate);
+
+    // ========== 求职者 ==========
+
+    /**
+     * 分页获取当前用户积分记录
+     * @param userId 用户id
+     * @param pageVO 分页
+     * @return PageResult<PointRecordDO>
+     **/
+    PageResult<PointRecordDO> page(Long userId,PageParam pageVO);
 }

+ 17 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordServiceImpl.java

@@ -3,6 +3,7 @@ package com.citu.module.menduner.reward.service.record;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.citu.framework.common.pojo.PageParam;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.module.menduner.reward.controller.base.record.PointRecordPageReqVO;
 import com.citu.module.menduner.reward.dal.dataobject.record.PointRecordDO;
@@ -16,6 +17,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.USER_POINT_NOT_ENOUGH;
@@ -98,4 +101,18 @@ public class PointRecordServiceImpl implements PointRecordService {
         }
         mapper.insert(record);
     }
+
+    @Override
+    public Integer getPointCount(Long userId, String url, LocalDateTime startDate, LocalDateTime endDate) {
+        List<PointRecordDO> list = mapper.getUserPointList(userId, url, startDate, endDate);
+        if (ObjectUtil.isEmpty(list)) {
+            return 0;
+        }
+        return list.stream().mapToInt(PointRecordDO::getPoint).sum();
+    }
+
+    @Override
+    public PageResult<PointRecordDO> page(Long userId, PageParam pageVO) {
+        return mapper.selectPageByUserId(userId,pageVO);
+    }
 }