Browse Source

1、增加签到配置
2、增加签到记录
3、增加积分记录

rayson 1 năm trước cách đây
mục cha
commit
3c2891a20a
52 tập tin đã thay đổi với 1412 bổ sung104 xóa
  1. 15 1
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/ErrorCodeConstants.java
  2. 1 1
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/config/PointRuleConfigStatusEnum.java
  3. 58 0
      menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/record/PointBizTypeEnum.java
  4. 8 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/PointRuleTest.java
  5. 6 6
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/config/PointRuleConfigController.java
  6. 1 5
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/event/EventTrackController.java
  7. 46 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/record/PointRecordController.java
  8. 74 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/sigin/SignInConfigController.java
  9. 46 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/sigin/SignInRecordController.java
  10. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/config/PointRuleConfigPageReqVO.java
  11. 3 4
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/config/PointRuleConfigRespVO.java
  12. 4 5
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/config/PointRuleConfigSaveReqVO.java
  13. 25 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/record/PointRecordPageReqVO.java
  14. 39 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/record/PointRecordRespVO.java
  15. 36 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/config/SignInConfigBaseVO.java
  16. 14 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/config/SignInConfigCreateReqVO.java
  17. 22 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/config/SignInConfigRespVO.java
  18. 20 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/config/SignInConfigUpdateReqVO.java
  19. 31 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/record/SignInRecordPageReqVO.java
  20. 27 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/record/SignInRecordRespVO.java
  21. 18 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/PointRecordConvert.java
  22. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/PointRuleConfigConvert.java
  23. 31 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/SignInConfigConvert.java
  24. 55 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/SignInRecordConvert.java
  25. 44 7
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/core/EasyRulesEngine.java
  26. 2 3
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/core/PointRule.java
  27. 23 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/core/RuleMatch.java
  28. 0 9
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/Test.java
  29. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/config/Condition.java
  30. 2 4
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/config/PointRuleConfigDO.java
  31. 74 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/record/PointRecordDO.java
  32. 46 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/signin/SignInConfigDO.java
  33. 42 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/signin/SignInRecordDO.java
  34. 0 9
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/Test.java
  35. 4 4
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/config/PointRuleConfigMapper.java
  36. 29 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/record/PointRecordMapper.java
  37. 24 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/signin/SignInConfigMapper.java
  38. 65 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/signin/SignInRecordMapper.java
  39. 3 3
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/rule/DynamicPointRule.java
  40. 4 4
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigService.java
  41. 6 6
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/config/PointRuleConfigServiceImpl.java
  42. 1 1
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackService.java
  43. 30 20
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java
  44. 35 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordService.java
  45. 65 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/record/PointRecordServiceImpl.java
  46. 63 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInConfigService.java
  47. 108 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInConfigServiceImpl.java
  48. 43 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInRecordService.java
  49. 88 0
      menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInRecordServiceImpl.java
  50. 11 2
      menduner/menduner-reward-biz/src/main/resources/i18n/messages_en_US.properties
  51. 12 1
      menduner/menduner-reward-biz/src/main/resources/i18n/messages_zh_CN.properties
  52. 5 5
      menduner/menduner-reward-biz/src/test/java/com/citu/module/menduner/reward/service/pointruleconfig/PointRuleConfigServiceImplCommonController.java

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

@@ -17,6 +17,7 @@ import com.citu.framework.common.exception.enums.ServiceErrorCodeRange;
 public interface ErrorCodeConstants {
 
     // ========== 公共配置  1_110_000_000 ==========
+    ErrorCode POINT_RULE_CONFIG_STATUS_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_000_001, "状态不能为空");
 
 
     // ========== 积分规则配置  1_110_001_000 ==========
@@ -27,6 +28,19 @@ 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_STATUS_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_001_008, "状态不能为空");
+
+    //========== 积分记录 1_110_002_000 ==========
+    ErrorCode POINT_RECORD_BIZ_NOT_SUPPORT = new ErrorCode(1_110_002_001, "用户积分记录业务类型不支持");
+
+    //========== 签到配置 1_110_003_000 ==========
+    ErrorCode SIGN_IN_CONFIG_NOT_EXISTS = new ErrorCode(1_110_003_001, "签到天数规则不存在");
+    ErrorCode SIGN_IN_CONFIG_EXISTS = new ErrorCode(1_110_003_002, "签到天数规则已存在");
+    ErrorCode SIGN_IN_CONFIG_DAY_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_003_003, "签到天数不能为空");
+    ErrorCode SIGN_IN_CONFIG_POINT_CAN_NOT_BE_EMPTY = new ErrorCode(1_110_003_004, "奖励积分不能为空");
+    ErrorCode SIGN_IN_CONFIG_POINT_CAN_NOT_BE_LESS_THAN_ZERO = new ErrorCode(1_110_003_005, "奖励积分不能小于 0");
+
+
+    //========== 签到配置 1_110_004_000 ==========
+    ErrorCode SIGN_IN_RECORD_TODAY_EXISTS = new ErrorCode(1_110_004_001, "今日已签到,请勿重复签到");
 
 }

+ 1 - 1
menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/pointruleconfig/PointRuleConfigStatusEnum.java → menduner/menduner-reward-api/src/main/java/com/citu/module/menduner/reward/enums/config/PointRuleConfigStatusEnum.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.reward.enums.pointruleconfig;
+package com.citu.module.menduner.reward.enums.config;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;

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

@@ -0,0 +1,58 @@
+package com.citu.module.menduner.reward.enums.record;
+
+import cn.hutool.core.util.EnumUtil;
+import com.citu.framework.common.core.IntArrayValuable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Objects;
+
+/**
+ * 会员积分的业务类型枚举
+ *
+ * @author Rayson
+ */
+@AllArgsConstructor
+@Getter
+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 的取消
+    ;
+
+    /**
+     * 类型
+     */
+    private final Integer type;
+    /**
+     * 名字
+     */
+    private final String name;
+    /**
+     * 描述
+     */
+    private final String description;
+    /**
+     * 是否为扣减积分
+     */
+    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()));
+    }
+
+}

+ 8 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/PointRuleTest.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.citu.module.menduner.reward.core.EasyRulesEngine;
 import com.citu.module.menduner.reward.core.RuleBase;
+import com.citu.module.menduner.reward.core.RuleMatch;
 import com.citu.module.menduner.reward.rule.DynamicRule;
 import com.citu.module.menduner.reward.rule.DynamicRuleAction;
 import org.jeasy.rules.api.Facts;
@@ -94,7 +95,13 @@ public class PointRuleTest {
 
 
         // 6. 调用规则匹配
-        EasyRulesEngine.RuleResult result = EasyRulesEngine.match(facts, baseRule);
+//        EasyRulesEngine.RuleResult result = EasyRulesEngine.match(facts, baseRule);
+        EasyRulesEngine.RuleResult result = EasyRulesEngine.match(
+                RuleMatch.builder()
+                        .facts(facts)
+                        .ruleBase(baseRule)
+                        .build()
+        );
         System.out.println(result);
 
     }

+ 6 - 6
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/pointruleconfig/PointRuleConfigController.java → menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/config/PointRuleConfigController.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.reward.controller.admin.pointruleconfig;
+package com.citu.module.menduner.reward.controller.admin.config;
 
 
 import com.citu.framework.apilog.core.annotation.ApiAccessLog;
