Bläddra i källkod

1、完善部分积分规则处理逻辑

rayson 1 år sedan
förälder
incheckning
2823422fc9
13 ändrade filer med 151 tillägg och 73 borttagningar
  1. 1 0
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/ErrorCodeConstants.java
  2. 6 13
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/record/PointBizTypeEnum.java
  3. 2 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventTrackController.java
  4. 11 3
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/config/PointRuleConfigMapper.java
  5. 2 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/redis/RedisKeyConstants.java
  6. 2 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigService.java
  7. 17 4
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigServiceImpl.java
  8. 5 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackService.java
  9. 92 43
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java
  10. 4 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordServiceImpl.java
  11. 7 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInRecordServiceImpl.java
  12. 1 0
      menduner/menduner-reward-biz/src/main/resources/i18n/messages_en_US.properties
  13. 1 1
      menduner/menduner-reward-biz/src/main/resources/i18n/messages_zh_CN.properties

+ 1 - 0
menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/ErrorCodeConstants.java

@@ -30,6 +30,7 @@ public interface ErrorCodeConstants {
     ErrorCode POINT_RULE_CONFIG_OPERATION_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_001_005, "数学运算符不能为空");
     ErrorCode POINT_RULE_CONFIG_POINT_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_001_006, "积分数量不能为空");
     ErrorCode POINT_RULE_CONFIG_TRIGGER_RULE_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_001_007, "触发规则不能为空");
+    ErrorCode POINT_RULE_CONFIG_URL_EXISTS = new ErrorCode(1_110_001_008, "事件地址已存在配置");
 
     //========== 积分记录 1_110_002_000 ==========
     ErrorCode POINT_RECORD_BIZ_NOT_SUPPORT = new ErrorCode(1_110_002_001, "用户积分记录业务类型不支持");

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

@@ -19,14 +19,7 @@ public enum PointBizTypeEnum implements IntArrayValuable {
     SIGN(1, "签到", "签到获得 {} 积分", true),
     ADMIN(2, "管理员修改", "管理员修改 {} 积分", true),
 
-    ORDER_USE(11, "订单积分抵扣", "下单使用 {} 积分", false), // 下单时,扣减积分
-    ORDER_USE_CANCEL(12, "订单积分抵扣(整单取消)", "订单取消,退还 {} 积分", true), // ORDER_USE 的取消
-    ORDER_USE_CANCEL_ITEM(13, "订单积分抵扣(单个退款)", "订单退款,退还 {} 积分", true), // ORDER_USE 的取消
-
-    ORDER_GIVE(21, "订单积分奖励", "下单获得 {} 积分", true), // 支付订单时,赠送积分
-    ORDER_GIVE_CANCEL(22, "订单积分奖励(整单取消)", "订单取消,退还 {} 积分", false), // ORDER_GIVE 的取消
-    ORDER_GIVE_CANCEL_ITEM(23, "订单积分奖励(单个退款)", "订单退款,扣除赠送的 {} 积分", false) // ORDER_GIVE 的取消
-    ;
+    EVENT(3, "事件跟踪", "访问 {} 事件,{}{} 积分", true);
 
     /**
      * 类型
@@ -45,14 +38,14 @@ public enum PointBizTypeEnum implements IntArrayValuable {
      */
     private final boolean add;
 
-    @Override
-    public int[] array() {
-        return new int[0];
-    }
-
     public static PointBizTypeEnum getByType(Integer type) {
         return EnumUtil.getBy(PointBizTypeEnum.class,
                 e -> Objects.equals(type, e.getType()));
     }
 
+    @Override
+    public int[] array() {
+        return new int[0];
+    }
+
 }

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

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

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

@@ -26,7 +26,7 @@ public interface PointRuleConfigMapper extends BaseMapperX<PointRuleConfigDO> {
                 .eqIfPresent(PointRuleConfigDO::getOperation, reqVO.getOperation())
                 .eqIfPresent(PointRuleConfigDO::getStatus, reqVO.getStatus())
                 .betweenIfPresent(PointRuleConfigDO::getCreateTime, reqVO.getCreateTime())
-                .orderByDesc(PointRuleConfigDO::getId));
+                .orderByDesc(PointRuleConfigDO::getUpdateTime));
     }
 
     default List<PointRuleConfigDO> selectList() {
@@ -42,10 +42,18 @@ public interface PointRuleConfigMapper extends BaseMapperX<PointRuleConfigDO> {
         );
     }
 
