Forráskód Böngészése

1、增加事件记录
2、增加事件指标
3、完善部分事件跟踪点击后逻辑

rayson 1 éve
szülő
commit
aca814c515
47 módosított fájl, 1508 hozzáadás és 87 törlés
  1. 1 1
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/EasyRulesConstants.java
  2. 8 0
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/ErrorCodeConstants.java
  3. 18 0
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/EventMetricConstants.java
  4. 19 0
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/MathOperationEnum.java
  5. 0 21
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/event/EventIndicatorEnum.java
  6. 1 19
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/common/CommonController.java
  7. 102 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventMetricController.java
  8. 94 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventRecordController.java
  9. 1 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventTrackController.java
  10. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/record/PointRecordController.java
  11. 4 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/config/PointRuleConfigRespVO.java
  12. 4 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/config/PointRuleConfigSaveReqVO.java
  13. 42 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventMetricPageReqVO.java
  14. 47 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventMetricRespVO.java
  15. 39 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventMetricSaveReqVO.java
  16. 37 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventRecordPageReqVO.java
  17. 44 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventRecordRespVO.java
  18. 36 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventRecordSaveReqVO.java
  19. 7 3
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventTrackPointRespVO.java
  20. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/config/SignInConfigUpdateReqVO.java
  21. 3 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/user/UserPointBaseVO.java
  22. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/user/UserPointSaveReqVO.java
  23. 2 2
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/user/UserPointUpdateReqVO.java
  24. 16 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/EventMetricConvert.java
  25. 4 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/core/EasyRulesEngine.java
  26. 4 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/config/PointRuleConfigDO.java
  27. 54 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/event/EventMetricDO.java
  28. 52 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/event/EventRecordDO.java
  29. 46 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/event/EventMetricMapper.java
  30. 50 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/event/EventRecordMapper.java
  31. 4 4
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/rule/DynamicPointRule.java
  32. 68 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventMetricService.java
  33. 87 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventMetricServiceImpl.java
  34. 66 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventRecordService.java
  35. 116 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventRecordServiceImpl.java
  36. 35 7
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java
  37. 9 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordService.java
  38. 42 16
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordServiceImpl.java
  39. 2 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInRecordServiceImpl.java
  40. 8 1
      menduner/menduner-reward-biz/src/main/resources/i18n/messages_en_US.properties
  41. 7 0
      menduner/menduner-reward-biz/src/main/resources/i18n/messages_zh_CN.properties
  42. 1 2
      menduner/menduner-reward-biz/src/test/java/com/citu/module/menduner/reward/service/config/PointRuleConfigServiceImplCommonController.java
  43. 148 0
      menduner/menduner-reward-biz/src/test/java/com/citu/module/menduner/reward/service/event/EventMetricServiceImplTest.java
  44. 139 0
      menduner/menduner-reward-biz/src/test/java/com/citu/module/menduner/reward/service/event/EventRecordServiceImplTest.java
  45. 3 1
      menduner/menduner-reward-biz/src/test/resources/sql/clean.sql
  46. 34 1
      menduner/menduner-reward-biz/src/test/resources/sql/create_tables.sql
  47. 1 1
      menduner/menduner-system-api/src/main/java/com/citu/module/menduner/system/enums/MendunerStatusEnum.java

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

@@ -36,7 +36,7 @@ public class EasyRulesConstants {
     public static final String RULE_CONFIG = "config";
     public static final String RULE_ACTION = "action";
     public static final String RULE_WHEN = RULE + ".when()";
-    public static final String RULE_THEN = RULE + ".invoke("+RULE_CONFIG+")";
+    public static final String RULE_THEN = RULE_ACTION + ".invoke("+RULE_CONFIG+")";
 
 
 }

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

@@ -18,6 +18,8 @@ public interface ErrorCodeConstants {
 
     // ========== 公共配置  1_110_000_000 ==========
     ErrorCode POINT_RULE_CONFIG_STATUS_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_000_001, "状态不能为空");
+    ErrorCode POINT_RULE_CONFIG_ID_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_000_002, "id不能为空");
+    ErrorCode USER_ID_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_000_003, "用户id不能为空");
 
 
     // ========== 积分规则配置  1_110_001_000 ==========
@@ -46,5 +48,11 @@ public interface ErrorCodeConstants {
     // ========== 用户相关  1_110_005_000 ============
     ErrorCode USER_NOT_EXISTS = new ErrorCode(1_110_005_001, "用户不存在");
     ErrorCode USER_POINT_NOT_ENOUGH = new ErrorCode(1_110_005_002, "用户积分余额不足");
+    ErrorCode USER_POINT_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_005_003, "变动积分不能为空");
 
+    // ========== 事件指标 1_110_006_000 ==========
+    ErrorCode EVENT_METRIC_NOT_EXISTS = new ErrorCode(1_110_006_001, "事件指标不存在");
+
+    // ========== 事件记录 1_110_007_000 ==========
+    ErrorCode EVENT_RECORD_NOT_EXISTS = new ErrorCode(1_110_007_001, "事件记录不存在");
 }

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

@@ -0,0 +1,18 @@
+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";
+
+}

+ 19 - 0
menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/MathOperationEnum.java

@@ -0,0 +1,19 @@
+package com.citu.module.menduner.reward.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 数据操作符 0 + | 1 -
+ **/
+@Getter
+@AllArgsConstructor
+public enum MathOperationEnum {
+    ADD("ADD", "+", "加"),
+    SUBTRACT("SUBTRACT", "-", "减");
+
+    final String expression;
+    final String operator;
+    final String remark;
+
+}

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

@@ -1,21 +0,0 @@
-package com.citu.module.menduner.reward.enums.event;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 事件指标 今日点击数 | 当月点击数 | 当年点击数 | 总点击数
- **/
-@Getter
-@AllArgsConstructor
-public enum EventIndicatorEnum {
-    TODAY("今日点击数", "todays_clicks", EventValueTypeEnum.NUMBER.getType(),"用户该事件当日访问数量"),
-    MONTH("当月点击数", "monthly_click", EventValueTypeEnum.NUMBER.getType(),"用户该事件当月访问数量"),
-    YEAR("当年点击数", "yearly_click", EventValueTypeEnum.NUMBER.getType(),"用户该事件当年访问数量"),
-    TOTAL("总点击数", "total_click", EventValueTypeEnum.NUMBER.getType(),"用户该事件总访问数量");
-
-    final String name;
-    final String value;
-    final String valueType;
-    final String remark;
-}

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

@@ -5,7 +5,7 @@ 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.event.EventIndicatorEnum;
+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;
@@ -41,22 +41,4 @@ public class CommonController {
         return success(list);
     }
 
-    @PermitAll
-    @PreAuthenticated
-    @GetMapping("/get/event-indicator")
-    @Operation(summary = "获取事件指标列表")
-    public CommonResult<List<EventRespVO>> getEventIndicator() {
-        List<EventRespVO> list = new ArrayList<>();
-        for (EventIndicatorEnum value : EventIndicatorEnum.values()) {
-            EventRespVO respVO = new EventRespVO();
-            respVO.setName(value.getName());
-            respVO.setValue(value.getValue());
-            respVO.setType(value.getValueType());
-            respVO.setRemark(value.getRemark());
-            list.add(respVO);
-        }
-        return CommonResult.success(list);
-    }
-
-
 }

+ 102 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventMetricController.java