@@ -8,11 +8,11 @@ import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
 import com.citu.framework.common.util.string.StrUtils;
 import com.citu.framework.excel.core.util.ExcelUtils;
-import com.citu.module.menduner.reward.controller.base.pointruleconfig.PointRuleConfigPageReqVO;
-import com.citu.module.menduner.reward.controller.base.pointruleconfig.PointRuleConfigRespVO;
-import com.citu.module.menduner.reward.controller.base.pointruleconfig.PointRuleConfigSaveReqVO;
-import com.citu.module.menduner.reward.dal.dataobject.pointruleconfig.PointRuleConfigDO;
-import com.citu.module.menduner.reward.service.PointRuleConfigService;
+import com.citu.module.menduner.reward.controller.base.config.PointRuleConfigPageReqVO;
+import com.citu.module.menduner.reward.controller.base.config.PointRuleConfigRespVO;
+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.service.config.PointRuleConfigService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;

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

@@ -5,8 +5,7 @@ import com.citu.framework.security.core.annotations.PreAuthenticated;
 import com.citu.module.menduner.reward.controller.base.common.TreeRespVO;
 import com.citu.module.menduner.reward.controller.base.event.EventTrackPointRespVO;
 import com.citu.module.menduner.reward.controller.base.event.EventTrackUrlRespVO;
-import com.citu.module.menduner.reward.service.EventTrackService;
-import com.citu.module.menduner.system.api.url.MendunerSystemUrlApi;
+import com.citu.module.menduner.reward.service.event.EventTrackService;
 import com.citu.module.menduner.system.api.url.UrlInfoRespVO;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -15,10 +14,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.annotation.security.PermitAll;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
 import static com.citu.framework.common.pojo.CommonResult.success;
 

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

@@ -0,0 +1,46 @@
+package com.citu.module.menduner.reward.controller.admin.record;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.reward.controller.base.record.PointRecordPageReqVO;
+import com.citu.module.menduner.reward.controller.base.record.PointRecordRespVO;
+import com.citu.module.menduner.reward.convert.PointRecordConvert;
+import com.citu.module.menduner.reward.dal.dataobject.record.PointRecordDO;
+import com.citu.module.menduner.reward.service.record.PointRecordService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 签到记录")
+@RestController
+@RequestMapping("/menduner/reward/point/record")
+@Validated
+public class PointRecordController {
+
+    @Resource
+    private PointRecordService pointRecordService;
+
+
+    @GetMapping("/page")
+    @Operation(summary = "获得用户积分记录分页")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:point-record:query')")
+    public CommonResult<PageResult<PointRecordRespVO>> getPointRecordPage(@Valid PointRecordPageReqVO pageVO) {
+        // 执行分页查询
+        PageResult<PointRecordDO> pageResult = pointRecordService.getPointRecordPage(pageVO);
+        if (CollectionUtils.isEmpty(pageResult.getList())) {
+            return success(PageResult.empty(pageResult.getTotal()));
+        }
+        return success(PointRecordConvert.INSTANCE.convertPage(pageResult));
+    }
+
+}

+ 74 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/sigin/SignInConfigController.java