-    default PointRuleConfigDO selectByIdAndStatus(Long id, PointRuleConfigStatusEnum status) {
+    default PointRuleConfigDO existByUrl(String url,Long id) {
         return selectOne(new LambdaQueryWrapperX<PointRuleConfigDO>()
-                .eq(PointRuleConfigDO::getId, id)
+                .eq(PointRuleConfigDO::getUrl, url)
+                .neIfPresent(PointRuleConfigDO::getId, id)
+        );
+    }
+
+    default PointRuleConfigDO selectByUrlAndStatus(String url, PointRuleConfigStatusEnum status) {
+        return selectOne(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/redis/RedisKeyConstants.java

@@ -11,8 +11,8 @@ public interface RedisKeyConstants {
     /**
      * 积分规则配置
      * <p>
-     * KEY 格式:point_rule_config:{id}
-     * VALUE 数据类型:String 角色信息
+     * KEY 格式:point_rule_config:{url}
+     * VALUE 数据类型:String 积分规则配置
      */
     String POINT_RULE_CONFIG = "point_rule_config";
 

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

@@ -56,10 +56,10 @@ public interface PointRuleConfigService {
     /**
      * 根据id查询已上线的积分规则配置
      *
-     * @param id 编号
+     * @param url 事件地址
      * @return 积分规则配置
      */
-    PointRuleConfigDO get(Long id);
+    PointRuleConfigDO getByUrl(String url);
 
     /**
      * 获取已上线的积分规则配置

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

@@ -20,6 +20,7 @@ import java.util.List;
 
 import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.POINT_RULE_CONFIG_NOT_EXISTS;
+import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.POINT_RULE_CONFIG_URL_EXISTS;
 
 /**
  * 积分规则配置 Service 实现类
@@ -34,26 +35,38 @@ public class PointRuleConfigServiceImpl implements PointRuleConfigService {
     private PointRuleConfigMapper mapper;
 
     @Override
+    @DSTransactional
     public Long createPointRuleConfig(PointRuleConfigSaveReqVO createReqVO) {
         // 插入
         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);
+        }
         mapper.insert(pointRuleConfig);
         // 返回
         return pointRuleConfig.getId();
     }
 
     @Override
+    @DSTransactional
     @CacheEvict(value = RedisKeyConstants.POINT_RULE_CONFIG, key = "#updateReqVO.id")
     public void updatePointRuleConfig(PointRuleConfigSaveReqVO updateReqVO) {
         // 校验存在
         validatePointRuleConfigExists(updateReqVO.getId());
+        // 效验是否重复
+        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);
     }
 
     @Override
+    @DSTransactional
     @CacheEvict(value = RedisKeyConstants.POINT_RULE_CONFIG, key = "#id")
     public void deletePointRuleConfig(Long id) {
         // 校验存在
@@ -70,7 +83,7 @@ public class PointRuleConfigServiceImpl implements PointRuleConfigService {
 
     @Override
     public PointRuleConfigDO getPointRuleConfig(Long id) {
-        return mapper.selectByIdAndStatus(id,PointRuleConfigStatusEnum.ENABLE);
+        return mapper.selectById(id);
     }
 
     @Override
@@ -79,10 +92,10 @@ public class PointRuleConfigServiceImpl implements PointRuleConfigService {
     }
 
     @Override
-    @Cacheable(value = RedisKeyConstants.POINT_RULE_CONFIG, key = "#id",
+    @Cacheable(value = RedisKeyConstants.POINT_RULE_CONFIG, key = "#url",
             unless = "#result == null")
-    public PointRuleConfigDO get(Long id) {
-        return mapper.selectById(id);
+    public PointRuleConfigDO getByUrl(String url) {
+        return mapper.selectByUrlAndStatus(url, PointRuleConfigStatusEnum.ENABLE);
     }
 
     @Override

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

@@ -19,9 +19,12 @@ public interface EventTrackService {
 
     /**
      * 点击事件跟踪
-     * @param id
+     * @param url
      **/
-    EventTrackPointRespVO click(Long id);
+    EventTrackPointRespVO click(String url);
 
+    /**
+     * 获取menduner相关服务的url地址
+     **/
     List<TreeRespVO<List<TreeRespVO<List<UrlInfoRespVO>>>>> getUrlList();
 }

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

@@ -9,10 +9,14 @@ import com.citu.module.menduner.reward.convert.PointRuleConfigConvert;
 import com.citu.module.menduner.reward.core.EasyRulesEngine;
 import com.citu.module.menduner.reward.core.PointRule;
 import com.citu.module.menduner.reward.core.RuleMatch;
+import com.citu.module.menduner.reward.dal.dataobject.config.Condition;
 import com.citu.module.menduner.reward.dal.dataobject.config.PointRuleConfigDO;
+import com.citu.module.menduner.reward.enums.MathOperationEnum;
+import com.citu.module.menduner.reward.enums.record.PointBizTypeEnum;
 import com.citu.module.menduner.reward.rule.DynamicPointRule;
 import com.citu.module.menduner.reward.rule.DynamicRuleAction;
 import com.citu.module.menduner.reward.service.config.PointRuleConfigService;
+import com.citu.module.menduner.reward.service.record.PointRecordService;
 import com.citu.module.menduner.system.api.url.MendunerSystemUrlApi;
 import com.citu.module.menduner.system.api.url.UrlInfoRespVO;
 import org.jeasy.rules.api.Facts;
@@ -44,6 +48,9 @@ public class EventTrackServiceImpl implements EventTrackService {
     @Resource
     private EventRecordService eventRecordService;
 
+    @Resource
+    private PointRecordService pointRecordService;
+
     @Resource
     private MendunerSystemUrlApi mendunerSystemUrlApi;
 
@@ -86,89 +93,131 @@ public class EventTrackServiceImpl implements EventTrackService {
     }
 
     @Override
-    public EventTrackPointRespVO click(Long id) {
+    public List<TreeRespVO<List<TreeRespVO<List<UrlInfoRespVO>>>>> getUrlList() {
+        List<UrlInfoRespVO> list = mendunerSystemUrlApi.list().getCheckedData();
+        return convertUrlInfoListToTree(list);
+    }
 
+    @Override
+    public EventTrackPointRespVO click(String url) {
+        // 初始化响应对象
         EventTrackPointRespVO respVO = new EventTrackPointRespVO();
 
-        // 用户信息
+        // 获取当前登录用户信息
         LoginUser loginUser = LoginUserContext.get2();
         if (null == loginUser) {
+            // 如果用户未登录,返回空
             return null;
         }
 
-        PointRuleConfigDO config = ruleConfigService.get(id);
+        // 根据URL获取积分规则配置信息
+        PointRuleConfigDO config = ruleConfigService.getByUrl(url);
         if (null == config) {
-            // 不存在
+            // 如果配置信息不存在,返回空
             return null;
         }
 
-        //  解析出当前规则的参数
-        List<String> triggerKeyList = EasyRulesEngine.extractUniqueKeys(config.getTriggerRule());
+        // 获取触发参数映射
+        Map<String, Object> triggerMap =
+                getRuleContextMap(loginUser.getId(), config.getUrl(), config.getTriggerRule());
 
-        // 读取对应数据
-        // 赋值到 context
-        Map<String, Object> triggerMap = new LinkedHashMap<>();
-        for (String key : triggerKeyList) {
-            if (triggerMap.containsKey(key)) {
-                continue;
-            }
-            triggerMap.put(key, eventRecordService.getEventCount(
+        // 创建积分规则对象
+        PointRule pointRule = createPointRule(config, triggerMap, null);
+
+        // 设置响应对象的基本信息
+        respVO.setTitle(pointRule.getRuleName());
+        respVO.setOperation(pointRule.getOperation());
+        respVO.setType(config.getType());
+        respVO.setPoint(pointRule.getPoint());
+
+        // 执行规则匹配和响应处理
+        DynamicRuleAction<PointRule> action = (t) -> {
+            pointRecordService.createPointRecord(
                     loginUser.getId(),
-                    config.getUrl(),
-                    key)
-            );
+                    url,
+                    MathOperationEnum.ADD,
+                    t.getPoint(),
+                    PointBizTypeEnum.EVENT,
+                    String.valueOf(config.getId()));
+            respVO.match();
+        };
+
+        match(pointRule, action);
+
+        // 返回响应对象
+        return respVO;
+    }
+
+
+    /**
+     * 获取规则参数映射
+     *
+     * @param userId    用户id
+     * @param condition 配置
+     * @param url       url
+     * @return Map<String, Object>
+     **/
+    private Map<String, Object> getRuleContextMap(Long userId, String url, Condition condition) {
+        Map<String, Object> map = new LinkedHashMap<>();
+        List<String> keyList = EasyRulesEngine.extractUniqueKeys(condition);
+
+        for (String key : keyList) {
+            if (!map.containsKey(key)) {
+                map.put(key, eventRecordService.getEventCount(userId, url, key));
+            }
         }
 
+        return map;
+    }
+
 
+    /**
+     * 创建积分规则对象
+     *
+     * @param config        配置
+     * @param triggerMap    触发键列表
+     * @param constraintMap 限制键列表
+     * @return PointRule
+     **/
+    private PointRule createPointRule(PointRuleConfigDO config,
+                                      Map<String, Object> triggerMap,
+                                      Map<String, Object> constraintMap) {
         PointRule pointRule = new PointRule();
-        // 基本信息
         pointRule.setRuleId(String.valueOf(config.getId()));
         pointRule.setRuleName(config.getUrl());
         pointRule.setDescription(config.getTitle());
         pointRule.setWhenExpression(RULE_WHEN);
         pointRule.setThenExpression(RULE_THEN);
-
-        // 构造参数
         pointRule.setTriggerRule(EasyRulesEngine.buildWhenExpression(config.getTriggerRule()));
         pointRule.setConstraintRule(EasyRulesEngine.buildWhenExpression(config.getConstraintRule()));
         pointRule.setTriggerContext(triggerMap);
-        pointRule.setConstraintContext(null);
+        pointRule.setConstraintContext(constraintMap);
         pointRule.setOperation(config.getOperation());
         pointRule.setPoint(config.getPoint());
 
+        return pointRule;
+    }
 
-        // 解析器的上下文
+    /**
+     * 执行匹配
+     *
+     * @param pointRule 积分规则对象
+     * @return void
+     **/
+    private void match(PointRule pointRule,
+                       DynamicRuleAction<PointRule> action) {
+        // 创建规则解析器的上下文
         Facts context = new Facts();
         context.put(RULE, new DynamicPointRule(pointRule));
         context.put(RULE_CONFIG, pointRule);
 
-
-        respVO.setTitle(pointRule.getRuleName());
-        respVO.setOperation(pointRule.getOperation());
-        respVO.setType(config.getType());
-        respVO.setPoint(pointRule.getPoint());
-
-        DynamicRuleAction<PointRule> action = (t) -> {
-            // 匹配成功后的逻辑
-            System.out.println("加分:" + t.getPoint());
-            respVO.match();
-        };
         context.put(RULE_ACTION, action);
 
-
-        // 调用
+        // 调用规则引擎进行匹配
         EasyRulesEngine.match(RuleMatch.builder()
                 .facts(context)
                 .ruleBase(pointRule)
                 .build());
-
-        return respVO;
-    }
-
-    @Override
-    public List<TreeRespVO<List<TreeRespVO<List<UrlInfoRespVO>>>>> getUrlList() {
-        List<UrlInfoRespVO> list = mendunerSystemUrlApi.list().getCheckedData();
-        return convertUrlInfoListToTree(list);
     }
 
 }

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

@@ -82,6 +82,10 @@ public class PointRecordServiceImpl implements PointRecordService {
                 .setOperation(operation.getOperator())
                 .setDescription(StrUtil.format(bizType.getDescription(), point))
                 .setPoint(point).setTotalPoint(totalPoint);
+
+        if (PointBizTypeEnum.EVENT.equals(bizType)) {
+            record.setDescription(StrUtil.format(bizType.getDescription(), url, operation.getOperator(), point));
+        }
         mapper.insert(record);
     }
 }

+ 7 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInRecordServiceImpl.java

@@ -72,7 +72,13 @@ public class SignInRecordServiceImpl implements SignInRecordService {
 
         // 4. 增加积分
         if (!ObjectUtils.equalsAny(record.getPoint(), null, 0)) {
-            pointRecordService.createPointRecord(userId, null, MathOperationEnum.ADD,record.getPoint(), PointBizTypeEnum.SIGN, String.valueOf(record.getId()));
+            pointRecordService.createPointRecord(
+                    userId,
+                    null,
+                    MathOperationEnum.ADD,
+                    record.getPoint(),
+                    PointBizTypeEnum.SIGN,
+                    String.valueOf(record.getId()));
         }
         return record;
     }

+ 1 - 0
menduner/menduner-reward-biz/src/main/resources/i18n/messages_en_US.properties

@@ -28,6 +28,7 @@
 1_110_001_005=Mathematical operator cannot be empty
 1_110_001_006=The number of points cannot be empty
 1_110_001_007=Trigger rule cannot be empty
+1_110_001_008=Event address already exists in configuration
 # ========== 积分记录 1_110_002_000 ==========
 1_110_002_001=User point record business type not supported
 # ========== 签到配置 1_110_003_000 ==========

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

@@ -28,7 +28,7 @@
 1_110_001_005=数学运算符不能为空
 1_110_001_006=积分数量不能为空
 1_110_001_007=触发规则不能为空
-1_110_001_008=状态不能为空
+1_110_001_008=事件地址已存在配置
 #========== 积分记录 1_110_002_000 ==========
 1_110_002_001=用户积分记录业务类型不支持
 # ========== 签到配置 1_110_003_000 ==========