@@ -0,0 +1,102 @@
+package com.citu.module.menduner.reward.controller.admin.event;
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.reward.controller.base.event.EventMetricPageReqVO;
+import com.citu.module.menduner.reward.controller.base.event.EventMetricRespVO;
+import com.citu.module.menduner.reward.controller.base.event.EventMetricSaveReqVO;
+import com.citu.module.menduner.reward.convert.EventMetricConvert;
+import com.citu.module.menduner.reward.dal.dataobject.event.EventMetricDO;
+import com.citu.module.menduner.reward.service.event.EventMetricService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 事件指标")
+@RestController
+@RequestMapping("/menduner/reward/event-metric")
+@Validated
+public class EventMetricController {
+
+    @Resource
+    private EventMetricService eventMetricService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建事件指标")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-metric:create')")
+    public CommonResult<Long> createEventMetric(@Valid @RequestBody EventMetricSaveReqVO createReqVO) {
+        return success(eventMetricService.createEventMetric(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新事件指标")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-metric:update')")
+    public CommonResult<Boolean> updateEventMetric(@Valid @RequestBody EventMetricSaveReqVO updateReqVO) {
+        eventMetricService.updateEventMetric(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除事件指标")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-metric:delete')")
+    public CommonResult<Boolean> deleteEventMetric(@RequestParam("id") Long id) {
+        eventMetricService.deleteEventMetric(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得事件指标")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-metric:query')")
+    public CommonResult<EventMetricRespVO> getEventMetric(@RequestParam("id") Long id) {
+        EventMetricDO eventMetric = eventMetricService.getEventMetric(id);
+        return success(BeanUtils.toBean(eventMetric, EventMetricRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得事件指标分页")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-metric:query')")
+    public CommonResult<PageResult<EventMetricRespVO>> getEventMetricPage(@Valid EventMetricPageReqVO pageReqVO) {
+        PageResult<EventMetricDO> pageResult = eventMetricService.getEventMetricPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, EventMetricRespVO.class));
+    }
+
+    @GetMapping("/list")
+    @Operation(summary = "获得事件指标列表")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-metric:query')")
+    public CommonResult<List<EventMetricRespVO>> getEventMetricPage() {
+        List<EventMetricDO> list = eventMetricService.getList();
+        return success(EventMetricConvert.INSTANCE.convert(list));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出事件指标 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-metric:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportEventMetricExcel(@Valid EventMetricPageReqVO pageReqVO,
+                                       HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<EventMetricDO> list = eventMetricService.getEventMetricPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "事件指标.xls", "数据", EventMetricRespVO.class,
+                BeanUtils.toBean(list, EventMetricRespVO.class));
+    }
+
+}

+ 94 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventRecordController.java

@@ -0,0 +1,94 @@
+package com.citu.module.menduner.reward.controller.admin.event;
+
+
+import com.citu.framework.apilog.core.annotation.ApiAccessLog;
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.framework.excel.core.util.ExcelUtils;
+import com.citu.module.menduner.reward.controller.base.event.EventRecordPageReqVO;
+import com.citu.module.menduner.reward.controller.base.event.EventRecordRespVO;
+import com.citu.module.menduner.reward.controller.base.event.EventRecordSaveReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.event.EventRecordDO;
+import com.citu.module.menduner.reward.service.event.EventRecordService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.List;
+
+import static com.citu.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 事件记录")
+@RestController
+@RequestMapping("/menduner/reward/event-record")
+@Validated
+public class EventRecordController {
+
+    @Resource
+    private EventRecordService eventRecordService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建事件记录")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-record:create')")
+    public CommonResult<Long> createEventRecord(@Valid @RequestBody EventRecordSaveReqVO createReqVO) {
+        return success(eventRecordService.createEventRecord(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新事件记录")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-record:update')")
+    public CommonResult<Boolean> updateEventRecord(@Valid @RequestBody EventRecordSaveReqVO updateReqVO) {
+        eventRecordService.updateEventRecord(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除事件记录")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-record:delete')")
+    public CommonResult<Boolean> deleteEventRecord(@RequestParam("id") Long id) {
+        eventRecordService.deleteEventRecord(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得事件记录")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-record:query')")
+    public CommonResult<EventRecordRespVO> getEventRecord(@RequestParam("id") Long id) {
+        EventRecordDO eventRecord = eventRecordService.getEventRecord(id);
+        return success(BeanUtils.toBean(eventRecord, EventRecordRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得事件记录分页")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-record:query')")
+    public CommonResult<PageResult<EventRecordRespVO>> getEventRecordPage(@Valid EventRecordPageReqVO pageReqVO) {
+        PageResult<EventRecordDO> pageResult = eventRecordService.getEventRecordPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, EventRecordRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出事件记录 Excel")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:event-record:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportEventRecordExcel(@Valid EventRecordPageReqVO pageReqVO,
+                                       HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<EventRecordDO> list = eventRecordService.getEventRecordPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "事件记录.xls", "数据", EventRecordRespVO.class,
+                BeanUtils.toBean(list, EventRecordRespVO.class));
+    }
+
+}

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

@@ -28,7 +28,6 @@ public class EventTrackController {
     private EventTrackService service;
 
 
-
     @PermitAll
     @PreAuthenticated
     @GetMapping("/list")
@@ -42,7 +41,7 @@ public class EventTrackController {
     @PostMapping("/click")
     @Operation(summary = "点击")
     public CommonResult<EventTrackPointRespVO> click(@RequestParam("id") Long id) {
-        return success(null);
+        return success(service.click(id));
     }
 
     @PermitAll

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

@@ -21,7 +21,7 @@ import javax.validation.Valid;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
 
-@Tag(name = "管理后台 - 签到记录")
+@Tag(name = "管理后台 - 积分记录")
 @RestController
 @RequestMapping("/menduner/reward/point/record")
 @Validated

+ 4 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/config/PointRuleConfigRespVO.java

@@ -45,6 +45,10 @@ public class PointRuleConfigRespVO {
     @ExcelProperty("约束规则")
     private Condition constraintRule;
 
+    @Schema(description = "排序")
+    @ExcelProperty("排序")
+    private Integer sort;
+
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @ExcelProperty("状态")
     private String status;

+ 4 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/config/PointRuleConfigSaveReqVO.java

@@ -1,6 +1,7 @@
 package com.citu.module.menduner.reward.controller.base.config;
 
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.citu.module.menduner.reward.dal.dataobject.config.Condition;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -41,6 +42,9 @@ public class PointRuleConfigSaveReqVO {
     @Schema(description = "约束规则")
     private Condition constraintRule;
 
+    @Schema(description = "排序")
+    private Integer sort;
+
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @NotEmpty(message = "{1_110_000_001}")
     private String status;

+ 42 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventMetricPageReqVO.java

@@ -0,0 +1,42 @@
+package com.citu.module.menduner.reward.controller.base.event;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 事件指标分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class EventMetricPageReqVO extends PageParam {
+
+    @Schema(description = "指标名称", example = "芋艿")
+    private String name;
+
+    @Schema(description = "指标值名称")
+    private String value;
+
+    @Schema(description = "指标分类", example = "1")
+    private Integer type;
+
+    @Schema(description = "备注说明", example = "随便")
+    private String remark;
+
+    @Schema(description = "状态", example = "1")
+    private String status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "指标值类型", example = "1")
+    private Integer valueType;
+
+}

+ 47 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventMetricRespVO.java

@@ -0,0 +1,47 @@
+package com.citu.module.menduner.reward.controller.base.event;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 事件指标 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class EventMetricRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32480")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "指标名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @ExcelProperty("指标名称")
+    private String name;
+
+    @Schema(description = "指标值名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("指标值名称")
+    private String value;
+
+    @Schema(description = "指标分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("指标分类")
+    private Integer type;
+
+    @Schema(description = "备注说明", example = "随便")
+    @ExcelProperty("备注说明")
+    private String remark;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("状态")
+    private String status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "指标值类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("指标值类型")
+    private Integer valueType;
+
+}

+ 39 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventMetricSaveReqVO.java

@@ -0,0 +1,39 @@
+package com.citu.module.menduner.reward.controller.base.event;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 事件指标新增/修改 Request VO")
+@Data
+public class EventMetricSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "32480")
+    private Long id;
+
+    @Schema(description = "指标名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @NotEmpty(message = "指标名称不能为空")
+    private String name;
+
+    @Schema(description = "指标值名称", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "指标值名称不能为空")
+    private String value;
+
+    @Schema(description = "指标分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "指标分类不能为空")
+    private Integer type;
+
+    @Schema(description = "备注说明", example = "随便")
+    private String remark;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotEmpty(message = "状态不能为空")
+    private String status;
+
+    @Schema(description = "指标值类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "指标值类型不能为空")
+    private Integer valueType;
+
+}

+ 37 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventRecordPageReqVO.java

@@ -0,0 +1,37 @@
+package com.citu.module.menduner.reward.controller.base.event;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.citu.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 事件记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class EventRecordPageReqVO extends PageParam {
+
+    @Schema(description = "用户id", example = "4194")
+    private String userId;
+
+    @Schema(description = "事件地址", example = "https://www.iocoder.cn")
+    private String url;
+
+    @Schema(description = "事件指标id", example = "29779")
+    private Long metricId;
+
+    @Schema(description = "日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] date;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 44 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventRecordRespVO.java

@@ -0,0 +1,44 @@
+package com.citu.module.menduner.reward.controller.base.event;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 事件记录 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class EventRecordRespVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "2146")
+    @ExcelProperty("id")
+    private Long id;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "4194")
+    @ExcelProperty("用户id")
+    private String userId;
+
+    @Schema(description = "事件地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @ExcelProperty("事件地址")
+    private String url;
+
+    @Schema(description = "事件指标id", requiredMode = Schema.RequiredMode.REQUIRED, example = "29779")
+    @ExcelProperty("事件指标id")
+    private Long metricId;
+
+    @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("日期")
+    private LocalDateTime date;
+
+    @Schema(description = "总次数", example = "20502")
+    @ExcelProperty("总次数")
+    private Integer count;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 36 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/event/EventRecordSaveReqVO.java

@@ -0,0 +1,36 @@
+package com.citu.module.menduner.reward.controller.base.event;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 事件记录新增/修改 Request VO")
+@Data
+public class EventRecordSaveReqVO {
+
+    @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "2146")
+    private Long id;
+
+    @Schema(description = "用户id", requiredMode = Schema.RequiredMode.REQUIRED, example = "4194")
+    @NotEmpty(message = "用户id不能为空")
+    private String userId;
+
+    @Schema(description = "事件地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
+    @NotEmpty(message = "事件地址不能为空")
+    private String url;
+
+    @Schema(description = "事件指标id", requiredMode = Schema.RequiredMode.REQUIRED, example = "29779")
+    @NotNull(message = "事件指标id不能为空")
+    private Long metricId;
+
+    @Schema(description = "日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "日期不能为空")
+    private LocalDateTime date;
+
+    @Schema(description = "总次数", example = "20502")
+    private Integer count;
+
+}

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

@@ -3,12 +3,12 @@ package com.citu.module.menduner.reward.controller.base.event;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
-import java.math.BigDecimal;
-
 @Schema(description = "事件跟踪积分 Response VO")
 @Data
 public class EventTrackPointRespVO {
 
+    @Schema(description = "是否匹配")
+    private boolean isMatch = false;
 
     @Schema(description = "规则标题")
     private String title;
@@ -20,6 +20,10 @@ public class EventTrackPointRespVO {
     private String operation;
 
     @Schema(description = "积分数")
-    private BigDecimal point;
+    private Integer point;
+
+    public void match() {
+        this.isMatch = true;
+    }
 
 }

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/config/SignInConfigUpdateReqVO.java

@@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull;
 public class SignInConfigUpdateReqVO extends SignInConfigBaseVO {
 
     @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13653")
-    @NotNull(message = "id不能为空")
+    @NotNull(message = "{1_110_000_002}")
     private Long id;
 
 }

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

@@ -14,6 +14,9 @@ public class UserPointBaseVO {
     
     @Schema(description = "用户id", example = "1")
     private Long userId;
+
+    @Schema(description = "积分数量积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "23788")
+    private Integer point;
     
     @Schema(description = "标签", example = "[1, 2]")
     private List<Long> tagIds;

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/user/UserPointSaveReqVO.java

@@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull;
 public class UserPointSaveReqVO extends UserPointBaseVO {
 
     @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23788")
-    @NotNull(message = "编号不能为空")
+    @NotNull(message = "{1_110_000_002}")
     private Long id;
 
 }

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

@@ -12,11 +12,11 @@ import javax.validation.constraints.NotNull;
 public class UserPointUpdateReqVO {
 
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23788")
-    @NotNull(message = "用户编号不能为空")
+    @NotNull(message = "{1_110_000_003}")
     private Long userId;
 
     @Schema(description = "变动积分,正数为增加,负数为减少", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
-    @NotNull(message = "变动积分不能为空")
+    @NotNull(message = "{1_110_005_003}")
     private Integer point;
 
 }

+ 16 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/EventMetricConvert.java

@@ -0,0 +1,16 @@
+package com.citu.module.menduner.reward.convert;
+
+import com.citu.module.menduner.reward.controller.base.event.EventMetricRespVO;
+import com.citu.module.menduner.reward.dal.dataobject.event.EventMetricDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+@Mapper
+public interface EventMetricConvert {
+
+    EventMetricConvert INSTANCE = Mappers.getMapper(EventMetricConvert.class);
+
+    List<EventMetricRespVO> convert(List<EventMetricDO> list);
+}

+ 4 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/core/EasyRulesEngine.java

@@ -33,7 +33,7 @@ public class EasyRulesEngine {
     /**
      * 执行规则匹配
      *
-     * @param ruleMatch    匹配规则
+     * @param ruleMatch 匹配规则
      */
     public static RuleResult match(RuleMatch ruleMatch) {
         // 结果
@@ -110,6 +110,9 @@ public class EasyRulesEngine {
      * 根据Condition构建mvel条件表达式
      */
     public static String buildWhenExpression(Condition condition) {
+        if (null == condition) {
+            return null;
+        }
         StringBuilder mvelExpressionSB = new StringBuilder();
         String operator = condition.getOperation();
 

+ 4 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/config/PointRuleConfigDO.java

@@ -58,6 +58,10 @@ public class PointRuleConfigDO extends BaseDO {
      */
     @TableField(typeHandler = JacksonTypeHandler.class)
     private Condition constraintRule;
+    /**
+     * 顺序
+     */
+    private Integer sort;
     /**
      * 状态
      */

+ 54 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/event/EventMetricDO.java

@@ -0,0 +1,54 @@
+package com.citu.module.menduner.reward.dal.dataobject.event;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+/**
+ * 事件指标 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_event_metric")
+@KeySequence("mde_event_metric_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class EventMetricDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 指标名称
+     */
+    private String name;
+    /**
+     * 指标值名称
+     */
+    private String value;
+    /**
+     * 指标分类
+     */
+    private Integer type;
+    /**
+     * 备注说明
+     */
+    private String remark;
+    /**
+     * 状态
+     */
+    private String status;
+    /**
+     * 指标值类型
+     */
+    private Integer valueType;
+
+}

+ 52 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/event/EventRecordDO.java

@@ -0,0 +1,52 @@
+package com.citu.module.menduner.reward.dal.dataobject.event;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * 事件记录 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_event_record")
+@KeySequence("mde_event_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class EventRecordDO extends BaseDO {
+
+    /**
+     * id
+     */
+    @TableId
+    private Long id;
+    /**
+     * 用户id
+     */
+    private String userId;
+    /**
+     * 事件地址
+     */
+    private String url;
+    /**
+     * 事件指标id
+     */
+    private Long metricId;
+    /**
+     * 日期
+     */
+    private LocalDateTime date;
+    /**
+     * 总次数
+     */
+    private Integer count;
+
+}

+ 46 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/event/EventMetricMapper.java

@@ -0,0 +1,46 @@
+package com.citu.module.menduner.reward.dal.mysql.event;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.reward.controller.base.event.EventMetricPageReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.event.EventMetricDO;
+import com.citu.module.menduner.system.enums.MendunerStatusEnum;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 事件指标 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface EventMetricMapper extends BaseMapperX<EventMetricDO> {
+
+    default PageResult<EventMetricDO> selectPage(EventMetricPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<EventMetricDO>()
+                .likeIfPresent(EventMetricDO::getName, reqVO.getName())
+                .eqIfPresent(EventMetricDO::getValue, reqVO.getValue())
+                .eqIfPresent(EventMetricDO::getType, reqVO.getType())
+                .eqIfPresent(EventMetricDO::getRemark, reqVO.getRemark())
+                .eqIfPresent(EventMetricDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(EventMetricDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(EventMetricDO::getValueType, reqVO.getValueType())
+                .orderByDesc(EventMetricDO::getId));
+    }
+
+    default EventMetricDO selectByValue(String value) {
+        LambdaQueryWrapperX<EventMetricDO> wrapperX = new LambdaQueryWrapperX<EventMetricDO>()
+                .eq(EventMetricDO::getValue, value)
+                .eq(EventMetricDO::getStatus, MendunerStatusEnum.ENABLE.getStatus());
+        return selectOne(wrapperX);
+    }
+
+    default List<EventMetricDO> selectList() {
+        return selectList(new LambdaQueryWrapperX<EventMetricDO>()
+                .eq(EventMetricDO::getStatus, MendunerStatusEnum.ENABLE.getStatus()));
+    }
+
+
+}

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

@@ -0,0 +1,50 @@
+package com.citu.module.menduner.reward.dal.mysql.event;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.reward.controller.base.event.EventRecordPageReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.event.EventRecordDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 事件记录 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface EventRecordMapper extends BaseMapperX<EventRecordDO> {
+
+    default PageResult<EventRecordDO> selectPage(EventRecordPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<EventRecordDO>()
+                .eqIfPresent(EventRecordDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(EventRecordDO::getUrl, reqVO.getUrl())
+                .eqIfPresent(EventRecordDO::getMetricId, reqVO.getMetricId())
+                .betweenIfPresent(EventRecordDO::getDate, reqVO.getDate())
+                .betweenIfPresent(EventRecordDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(EventRecordDO::getId));
+    }
+
+    default List<EventRecordDO> getList(Long userId, String url, Long metricId, LocalDateTime startDate, LocalDateTime endDate) {
+        LambdaQueryWrapperX<EventRecordDO> wrapperX = new LambdaQueryWrapperX<EventRecordDO>();
+        wrapperX.eq(EventRecordDO::getUserId, userId)
+                .eq(EventRecordDO::getUrl, url)
+                .eq(EventRecordDO::getMetricId, metricId);
+
+        if (null != startDate) {
+            wrapperX.le(EventRecordDO::getDate, startDate);
+        }
+
+        if (null != endDate) {
+            wrapperX.lt(EventRecordDO::getDate, endDate);
+        }
+
+        return selectList(wrapperX);
+    }
+
+
+}

+ 4 - 4
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/rule/DynamicPointRule.java

@@ -31,7 +31,7 @@ public class DynamicPointRule {
 
         // 触发条件
         String triggerExpression = fact.getTriggerRule();
-        if (StringUtils.hasText(triggerExpression)) {
+        if (!StringUtils.hasText(triggerExpression)) {
             log.warn("when 触发条件为空");
             return false;
         }
@@ -48,11 +48,11 @@ public class DynamicPointRule {
         String constraintExpression = fact.getConstraintRule();
 
         // 如果限制条件为空,则直接返回 true
-        if (StringUtils.hasText(constraintExpression)) {
-            log.warn("when 限制条件为空, 不做效验");
+        if (!StringUtils.hasText(constraintExpression)) {
+            log.warn("then 限制条件为空, 不做效验");
             return true;
         }
-        log.warn("when 限制规则 {} , context {}", constraintExpression, fact.getConstraintContext());
+        log.warn("then 限制规则 {} , context {}", constraintExpression, fact.getConstraintContext());
         // 解析限制条件表达式
         // 这里你可以根据实际情况添加上下文参数
         // num <=1

+ 68 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventMetricService.java

@@ -0,0 +1,68 @@
+package com.citu.module.menduner.reward.service.event;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.reward.controller.base.event.EventMetricPageReqVO;
+import com.citu.module.menduner.reward.controller.base.event.EventMetricSaveReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.event.EventMetricDO;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 事件指标 Service 接口
+ *
+ * @author Rayson
+ */
+public interface EventMetricService {
+
+    /**
+     * 创建事件指标
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createEventMetric(@Valid EventMetricSaveReqVO createReqVO);
+
+    /**
+     * 更新事件指标
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateEventMetric(@Valid EventMetricSaveReqVO updateReqVO);
+
+    /**
+     * 删除事件指标
+     *
+     * @param id 编号
+     */
+    void deleteEventMetric(Long id);
+
+    /**
+     * 获得事件指标
+     *
+     * @param id 编号
+     * @return 事件指标
+     */
+    EventMetricDO getEventMetric(Long id);
+
+    /**
+     * 获得事件指标分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 事件指标分页
+     */
+    PageResult<EventMetricDO> getEventMetricPage(EventMetricPageReqVO pageReqVO);
+
+    /**
+     * 根据指标值获取指标信息
+     * @return 事件指标
+     */
+    EventMetricDO getByValue(String value);
+
+    /**
+     * 获取指标信息列表
+     * @return 事件指标集合
+     */
+    List<EventMetricDO> getList();
+
+}

+ 87 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventMetricServiceImpl.java

@@ -0,0 +1,87 @@
+package com.citu.module.menduner.reward.service.event;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.object.BeanUtils;
+import com.citu.module.menduner.reward.controller.base.event.EventMetricPageReqVO;
+import com.citu.module.menduner.reward.controller.base.event.EventMetricSaveReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.event.EventMetricDO;
+import com.citu.module.menduner.reward.dal.mysql.event.EventMetricMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import java.util.Collections;
+import java.util.List;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.EVENT_METRIC_NOT_EXISTS;
+
+/**
+ * 事件指标 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class EventMetricServiceImpl implements EventMetricService {
+
+    @Resource
+    private EventMetricMapper eventMetricMapper;
+
+    @Override
+    public Long createEventMetric(EventMetricSaveReqVO createReqVO) {
+        // 插入
+        EventMetricDO eventMetric = BeanUtils.toBean(createReqVO, EventMetricDO.class);
+        eventMetricMapper.insert(eventMetric);
+        // 返回
+        return eventMetric.getId();
+    }
+
+    @Override
+    public void updateEventMetric(EventMetricSaveReqVO updateReqVO) {
+        // 校验存在
+        validateEventMetricExists(updateReqVO.getId());
+        // 更新
+        EventMetricDO updateObj = BeanUtils.toBean(updateReqVO, EventMetricDO.class);
+        eventMetricMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteEventMetric(Long id) {
+        // 校验存在
+        validateEventMetricExists(id);
+        // 删除
+        eventMetricMapper.deleteById(id);
+    }
+
+    private void validateEventMetricExists(Long id) {
+        if (eventMetricMapper.selectById(id) == null) {
+            throw exception(EVENT_METRIC_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public EventMetricDO getEventMetric(Long id) {
+        return eventMetricMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<EventMetricDO> getEventMetricPage(EventMetricPageReqVO pageReqVO) {
+        return eventMetricMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public EventMetricDO getByValue(String value) {
+        EventMetricDO eventMetric = eventMetricMapper.selectByValue(value);
+        if(null == eventMetric) {
+            throw exception(EVENT_METRIC_NOT_EXISTS);
+        }
+        return eventMetric;
+    }
+
+    @Override
+    public List<EventMetricDO> getList() {
+        return eventMetricMapper.selectList();
+    }
+}

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

@@ -0,0 +1,66 @@
+package com.citu.module.menduner.reward.service.event;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.reward.controller.base.event.EventRecordPageReqVO;
+import com.citu.module.menduner.reward.controller.base.event.EventRecordSaveReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.event.EventRecordDO;
+
+import javax.validation.Valid;
+
+/**
+ * 事件记录 Service 接口
+ *
+ * @author Rayson
+ */
+public interface EventRecordService {
+
+    /**
+     * 创建事件记录
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createEventRecord(@Valid EventRecordSaveReqVO createReqVO);
+
+    /**
+     * 更新事件记录
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateEventRecord(@Valid EventRecordSaveReqVO updateReqVO);
+
+    /**
+     * 删除事件记录
+     *
+     * @param id 编号
+     */
+    void deleteEventRecord(Long id);
+
+    /**
+     * 获得事件记录
+     *
+     * @param id 编号
+     * @return 事件记录
+     */
+    EventRecordDO getEventRecord(Long id);
+
+    /**
+     * 获得事件记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 事件记录分页
+     */
+    PageResult<EventRecordDO> getEventRecordPage(EventRecordPageReqVO pageReqVO);
+
+
+    /**
+     * 根据条件获取事件记录数
+     *
+     * @param userId      用户id
+     * @param url         事件地址
+     * @param metricValue 事件指标值
+     * @return 事件记录分页
+     */
+    Integer getEventCount(Long userId, String url, String metricValue);
+}

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

@@ -0,0 +1,116 @@
+package com.citu.module.menduner.reward.service.event;
+
+
+import cn.hutool.core.util.ObjectUtil;
+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;
+import com.citu.module.menduner.reward.controller.base.event.EventRecordSaveReqVO;
+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.mzt.logapi.service.impl.DefaultLogRecordServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+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 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class EventRecordServiceImpl implements EventRecordService {
+
+    @Resource
+    private EventRecordMapper eventRecordMapper;
+
+    @Resource
+    private EventMetricService eventMetricService;
+
+
+    @Override
+    public Long createEventRecord(EventRecordSaveReqVO createReqVO) {
+        // 插入
+        EventRecordDO eventRecord = BeanUtils.toBean(createReqVO, EventRecordDO.class);
+        eventRecordMapper.insert(eventRecord);
+        // 返回
+        return eventRecord.getId();
+    }
+
+    @Override
+    public void updateEventRecord(EventRecordSaveReqVO updateReqVO) {
+        // 校验存在
+        validateEventRecordExists(updateReqVO.getId());
+        // 更新
+        EventRecordDO updateObj = BeanUtils.toBean(updateReqVO, EventRecordDO.class);
+        eventRecordMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteEventRecord(Long id) {
+        // 校验存在
+        validateEventRecordExists(id);
+        // 删除
+        eventRecordMapper.deleteById(id);
+    }
+
+    private void validateEventRecordExists(Long id) {
+        if (eventRecordMapper.selectById(id) == null) {
+            throw exception(EVENT_RECORD_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public EventRecordDO getEventRecord(Long id) {
+        return eventRecordMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<EventRecordDO> getEventRecordPage(EventRecordPageReqVO pageReqVO) {
+        return eventRecordMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public Integer getEventCount(Long userId, String url, String metricValue) {
+        LocalDateTime startDate = null;
+        LocalDateTime endDate = null;
+        LocalDate date = LocalDate.now();
+        EventMetricDO eventMetric = eventMetricService.getByValue(metricValue);
+
+        switch (eventMetric.getValue()) {
+            case TODAY:
+                startDate = date.atStartOfDay();
+                endDate = date.atTime(LocalTime.MAX);
+                break;
+            case MONTH:
+                startDate = date.withDayOfMonth(1).atStartOfDay();
+                endDate = date.withDayOfMonth(date.lengthOfMonth()).atTime(LocalTime.MAX);
+                break;
+            case YEAR:
+                startDate = date.withDayOfYear(1).atStartOfDay();
+                endDate = date.withDayOfYear(date.lengthOfYear()).atTime(LocalTime.MAX);
+                break;
+            case TOTAL:
+                break;
+            default:
+                throw new IllegalStateException("Unexpected value: " + eventMetric.getValue());
+        }
+
+        List<EventRecordDO> list = eventRecordMapper.getList(userId, url, eventMetric.getId(), startDate, endDate);
+        if(ObjectUtil.isEmpty(list)) {
+            return 0;
+        }
+        return list.stream().mapToInt(EventRecordDO::getCount).sum();
+    }
+}

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

@@ -21,6 +21,7 @@ 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.stream.Collectors;
@@ -40,6 +41,9 @@ public class EventTrackServiceImpl implements EventTrackService {
     @Resource
     private PointRuleConfigService ruleConfigService;
 
+    @Resource
+    private EventRecordService eventRecordService;
+
     @Resource
     private MendunerSystemUrlApi mendunerSystemUrlApi;
 
@@ -83,6 +87,15 @@ public class EventTrackServiceImpl implements EventTrackService {
 
     @Override
     public EventTrackPointRespVO click(Long id) {
+
+        EventTrackPointRespVO respVO = new EventTrackPointRespVO();
+
+        // 用户信息
+        LoginUser loginUser = LoginUserContext.get2();
+        if (null == loginUser) {
+            return null;
+        }
+
         PointRuleConfigDO config = ruleConfigService.get(id);
         if (null == config) {
             // 不存在
@@ -94,9 +107,17 @@ public class EventTrackServiceImpl implements EventTrackService {
 
         // 读取对应数据
         // 赋值到 context
-
-        // 用户信息
-        LoginUser loginUser = LoginUserContext.get2();
+        Map<String, Object> triggerMap = new LinkedHashMap<>();
+        for (String key : triggerKeyList) {
+            if (triggerMap.containsKey(key)) {
+                continue;
+            }
+            triggerMap.put(key, eventRecordService.getEventCount(
+                    loginUser.getId(),
+                    config.getUrl(),
+                    key)
+            );
+        }
 
 
         PointRule pointRule = new PointRule();
@@ -109,8 +130,8 @@ public class EventTrackServiceImpl implements EventTrackService {
 
         // 构造参数
         pointRule.setTriggerRule(EasyRulesEngine.buildWhenExpression(config.getTriggerRule()));
-        pointRule.setConstraintRule(EasyRulesEngine.buildThenExpression());
-        pointRule.setTriggerContext(null);
+        pointRule.setConstraintRule(EasyRulesEngine.buildWhenExpression(config.getConstraintRule()));
+        pointRule.setTriggerContext(triggerMap);
         pointRule.setConstraintContext(null);
         pointRule.setOperation(config.getOperation());
         pointRule.setPoint(config.getPoint());
@@ -119,11 +140,18 @@ public class EventTrackServiceImpl implements EventTrackService {
         // 解析器的上下文
         Facts context = new Facts();
         context.put(RULE, new DynamicPointRule(pointRule));
-        context.put(RULE_CONFIG, config);
+        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);
 
@@ -134,7 +162,7 @@ public class EventTrackServiceImpl implements EventTrackService {
                 .ruleBase(pointRule)
                 .build());
 
-        return null;
+        return respVO;
     }
 
     @Override

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

@@ -3,6 +3,7 @@ package com.citu.module.menduner.reward.service.record;
 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;
 
 
@@ -26,10 +27,17 @@ public interface PointRecordService {
      * 创建用户积分记录
      *
      * @param userId  用户ID
+     * @param url 事件地址
+     * @param operation 操作
      * @param point   变动积分
      * @param bizType 业务类型
      * @param bizId   业务编号
      */
-    void createPointRecord(Long userId, Integer point, PointBizTypeEnum bizType, String bizId);
+    void createPointRecord(Long userId,
+                           String url,
+                           MathOperationEnum operation,
+                           Integer point,
+                           PointBizTypeEnum bizType,
+                           String bizId);
 
 }

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

@@ -1,17 +1,25 @@
 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.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.dal.dataobject.user.UserPointDO;
 import com.citu.module.menduner.reward.dal.mysql.record.PointRecordMapper;
+import com.citu.module.menduner.reward.enums.MathOperationEnum;
 import com.citu.module.menduner.reward.enums.record.PointBizTypeEnum;
+import com.citu.module.menduner.reward.service.user.UserPointService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.USER_POINT_NOT_ENOUGH;
+
 
 /**
  * 积分记录 Service 实现类
@@ -26,6 +34,9 @@ public class PointRecordServiceImpl implements PointRecordService {
     @Resource
     private PointRecordMapper mapper;
 
+    @Resource
+    private UserPointService userPointService;
+
     @Override
     public PageResult<PointRecordDO> getPointRecordPage(PointRecordPageReqVO pageReqVO) {
         return mapper.selectPage(pageReqVO);
@@ -33,29 +44,44 @@ public class PointRecordServiceImpl implements PointRecordService {
 
     @Override
     @DSTransactional
-    public void createPointRecord(Long userId, Integer point, PointBizTypeEnum bizType, String bizId) {
+    public void createPointRecord(Long userId,
+                                  String url,
+                                  MathOperationEnum operation,
+                                  Integer point,
+                                  PointBizTypeEnum bizType,
+                                  String bizId) {
         if (point == 0) {
             return;
         }
         // 1. 校验用户积分余额
-//        UserDO user = memberUserService.getUser(userId);
-//        Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0);
-//        int totalPoint = userPoint + point; // 用户变动后的积分
-//        if (totalPoint < 0) {
-//            throw exception(USER_POINT_NOT_ENOUGH);
-//        }
+        UserPointDO user = userPointService.getPointByUserId(userId);
+        Integer userPoint = ObjectUtil.defaultIfNull(user.getPoint(), 0);
+        int totalPoint = userPoint + point; // 用户变动后的积分
+        if (totalPoint < 0) {
+            throw exception(USER_POINT_NOT_ENOUGH);
+        }
+
+        if (MathOperationEnum.SUBTRACT.equals(operation)) {
+            // 减法
+            point = -Math.abs(point);
+        }
 
         // 2. 更新用户积分
-//        boolean success = memberUserService.updateUserPoint(userId, point);
-//        if (!success) {
-//            throw exception(USER_POINT_NOT_ENOUGH);
-//        }
+        boolean success = userPointService.updateUserPoint(userId, point);
+        if (!success) {
+            throw exception(USER_POINT_NOT_ENOUGH);
+        }
 
         // 3. 增加积分记录
-//        PointRecordDO record = new PointRecordDO()
-//                .setUserId(userId).setBizId(bizId).setBizType(bizType.getType())
-//                .setTitle(bizType.getName()).setDescription(StrUtil.format(bizType.getDescription(), point))
-//                .setPoint(point).setTotalPoint(totalPoint);
-//        mapper.insert(record);
+        PointRecordDO record = new PointRecordDO()
+                .setUserId(userId)
+                .setBizId(bizId)
+                .setBizType(bizType.getType())
+                .setTitle(bizType.getName())
+                .setUrl(url)
+                .setOperation(operation.getOperator())
+                .setDescription(StrUtil.format(bizType.getDescription(), point))
+                .setPoint(point).setTotalPoint(totalPoint);
+        mapper.insert(record);
     }
 }

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

@@ -11,6 +11,7 @@ import com.citu.module.menduner.reward.convert.SignInRecordConvert;
 import com.citu.module.menduner.reward.dal.dataobject.signin.SignInConfigDO;
 import com.citu.module.menduner.reward.dal.dataobject.signin.SignInRecordDO;
 import com.citu.module.menduner.reward.dal.mysql.signin.SignInRecordMapper;
+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 org.springframework.stereotype.Service;
@@ -71,7 +72,7 @@ public class SignInRecordServiceImpl implements SignInRecordService {
 
         // 4. 增加积分
         if (!ObjectUtils.equalsAny(record.getPoint(), null, 0)) {
-            pointRecordService.createPointRecord(userId, record.getPoint(), PointBizTypeEnum.SIGN, String.valueOf(record.getId()));
+            pointRecordService.createPointRecord(userId, null, MathOperationEnum.ADD,record.getPoint(), PointBizTypeEnum.SIGN, String.valueOf(record.getId()));
         }
         return record;
     }

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

@@ -18,6 +18,8 @@
 999=unknown error
 # ========== 公共配置  1_110_000_000 ==========
 1_110_000_001=Status cannot be empty
+1_110_000_002=id cannot be empty
+1_110_000_003=User ID cannot be empty
 # ========== 积分规则配置  1_110_001_000 ==========
 1_110_001_001=Integral rule configuration does not exist
 1_110_001_002=Event address cannot be empty
@@ -38,4 +40,9 @@
 1_110_004_001=Checked in today, please do not sign in again
 # ========== 用户相关  1_110_005_000 ============
 1_110_005_001=User does not exist
-1_110_005_002=Insufficient user points balance
+1_110_005_002=Insufficient user points balance
+1_110_005_003=Variable integral cannot be empty
+# ========== 事件指标 1_110_006_000 ==========
+1_110_006_001=Event indicator does not exist
+# ========== 事件记录 1_110_007_000 ==========
+1_110_007_001=Event record does not exist

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

@@ -18,6 +18,8 @@
 999=未知错误
 # ========== 公共配置  1_110_000_000 ==========
 1_110_000_001=状态不能为空
+1_110_000_002=id不能为空
+1_110_000_003=用户id不能为空
 # ========== 积分规则配置  1_110_001_000 ==========
 1_110_001_001=积分规则配置不存在
 1_110_001_002=事件地址不能为空
@@ -40,3 +42,8 @@
 # ========== 用户相关  1_110_005_000 ============
 1_110_005_001=用户不存在
 1_110_005_002=用户积分余额不足
+1_110_005_003=变动积分不能为空
+# ========== 事件指标 1_110_006_000 ==========
+1_110_006_001=事件指标不存在
+# ========== 事件记录 1_110_007_000 ==========
+1_110_007_001=事件记录不存在

+ 1 - 2
menduner/menduner-reward-biz/src/test/java/com/citu/module/menduner/reward/service/pointruleconfig/PointRuleConfigServiceImplCommonController.java → menduner/menduner-reward-biz/src/test/java/com/citu/module/menduner/reward/service/config/PointRuleConfigServiceImplCommonController.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.reward.service.pointruleconfig;
+package com.citu.module.menduner.reward.service.config;
 
 
 import com.citu.framework.common.pojo.PageResult;
@@ -7,7 +7,6 @@ import com.citu.module.menduner.reward.controller.base.config.PointRuleConfigPag
 import com.citu.module.menduner.reward.controller.base.config.PointRuleConfigSaveReqVO;
 import com.citu.module.menduner.reward.dal.dataobject.config.PointRuleConfigDO;
 import com.citu.module.menduner.reward.dal.mysql.config.PointRuleConfigMapper;
-import com.citu.module.menduner.reward.service.config.PointRuleConfigServiceImpl;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.context.annotation.Import;

+ 148 - 0
menduner/menduner-reward-biz/src/test/java/com/citu/module/menduner/reward/service/event/EventMetricServiceImplTest.java

@@ -0,0 +1,148 @@
+package com.citu.module.menduner.reward.service.event;
+
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.reward.controller.base.event.EventMetricPageReqVO;
+import com.citu.module.menduner.reward.controller.base.event.EventMetricSaveReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.event.EventMetricDO;
+import com.citu.module.menduner.reward.dal.mysql.event.EventMetricMapper;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
+import static com.citu.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static com.citu.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static com.citu.framework.test.core.util.AssertUtils.assertServiceException;
+import static com.citu.framework.test.core.util.RandomUtils.randomLongId;
+import static com.citu.framework.test.core.util.RandomUtils.randomPojo;
+import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.EVENT_METRIC_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link EventMetricServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(EventMetricServiceImpl.class)
+public class EventMetricServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private EventMetricServiceImpl eventMetricService;
+
+    @Resource
+    private EventMetricMapper eventMetricMapper;
+
+    @Test
+    public void testCreateEventMetric_success() {
+        // 准备参数
+        EventMetricSaveReqVO createReqVO = randomPojo(EventMetricSaveReqVO.class).setId(null);
+
+        // 调用
+        Long eventMetricId = eventMetricService.createEventMetric(createReqVO);
+        // 断言
+        assertNotNull(eventMetricId);
+        // 校验记录的属性是否正确
+        EventMetricDO eventMetric = eventMetricMapper.selectById(eventMetricId);
+        assertPojoEquals(createReqVO, eventMetric, "id");
+    }
+
+    @Test
+    public void testUpdateEventMetric_success() {
+        // mock 数据
+        EventMetricDO dbEventMetric = randomPojo(EventMetricDO.class);
+        eventMetricMapper.insert(dbEventMetric);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        EventMetricSaveReqVO updateReqVO = randomPojo(EventMetricSaveReqVO.class, o -> {
+            o.setId(dbEventMetric.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        eventMetricService.updateEventMetric(updateReqVO);
+        // 校验是否更新正确
+        EventMetricDO eventMetric = eventMetricMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, eventMetric);
+    }
+
+    @Test
+    public void testUpdateEventMetric_notExists() {
+        // 准备参数
+        EventMetricSaveReqVO updateReqVO = randomPojo(EventMetricSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> eventMetricService.updateEventMetric(updateReqVO), EVENT_METRIC_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteEventMetric_success() {
+        // mock 数据
+        EventMetricDO dbEventMetric = randomPojo(EventMetricDO.class);
+        eventMetricMapper.insert(dbEventMetric);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbEventMetric.getId();
+
+        // 调用
+        eventMetricService.deleteEventMetric(id);
+        // 校验数据不存在了
+        assertNull(eventMetricMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteEventMetric_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> eventMetricService.deleteEventMetric(id), EVENT_METRIC_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetEventMetricPage() {
+        // mock 数据
+        EventMetricDO dbEventMetric = randomPojo(EventMetricDO.class, o -> { // 等会查询到
+            o.setName(null);
+            o.setValue(null);
+            o.setType(null);
+            o.setRemark(null);
+            o.setStatus(null);
+            o.setCreateTime(null);
+            o.setValueType(null);
+        });
+        eventMetricMapper.insert(dbEventMetric);
+        // 测试 name 不匹配
+        eventMetricMapper.insert(cloneIgnoreId(dbEventMetric, o -> o.setName(null)));
+        // 测试 value 不匹配
+        eventMetricMapper.insert(cloneIgnoreId(dbEventMetric, o -> o.setValue(null)));
+        // 测试 type 不匹配
+        eventMetricMapper.insert(cloneIgnoreId(dbEventMetric, o -> o.setType(null)));
+        // 测试 remark 不匹配
+        eventMetricMapper.insert(cloneIgnoreId(dbEventMetric, o -> o.setRemark(null)));
+        // 测试 status 不匹配
+        eventMetricMapper.insert(cloneIgnoreId(dbEventMetric, o -> o.setStatus(null)));
+        // 测试 createTime 不匹配
+        eventMetricMapper.insert(cloneIgnoreId(dbEventMetric, o -> o.setCreateTime(null)));
+        // 测试 valueType 不匹配
+        eventMetricMapper.insert(cloneIgnoreId(dbEventMetric, o -> o.setValueType(null)));
+        // 准备参数
+        EventMetricPageReqVO reqVO = new EventMetricPageReqVO();
+        reqVO.setName(null);
+        reqVO.setValue(null);
+        reqVO.setType(null);
+        reqVO.setRemark(null);
+        reqVO.setStatus(null);
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+        reqVO.setValueType(null);
+
+        // 调用
+        PageResult<EventMetricDO> pageResult = eventMetricService.getEventMetricPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbEventMetric, pageResult.getList().get(0));
+    }
+
+}

+ 139 - 0
menduner/menduner-reward-biz/src/test/java/com/citu/module/menduner/reward/service/event/EventRecordServiceImplTest.java

@@ -0,0 +1,139 @@
+package com.citu.module.menduner.reward.service.event;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.test.core.ut.BaseDbUnitTest;
+import com.citu.module.menduner.reward.controller.base.event.EventRecordPageReqVO;
+import com.citu.module.menduner.reward.controller.base.event.EventRecordSaveReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.event.EventRecordDO;
+import com.citu.module.menduner.reward.dal.mysql.event.EventRecordMapper;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.annotation.Import;
+
+import javax.annotation.Resource;
+
+import static com.citu.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime;
+import static com.citu.framework.common.util.object.ObjectUtils.cloneIgnoreId;
+import static com.citu.framework.test.core.util.AssertUtils.assertPojoEquals;
+import static com.citu.framework.test.core.util.AssertUtils.assertServiceException;
+import static com.citu.framework.test.core.util.RandomUtils.randomLongId;
+import static com.citu.framework.test.core.util.RandomUtils.randomPojo;
+import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.EVENT_RECORD_NOT_EXISTS;
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * {@link EventRecordServiceImpl} 的单元测试类
+ *
+ * @author Rayson
+ */
+@Import(EventRecordServiceImpl.class)
+public class EventRecordServiceImplTest extends BaseDbUnitTest {
+
+    @Resource
+    private EventRecordServiceImpl eventRecordService;
+
+    @Resource
+    private EventRecordMapper eventRecordMapper;
+
+    @Test
+    public void testCreateEventRecord_success() {
+        // 准备参数
+        EventRecordSaveReqVO createReqVO = randomPojo(EventRecordSaveReqVO.class).setId(null);
+
+        // 调用
+        Long eventRecordId = eventRecordService.createEventRecord(createReqVO);
+        // 断言
+        assertNotNull(eventRecordId);
+        // 校验记录的属性是否正确
+        EventRecordDO eventRecord = eventRecordMapper.selectById(eventRecordId);
+        assertPojoEquals(createReqVO, eventRecord, "id");
+    }
+
+    @Test
+    public void testUpdateEventRecord_success() {
+        // mock 数据
+        EventRecordDO dbEventRecord = randomPojo(EventRecordDO.class);
+        eventRecordMapper.insert(dbEventRecord);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        EventRecordSaveReqVO updateReqVO = randomPojo(EventRecordSaveReqVO.class, o -> {
+            o.setId(dbEventRecord.getId()); // 设置更新的 ID
+        });
+
+        // 调用
+        eventRecordService.updateEventRecord(updateReqVO);
+        // 校验是否更新正确
+        EventRecordDO eventRecord = eventRecordMapper.selectById(updateReqVO.getId()); // 获取最新的
+        assertPojoEquals(updateReqVO, eventRecord);
+    }
+
+    @Test
+    public void testUpdateEventRecord_notExists() {
+        // 准备参数
+        EventRecordSaveReqVO updateReqVO = randomPojo(EventRecordSaveReqVO.class);
+
+        // 调用, 并断言异常
+        assertServiceException(() -> eventRecordService.updateEventRecord(updateReqVO), EVENT_RECORD_NOT_EXISTS);
+    }
+
+    @Test
+    public void testDeleteEventRecord_success() {
+        // mock 数据
+        EventRecordDO dbEventRecord = randomPojo(EventRecordDO.class);
+        eventRecordMapper.insert(dbEventRecord);// @Sql: 先插入出一条存在的数据
+        // 准备参数
+        Long id = dbEventRecord.getId();
+
+        // 调用
+        eventRecordService.deleteEventRecord(id);
+        // 校验数据不存在了
+        assertNull(eventRecordMapper.selectById(id));
+    }
+
+    @Test
+    public void testDeleteEventRecord_notExists() {
+        // 准备参数
+        Long id = randomLongId();
+
+        // 调用, 并断言异常
+        assertServiceException(() -> eventRecordService.deleteEventRecord(id), EVENT_RECORD_NOT_EXISTS);
+    }
+
+    @Test
+    @Disabled  // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
+    public void testGetEventRecordPage() {
+        // mock 数据
+        EventRecordDO dbEventRecord = randomPojo(EventRecordDO.class, o -> { // 等会查询到
+            o.setUserId(null);
+            o.setUrl(null);
+            o.setMetricId(null);
+            o.setDate(null);
+            o.setCreateTime(null);
+        });
+        eventRecordMapper.insert(dbEventRecord);
+        // 测试 userId 不匹配
+        eventRecordMapper.insert(cloneIgnoreId(dbEventRecord, o -> o.setUserId(null)));
+        // 测试 url 不匹配
+        eventRecordMapper.insert(cloneIgnoreId(dbEventRecord, o -> o.setUrl(null)));
+        // 测试 metricId 不匹配
+        eventRecordMapper.insert(cloneIgnoreId(dbEventRecord, o -> o.setMetricId(null)));
+        // 测试 date 不匹配
+        eventRecordMapper.insert(cloneIgnoreId(dbEventRecord, o -> o.setDate(null)));
+        // 测试 createTime 不匹配
+        eventRecordMapper.insert(cloneIgnoreId(dbEventRecord, o -> o.setCreateTime(null)));
+        // 准备参数
+        EventRecordPageReqVO reqVO = new EventRecordPageReqVO();
+        reqVO.setUserId(null);
+        reqVO.setUrl(null);
+        reqVO.setMetricId(null);
+        reqVO.setDate(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+        reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 28));
+
+        // 调用
+        PageResult<EventRecordDO> pageResult = eventRecordService.getEventRecordPage(reqVO);
+        // 断言
+        assertEquals(1, pageResult.getTotal());
+        assertEquals(1, pageResult.getList().size());
+        assertPojoEquals(dbEventRecord, pageResult.getList().get(0));
+    }
+
+}

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

@@ -1 +1,3 @@
-DELETE FROM "mde_point_rule_config";
+DELETE FROM "mde_point_rule_config";
+DELETE FROM "mde_event_metric";
+DELETE FROM "mde_event_record";

+ 34 - 1
menduner/menduner-reward-biz/src/test/resources/sql/create_tables.sql

@@ -15,4 +15,37 @@ CREATE TABLE IF NOT EXISTS "mde_point_rule_config" (
                                                        "deleted" bit NOT NULL DEFAULT FALSE,
                                                        "tenant_id" bigint NOT NULL,
                                                        PRIMARY KEY ("id")
-) COMMENT '积分规则配置';
+) COMMENT '积分规则配置';
+
+CREATE TABLE IF NOT EXISTS "mde_event_metric" (
+                                                  "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+                                                  "name" varchar NOT NULL,
+                                                  "value" varchar NOT NULL,
+                                                  "type" int NOT NULL,
+                                                  "remark" varchar,
+                                                  "status" varchar NOT NULL,
+                                                  "creator" varchar DEFAULT '',
+                                                  "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                                  "updater" varchar DEFAULT '',
+                                                  "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+                                                  "deleted" bit NOT NULL DEFAULT FALSE,
+                                                  "tenant_id" bigint NOT NULL,
+                                                  "value_type" int NOT NULL,
+                                                  PRIMARY KEY ("id")
+) COMMENT '门墩儿-事件指标表';
+
+CREATE TABLE IF NOT EXISTS "mde_event_record" (
+                                                  "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
+                                                  "user_id" varchar NOT NULL,
+                                                  "url" varchar NOT NULL,
+                                                  "metric_id" bigint NOT NULL,
+                                                  "date" varchar NOT NULL,
+                                                  "count" int,
+                                                  "creator" varchar DEFAULT '',
+                                                  "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+                                                  "updater" varchar DEFAULT '',
+                                                  "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+                                                  "deleted" bit NOT NULL DEFAULT FALSE,
+                                                  "tenant_id" bigint NOT NULL,
+                                                  PRIMARY KEY ("id")
+) COMMENT '门墩儿-事件记录表';

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

@@ -9,7 +9,7 @@ import lombok.Getter;
 import java.util.Arrays;
 
 /**
- * 帐号状态(0正常 1停用)
+ * 状态(0正常 1停用)
  **/
 @Getter
 @AllArgsConstructor