@@ -0,0 +1,74 @@
+package com.citu.module.menduner.reward.controller.admin.sigin;
+
+import com.citu.framework.common.pojo.CommonResult;
+
+import com.citu.module.menduner.reward.controller.base.signin.config.SignInConfigCreateReqVO;
+import com.citu.module.menduner.reward.controller.base.signin.config.SignInConfigRespVO;
+import com.citu.module.menduner.reward.controller.base.signin.config.SignInConfigUpdateReqVO;
+import com.citu.module.menduner.reward.convert.SignInConfigConvert;
+import com.citu.module.menduner.reward.dal.dataobject.signin.SignInConfigDO;
+import com.citu.module.menduner.reward.service.signin.SignInConfigService;
+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.validation.Valid;
+import java.util.List;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 签到规则")
+@RestController
+@RequestMapping("/menduner/reward/sign-in/config")
+@Validated
+public class SignInConfigController {
+
+    @Resource
+    private SignInConfigService signInConfigService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建签到规则")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:sign-in-config:create')")
+    public CommonResult<Long> createSignInConfig(@Valid @RequestBody SignInConfigCreateReqVO createReqVO) {
+        return success(signInConfigService.createSignInConfig(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新签到规则")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:sign-in-config:update')")
+    public CommonResult<Boolean> updateSignInConfig(@Valid @RequestBody SignInConfigUpdateReqVO updateReqVO) {
+        signInConfigService.updateSignInConfig(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除签到规则")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('menduner:reward:sign-in-config:delete')")
+    public CommonResult<Boolean> deleteSignInConfig(@RequestParam("id") Long id) {
+        signInConfigService.deleteSignInConfig(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得签到规则")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:sign-in-config:query')")
+    public CommonResult<SignInConfigRespVO> getSignInConfig(@RequestParam("id") Long id) {
+        SignInConfigDO signInConfig = signInConfigService.getSignInConfig(id);
+        return success(SignInConfigConvert.INSTANCE.convert(signInConfig));
+    }
+
+    @GetMapping("/list")
+    @Operation(summary = "获得签到规则列表")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:sign-in-config:query')")
+    public CommonResult<List<SignInConfigRespVO>> getSignInConfigList() {
+        List<SignInConfigDO> list = signInConfigService.getSignInConfigList();
+        return success(SignInConfigConvert.INSTANCE.convertList(list));
+    }
+
+}

+ 46 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/admin/sigin/SignInRecordController.java

@@ -0,0 +1,46 @@
+package com.citu.module.menduner.reward.controller.admin.sigin;
+
+import com.citu.framework.common.pojo.CommonResult;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.reward.controller.base.signin.record.SignInRecordPageReqVO;
+import com.citu.module.menduner.reward.controller.base.signin.record.SignInRecordRespVO;
+import com.citu.module.menduner.reward.convert.SignInRecordConvert;
+import com.citu.module.menduner.reward.dal.dataobject.signin.SignInRecordDO;
+import com.citu.module.menduner.reward.service.signin.SignInRecordService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static com.citu.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 签到记录")
+@RestController
+@RequestMapping("/menduner/reward/sign-in/record")
+@Validated
+public class SignInRecordController {
+
+    @Resource
+    private SignInRecordService signInRecordService;
+
+
+    @GetMapping("/page")
+    @Operation(summary = "获得签到记录分页")
+    @PreAuthorize("@ss.hasPermission('menduner:reward:sign-in-record:query')")
+    public CommonResult<PageResult<SignInRecordRespVO>> getSignInRecordPage(@Valid SignInRecordPageReqVO pageVO) {
+        // 执行分页查询
+        PageResult<SignInRecordDO> pageResult = signInRecordService.getSignInRecordPage(pageVO);
+        if (CollectionUtils.isEmpty(pageResult.getList())) {
+            return success(PageResult.empty(pageResult.getTotal()));
+        }
+        // 拼接结果返回
+        return success(SignInRecordConvert.INSTANCE.convertPage(pageResult));
+    }
+}

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/pointruleconfig/PointRuleConfigPageReqVO.java → menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/config/PointRuleConfigPageReqVO.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.reward.controller.base.pointruleconfig;
+package com.citu.module.menduner.reward.controller.base.config;
 
 import com.citu.framework.common.pojo.PageParam;
 import io.swagger.v3.oas.annotations.media.Schema;

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

@@ -1,11 +1,10 @@
-package com.citu.module.menduner.reward.controller.base.pointruleconfig;
+package com.citu.module.menduner.reward.controller.base.config;
 
 
-import com.citu.module.menduner.reward.dal.dataobject.pointruleconfig.Condition;
+import com.citu.module.menduner.reward.dal.dataobject.config.Condition;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
-import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import com.alibaba.excel.annotation.*;
 
@@ -36,7 +35,7 @@ public class PointRuleConfigRespVO {
 
     @Schema(description = "积分数", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("积分数")
-    private BigDecimal point;
+    private Integer point;
 
     @Schema(description = "触发规则", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("触发规则")

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

@@ -1,12 +1,11 @@
-package com.citu.module.menduner.reward.controller.base.pointruleconfig;
+package com.citu.module.menduner.reward.controller.base.config;
 
 
-import com.citu.module.menduner.reward.dal.dataobject.pointruleconfig.Condition;
+import com.citu.module.menduner.reward.dal.dataobject.config.Condition;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
 import javax.validation.constraints.*;
-import java.math.BigDecimal;
 
 @Schema(description = "管理后台 - 积分规则配置新增/修改 Request VO")
 @Data
@@ -33,7 +32,7 @@ public class PointRuleConfigSaveReqVO {
 
     @Schema(description = "积分数", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotNull(message = "{1_110_001_006}")
-    private BigDecimal point;
+    private Integer point;
 
     @Schema(description = "触发规则", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotNull(message = "{1_110_001_007}")
@@ -43,7 +42,7 @@ public class PointRuleConfigSaveReqVO {
     private Condition constraintRule;
 
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
-    @NotEmpty(message = "{1_110_001_008}")
+    @NotEmpty(message = "{1_110_000_001}")
     private String status;
 
 }

+ 25 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/record/PointRecordPageReqVO.java

@@ -0,0 +1,25 @@
+package com.citu.module.menduner.reward.controller.base.record;
+
+import com.citu.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 用户积分记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PointRecordPageReqVO extends PageParam {
+
+
+    @Schema(description = "用户编号", example = "123")
+    private Long userId;
+
+    @Schema(description = "业务类型", example = "1")
+    private Integer bizType;
+
+    @Schema(description = "积分标题", example = "呵呵")
+    private String title;
+
+}

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

@@ -0,0 +1,39 @@
+package com.citu.module.menduner.reward.controller.base.record;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 用户积分记录 Response VO")
+@Data
+public class PointRecordRespVO {
+
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "31457")
+    private Long id;
+
+    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+    private Long userId;
+
+    @Schema(description = "业务编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "22706")
+    private String bizId;
+
+    @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer bizType;
+
+    @Schema(description = "积分标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜")
+    private String title;
+
+    @Schema(description = "积分描述", example = "你猜")
+    private String description;
+
+    @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+    private Integer point;
+
+    @Schema(description = "变动后的积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
+    private Integer totalPoint;
+
+    @Schema(description = "发生时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime createTime;
+
+}

+ 36 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/config/SignInConfigBaseVO.java

@@ -0,0 +1,36 @@
+package com.citu.module.menduner.reward.controller.base.signin.config;
+
+import cn.hutool.core.util.ObjUtil;
+import com.citu.framework.common.enums.CommonStatusEnum;
+import com.citu.framework.common.validation.InEnum;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.AssertTrue;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.PositiveOrZero;
+
+/**
+ * 签到规则 Base VO,提供给添加、修改、详细的子 VO 使用
+ * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
+ */
+@Data
+public class SignInConfigBaseVO {
+
+    @Schema(description = "签到第 x 天", requiredMode = Schema.RequiredMode.REQUIRED, example = "7")
+    @NotNull(message = "{1_110_003_003}")
+    private Integer day;
+
+    @Schema(description = "奖励积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+    @NotNull(message = "{1_110_003_004}")
+    @PositiveOrZero(message = "{1_110_003_005}")
+    private Integer point;
+
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "{1_110_000_001}")
+    @InEnum(CommonStatusEnum.class)
+    private Integer status;
+
+}

+ 14 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/config/SignInConfigCreateReqVO.java

@@ -0,0 +1,14 @@
+package com.citu.module.menduner.reward.controller.base.signin.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 签到规则创建 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class SignInConfigCreateReqVO extends SignInConfigBaseVO {
+
+}

+ 22 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/config/SignInConfigRespVO.java

@@ -0,0 +1,22 @@
+package com.citu.module.menduner.reward.controller.base.signin.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 签到规则 Response VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class SignInConfigRespVO extends SignInConfigBaseVO {
+
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "20937")
+    private Integer id;
+
+    @Schema(description = "创建时间")
+    private LocalDateTime createTime;
+
+}

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

@@ -0,0 +1,20 @@
+package com.citu.module.menduner.reward.controller.base.signin.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 签到规则更新 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class SignInConfigUpdateReqVO extends SignInConfigBaseVO {
+
+    @Schema(description = "规则自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "13653")
+    @NotNull(message = "规则自增主键不能为空")
+    private Long id;
+
+}

+ 31 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/record/SignInRecordPageReqVO.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.reward.controller.base.signin.record;
+
+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 SignInRecordPageReqVO extends PageParam {
+
+
+    @Schema(description = "第几天签到", example = "10")
+    private Integer day;
+
+    @Schema(description = "用户编号", example = "123")
+    private Long userId;
+
+    @Schema(description = "签到时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 27 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/controller/base/signin/record/SignInRecordRespVO.java

@@ -0,0 +1,27 @@
+package com.citu.module.menduner.reward.controller.base.signin.record;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 签到记录 Response VO")
+@Data
+public class SignInRecordRespVO {
+
+    @Schema(description = "签到自增 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11903")
+    private Long id;
+
+    @Schema(description = "签到用户", requiredMode = Schema.RequiredMode.REQUIRED, example = "6507")
+    private Long userId;
+
+    @Schema(description = "第几天签到", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    private Integer day;
+
+    @Schema(description = "签到的积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+    private Integer point;
+
+    @Schema(description = "签到时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    private LocalDateTime createTime;
+
+}

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

@@ -0,0 +1,18 @@
+package com.citu.module.menduner.reward.convert;
+
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.reward.controller.base.record.PointRecordRespVO;
+import com.citu.module.menduner.reward.dal.dataobject.record.PointRecordDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+
+@Mapper
+public interface PointRecordConvert {
+    PointRecordConvert INSTANCE = Mappers.getMapper(PointRecordConvert.class);
+
+
+    PageResult<PointRecordRespVO> convertPage(PageResult<PointRecordDO> pageResult);
+
+
+}

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/PointRuleConfigConvert.java

@@ -1,7 +1,7 @@
 package com.citu.module.menduner.reward.convert;
 
 import com.citu.module.menduner.reward.controller.base.event.EventTrackUrlRespVO;
-import com.citu.module.menduner.reward.dal.dataobject.pointruleconfig.PointRuleConfigDO;
+import com.citu.module.menduner.reward.dal.dataobject.config.PointRuleConfigDO;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 

+ 31 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/SignInConfigConvert.java

@@ -0,0 +1,31 @@
+package com.citu.module.menduner.reward.convert;
+
+import com.citu.module.menduner.reward.controller.base.signin.config.SignInConfigCreateReqVO;
+import com.citu.module.menduner.reward.controller.base.signin.config.SignInConfigRespVO;
+import com.citu.module.menduner.reward.controller.base.signin.config.SignInConfigUpdateReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.signin.SignInConfigDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 签到规则 Convert
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface SignInConfigConvert {
+
+    SignInConfigConvert INSTANCE = Mappers.getMapper(SignInConfigConvert.class);
+
+    SignInConfigDO convert(SignInConfigCreateReqVO bean);
+
+    SignInConfigDO convert(SignInConfigUpdateReqVO bean);
+
+    SignInConfigRespVO convert(SignInConfigDO bean);
+
+    List<SignInConfigRespVO> convertList(List<SignInConfigDO> list);
+
+
+}

+ 55 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/convert/SignInRecordConvert.java

@@ -0,0 +1,55 @@
+package com.citu.module.menduner.reward.convert;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.date.DateUtils;
+import com.citu.module.menduner.reward.controller.base.signin.record.SignInRecordRespVO;
+import com.citu.module.menduner.reward.dal.dataobject.signin.SignInConfigDO;
+import com.citu.module.menduner.reward.dal.dataobject.signin.SignInRecordDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * 签到记录 Convert
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface SignInRecordConvert {
+
+    SignInRecordConvert INSTANCE = Mappers.getMapper(SignInRecordConvert.class);
+
+
+    PageResult<SignInRecordRespVO> convertPage(PageResult<SignInRecordDO> pageResult);
+
+    default SignInRecordDO convert(Long userId, SignInRecordDO lastRecord, List<SignInConfigDO> configs) {
+        // 1. 计算是第几天签到
+        configs.sort(Comparator.comparing(SignInConfigDO::getDay));
+        SignInConfigDO lastConfig = CollUtil.getLast(configs); // 最大签到天数配置
+        // 1.2. 计算今天是第几天签到 (只有连续签到才加否则重置为 1)
+        int day = 1;
+        if (lastRecord != null && DateUtils.isYesterday(lastRecord.getCreateTime())) {
+            day = lastRecord.getDay() + 1;
+        }
+        // 1.3 判断是否超出了最大签到配置
+        if (day > lastConfig.getDay()) {
+            day = 1; // 超过最大配置的天数,重置到第一天。(也就是说开启下一轮签到)
+        }
+
+        // 2.1 初始化签到信息
+        SignInRecordDO record = new SignInRecordDO().setUserId(userId)
+                .setDay(day).setPoint(0);
+        // 2.2 获取签到对应的积分
+        SignInConfigDO config = CollUtil.findOne(configs, item -> ObjUtil.equal(item.getDay(), record.getDay()));
+        if (config == null) {
+            return record;
+        }
+        record.setPoint(config.getPoint());
+        return record;
+    }
+
+}

+ 44 - 7
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/core/EasyRulesEngine.java

@@ -3,11 +3,10 @@ package com.citu.module.menduner.reward.core;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-import com.citu.module.menduner.reward.dal.dataobject.pointruleconfig.Condition;
+import com.citu.module.menduner.reward.dal.dataobject.config.Condition;
 import com.citu.module.menduner.reward.enums.OperationEnum;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
-import org.jeasy.rules.api.Facts;
 import org.jeasy.rules.api.Rule;
 import org.jeasy.rules.api.Rules;
 import org.jeasy.rules.api.RulesEngine;
@@ -16,6 +15,8 @@ import org.jeasy.rules.mvel.MVELRule;
 import org.springframework.util.StringUtils;
 
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static com.citu.module.menduner.reward.enums.EasyRulesConstants.*;
 
@@ -32,12 +33,12 @@ public class EasyRulesEngine {
     /**
      * 执行规则匹配
      *
-     * @param facts      事实
-     * @param baseRule 规则模型
+     * @param ruleMatch    匹配规则
      */
-    public static RuleResult match(Facts facts, RuleBase baseRule) {
+    public static RuleResult match(RuleMatch ruleMatch) {
         // 结果
         RuleResult result = new RuleResult();
+        RuleBase baseRule = ruleMatch.getRuleBase();
         result.setRuleId(baseRule.getRuleId());
         // 规则内容
         Rule mvelrule = new MVELRule()
@@ -51,10 +52,11 @@ public class EasyRulesEngine {
         rules.register(mvelrule);
         // 创建规则执行引擎,并执行规则
         RulesEngine rulesEngine = new DefaultRulesEngine();
-        rulesEngine.fire(rules, facts);
+        rulesEngine.fire(rules, ruleMatch.getFacts());
         return result;
     }
 
+
     /**
      * 根据json构建mvel条件表达式
      *
@@ -114,7 +116,7 @@ public class EasyRulesEngine {
         switch (condition.getType()) {
             case EXPRESSION_TYPE:
                 String fieldName = condition.getKey();
-                Object fieldValue =condition.getValue();
+                Object fieldValue = condition.getValue();
                 mvelExpressionSB.append(buildOperatorExpress(operator, fieldName, fieldValue));
                 break;
             case RELATION_TYPE:
@@ -191,6 +193,41 @@ public class EasyRulesEngine {
         return relation;
     }
 
+    /**
+     * 提取给定根条件及其所有子条件中所有唯一的key值。
+     *
+     * @param rootCondition 根条件对象
+     * @return 包含所有唯一key值的列表
+     */
+    public static List<String> extractUniqueKeys(Condition rootCondition) {
+        return extractKeysRecursively(rootCondition)
+                .distinct()
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 递归地提取条件中的key值,并返回一个Stream。
+     *
+     * @param condition 当前条件对象
+     * @return 一个包含当前条件及其子条件中的key值的Stream
+     */
+    private static Stream<String> extractKeysRecursively(Condition condition) {
+        if (condition == null) {
+            return Stream.empty();
+        }
+
+        // 创建一个包含当前条件key的Stream
+        Stream<String> keyStream = condition.getKey() != null ? Stream.of(condition.getKey()) : Stream.empty();
+
+        // 递归处理子条件
+        Stream<String> childrenKeysStream = condition.getChildren() != null
+                ? condition.getChildren().stream().flatMap(EasyRulesEngine::extractKeysRecursively)
+                : Stream.empty();
+
+        // 合并当前key和子条件的key Streams
+        return Stream.concat(keyStream, childrenKeysStream);
+    }
+
 
     /**
      * 构建mvel结果表达式

+ 2 - 3
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/core/PointRuleFact.java → menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/core/PointRule.java

@@ -2,7 +2,6 @@ package com.citu.module.menduner.reward.core;
 
 import lombok.Data;
 
-import java.math.BigDecimal;
 import java.util.Map;
 
 /**
@@ -11,7 +10,7 @@ import java.util.Map;
  * @author rayson
  **/
 @Data
-public class PointRuleFact extends RuleBase{
+public class PointRule extends RuleBase {
 
     /**
      * 触发规则
@@ -39,6 +38,6 @@ public class PointRuleFact extends RuleBase{
     /**
      * 积分数
      */
-    private BigDecimal point;
+    private Integer point;
 
 }

+ 23 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/core/RuleMatch.java

@@ -0,0 +1,23 @@
+package com.citu.module.menduner.reward.core;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jeasy.rules.api.Facts;
+
+/**
+ * 规则匹配
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class RuleMatch {
+
+    /** 事实 **/
+    private Facts facts;
+
+    /** 规则基本信息 **/
+    private RuleBase ruleBase;
+}

+ 0 - 9
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/Test.java

@@ -1,9 +0,0 @@
-package com.citu.module.menduner.reward.dal.dataobject;
-
-/**
- * @author rayson
- * @description Test
- * @create 2024/6/17 下午6:56
- **/
-public class Test {
-}

+ 1 - 1
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/pointruleconfig/Condition.java → menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/config/Condition.java

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.reward.dal.dataobject.pointruleconfig;
+package com.citu.module.menduner.reward.dal.dataobject.config;
 
 import com.citu.module.menduner.reward.enums.EasyRulesConstants;
 import com.citu.module.menduner.reward.enums.OperationEnum;

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

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.reward.dal.dataobject.pointruleconfig;
+package com.citu.module.menduner.reward.dal.dataobject.config;
 
 import com.baomidou.mybatisplus.annotation.KeySequence;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -8,8 +8,6 @@ import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import com.citu.framework.mybatis.core.dataobject.BaseDO;
 import lombok.*;
 
-import java.math.BigDecimal;
-
 /**
  * 积分规则配置 DO
  *
@@ -49,7 +47,7 @@ public class PointRuleConfigDO extends BaseDO {
     /**
      * 积分数
      */
-    private BigDecimal point;
+    private Integer point;
     /**
      * 触发规则
      */

+ 74 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/record/PointRecordDO.java

@@ -0,0 +1,74 @@
+package com.citu.module.menduner.reward.dal.dataobject.record;
+
+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_point_record")
+@KeySequence("mde_point_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PointRecordDO extends BaseDO {
+
+    /**
+     * 自增主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 用户编号
+     */
+    private Long userId;
+
+    /**
+     * 业务编码
+     */
+    private String bizId;
+    /**
+     * 业务类型
+     */
+    private Integer bizType;
+
+    /**
+     * 事件地址,用于记录积分规则访问的记录
+     */
+    private String url;
+
+    /**
+     * 积分标题
+     */
+    private String title;
+    /**
+     * 积分描述
+     */
+    private String description;
+
+    /**
+     * 数学运算符 + | -
+     */
+    private String operation;
+
+    /**
+     * 变动积分
+     *
+     * 1、正数表示获得积分
+     * 2、负数表示消耗积分
+     */
+    private Integer point;
+    /**
+     * 变动后的积分
+     */
+    private Integer totalPoint;
+
+}

+ 46 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/signin/SignInConfigDO.java

@@ -0,0 +1,46 @@
+package com.citu.module.menduner.reward.dal.dataobject.signin;
+
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.citu.framework.common.enums.CommonStatusEnum;
+import com.citu.framework.mybatis.core.dataobject.BaseDO;
+import lombok.*;
+
+/**
+ * 签到规则 DO
+ *
+ * @author Rayson
+ */
+@TableName("mde_sign_in_config")
+@KeySequence("mde_sign_in_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SignInConfigDO extends BaseDO {
+
+    /**
+     * 规则自增主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 签到第 x 天
+     */
+    private Integer day;
+    /**
+     * 奖励积分
+     */
+    private Integer point;
+
+    /**
+     * 状态
+     * <p>
+     * 枚举 {@link CommonStatusEnum}
+     */
+    private Integer status;
+
+}

+ 42 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/dataobject/signin/SignInRecordDO.java

@@ -0,0 +1,42 @@
+package com.citu.module.menduner.reward.dal.dataobject.signin;
+
+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_sign_in_record")
+@KeySequence("mde_sign_in_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SignInRecordDO extends BaseDO {
+
+    /**
+     * 编号
+     */
+    @TableId
+    private Long id;
+    /**
+     * 签到用户
+     */
+    private Long userId;
+    /**
+     * 第几天签到
+     */
+    private Integer day;
+    /**
+     * 签到的积分
+     */
+    private Integer point;
+
+}

+ 0 - 9
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/Test.java

@@ -1,9 +0,0 @@
-package com.citu.module.menduner.reward.dal.mysql;
-
-/**
- * @author rayson
- * @description Test
- * @create 2024/6/17 下午6:56
- **/
-public class Test {
-}

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

@@ -1,11 +1,11 @@
-package com.citu.module.menduner.reward.dal.mysql.pointruleconfig;
+package com.citu.module.menduner.reward.dal.mysql.config;
 
 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.pointruleconfig.PointRuleConfigPageReqVO;
-import com.citu.module.menduner.reward.dal.dataobject.pointruleconfig.PointRuleConfigDO;
-import com.citu.module.menduner.reward.enums.pointruleconfig.PointRuleConfigStatusEnum;
+import com.citu.module.menduner.reward.controller.base.config.PointRuleConfigPageReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.config.PointRuleConfigDO;
+import com.citu.module.menduner.reward.enums.config.PointRuleConfigStatusEnum;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;

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

@@ -0,0 +1,29 @@
+package com.citu.module.menduner.reward.dal.mysql.record;
+
+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.record.PointRecordPageReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.record.PointRecordDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Set;
+
+/**
+ * 用户积分记录 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface PointRecordMapper extends BaseMapperX<PointRecordDO> {
+
+    default PageResult<PointRecordDO> selectPage(PointRecordPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<PointRecordDO>()
+                .eqIfPresent(PointRecordDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(PointRecordDO::getBizType, reqVO.getBizType())
+                .likeIfPresent(PointRecordDO::getTitle, reqVO.getTitle())
+                .orderByDesc(PointRecordDO::getId));
+    }
+
+
+}

+ 24 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/signin/SignInConfigMapper.java

@@ -0,0 +1,24 @@
+package com.citu.module.menduner.reward.dal.mysql.signin;
+
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.module.menduner.reward.dal.dataobject.signin.SignInConfigDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 签到规则 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface SignInConfigMapper extends BaseMapperX<SignInConfigDO> {
+
+    default SignInConfigDO selectByDay(Integer day) {
+        return selectOne(SignInConfigDO::getDay, day);
+    }
+
+    default List<SignInConfigDO> selectListByStatus(Integer status) {
+        return selectList(SignInConfigDO::getStatus, status);
+    }
+}

+ 65 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/dal/mysql/signin/SignInRecordMapper.java

@@ -0,0 +1,65 @@
+package com.citu.module.menduner.reward.dal.mysql.signin;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.citu.module.menduner.reward.controller.base.signin.record.SignInRecordPageReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.signin.SignInRecordDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 签到记录 Mapper
+ *
+ * @author Rayson
+ */
+@Mapper
+public interface SignInRecordMapper extends BaseMapperX<SignInRecordDO> {
+
+    default PageResult<SignInRecordDO> selectPage(SignInRecordPageReqVO reqVO, Set<Long> userIds) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<SignInRecordDO>()
+                .inIfPresent(SignInRecordDO::getUserId, userIds)
+                .eqIfPresent(SignInRecordDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(SignInRecordDO::getDay, reqVO.getDay())
+                .betweenIfPresent(SignInRecordDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(SignInRecordDO::getId));
+    }
+
+    default PageResult<SignInRecordDO> selectPage(Long userId, PageParam pageParam) {
+        return selectPage(pageParam, new LambdaQueryWrapperX<SignInRecordDO>()
+                .eq(SignInRecordDO::getUserId, userId)
+                .orderByDesc(SignInRecordDO::getId));
+    }
+
+    /**
+     * 获取用户最近的签到记录信息,根据签到时间倒序
+     *
+     * @param userId 用户编号
+     * @return 签到记录列表
+     */
+    default SignInRecordDO selectLastRecordByUserId(Long userId) {
+        return selectOne(new QueryWrapper<SignInRecordDO>()
+                .eq("user_id", userId)
+                .orderByDesc("create_time")
+                .last("limit 1"));
+    }
+
+    default Long selectCountByUserId(Long userId) {
+        return selectCount(SignInRecordDO::getUserId, userId);
+    }
+
+    /**
+     * 获取用户的签到记录列表信息
+     *
+     * @param userId 用户编号
+     * @return 签到记录信息
+     */
+    default List<SignInRecordDO> selectListByUserId(Long userId) {
+        return selectList(SignInRecordDO::getUserId, userId);
+    }
+
+}

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

@@ -1,6 +1,6 @@
 package com.citu.module.menduner.reward.rule;
 
-import com.citu.module.menduner.reward.core.PointRuleFact;
+import com.citu.module.menduner.reward.core.PointRule;
 import lombok.extern.slf4j.Slf4j;
 import org.jeasy.rules.annotation.Action;
 import org.jeasy.rules.annotation.Condition;
@@ -19,9 +19,9 @@ import java.util.Map;
 @Rule(name = "DynamicRule")
 public class DynamicPointRule {
 
-    private final PointRuleFact fact;
+    private final PointRule fact;
 
-    public DynamicPointRule(PointRuleFact fact) {
+    public DynamicPointRule(PointRule fact) {
         this.fact = fact;
     }
 

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

@@ -1,9 +1,9 @@
-package com.citu.module.menduner.reward.service;
+package com.citu.module.menduner.reward.service.config;
 
 import com.citu.framework.common.pojo.PageResult;
-import com.citu.module.menduner.reward.controller.base.pointruleconfig.PointRuleConfigPageReqVO;
-import com.citu.module.menduner.reward.controller.base.pointruleconfig.PointRuleConfigSaveReqVO;
-import com.citu.module.menduner.reward.dal.dataobject.pointruleconfig.PointRuleConfigDO;
+import com.citu.module.menduner.reward.controller.base.config.PointRuleConfigPageReqVO;
+import com.citu.module.menduner.reward.controller.base.config.PointRuleConfigSaveReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.config.PointRuleConfigDO;
 
 import javax.validation.Valid;
 import java.util.List;

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

@@ -1,14 +1,14 @@
-package com.citu.module.menduner.reward.service;
+package com.citu.module.menduner.reward.service.config;
 
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.common.util.object.BeanUtils;
-import com.citu.module.menduner.reward.controller.base.pointruleconfig.PointRuleConfigPageReqVO;
-import com.citu.module.menduner.reward.controller.base.pointruleconfig.PointRuleConfigSaveReqVO;
-import com.citu.module.menduner.reward.dal.dataobject.pointruleconfig.PointRuleConfigDO;
-import com.citu.module.menduner.reward.dal.mysql.pointruleconfig.PointRuleConfigMapper;
+import com.citu.module.menduner.reward.controller.base.config.PointRuleConfigPageReqVO;
+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.dal.redis.RedisKeyConstants;
-import com.citu.module.menduner.reward.enums.pointruleconfig.PointRuleConfigStatusEnum;
+import com.citu.module.menduner.reward.enums.config.PointRuleConfigStatusEnum;
 import com.citu.module.menduner.system.enums.MendunerStatusEnum;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;

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

@@ -1,4 +1,4 @@
-package com.citu.module.menduner.reward.service;
+package com.citu.module.menduner.reward.service.event;
 
 import com.citu.module.menduner.reward.controller.base.common.TreeRespVO;
 import com.citu.module.menduner.reward.controller.base.event.EventTrackPointRespVO;

+ 30 - 20
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/EventTrackServiceImpl.java → menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/event/EventTrackServiceImpl.java

@@ -1,14 +1,16 @@
-package com.citu.module.menduner.reward.service;
+package com.citu.module.menduner.reward.service.event;
 
 import com.citu.module.menduner.reward.controller.base.common.TreeRespVO;
 import com.citu.module.menduner.reward.controller.base.event.EventTrackPointRespVO;
 import com.citu.module.menduner.reward.controller.base.event.EventTrackUrlRespVO;
 import com.citu.module.menduner.reward.convert.PointRuleConfigConvert;
 import com.citu.module.menduner.reward.core.EasyRulesEngine;
-import com.citu.module.menduner.reward.core.PointRuleFact;
-import com.citu.module.menduner.reward.dal.dataobject.pointruleconfig.PointRuleConfigDO;
+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.PointRuleConfigDO;
 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.system.api.url.MendunerSystemUrlApi;
 import com.citu.module.menduner.system.api.url.UrlInfoRespVO;
 import org.jeasy.rules.api.Facts;
@@ -17,7 +19,6 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -40,7 +41,6 @@ public class EventTrackServiceImpl implements EventTrackService {
     @Resource
     private MendunerSystemUrlApi mendunerSystemUrlApi;
 
-
     @Override
     public List<EventTrackUrlRespVO> getEventTrackList() {
         List<PointRuleConfigDO> list = ruleConfigService.getList();
@@ -52,34 +52,41 @@ public class EventTrackServiceImpl implements EventTrackService {
         PointRuleConfigDO config = ruleConfigService.get(id);
         if (null == config) {
             // 不存在
+            return null;
         }
 
         // redis 解析出当前操作用户的参数
 
+        List<String> triggerKeyList = EasyRulesEngine.extractUniqueKeys(config.getConstraintRule());
+
+        // 读取对应数据
+        // 赋值到 context
+
+
 
-        PointRuleFact fact = new PointRuleFact();
+        PointRule pointRule= new PointRule();
         // 基本信息
-        fact.setRuleId(String.valueOf(config.getId()));
-        fact.setRuleName(config.getUrl());
-        fact.setDescription(config.getTitle());
-        fact.setWhenExpression(RULE_WHEN);
-        fact.setThenExpression(RULE_THEN);
+        pointRule.setRuleId(String.valueOf(config.getId()));
+        pointRule.setRuleName(config.getUrl());
+        pointRule.setDescription(config.getTitle());
+        pointRule.setWhenExpression(RULE_WHEN);
+        pointRule.setThenExpression(RULE_THEN);
 
         // 构造参数
-        fact.setTriggerRule(EasyRulesEngine.buildWhenExpression(config.getTriggerRule()));
-        fact.setLimitRule(EasyRulesEngine.buildThenExpression());
-        fact.setTriggerContext(null);
-        fact.setLimitContext(null);
-        fact.setOperation(config.getOperation());
-        fact.setPoint(config.getPoint());
+        pointRule.setTriggerRule(EasyRulesEngine.buildWhenExpression(config.getTriggerRule()));
+        pointRule.setLimitRule(EasyRulesEngine.buildThenExpression());
+        pointRule.setTriggerContext(null);
+        pointRule.setLimitContext(null);
+        pointRule.setOperation(config.getOperation());
+        pointRule.setPoint(config.getPoint());
 
 
         // 解析器的上下文
         Facts context = new Facts();
-        context.put(RULE, new DynamicPointRule(fact));
+        context.put(RULE, new DynamicPointRule(pointRule));
         context.put(RULE_CONFIG, config);
 
-        DynamicRuleAction<PointRuleFact> action = (t) -> {
+        DynamicRuleAction<PointRule> action = (t) -> {
             // 匹配成功后的逻辑
             System.out.println("加分:" + t.getPoint());
         };
@@ -87,7 +94,10 @@ public class EventTrackServiceImpl implements EventTrackService {
 
 
         // 调用
-        EasyRulesEngine.match(context, fact);
+        EasyRulesEngine.match(RuleMatch.builder()
+                        .facts(context)
+                        .ruleBase(pointRule)
+                .build());
 
         return null;
     }

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

@@ -0,0 +1,35 @@
+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.record.PointBizTypeEnum;
+
+
+/**
+ * 用户积分记录 Service 接口
+ *
+ * @author Rayson
+ */
+public interface PointRecordService {
+
+    /**
+     * 【管理员】获得积分记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 签到记录分页
+     */
+    PageResult<PointRecordDO> getPointRecordPage(PointRecordPageReqVO pageReqVO);
+
+
+    /**
+     * 创建用户积分记录
+     *
+     * @param userId  用户ID
+     * @param point   变动积分
+     * @param bizType 业务类型
+     * @param bizId   业务编号
+     */
+    void createPointRecord(Long userId, Integer point, PointBizTypeEnum bizType, String bizId);
+
+}

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

@@ -0,0 +1,65 @@
+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.mysql.record.PointRecordMapper;
+import com.citu.module.menduner.reward.enums.record.PointBizTypeEnum;
+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;
+
+
+/**
+ * 积分记录 Service 实现类
+ *
+ * @author Rayson
+ */
+@Slf4j
+@Service
+@Validated
+public class PointRecordServiceImpl implements PointRecordService {
+
+    @Resource
+    private PointRecordMapper mapper;
+
+    @Override
+    public PageResult<PointRecordDO> getPointRecordPage(PointRecordPageReqVO pageReqVO) {
+        return mapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    @DSTransactional
+    public void createPointRecord(Long userId, 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);
+//        }
+
+        // 2. 更新用户积分
+//        boolean success = memberUserService.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);
+    }
+}

+ 63 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInConfigService.java

@@ -0,0 +1,63 @@
+package com.citu.module.menduner.reward.service.signin;
+
+
+import com.citu.module.menduner.reward.controller.base.signin.config.SignInConfigCreateReqVO;
+import com.citu.module.menduner.reward.controller.base.signin.config.SignInConfigUpdateReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.signin.SignInConfigDO;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 签到规则 Service 接口
+ *
+ * @author Rayson
+ */
+public interface SignInConfigService {
+
+    /**
+     * 创建签到规则
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createSignInConfig(@Valid SignInConfigCreateReqVO createReqVO);
+
+    /**
+     * 更新签到规则
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateSignInConfig(@Valid SignInConfigUpdateReqVO updateReqVO);
+
+    /**
+     * 删除签到规则
+     *
+     * @param id 编号
+     */
+    void deleteSignInConfig(Long id);
+
+    /**
+     * 获得签到规则
+     *
+     * @param id 编号
+     * @return 签到规则
+     */
+    SignInConfigDO getSignInConfig(Long id);
+
+    /**
+     * 获得签到规则列表
+     *
+     * @return 签到规则分页
+     */
+    List<SignInConfigDO> getSignInConfigList();
+
+    /**
+     * 获得签到规则列表
+     *
+     * @param status 状态
+     * @return 签到规则分页
+     */
+    List<SignInConfigDO> getSignInConfigList(Integer status);
+
+}

+ 108 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInConfigServiceImpl.java

@@ -0,0 +1,108 @@
+package com.citu.module.menduner.reward.service.signin;
+
+
+import com.citu.module.menduner.reward.controller.base.signin.config.SignInConfigCreateReqVO;
+import com.citu.module.menduner.reward.controller.base.signin.config.SignInConfigUpdateReqVO;
+import com.citu.module.menduner.reward.convert.SignInConfigConvert;
+import com.citu.module.menduner.reward.dal.dataobject.signin.SignInConfigDO;
+import com.citu.module.menduner.reward.dal.mysql.signin.SignInConfigMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.Comparator;
+import java.util.List;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.SIGN_IN_CONFIG_EXISTS;
+import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.SIGN_IN_CONFIG_NOT_EXISTS;
+
+
+/**
+ * 签到规则 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class SignInConfigServiceImpl implements SignInConfigService {
+
+    @Resource
+    private SignInConfigMapper memberSignInConfigMapper;
+
+    @Override
+    public Long createSignInConfig(SignInConfigCreateReqVO createReqVO) {
+        // 判断是否重复插入签到天数
+        validateSignInConfigDayDuplicate(createReqVO.getDay(), null);
+
+        // 插入
+        SignInConfigDO signInConfig = SignInConfigConvert.INSTANCE.convert(createReqVO);
+        memberSignInConfigMapper.insert(signInConfig);
+        // 返回
+        return signInConfig.getId();
+    }
+
+    @Override
+    public void updateSignInConfig(SignInConfigUpdateReqVO updateReqVO) {
+        // 校验存在
+        validateSignInConfigExists(updateReqVO.getId());
+        // 判断是否重复插入签到天数
+        validateSignInConfigDayDuplicate(updateReqVO.getDay(), updateReqVO.getId());
+
+        // 判断更新
+        SignInConfigDO updateObj = SignInConfigConvert.INSTANCE.convert(updateReqVO);
+        memberSignInConfigMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteSignInConfig(Long id) {
+        // 校验存在
+        validateSignInConfigExists(id);
+        // 删除
+        memberSignInConfigMapper.deleteById(id);
+    }
+
+    private void validateSignInConfigExists(Long id) {
+        if (memberSignInConfigMapper.selectById(id) == null) {
+            throw exception(SIGN_IN_CONFIG_NOT_EXISTS);
+        }
+    }
+
+    /**
+     * 校验 day 是否重复
+     *
+     * @param day 天
+     * @param id  编号,只有更新的时候会传递
+     */
+    private void validateSignInConfigDayDuplicate(Integer day, Long id) {
+        SignInConfigDO config = memberSignInConfigMapper.selectByDay(day);
+        // 1. 新增时,config 非空,则说明重复
+        if (id == null && config != null) {
+            throw exception(SIGN_IN_CONFIG_EXISTS);
+        }
+        // 2. 更新时,如果 config 非空,且 id 不相等,则说明重复
+        if (id != null && config != null && !config.getId().equals(id)) {
+            throw exception(SIGN_IN_CONFIG_EXISTS);
+        }
+    }
+
+    @Override
+    public SignInConfigDO getSignInConfig(Long id) {
+        return memberSignInConfigMapper.selectById(id);
+    }
+
+    @Override
+    public List<SignInConfigDO> getSignInConfigList() {
+        List<SignInConfigDO> list = memberSignInConfigMapper.selectList();
+        list.sort(Comparator.comparing(SignInConfigDO::getDay));
+        return list;
+    }
+
+    @Override
+    public List<SignInConfigDO> getSignInConfigList(Integer status) {
+        List<SignInConfigDO> list = memberSignInConfigMapper.selectListByStatus(status);
+        list.sort(Comparator.comparing(SignInConfigDO::getDay));
+        return list;
+    }
+
+}

+ 43 - 0
menduner/menduner-reward-biz/src/main/java/com/citu/module/menduner/reward/service/signin/SignInRecordService.java

@@ -0,0 +1,43 @@
+package com.citu.module.menduner.reward.service.signin;
+
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.module.menduner.reward.controller.base.signin.record.SignInRecordPageReqVO;
+import com.citu.module.menduner.reward.dal.dataobject.signin.SignInRecordDO;
+
+
+/**
+ * 签到记录 Service 接口
+ *
+ * @author Rayson
+ */
+public interface SignInRecordService {
+
+    /**
+     * 【管理员】获得签到记录分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 签到记录分页
+     */
+    PageResult<SignInRecordDO> getSignInRecordPage(SignInRecordPageReqVO pageReqVO);
+
+    /**
+     * 【会员】获得签到记录分页
+     *
+     * @param userId    用户编号
+     * @param pageParam 分页查询
+     * @return 签到记录分页
+     */
+    PageResult<SignInRecordDO> getSignRecordPage(Long userId, PageParam pageParam);
+
+    /**
+     * 创建签到记录
+     *
+     * @param userId 用户编号
+     * @return 签到记录
+     */
+    SignInRecordDO createSignRecord(Long userId);
+
+
+
+}

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

@@ -0,0 +1,88 @@
+package com.citu.module.menduner.reward.service.signin;
+
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.citu.framework.common.enums.CommonStatusEnum;
+import com.citu.framework.common.pojo.PageParam;
+import com.citu.framework.common.pojo.PageResult;
+import com.citu.framework.common.util.date.DateUtils;
+import com.citu.framework.common.util.object.ObjectUtils;
+import com.citu.module.menduner.reward.controller.base.signin.record.SignInRecordPageReqVO;
+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.record.PointBizTypeEnum;
+import com.citu.module.menduner.reward.service.record.PointRecordService;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Set;
+
+import static com.citu.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.citu.module.menduner.reward.enums.ErrorCodeConstants.SIGN_IN_RECORD_TODAY_EXISTS;
+
+/**
+ * 签到记录 Service 实现类
+ *
+ * @author Rayson
+ */
+@Service
+@Validated
+public class SignInRecordServiceImpl implements SignInRecordService {
+
+    @Resource
+    private SignInRecordMapper signInRecordMapper;
+    @Resource
+    private SignInConfigService signInConfigService;
+    @Resource
+    private PointRecordService pointRecordService;
+
+
+    @Override
+    public PageResult<SignInRecordDO> getSignInRecordPage(SignInRecordPageReqVO pageReqVO) {
+        // 根据用户昵称查询出用户ids
+        Set<Long> userIds = null;
+        // 分页查询
+        return signInRecordMapper.selectPage(pageReqVO, userIds);
+    }
+
+    @Override
+    public PageResult<SignInRecordDO> getSignRecordPage(Long userId, PageParam pageParam) {
+        return signInRecordMapper.selectPage(userId, pageParam);
+    }
+
+    @Override
+    @DSTransactional
+    public SignInRecordDO createSignRecord(Long userId) {
+        // 1. 获取当前用户最近的签到
+        SignInRecordDO lastRecord = signInRecordMapper.selectLastRecordByUserId(userId);
+        // 1.1. 判断是否重复签到
+        validateSigned(lastRecord);
+
+        // 2.1. 获取所有的签到规则
+        List<SignInConfigDO> signInConfigs = signInConfigService.getSignInConfigList(CommonStatusEnum.ENABLE.getStatus());
+        // 2.2. 组合数据
+        SignInRecordDO record = SignInRecordConvert.INSTANCE.convert(userId, lastRecord, signInConfigs);
+
+        // 3. 插入签到记录
+        signInRecordMapper.insert(record);
+
+        // 4. 增加积分
+        if (!ObjectUtils.equalsAny(record.getPoint(), null, 0)) {
+            pointRecordService.createPointRecord(userId, record.getPoint(), PointBizTypeEnum.SIGN, String.valueOf(record.getId()));
+        }
+        return record;
+    }
+
+    private void validateSigned(SignInRecordDO signInRecordDO) {
+        if (signInRecordDO == null) {
+            return;
+        }
+        if (DateUtils.isToday(signInRecordDO.getCreateTime())) {
+            throw exception(SIGN_IN_RECORD_TODAY_EXISTS);
+        }
+    }
+
+}

+ 11 - 2
menduner/menduner-reward-biz/src/main/resources/i18n/messages_en_US.properties

@@ -8,7 +8,6 @@
 405=incorrect request method
 423=request failed, please try again later # concurrent request, not allowed
 429=request too frequent, please try again later
-
 # ========== 服务端错误段 ==========
 500=system abnormality
 501=function not implemented/not enabled
@@ -18,6 +17,7 @@
 901=demonstration mode, write operation prohibited
 999=unknown error
 # ========== 公共配置  1_110_000_000 ==========
+1_110_000_001=Status 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
@@ -26,4 +26,13 @@
 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=Status cannot be empty
+#========== 积分记录 1_110_002_000 ==========
+1_110_002_001=User point record business type not supported
+#========== 签到配置 1_110_003_000 ==========
+1_110_003_001=The check-in day rule does not exist
+1_110_003_002=The check-in day rule already exists
+1_110_003_003=Check in days cannot be empty
+1_110_003_004=Reward points cannot be empty
+1_110_003_005=Reward points cannot be less than 0
+#========== 签到配置 1_110_004_000 ==========
+1_110_004_001=Checked in today, please do not sign in again

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

@@ -17,6 +17,7 @@
 901=演示模式,禁止写操作
 999=未知错误
 # ========== 公共配置  1_110_000_000 ==========
+1_110_000_001=状态不能为空
 # ========== 积分规则配置  1_110_001_000 ==========
 1_110_001_001=积分规则配置不存在
 1_110_001_002=事件地址不能为空
@@ -25,4 +26,14 @@
 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 ==========
+1_110_003_001=签到天数规则不存在
+1_110_003_002=签到天数规则已存在
+1_110_003_003=签到天数不能为空
+1_110_003_004=奖励积分不能为空
+1_110_003_005=奖励积分不能小于 0
+#========== 签到配置 1_110_004_000 ==========
+1_110_004_001=今日已签到,请勿重复签到

+ 5 - 5
menduner/menduner-reward-biz/src/test/java/com/citu/module/menduner/reward/service/pointruleconfig/PointRuleConfigServiceImplCommonController.java

@@ -3,11 +3,11 @@ package com.citu.module.menduner.reward.service.pointruleconfig;
 
 import com.citu.framework.common.pojo.PageResult;
 import com.citu.framework.test.core.ut.BaseDbUnitTest;
-import com.citu.module.menduner.reward.controller.base.pointruleconfig.PointRuleConfigPageReqVO;
-import com.citu.module.menduner.reward.controller.base.pointruleconfig.PointRuleConfigSaveReqVO;
-import com.citu.module.menduner.reward.dal.dataobject.pointruleconfig.PointRuleConfigDO;
-import com.citu.module.menduner.reward.dal.mysql.pointruleconfig.PointRuleConfigMapper;
-import com.citu.module.menduner.reward.service.PointRuleConfigServiceImpl;
+import com.citu.module.menduner.reward.controller.base.config.PointRuleConfigPageReqVO;
+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;