瀏覽代碼

【feat】【第二版开发】
1.增加功能
2.移除无效代码

ChenYL 1 年之前
父節點
當前提交
a2d77a5d54
共有 60 個文件被更改,包括 1449 次插入600 次删除
  1. 15 0
      doc/sql/update-v2.sql
  2. 34 51
      doc/技术文档.md
  3. 0 57
      src/main/java/com/punchsettle/server/atomic/entity/LotteryInvestRecord.java
  4. 13 6
      src/main/java/com/punchsettle/server/atomic/entity/LotteryScratchRecord.java
  5. 10 3
      src/main/java/com/punchsettle/server/atomic/entity/PunchIn.java
  6. 0 13
      src/main/java/com/punchsettle/server/atomic/mapper/LotteryInvestRecordMapper.java
  7. 13 0
      src/main/java/com/punchsettle/server/atomic/mapper/LotteryScratchRecordMapper.java
  8. 0 13
      src/main/java/com/punchsettle/server/atomic/mapper/LotteryWinRecordMapper.java
  9. 0 10
      src/main/java/com/punchsettle/server/atomic/service/ILotteryInvestRecordService.java
  10. 31 0
      src/main/java/com/punchsettle/server/atomic/service/ILotteryScratchRecordService.java
  11. 0 10
      src/main/java/com/punchsettle/server/atomic/service/ILotteryWinRecordService.java
  12. 14 1
      src/main/java/com/punchsettle/server/atomic/service/IPunchInRecordService.java
  13. 11 11
      src/main/java/com/punchsettle/server/atomic/service/IPunchInService.java
  14. 10 0
      src/main/java/com/punchsettle/server/atomic/service/IUserClaimRewardRecordService.java
  15. 0 14
      src/main/java/com/punchsettle/server/atomic/service/impl/LotteryInvestRecordServiceImpl.java
  16. 44 0
      src/main/java/com/punchsettle/server/atomic/service/impl/LotteryScratchRecordServiceImpl.java
  17. 0 14
      src/main/java/com/punchsettle/server/atomic/service/impl/LotteryWinRecordServiceImpl.java
  18. 22 1
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInRecordServiceImpl.java
  19. 18 20
      src/main/java/com/punchsettle/server/atomic/service/impl/PunchInServiceImpl.java
  20. 23 0
      src/main/java/com/punchsettle/server/atomic/service/impl/UserClaimRewardRecordServiceImpl.java
  21. 17 0
      src/main/java/com/punchsettle/server/common/annotation/EnumValue.java
  22. 0 17
      src/main/java/com/punchsettle/server/common/converter/enums/IJsonEnum.java
  23. 0 33
      src/main/java/com/punchsettle/server/common/converter/enums/IntegerToEnumConverter.java
  24. 0 22
      src/main/java/com/punchsettle/server/common/converter/enums/IntegerToEnumConverterFactory.java
  25. 1 0
      src/main/java/com/punchsettle/server/common/entity/BaseEntity.java
  26. 13 0
      src/main/java/com/punchsettle/server/common/exception/BusinessException.java
  27. 113 0
      src/main/java/com/punchsettle/server/common/typehandler/EnumValueTypeHandler.java
  28. 0 10
      src/main/java/com/punchsettle/server/common/valid/DoSomething.java
  29. 34 0
      src/main/java/com/punchsettle/server/constant/PunchInCategoryEnum.java
  30. 36 0
      src/main/java/com/punchsettle/server/constant/PunchInRuleEnum.java
  31. 4 7
      src/main/java/com/punchsettle/server/constant/PunchInStatusEnum.java
  32. 34 0
      src/main/java/com/punchsettle/server/constant/ScratchActionTypeEnum.java
  33. 0 7
      src/main/java/com/punchsettle/server/core/config/WebMvcConfig.java
  34. 59 0
      src/main/java/com/punchsettle/server/dto/UserInfoDto.java
  35. 0 18
      src/main/java/com/punchsettle/server/dto/UserRewardDto.java
  36. 42 10
      src/main/java/com/punchsettle/server/dto/punchin/PunchInDto.java
  37. 27 0
      src/main/java/com/punchsettle/server/dto/punchin/PunchInQuery.java
  38. 1 1
      src/main/java/com/punchsettle/server/dto/punchin/PunchInRecordDto.java
  39. 11 1
      src/main/java/com/punchsettle/server/dto/punchin/PunchInRecordQuery.java
  40. 27 6
      src/main/java/com/punchsettle/server/dto/punchin/PunchInWithRecordDto.java
  41. 1 1
      src/main/java/com/punchsettle/server/dto/reward/ClaimRewardDto.java
  42. 37 0
      src/main/java/com/punchsettle/server/dto/reward/ClaimRewardRecordDto.java
  43. 28 0
      src/main/java/com/punchsettle/server/dto/reward/ClaimRewardRecordQuery.java
  44. 57 0
      src/main/java/com/punchsettle/server/dto/scratch/ScratchDto.java
  45. 35 0
      src/main/java/com/punchsettle/server/dto/scratch/ScratchQuery.java
  46. 27 0
      src/main/java/com/punchsettle/server/dto/task/SettleRewardTaskDto.java
  47. 11 7
      src/main/java/com/punchsettle/server/service/controller/PunchInController.java
  48. 9 6
      src/main/java/com/punchsettle/server/service/controller/RewardController.java
  49. 31 0
      src/main/java/com/punchsettle/server/service/controller/UserController.java
  50. 10 4
      src/main/java/com/punchsettle/server/service/manager/IPunchInManager.java
  51. 6 3
      src/main/java/com/punchsettle/server/service/manager/IRewardManager.java
  52. 31 0
      src/main/java/com/punchsettle/server/service/manager/IScratchManager.java
  53. 24 0
      src/main/java/com/punchsettle/server/service/manager/ISettleManager.java
  54. 7 0
      src/main/java/com/punchsettle/server/service/manager/IUserManager.java
  55. 78 19
      src/main/java/com/punchsettle/server/service/manager/impl/PunchInManagerImpl.java
  56. 19 9
      src/main/java/com/punchsettle/server/service/manager/impl/RewardManagerImpl.java
  57. 102 0
      src/main/java/com/punchsettle/server/service/manager/impl/ScratchManagerImpl.java
  58. 238 0
      src/main/java/com/punchsettle/server/service/manager/impl/SettleManagerImpl.java
  59. 9 195
      src/main/java/com/punchsettle/server/service/manager/impl/TaskManagerImpl.java
  60. 12 0
      src/main/java/com/punchsettle/server/service/manager/impl/UserManagerImpl.java

+ 15 - 0
doc/sql/update-v2.sql

@@ -146,3 +146,18 @@ INSERT INTO punch_settle.sys_dict_item (id, dict_id, item_code, item_name, descr
 INSERT INTO punch_settle.sys_dict_item (id, dict_id, item_code, item_name, description, status, created_by, creation_time, last_updated_by, last_update_time, version, delete_flag) VALUES(4, 2, 'CHAOGEILI', '超给力', NULL, 1, 1, '2024-12-12 18:40:06', 1, '2024-12-12 18:40:06', 1, 0);
 
 DROP TABLE punch_settle.user_ext;
+
+DROP TABLE punch_settle.lottery_invest_record;
+
+RENAME TABLE punch_settle.lottery_win_record TO punch_settle.lottery_scratch_record;
+ALTER TABLE punch_settle.lottery_scratch_record
+COMMENT='彩票刮刮乐记录';
+ALTER TABLE punch_settle.lottery_scratch_record MODIFY COLUMN win_amount decimal(10,2) DEFAULT 0.00 NOT NULL COMMENT '金额(元)';
+ALTER TABLE punch_settle.lottery_scratch_record ADD `type` int NOT NULL COMMENT '记录类型(0-投入/购买,1-中奖)';
+ALTER TABLE punch_settle.lottery_scratch_record CHANGE `type` `type` int NOT NULL COMMENT '记录类型(0-投入/购买,1-中奖)' AFTER user_id;
+
+ALTER TABLE punch_settle.lottery_scratch_record CHANGE `type` action_type int NOT NULL COMMENT '动作类型(0-投入/购买,1-中奖,2-撤销投入,3-撤销中奖)';
+
+ALTER TABLE punch_settle.lottery_scratch_record ADD revoke_id bigint NULL COMMENT '撤销的刮刮乐记录ID';
+ALTER TABLE punch_settle.lottery_scratch_record CHANGE revoke_id revoke_id bigint NULL COMMENT '撤销的刮刮乐记录ID' AFTER action_type;
+ALTER TABLE punch_settle.lottery_scratch_record DROP COLUMN revoke_id;

+ 34 - 51
doc/技术文档.md

@@ -23,17 +23,17 @@ ui设计工具:即时设计
 
 * 用户
 
-  1. 微信用户登录
+  1. (已开发)微信用户登录
 
      说明:简单获取头像、微信openid、昵称,然后用于后台数据处理和前端显示即可
 
-  2. 昵称修改(这个最后开发)
+  2. (这个最后开发)昵称修改
 
-  3. 头像修改(这个最后开发)
+  3. (这个最后开发)头像修改
 
 * 打卡任务
 
-  1. 查询当前用户拥有的打卡任务列表
+  1. (已开发)查询当前用户拥有的打卡任务列表
 
      显示内容:任务名称、任务描述、奖励数、全勤奖励标识、周末奖励标识、本周打卡记录,今日打卡情况
 
@@ -43,7 +43,7 @@ ui设计工具:即时设计
      * 打卡类型:计数,未完成显示“计数”,并且显示当前已打卡次数
      * 打卡类型:计时,未完成显示“计时”,并且显示当前已记录的打卡时间
 
-  2. 新建/编辑任务
+  2. (已开发)新建/编辑任务
 
      显示内容:任务名称、奖励数、全勤奖励标识、周末奖励标识、任务描述,打卡类型,打卡配置(四种比较规则、两种数值类型)
 
@@ -56,15 +56,15 @@ ui设计工具:即时设计
        * 计时:需要设置比较规则和时间
      * 比较规则:大于、小于、大于等于、小于等于
 
-  3. 删除任务
+  3. (已开发)删除任务
 
-  4. 打卡
+  4. (已开发)打卡
 
-  5. 补打卡
+  5. (这个最后开发,要考虑结算的问题)补打卡
 
-  6. 误打卡撤销
+  6. (这个最后开发,要考虑结算的问题)误打卡撤销
 
-  7. 归档
+  7. (已开发)归档
 
   8. 针对单一任务查询时间范围内的打卡信息
 
@@ -72,25 +72,25 @@ ui设计工具:即时设计
 
 * 奖励
 
-  1. 查询当前用户拥有的奖励数
+  1. (已开发)查询当前用户拥有的奖励数
 
      显示内容:总奖励数、已领取奖励数、待领取奖励数
 
-  2. 领取奖励(部分领取、一次性全部领取)
+  2. (已开发,全部领取需要前端部分支持)领取奖励(部分领取、一次性全部领取)
 
      说明:全部领取功能通过前端页面支持,后端不需要额外开发
 
-  3. 按时间范围查询当前用户的领取奖励记录
+  3. (已开发)按时间范围查询当前用户的领取奖励记录
 
 * 刮刮乐
 
-  1. 查询当前用户的投入刮刮乐信息
+  1. (已开发)查询当前用户的投入刮刮乐信息
 
      显示内容:投入金额、中奖金额
 
-  2. 追加投入金额
+  2. (已开发,待自测)追加投入金额记录/中奖记录
 
-  3. 添加中奖记录
+  3. (已开发,待自测)撤销投入金额记录/中奖记录
 
   4. 按时间范围的刮刮乐查询记录
 
@@ -103,7 +103,7 @@ ui设计工具:即时设计
 
 * 系统
 
-  1. 每晚自动结算
+  1. (已开发)每晚自动结算
 
 
 
@@ -329,42 +329,24 @@ ui设计工具:即时设计
 
 
 
-### 彩票投入记录
+### 彩票刮刮乐记录
 
-表名:lottery_invest_record
+表名:lottery_scratch_record
 
-| 字段             | 类型          | 描述                               |
-| ---------------- | ------------- | ---------------------------------- |
-| id               | bigint        | 主键                               |
-| user_id          | bigint        | 用户主键                           |
-| source           | varchar(100)  | 来源                               |
-| category         | varchar(100)  | 种类                               |
-| invest_amount    | decimal(10,2) | 投入金额(元)                     |
-| created_by       | bigint        | 创建人                             |
-| creation_time    | timestamp     | 创建时间                           |
-| last_updated_by  | bigint        | 最后更信人                         |
-| last_update_time | timestamp     | 最后更新时间                       |
-| version          | bigint        | 版本号                             |
-| delete_flag      | tinyint       | 逻辑删除标志(0-未删除,1-已删除) |
-
-
-
-### 彩票中奖记录
-
-表名:lottery_win_record
-
-| 字段             | 类型          | 描述                               |
-| ---------------- | ------------- | ---------------------------------- |
-| id               | bigint        | 主键                               |
-| source           | varchar(100)  | 来源                               |
-| category         | varchar(100)  | 种类                               |
-| win_amount       | decimal(10,2) | 中奖金额(元)                     |
-| created_by       | bigint        | 创建人                             |
-| creation_time    | timestamp     | 创建时间                           |
-| last_updated_by  | bigint        | 最后更信人                         |
-| last_update_time | timestamp     | 最后更新时间                       |
-| version          | bigint        | 版本号                             |
-| delete_flag      | tinyint       | 逻辑删除标志(0-未删除,1-已删除) |
+| 字段             | 类型          | 描述                                                  |
+| ---------------- | ------------- | ----------------------------------------------------- |
+| id               | bigint        | 主键                                                  |
+| user_id          | bigint        | 用户主键                                              |
+| action_type      | int           | 动作类型(0-投入/购买,1-中奖,2-撤销投入,3-撤销中奖) |
+| source           | varchar(100)  | 彩票来源                                              |
+| category         | varchar(100)  | 彩票种类                                              |
+| amount           | decimal(10,2) | 金额(元)                                            |
+| created_by       | bigint        | 创建人                                                |
+| creation_time    | timestamp     | 创建时间                                              |
+| last_updated_by  | bigint        | 最后更信人                                            |
+| last_update_time | timestamp     | 最后更新时间                                          |
+| version          | bigint        | 版本号                                                |
+| delete_flag      | tinyint       | 逻辑删除标志(0-未删除,1-已删除)                    |
 
 
 
@@ -416,5 +398,6 @@ ui设计工具:即时设计
 * [两种优雅的获取当前登录用户ID的方式](https://blog.csdn.net/tomorrow9813/article/details/131736382)
 * [学会自己编写Mybatis插件(拦截器)实现自定义需求](https://juejin.cn/post/7220321558103097404#heading-3)
 * [Mybatis拦截器教程及几个实用自定义拦截器分享](https://juejin.cn/post/7242129949179248700#heading-5)
+* [tk.mybatis 2.1.15 如何将枚举类型在类中进行自动转换](https://blog.csdn.net/qq_42766445/article/details/134196790)
 
 

+ 0 - 57
src/main/java/com/punchsettle/server/atomic/entity/LotteryInvestRecord.java

@@ -1,57 +0,0 @@
-package com.punchsettle.server.atomic.entity;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 彩票投入记录
- * @date 2024/12/12 18:53
- */
-
-import com.punchsettle.server.common.entity.BaseEntity;
-import jakarta.persistence.Column;
-import jakarta.persistence.Table;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-import java.io.Serial;
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 彩票投入记录
- * @date 2024/12/12 18:56
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@Table(name = "lottery_invest_record")
-public class LotteryInvestRecord extends BaseEntity implements Serializable {
-
-    @Serial
-    private static final long serialVersionUID = -4667296005259491578L;
-
-    /**
-     * 用户表主键
-     */
-    @Column(name = "user_id")
-    private Long userId;
-
-    /**
-     * 来源
-     */
-    @Column(name = "source")
-    private String source;
-
-    /**
-     * 种类
-     */
-    @Column(name = "category")
-    private String category;
-
-    /**
-     * 投入金额(元)
-     */
-    @Column(name = "invest_amount")
-    private BigDecimal investAmount;
-}

+ 13 - 6
src/main/java/com/punchsettle/server/atomic/entity/LotteryWinRecord.java → src/main/java/com/punchsettle/server/atomic/entity/LotteryScratchRecord.java

@@ -1,6 +1,7 @@
 package com.punchsettle.server.atomic.entity;
 
 import com.punchsettle.server.common.entity.BaseEntity;
+import com.punchsettle.server.constant.ScratchActionTypeEnum;
 import jakarta.persistence.Column;
 import jakarta.persistence.Table;
 import lombok.Data;
@@ -13,13 +14,13 @@ import java.math.BigDecimal;
 /**
  * @author tyuio
  * @version 1.0.0
- * @description 彩票中奖记录
+ * @description 彩票刮刮乐记录
  * @date 2024/12/12 18:56
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@Table(name = "lottery_win_record")
-public class LotteryWinRecord extends BaseEntity implements Serializable {
+@Table(name = "lottery_scratch_record")
+public class LotteryScratchRecord extends BaseEntity implements Serializable {
 
     @Serial
     private static final long serialVersionUID = -3521710481088966503L;
@@ -30,6 +31,12 @@ public class LotteryWinRecord extends BaseEntity implements Serializable {
     @Column(name = "user_id")
     private Long userId;
 
+    /**
+     * 动作类型(0-投入/购买,1-中奖,2-撤销投入,3-撤销中奖)
+     */
+    @Column(name = "action_type")
+    private ScratchActionTypeEnum actionType;
+
     /**
      * 来源
      */
@@ -43,8 +50,8 @@ public class LotteryWinRecord extends BaseEntity implements Serializable {
     private String category;
 
     /**
-     * 中奖金额(元)
+     * 金额(元)
      */
-    @Column(name = "win_amount")
-    private BigDecimal winAmount;
+    @Column(name = "amount")
+    private BigDecimal amount;
 }

+ 10 - 3
src/main/java/com/punchsettle/server/atomic/entity/PunchIn.java

@@ -2,15 +2,18 @@ package com.punchsettle.server.atomic.entity;
 
 import java.io.Serial;
 import java.io.Serializable;
-import java.time.LocalDateTime;
 import java.time.LocalTime;
 
+import com.punchsettle.server.common.typehandler.EnumValueTypeHandler;
 import com.punchsettle.server.common.entity.BaseEntity;
+import com.punchsettle.server.constant.PunchInCategoryEnum;
+import com.punchsettle.server.constant.PunchInRuleEnum;
 
 import jakarta.persistence.Column;
 import jakarta.persistence.Table;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import tk.mybatis.mapper.annotation.ColumnType;
 
 /**
  * @description 打卡任务表 实体
@@ -40,15 +43,19 @@ public class PunchIn extends BaseEntity implements Serializable {
 
     /**
      * 打卡类型(0-单次打卡,1-计数、2计时)
+     * @see PunchInCategoryEnum
      */
+    @ColumnType(typeHandler = EnumValueTypeHandler.class)
     @Column(name = "category")
-    private Integer category;
+    private PunchInCategoryEnum category;
 
     /**
      * 比较规则(0-大于,1-大于等于,2-小于,3-小于等于)
+     * @see PunchInRuleEnum
      */
+    @ColumnType(typeHandler = EnumValueTypeHandler.class)
     @Column(name = "rule")
-    private Integer rule;
+    private PunchInRuleEnum rule;
 
     /**
      * 次数记录

+ 0 - 13
src/main/java/com/punchsettle/server/atomic/mapper/LotteryInvestRecordMapper.java

@@ -1,13 +0,0 @@
-package com.punchsettle.server.atomic.mapper;
-
-import com.punchsettle.server.atomic.entity.LotteryInvestRecord;
-import tk.mybatis.mapper.common.Mapper;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 彩票投入记录 Mapper
- * @date 2024/12/12 19:05
- */
-public interface LotteryInvestRecordMapper extends Mapper<LotteryInvestRecord> {
-}

+ 13 - 0
src/main/java/com/punchsettle/server/atomic/mapper/LotteryScratchRecordMapper.java

@@ -0,0 +1,13 @@
+package com.punchsettle.server.atomic.mapper;
+
+import com.punchsettle.server.atomic.entity.LotteryScratchRecord;
+import tk.mybatis.mapper.common.Mapper;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 彩票刮刮乐记录 Mapper
+ * @date 2024/12/12 19:06
+ */
+public interface LotteryScratchRecordMapper extends Mapper<LotteryScratchRecord> {
+}

+ 0 - 13
src/main/java/com/punchsettle/server/atomic/mapper/LotteryWinRecordMapper.java

@@ -1,13 +0,0 @@
-package com.punchsettle.server.atomic.mapper;
-
-import com.punchsettle.server.atomic.entity.LotteryWinRecord;
-import tk.mybatis.mapper.common.Mapper;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 彩票中奖记录 Mapper
- * @date 2024/12/12 19:06
- */
-public interface LotteryWinRecordMapper extends Mapper<LotteryWinRecord> {
-}

+ 0 - 10
src/main/java/com/punchsettle/server/atomic/service/ILotteryInvestRecordService.java

@@ -1,10 +0,0 @@
-package com.punchsettle.server.atomic.service;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 彩票投入记录 service
- * @date 2024/12/12 19:08
- */
-public interface ILotteryInvestRecordService {
-}

+ 31 - 0
src/main/java/com/punchsettle/server/atomic/service/ILotteryScratchRecordService.java

@@ -0,0 +1,31 @@
+package com.punchsettle.server.atomic.service;
+
+import com.punchsettle.server.atomic.entity.LotteryScratchRecord;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 彩票刮刮乐记录 service
+ * @date 2024/12/12 19:08
+ */
+public interface ILotteryScratchRecordService {
+
+    /**
+     * 根据ID更新
+     * @param record
+     */
+    void insert(LotteryScratchRecord record);
+
+    /**
+     * 根据ID更新
+     * @param record
+     */
+    void update(LotteryScratchRecord record);
+
+    /**
+     * 根据ID获取记录
+     * @param id
+     * @return
+     */
+    LotteryScratchRecord selectById(Long id);
+}

+ 0 - 10
src/main/java/com/punchsettle/server/atomic/service/ILotteryWinRecordService.java

@@ -1,10 +0,0 @@
-package com.punchsettle.server.atomic.service;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 彩票中奖记录 service
- * @date 2024/12/12 19:08
- */
-public interface ILotteryWinRecordService {
-}

+ 14 - 1
src/main/java/com/punchsettle/server/atomic/service/IPunchInRecordService.java

@@ -3,7 +3,7 @@ package com.punchsettle.server.atomic.service;
 import java.util.List;
 
 import com.punchsettle.server.atomic.entity.PunchInRecord;
-import com.punchsettle.server.dto.PunchInRecordQuery;
+import com.punchsettle.server.dto.punchin.PunchInRecordQuery;
 
 /**
  * @author tyuio
@@ -19,6 +19,19 @@ public interface IPunchInRecordService {
      */
     void insert(PunchInRecord record);
 
+    /**
+     * 更新打卡记录
+     * @param record
+     */
+    void update(PunchInRecord record);
+
+    /**
+     * 根据查询条件查询打卡记录
+     * @param query
+     * @return
+     */
+    PunchInRecord selectOneByCondition(PunchInRecordQuery query);
+
     /**
      * 根据查询条件查询打卡记录
      * @param query

+ 11 - 11
src/main/java/com/punchsettle/server/atomic/service/IPunchInService.java

@@ -3,6 +3,7 @@ package com.punchsettle.server.atomic.service;
 import java.util.List;
 
 import com.punchsettle.server.atomic.entity.PunchIn;
+import com.punchsettle.server.dto.punchin.PunchInQuery;
 
 /**
  * @author tyuio
@@ -12,13 +13,6 @@ import com.punchsettle.server.atomic.entity.PunchIn;
  */
 public interface IPunchInService {
 
-    /**
-     * 根据创建人查询所有的打卡结算任务数据
-     * @param createdBy
-     * @return
-     */
-    List<PunchIn> listByCreatedBy(Long createdBy);
-
     /**
      * 根据主键查询打卡任务
      * @param id
@@ -27,21 +21,27 @@ public interface IPunchInService {
     PunchIn getById(Long id);
 
     /**
-     * 根据创建人查询所有的打卡结算任务数据
-     * @param userIds 创建人id
+     * 条件查询打卡任务
+     * @param query 查询条件
      * @return
      */
-    List<PunchIn> listByCreatedBy(List<Long> userIds);
+    List<PunchIn> listByCondition(PunchInQuery query);
 
     /**
      * 新增或更新打卡结算任务
      * @param punchIn
      */
-    void insertOrUpdate(PunchIn punchIn);
+    void insert(PunchIn punchIn);
 
     /**
      * 根据主键删除打卡结算任务
      * @param punchInId
      */
     void delete(Long punchInId);
+
+    /**
+     * 更新打卡任务
+     * @param punchIn
+     */
+    void update(PunchIn punchIn);
 }

+ 10 - 0
src/main/java/com/punchsettle/server/atomic/service/IUserClaimRewardRecordService.java

@@ -1,6 +1,9 @@
 package com.punchsettle.server.atomic.service;
 
 import com.punchsettle.server.atomic.entity.UserClaimRewardRecord;
+import com.punchsettle.server.dto.reward.ClaimRewardRecordQuery;
+
+import java.util.List;
 
 /**
  * @author tyuio
@@ -15,4 +18,11 @@ public interface IUserClaimRewardRecordService {
      * @param record
      */
     void insert(UserClaimRewardRecord record);
+
+    /**
+     * 根据条件查询领取奖励记录
+     * @param query
+     * @return
+     */
+    List<UserClaimRewardRecord> listByCondition(ClaimRewardRecordQuery query);
 }

+ 0 - 14
src/main/java/com/punchsettle/server/atomic/service/impl/LotteryInvestRecordServiceImpl.java

@@ -1,14 +0,0 @@
-package com.punchsettle.server.atomic.service.impl;
-
-import com.punchsettle.server.atomic.service.ILotteryInvestRecordService;
-import org.springframework.stereotype.Service;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 彩票投入记录 service
- * @date 2024/12/12 19:10
- */
-@Service
-public class LotteryInvestRecordServiceImpl implements ILotteryInvestRecordService {
-}

+ 44 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/LotteryScratchRecordServiceImpl.java

@@ -0,0 +1,44 @@
+package com.punchsettle.server.atomic.service.impl;
+
+import com.punchsettle.server.atomic.entity.LotteryScratchRecord;
+import com.punchsettle.server.atomic.mapper.LotteryScratchRecordMapper;
+import com.punchsettle.server.atomic.service.ILotteryScratchRecordService;
+import com.punchsettle.server.common.utils.Assert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 彩票刮刮乐记录 service
+ * @date 2024/12/12 19:10
+ */
+@Service
+public class LotteryScratchRecordServiceImpl implements ILotteryScratchRecordService {
+
+    @Autowired
+    private LotteryScratchRecordMapper scratchRecordMapper;
+
+    @Override
+    public void insert(LotteryScratchRecord record) {
+        Assert.isNull(record);
+        scratchRecordMapper.insertSelective(record);
+    }
+
+    @Override
+    public void update(LotteryScratchRecord record) {
+        Assert.isNull(record);
+        scratchRecordMapper.updateByPrimaryKeySelective(record);
+    }
+
+    @Override
+    public LotteryScratchRecord selectById(Long id) {
+        if (Objects.isNull(id)) {
+            return null;
+        }
+
+        return scratchRecordMapper.selectByPrimaryKey(id);
+    }
+}

+ 0 - 14
src/main/java/com/punchsettle/server/atomic/service/impl/LotteryWinRecordServiceImpl.java

@@ -1,14 +0,0 @@
-package com.punchsettle.server.atomic.service.impl;
-
-import com.punchsettle.server.atomic.service.ILotteryWinRecordService;
-import org.springframework.stereotype.Service;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 彩票中奖记录 service
- * @date 2024/12/12 19:10
- */
-@Service
-public class LotteryWinRecordServiceImpl implements ILotteryWinRecordService {
-}

+ 22 - 1
src/main/java/com/punchsettle/server/atomic/service/impl/PunchInRecordServiceImpl.java

@@ -11,7 +11,7 @@ import com.punchsettle.server.atomic.entity.PunchInRecord;
 import com.punchsettle.server.atomic.mapper.PunchInRecordMapper;
 import com.punchsettle.server.atomic.service.IPunchInRecordService;
 import com.punchsettle.server.common.utils.Assert;
-import com.punchsettle.server.dto.PunchInRecordQuery;
+import com.punchsettle.server.dto.punchin.PunchInRecordQuery;
 
 import io.micrometer.common.util.StringUtils;
 import tk.mybatis.mapper.weekend.Weekend;
@@ -35,6 +35,27 @@ public class PunchInRecordServiceImpl implements IPunchInRecordService {
         punchInRecordMapper.insertSelective(record);
     }
 
+    @Override
+    public void update(PunchInRecord record) {
+        Assert.isNull(record);
+        punchInRecordMapper.updateByPrimaryKeySelective(record);
+    }
+
+    @Override
+    public PunchInRecord selectOneByCondition(PunchInRecordQuery query) {
+        Assert.isNull(query);
+
+        Weekend<PunchInRecord> weekend = Weekend.of(PunchInRecord.class);
+        WeekendCriteria<PunchInRecord, Object> criteria = weekend.weekendCriteria();
+        if (!Objects.isNull(query.getPunchInId())) {
+            criteria.andEqualTo(PunchInRecord::getPunchInId, query.getPunchInId());
+        }
+        if (StringUtils.isNotBlank(query.getPunchInDate())) {
+            criteria.andEqualTo(PunchInRecord::getPunchInDate, query.getPunchInDate());
+        }
+        return punchInRecordMapper.selectOneByExample(weekend);
+    }
+
     @Override
     public List<PunchInRecord> listByCondition(PunchInRecordQuery query) {
         if (Objects.isNull(query)) {

+ 18 - 20
src/main/java/com/punchsettle/server/atomic/service/impl/PunchInServiceImpl.java

@@ -3,6 +3,8 @@ package com.punchsettle.server.atomic.service.impl;
 import java.util.List;
 import java.util.Objects;
 
+import com.punchsettle.server.dto.punchin.PunchInDto;
+import com.punchsettle.server.dto.punchin.PunchInQuery;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -27,17 +29,6 @@ public class PunchInServiceImpl implements IPunchInService {
     @Autowired
     private PunchInMapper punchInMapper;
 
-    @Override
-    public List<PunchIn> listByCreatedBy(Long createdBy) {
-        if (Objects.isNull(createdBy)) {
-            return List.of();
-        }
-
-        PunchIn query = new PunchIn();
-        query.setCreatedBy(createdBy);
-        return punchInMapper.select(query);
-    }
-
     @Override
     public PunchIn getById(Long id) {
         if (Objects.isNull(id)) {
@@ -47,25 +38,26 @@ public class PunchInServiceImpl implements IPunchInService {
     }
 
     @Override
-    public List<PunchIn> listByCreatedBy(List<Long> userIds) {
-        if (CollectionUtils.isEmpty(userIds)) {
+    public List<PunchIn> listByCondition(PunchInQuery query) {
+        if (Objects.isNull(query)) {
             return List.of();
         }
 
         Weekend<PunchIn> punchInWeekend = Weekend.of(PunchIn.class);
         WeekendCriteria<PunchIn, Object> criteria = punchInWeekend.weekendCriteria();
-        criteria.andIn(PunchIn::getCreatedBy, userIds);
+        if (!CollectionUtils.isEmpty(query.getUserIds())) {
+            criteria.andIn(PunchIn::getCreatedBy, query.getUserIds());
+        }
+        if (!Objects.isNull(query.getArchiveFlag())) {
+            criteria.andEqualTo(PunchIn::getArchiveFlag, query.getArchiveFlag());
+        }
         return punchInMapper.selectByExample(punchInWeekend);
     }
 
     @Override
-    public void insertOrUpdate(PunchIn punchIn) {
+    public void insert(PunchIn punchIn) {
         Assert.isNull(punchIn);
-        if (Objects.isNull(punchIn.getId())) {
-            punchInMapper.insertSelective(punchIn);
-        } else {
-            punchInMapper.updateByPrimaryKeySelective(punchIn);
-        }
+        punchInMapper.insertSelective(punchIn);
     }
 
     @Override
@@ -73,4 +65,10 @@ public class PunchInServiceImpl implements IPunchInService {
         Assert.isNull(punchInId);
         punchInMapper.deleteByPrimaryKey(punchInId);
     }
+
+    @Override
+    public void update(PunchIn punchIn) {
+        Assert.isNull(punchIn);
+        punchInMapper.updateByPrimaryKeySelective(punchIn);
+    }
 }

+ 23 - 0
src/main/java/com/punchsettle/server/atomic/service/impl/UserClaimRewardRecordServiceImpl.java

@@ -1,5 +1,8 @@
 package com.punchsettle.server.atomic.service.impl;
 
+import java.util.List;
+import java.util.Objects;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -7,6 +10,11 @@ import com.punchsettle.server.atomic.entity.UserClaimRewardRecord;
 import com.punchsettle.server.atomic.mapper.UserClaimRewardRecordMapper;
 import com.punchsettle.server.atomic.service.IUserClaimRewardRecordService;
 import com.punchsettle.server.common.utils.Assert;
+import com.punchsettle.server.dto.reward.ClaimRewardRecordQuery;
+
+import org.springframework.util.StringUtils;
+import tk.mybatis.mapper.weekend.Weekend;
+import tk.mybatis.mapper.weekend.WeekendCriteria;
 
 /**
  * @author tyuio
@@ -25,4 +33,19 @@ public class UserClaimRewardRecordServiceImpl implements IUserClaimRewardRecordS
         Assert.isNull(record);
         userClaimRewardRecordMapper.insertSelective(record);
     }
+
+    @Override
+    public List<UserClaimRewardRecord> listByCondition(ClaimRewardRecordQuery query) {
+        if (Objects.isNull(query)) {
+            return List.of();
+        }
+
+        Weekend<UserClaimRewardRecord> weekend = Weekend.of(UserClaimRewardRecord.class);
+        WeekendCriteria<UserClaimRewardRecord, Object> criteria = weekend.weekendCriteria();
+        if (StringUtils.hasText(query.getStartDate()) && StringUtils.hasText(query.getEndDate())) {
+            criteria.andBetween(UserClaimRewardRecord::getClaimRewardTime, query.getStartDate(), query.getEndDate());
+        }
+
+        return userClaimRewardRecordMapper.selectByExample(weekend);
+    }
 }

+ 17 - 0
src/main/java/com/punchsettle/server/common/annotation/EnumValue.java

@@ -0,0 +1,17 @@
+package com.punchsettle.server.common.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 数据库枚举值转换注解
+ * @date 2024/12/13 10:55
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface EnumValue {
+}

+ 0 - 17
src/main/java/com/punchsettle/server/common/converter/enums/IJsonEnum.java

@@ -1,17 +0,0 @@
-package com.punchsettle.server.common.converter.enums;
-
-import com.fasterxml.jackson.annotation.JsonValue;
-
-/**
- * Json返回值枚举接口
- *
- * @author tyuio
- */
-public interface IJsonEnum<T> {
-
-    /**
-     * 获取枚举编码
-     */
-    @JsonValue
-    T getCode();
-}

+ 0 - 33
src/main/java/com/punchsettle/server/common/converter/enums/IntegerToEnumConverter.java

@@ -1,33 +0,0 @@
-package com.punchsettle.server.common.converter.enums;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.springframework.core.convert.converter.Converter;
-
-/**
- * 转换器 数值转换为枚举
- *
- * @author tyuio
- */
-public class IntegerToEnumConverter<T extends IJsonEnum<Integer>> implements Converter<Integer, T> {
-
-    private final Map<Integer, T> enumMap = new HashMap<>();
-
-    public IntegerToEnumConverter(Class<T> enumType) {
-        T[] enums = enumType.getEnumConstants();
-        for (T e : enums) {
-            enumMap.put(e.getCode(), e);
-        }
-    }
-
-    @Override
-    public T convert(Integer source) {
-        T t = enumMap.get(source);
-        if (t == null) {
-            throw new IllegalArgumentException("无法匹配对应的枚举类型");
-        }
-        return t;
-    }
-
-}

+ 0 - 22
src/main/java/com/punchsettle/server/common/converter/enums/IntegerToEnumConverterFactory.java

@@ -1,22 +0,0 @@
-package com.punchsettle.server.common.converter.enums;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.springframework.core.convert.converter.Converter;
-import org.springframework.core.convert.converter.ConverterFactory;
-
-public class IntegerToEnumConverterFactory implements ConverterFactory<Integer, IJsonEnum> {
-
-    private static final Map<Class, Converter> CONVERTERS = new HashMap<>();
-
-    @Override
-    public <T extends IJsonEnum> Converter<Integer, T> getConverter(Class<T> targetType) {
-        Converter<Integer, T> converter = CONVERTERS.get(targetType);
-        if (converter == null) {
-            converter = new IntegerToEnumConverter<>(targetType);
-            CONVERTERS.put(targetType, converter);
-        }
-        return converter;
-    }
-}

+ 1 - 0
src/main/java/com/punchsettle/server/common/entity/BaseEntity.java

@@ -59,6 +59,7 @@ public class BaseEntity {
      * 逻辑删除标志(0-未删除,1-已删除)
      */
     @LogicDelete
+    @Column(name = "delete_flag")
     private Boolean deleteFlag;
 
 }

+ 13 - 0
src/main/java/com/punchsettle/server/common/exception/BusinessException.java

@@ -11,7 +11,20 @@ public class BusinessException extends RuntimeException {
         super(message);
     }
 
+    /**
+     * 构造业务异常信息
+     * @param message
+     * @return
+     */
     public static BusinessException fail(String message) {
         return new BusinessException(message);
     }
+
+    /**
+     * 抛出业务异常
+     * @param message
+     */
+    public static void throwFail(String message) {
+    	throw fail(message);
+    }
 }

+ 113 - 0
src/main/java/com/punchsettle/server/common/typehandler/EnumValueTypeHandler.java

@@ -0,0 +1,113 @@
+package com.punchsettle.server.common.typehandler;
+
+import com.punchsettle.server.common.annotation.EnumValue;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
+import java.lang.reflect.Field;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 数据库枚举值转换器
+ * @date 2024/12/13 10:57
+ */
+public class EnumValueTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
+
+    private final Class<E> type;
+
+    private final E[] enums;
+
+    public EnumValueTypeHandler(Class<E> type) {
+        if (type == null) {
+            throw new IllegalArgumentException("Type argument cannot be null");
+        }
+        this.type = type;
+        this.enums = type.getEnumConstants();
+        if (this.enums == null) {
+            throw new IllegalArgumentException(type.getSimpleName() + " does not represent an enum type.");
+        }
+    }
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, E parameter, JdbcType jdbcType) throws SQLException {
+        Field[] declaredFields = parameter.getClass().getDeclaredFields();
+        for (Field declaredField : declaredFields) {
+            EnumValue annotation = declaredField.getAnnotation(EnumValue.class);
+            if (annotation == null) {
+                continue;
+            }
+            declaredField.setAccessible(true);
+            Object paramValue = null;
+            try {
+                // 获取到设置了EnumValue注解字段的value值
+                paramValue = declaredField.get(parameter);
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+            ps.setObject(i, paramValue);
+            return;
+        }
+    }
+
+    @Override
+    public E getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        Field[] declaredFields = type.getDeclaredFields();
+        Field enumField = null;
+        Object value4Db = null;
+        for (Field declaredField : declaredFields) {
+            EnumValue annotation = declaredField.getAnnotation(EnumValue.class);
+            if (annotation == null) {
+                continue;
+            }
+            enumField = declaredField;
+            value4Db = rs.getObject(columnName, enumField.getType());
+            break;
+        }
+        if (enumField == null) {
+            return getResultByOrdinal(rs.getInt(columnName), rs.wasNull());
+        }
+        enumField.setAccessible(true);
+        for (E anEnum : enums) {
+            try {
+                Object value = enumField.get(anEnum);
+                if (value.equals(value4Db)) {
+                    return anEnum;
+                }
+            } catch (IllegalAccessException e) {
+                e.printStackTrace();
+            }
+        }
+        return getResultByOrdinal(rs.getInt(columnName), rs.wasNull());
+    }
+
+    private E getResultByOrdinal(int anInt, boolean b) {
+        int ordinal = anInt;
+        if (ordinal == 0 && b) {
+            return null;
+        }
+        return toOrdinalEnum(ordinal);
+    }
+
+    @Override
+    public E getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return getResultByOrdinal(rs.getInt(columnIndex), rs.wasNull());
+    }
+
+    @Override
+    public E getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return getResultByOrdinal(cs.getInt(columnIndex), cs.wasNull());
+    }
+
+    private E toOrdinalEnum(int ordinal) {
+        try {
+            return enums[ordinal];
+        } catch (Exception ex) {
+            throw new IllegalArgumentException("Cannot convert " + ordinal + " to " + type.getSimpleName() + " by ordinal value.", ex);
+        }
+    }
+}

+ 0 - 10
src/main/java/com/punchsettle/server/common/valid/DoSomething.java

@@ -1,10 +0,0 @@
-package com.punchsettle.server.common.valid;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 做某一操作 校验器分组
- * @date 2024/11/26 15:47
- */
-public interface DoSomething {
-}

+ 34 - 0
src/main/java/com/punchsettle/server/constant/PunchInCategoryEnum.java

@@ -0,0 +1,34 @@
+package com.punchsettle.server.constant;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.punchsettle.server.common.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡类型(0-单次打卡,1-计数、2计时)
+ * @date 2024/12/13 9:46
+ */
+@Getter
+@AllArgsConstructor
+public enum PunchInCategoryEnum {
+
+
+    SINGLE("单次打卡", 0),
+    COUNT("计数打卡", 1),
+    TIME("计时打卡", 2);
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 编码
+     */
+    @JsonValue
+    @EnumValue
+    private Integer code;
+}

+ 36 - 0
src/main/java/com/punchsettle/server/constant/PunchInRuleEnum.java

@@ -0,0 +1,36 @@
+package com.punchsettle.server.constant;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.punchsettle.server.common.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡任务比较规则(0-大于,1-大于等于,2-小于,3-小于等于)
+ * @date 2024/12/13 9:41
+ */
+@Getter
+@AllArgsConstructor
+public enum PunchInRuleEnum {
+
+
+    GREATER_OR_EQUAL("大于等于", 1),
+    LESS("小于", 2),
+    GREATER("大于", 0),
+    LESS_OR_EQUAL("小于等于", 3)
+    ;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 编码
+     */
+    @JsonValue
+    @EnumValue
+    private Integer code;
+}

+ 4 - 7
src/main/java/com/punchsettle/server/constant/PunchInStatusEnum.java

@@ -1,6 +1,7 @@
 package com.punchsettle.server.constant;
 
 import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 
 /**
@@ -10,6 +11,7 @@ import lombok.Getter;
  * @date 2024/11/26 21:59
  */
 @Getter
+@AllArgsConstructor
 public enum PunchInStatusEnum {
 
     UNCREATED("未创建打卡任务", "uncreated"),
@@ -24,13 +26,8 @@ public enum PunchInStatusEnum {
     private String name;
 
     /**
-     * 
+     * 编码
      */
     @JsonValue
-    private String value;
-
-    PunchInStatusEnum(String name, String value) {
-        this.name = name;
-        this.value = value;
-    }
+    private String code;
 }

+ 34 - 0
src/main/java/com/punchsettle/server/constant/ScratchActionTypeEnum.java

@@ -0,0 +1,34 @@
+package com.punchsettle.server.constant;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.punchsettle.server.common.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 刮刮乐动作枚举(0-投入/购买,1-中奖,2-撤销投入,3-撤销中奖)
+ * @date 2024/12/13 16:04
+ */
+@Getter
+@AllArgsConstructor
+public enum ScratchActionTypeEnum {
+
+    INVEST("投入", 0),
+    WIN("中奖", 1),
+    REVOKE_INVEST("撤销投入", 2),
+    REVOKE_WIN("撤销中奖记录", 3);
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 编码
+     */
+    @JsonValue
+    @EnumValue
+    private Integer code;
+}

+ 0 - 7
src/main/java/com/punchsettle/server/core/config/WebMvcConfig.java

@@ -2,12 +2,10 @@ package com.punchsettle.server.core.config;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.format.FormatterRegistry;
 import org.springframework.web.servlet.config.annotation.CorsRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
-import com.punchsettle.server.common.converter.enums.IntegerToEnumConverterFactory;
 import com.punchsettle.server.core.interceptor.AuthInterceptor;
 
 @Configuration
@@ -16,11 +14,6 @@ public class WebMvcConfig implements WebMvcConfigurer {
     @Autowired
     private AuthInterceptor authInterceptor;
 
-    @Override
-    public void addFormatters(FormatterRegistry registry) {
-        registry.addConverterFactory(new IntegerToEnumConverterFactory());
-    }
-
     /**
      * 登录校验拦截
      * @param registry

+ 59 - 0
src/main/java/com/punchsettle/server/dto/UserInfoDto.java

@@ -0,0 +1,59 @@
+package com.punchsettle.server.dto;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description TODO
+ * @date 2024/12/13 15:11
+ */
+
+import java.math.BigDecimal;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 领取结算奖励 dto
+ * @date 2024/11/25 19:42
+ */
+@Data
+@EqualsAndHashCode
+public class UserInfoDto {
+
+    /**
+     * 微信昵称
+     */
+    private String nickname;
+
+    /**
+     * 微信头像url
+     */
+    private String avatar;
+
+    /**
+     * 总奖励数
+     */
+    private Integer totalRewardNum;
+
+    /**
+     * 未领取奖励数
+     */
+    private Integer unclaimedRewardNum;
+
+    /**
+     * 已领取奖励数
+     */
+    private Integer claimedRewardNum;
+
+    /**
+     * 彩票投入金额(元)
+     */
+    private BigDecimal lotteryInvestAmount;
+
+    /**
+     * 彩票中奖金额(元)
+     */
+    private BigDecimal lotteryWinAmount;
+}

+ 0 - 18
src/main/java/com/punchsettle/server/dto/UserRewardDto.java

@@ -1,18 +0,0 @@
-package com.punchsettle.server.dto;
-
-import lombok.Data;
-
-/**
- * @author tyuio
- * @version 1.0.0
- * @description 用户奖励
- * @date 2024/11/25 20:55
- */
-@Data
-public class UserRewardDto {
-
-    /**
-     * 未领取奖励数
-     */
-    private Integer unclaimedRewardNum;
-}

+ 42 - 10
src/main/java/com/punchsettle/server/dto/PunchInDto.java → src/main/java/com/punchsettle/server/dto/punchin/PunchInDto.java

@@ -1,12 +1,15 @@
-package com.punchsettle.server.dto;
+package com.punchsettle.server.dto.punchin;
+
+import java.time.LocalTime;
 
-import com.punchsettle.server.common.valid.Query;
 import org.hibernate.validator.constraints.Length;
 
 import com.punchsettle.server.common.valid.Delete;
-import com.punchsettle.server.common.valid.DoSomething;
+import com.punchsettle.server.common.valid.Query;
 import com.punchsettle.server.common.valid.Save;
 import com.punchsettle.server.common.valid.Update;
+import com.punchsettle.server.constant.PunchInCategoryEnum;
+import com.punchsettle.server.constant.PunchInRuleEnum;
 
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
@@ -25,17 +28,20 @@ import lombok.EqualsAndHashCode;
 public class PunchInDto {
 
     /**
-     * 打卡结算主键
+     * 打卡校验组
      */
-    @NotNull(message = "打卡结算主键不能为空", groups = {Query.class, Update.class, Delete.class, DoSomething.class})
-    private Long id;
+    public interface DoPunchIn {};
 
     /**
-     * 版本号
+     * 归档校验组
      */
-    @NotNull(message = "版本号不能为空", groups = {Update.class})
-    @Positive(message = "版本号必须大于0", groups = {Update.class})
-    private Integer version;
+    public interface Archive {};
+
+    /**
+     * 打卡结算主键
+     */
+    @NotNull(message = "打卡结算主键不能为空", groups = {Query.class, Update.class, Delete.class, DoPunchIn.class, Archive.class})
+    private Long id;
 
     /**
      * 任务名称
@@ -51,6 +57,32 @@ public class PunchInDto {
     @Positive(message = "奖励倍数必须大于0", groups = {Save.class, Update.class})
     private Integer rewardNum;
 
+    /**
+     * 打卡类型(0-单次打卡,1-计数、2计时)
+     */
+    @NotNull(message = "打卡类型不能为空", groups = {Save.class, Update.class})
+    private PunchInCategoryEnum category;
+
+    /**
+     * @see PunchInRuleEnum
+     */
+    private PunchInRuleEnum rule;
+
+    /**
+     * 次数记录
+     */
+    private Integer countTrack;
+
+    /**
+     * 时间记录
+     */
+    private LocalTime timeTrack;
+
+    /**
+     * 任务描述
+     */
+    private String description;
+
     /**
      * 是否启用周末双倍标志(0-不是,1-是)
      */

+ 27 - 0
src/main/java/com/punchsettle/server/dto/punchin/PunchInQuery.java

@@ -0,0 +1,27 @@
+package com.punchsettle.server.dto.punchin;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 打卡任务查询 dto
+ * @date 2024/12/13 9:09
+ */
+@Data
+@EqualsAndHashCode
+public class PunchInQuery {
+
+    /**
+     * 创建人id
+     */
+    private List<Long> userIds;
+
+    /**
+     * 是否归档标志(0-不是,1-是)
+     */
+    private Boolean archiveFlag;
+}

+ 1 - 1
src/main/java/com/punchsettle/server/dto/PunchInRecordDto.java → src/main/java/com/punchsettle/server/dto/punchin/PunchInRecordDto.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.dto;
+package com.punchsettle.server.dto.punchin;
 
 import com.punchsettle.server.constant.PunchInStatusEnum;
 import lombok.Data;

+ 11 - 1
src/main/java/com/punchsettle/server/dto/PunchInRecordQuery.java → src/main/java/com/punchsettle/server/dto/punchin/PunchInRecordQuery.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.dto;
+package com.punchsettle.server.dto.punchin;
 
 import java.util.List;
 
@@ -29,4 +29,14 @@ public class PunchInRecordQuery {
      * 打卡日期范围-结束日期
      */
     private String endDate;
+
+    /**
+     * 打卡日期
+     */
+    private String punchInDate;
+
+    /**
+     * 打卡任务主键
+     */
+    private Long punchInId;
 }

+ 27 - 6
src/main/java/com/punchsettle/server/dto/PunchInWithRecordDto.java → src/main/java/com/punchsettle/server/dto/punchin/PunchInWithRecordDto.java

@@ -1,5 +1,6 @@
-package com.punchsettle.server.dto;
+package com.punchsettle.server.dto.punchin;
 
+import java.time.LocalTime;
 import java.util.List;
 
 import lombok.Data;
@@ -28,6 +29,31 @@ public class PunchInWithRecordDto {
      */
     private Integer rewardNum;
 
+    /**
+     * 打卡类型(0-单次打卡,1-计数、2计时)
+     */
+    private Integer category;
+
+    /**
+     * 比较规则(0-大于,1-大于等于,2-小于,3-小于等于)
+     */
+    private Integer rule;
+
+    /**
+     * 次数记录
+     */
+    private Integer countTrack;
+
+    /**
+     * 时间记录
+     */
+    private LocalTime timeTrack;
+
+    /**
+     * 任务描述
+     */
+    private String description;
+
     /**
      * 是否启用周末双倍标志(0-不是,1-是)
      */
@@ -38,11 +64,6 @@ public class PunchInWithRecordDto {
      */
     private Boolean fullAttendanceFlag;
 
-    /**
-     * 是否归档标志(0-不是,1-是)
-     */
-    private Boolean archiveFlag;
-
     /**
      * 打卡记录
      */

+ 1 - 1
src/main/java/com/punchsettle/server/dto/ClaimRewardDto.java → src/main/java/com/punchsettle/server/dto/reward/ClaimRewardDto.java

@@ -1,4 +1,4 @@
-package com.punchsettle.server.dto;
+package com.punchsettle.server.dto.reward;
 
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Positive;

+ 37 - 0
src/main/java/com/punchsettle/server/dto/reward/ClaimRewardRecordDto.java

@@ -0,0 +1,37 @@
+package com.punchsettle.server.dto.reward;
+
+import java.sql.Timestamp;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 领取奖励记录
+ * @date 2024/11/25 20:44
+ */
+@Data
+@EqualsAndHashCode
+public class ClaimRewardRecordDto {
+
+    /**
+     * 本次领取奖励数
+     */
+    private Integer claimRewardNum;
+
+    /**
+     * 领取奖励时间
+     */
+    private Timestamp claimRewardTime;
+
+    /**
+     * 领取前用户拥有的奖励数
+     */
+    private Integer beforeClaimRewardNum;
+
+    /**
+     * 领取后用户拥有的奖励数
+     */
+    private Integer afterClaimRewardNum;
+}

+ 28 - 0
src/main/java/com/punchsettle/server/dto/reward/ClaimRewardRecordQuery.java

@@ -0,0 +1,28 @@
+package com.punchsettle.server.dto.reward;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 领取奖励记录查询
+ * @date 2024/11/25 20:44
+ */
+@Data
+@EqualsAndHashCode
+public class ClaimRewardRecordQuery {
+
+    /*
+     * 查询时间范围 开始
+     */
+    @NotBlank(message = "开始时间不能为空")
+    private String startDate;
+
+    /*
+     * 查询时间范围 结束
+     */
+    @NotBlank(message = "结束时间不能为空")
+    private String endDate;
+}

+ 57 - 0
src/main/java/com/punchsettle/server/dto/scratch/ScratchDto.java

@@ -0,0 +1,57 @@
+package com.punchsettle.server.dto.scratch;
+
+import com.punchsettle.server.common.valid.Save;
+import com.punchsettle.server.constant.ScratchActionTypeEnum;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Positive;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 刮刮乐 dto
+ * @date 2024/12/13 15:47
+ */
+@Data
+@EqualsAndHashCode
+public class ScratchDto {
+
+    /**
+     * 撤销校验组
+     */
+    public interface Revoke {};
+
+    /**
+     * 刮刮乐记录ID
+     */
+    @NotNull(message = "记录ID不能为空", groups = {Revoke.class})
+    private Long id;
+
+    /**
+     * 动作类型(0-投入/购买,1-中奖,2-撤销投入,3-撤销中奖)
+     */
+    @NotNull(message = "记录类型不能为空", groups = {Save.class})
+    private ScratchActionTypeEnum actionType;
+
+    /**
+     * 来源
+     */
+    @NotNull(message = "来源不能为空", groups = {Save.class})
+    private String source;
+
+    /**
+     * 种类
+     */
+    @NotNull(message = "种类不能为空", groups = {Save.class})
+    private String category;
+
+    /**
+     * 金额(元)
+     */
+    @NotNull(message = "金额不能为空", groups = {Save.class})
+    @Positive(message = "金额必须大于0", groups = {Save.class})
+    private BigDecimal amount;
+}

+ 35 - 0
src/main/java/com/punchsettle/server/dto/scratch/ScratchQuery.java

@@ -0,0 +1,35 @@
+package com.punchsettle.server.dto.scratch;
+
+import com.punchsettle.server.constant.ScratchActionTypeEnum;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 刮刮乐记录查询 dto
+ * @date 2024/12/13 16:23
+ */
+@Data
+@EqualsAndHashCode
+public class ScratchQuery {
+
+    /**
+     * 动作类型(0-投入/购买,1-中奖,2-撤销投入,3-撤销中奖)
+     * @see ScratchActionTypeEnum
+     */
+    private ScratchActionTypeEnum actionType;
+
+    /*
+     * 查询时间范围 开始
+     */
+    @NotBlank(message = "开始时间不能为空")
+    private String startDate;
+
+    /*
+     * 查询时间范围 结束
+     */
+    @NotBlank(message = "结束时间不能为空")
+    private String endDate;
+}

+ 27 - 0
src/main/java/com/punchsettle/server/dto/task/SettleRewardTaskDto.java

@@ -0,0 +1,27 @@
+package com.punchsettle.server.dto.task;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 结算奖励dto
+ * @date 2024/12/12 22:26
+ */
+@Data
+@EqualsAndHashCode
+public class SettleRewardTaskDto {
+
+    /**
+     * 需要结算的用户id
+     */
+    private Long userId;
+
+    /**
+     * 需要结算的打卡日期
+     */
+    @NotBlank(message = "结算日期不能为空")
+    private String settleDate;
+}

+ 11 - 7
src/main/java/com/punchsettle/server/service/controller/PunchInController.java

@@ -12,11 +12,10 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import com.punchsettle.server.common.valid.Delete;
-import com.punchsettle.server.common.valid.DoSomething;
 import com.punchsettle.server.common.valid.Save;
 import com.punchsettle.server.common.valid.Update;
-import com.punchsettle.server.dto.PunchInDto;
-import com.punchsettle.server.dto.PunchInWithRecordDto;
+import com.punchsettle.server.dto.punchin.PunchInDto;
+import com.punchsettle.server.dto.punchin.PunchInWithRecordDto;
 import com.punchsettle.server.service.manager.IPunchInManager;
 
 /**
@@ -35,8 +34,8 @@ public class PunchInController {
     /**
      * 查询打卡任务
      */
-    @GetMapping("/queryPunchIn")
-    public List<PunchInWithRecordDto> query() {
+    @GetMapping("/queryPunchIns")
+    public List<PunchInWithRecordDto> queryPunchIns() {
         return punchInManager.queryPunchInAndRecord();
     }
 
@@ -73,7 +72,12 @@ public class PunchInController {
      * 打卡
      */
     @PostMapping("/doPunchIn")
-    public void doPunchIn(@RequestBody @Validated({DoSomething.class}) PunchInDto dto) {
-        punchInManager.doPunchIn(dto.getId());
+    public void doPunchIn(@RequestBody @Validated({PunchInDto.DoPunchIn.class}) PunchInDto dto) {
+        punchInManager.doPunchIn(dto);
+    }
+
+    @PostMapping("/archivePunchIn")
+    public void archivePunchIn(@RequestBody @Validated({PunchInDto.Archive.class}) PunchInDto dto) {
+        punchInManager.archivePunchIn(dto.getId());
     }
 }

+ 9 - 6
src/main/java/com/punchsettle/server/service/controller/RewardController.java

@@ -1,5 +1,7 @@
 package com.punchsettle.server.service.controller;
 
+import com.punchsettle.server.dto.reward.ClaimRewardRecordDto;
+import com.punchsettle.server.dto.reward.ClaimRewardRecordQuery;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -8,10 +10,11 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.punchsettle.server.dto.ClaimRewardDto;
-import com.punchsettle.server.dto.UserRewardDto;
+import com.punchsettle.server.dto.reward.ClaimRewardDto;
 import com.punchsettle.server.service.manager.IRewardManager;
 
+import java.util.List;
+
 /**
  * @author tyuio
  * @version 1.0.0
@@ -26,12 +29,12 @@ public class RewardController {
     private IRewardManager rewardManager;
 
     /**
-     * 查询奖励
+     * 查询领取奖励记录
      * @return
      */
-    @GetMapping("/queryReward")
-    public UserRewardDto queryReward() {
-        return rewardManager.queryReward();
+    @PostMapping("/queryClaimRewardRecords")
+    public List<ClaimRewardRecordDto> queryClaimRewardRecords(@RequestBody @Validated ClaimRewardRecordQuery query) {
+        return rewardManager.queryClaimRewardRecords(query);
     }
 
     /**

+ 31 - 0
src/main/java/com/punchsettle/server/service/controller/UserController.java

@@ -0,0 +1,31 @@
+package com.punchsettle.server.service.controller;
+
+import com.punchsettle.server.dto.UserInfoDto;
+import com.punchsettle.server.service.manager.IUserManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 用户 controller
+ * @date 2024/12/13 15:09
+ */
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+    @Autowired
+    private IUserManager userManager;
+
+    /**
+     * 查询当前用户信息
+     * @return
+     */
+    @GetMapping("/queryUserInfo")
+    public UserInfoDto queryUserInfo() {
+        return userManager.queryUserInfo();
+    }
+}

+ 10 - 4
src/main/java/com/punchsettle/server/service/manager/IPunchInManager.java

@@ -2,8 +2,8 @@ package com.punchsettle.server.service.manager;
 
 import java.util.List;
 
-import com.punchsettle.server.dto.PunchInDto;
-import com.punchsettle.server.dto.PunchInWithRecordDto;
+import com.punchsettle.server.dto.punchin.PunchInDto;
+import com.punchsettle.server.dto.punchin.PunchInWithRecordDto;
 
 /**
  * @author tyuio
@@ -38,7 +38,13 @@ public interface IPunchInManager {
 
     /**
      * 完成打卡结算任务插入打卡记录
-     * @param punchInId 主键
+     * @param punchInDto
+     */
+    void doPunchIn(PunchInDto punchInDto);
+
+    /**
+     * 归档打卡任务
+     * @param punchInId
      */
-    void doPunchIn(Long punchInId);
+    void archivePunchIn(Long punchInId);
 }

+ 6 - 3
src/main/java/com/punchsettle/server/service/manager/IRewardManager.java

@@ -1,7 +1,10 @@
 package com.punchsettle.server.service.manager;
 
-import com.punchsettle.server.dto.ClaimRewardDto;
-import com.punchsettle.server.dto.UserRewardDto;
+import com.punchsettle.server.dto.reward.ClaimRewardDto;
+import com.punchsettle.server.dto.reward.ClaimRewardRecordDto;
+import com.punchsettle.server.dto.reward.ClaimRewardRecordQuery;
+
+import java.util.List;
 
 /**
  * @author tyuio
@@ -21,5 +24,5 @@ public interface IRewardManager {
      * 查询当前用户拥有的奖励数
      * @return
      */
-    UserRewardDto queryReward();
+    List<ClaimRewardRecordDto> queryClaimRewardRecords(ClaimRewardRecordQuery query);
 }

+ 31 - 0
src/main/java/com/punchsettle/server/service/manager/IScratchManager.java

@@ -0,0 +1,31 @@
+package com.punchsettle.server.service.manager;
+
+import com.punchsettle.server.dto.scratch.ScratchDto;
+import com.punchsettle.server.dto.scratch.ScratchQuery;
+
+import java.util.List;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 刮刮乐记录 manager
+ * @date 2024/12/13 15:51
+ */
+public interface IScratchManager {
+
+    /**
+     * 修改投入金额/中奖金额
+     * @param dto
+     */
+    void modifyScratchAmount(ScratchDto dto);
+
+    /**
+     * 撤销投入金额记录/中奖记录
+     */
+    void revokeScratchRecord(ScratchDto dto);
+
+    /**
+     * 按时间范围查询刮刮乐记录
+     */
+    List<ScratchDto> queryScratchRecord(ScratchQuery query);
+}

+ 24 - 0
src/main/java/com/punchsettle/server/service/manager/ISettleManager.java

@@ -0,0 +1,24 @@
+package com.punchsettle.server.service.manager;
+
+import com.punchsettle.server.dto.task.SettleRewardTaskDto;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 结算服务类
+ * @date 2024/12/12 22:23
+ */
+public interface ISettleManager {
+
+    /**
+     * 结算奖励
+     * 结算范围:昨天的所有用户
+     */
+    void settleReward();
+
+    /**
+     * 结算奖励
+     * 结算范围:dto中指定的打卡日期、用户
+     */
+    void settleReward(SettleRewardTaskDto dto);
+}

+ 7 - 0
src/main/java/com/punchsettle/server/service/manager/IUserManager.java

@@ -1,6 +1,7 @@
 package com.punchsettle.server.service.manager;
 
 import com.punchsettle.server.atomic.entity.User;
+import com.punchsettle.server.dto.UserInfoDto;
 
 /**
  * @author tyuio
@@ -15,4 +16,10 @@ public interface IUserManager {
      * @param user
      */
     User getAndAddUser(User user);
+
+    /**
+     * 查询当前用户信息
+     * @return
+     */
+    UserInfoDto queryUserInfo();
 }

+ 78 - 19
src/main/java/com/punchsettle/server/service/manager/impl/PunchInManagerImpl.java

@@ -6,10 +6,13 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import com.punchsettle.server.constant.PunchInCategoryEnum;
+import com.punchsettle.server.dto.punchin.PunchInQuery;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -23,10 +26,10 @@ import com.punchsettle.server.atomic.service.IPunchInService;
 import com.punchsettle.server.common.exception.BusinessException;
 import com.punchsettle.server.common.utils.Assert;
 import com.punchsettle.server.constant.PunchInStatusEnum;
-import com.punchsettle.server.dto.PunchInDto;
-import com.punchsettle.server.dto.PunchInRecordDto;
-import com.punchsettle.server.dto.PunchInRecordQuery;
-import com.punchsettle.server.dto.PunchInWithRecordDto;
+import com.punchsettle.server.dto.punchin.PunchInDto;
+import com.punchsettle.server.dto.punchin.PunchInRecordDto;
+import com.punchsettle.server.dto.punchin.PunchInRecordQuery;
+import com.punchsettle.server.dto.punchin.PunchInWithRecordDto;
 import com.punchsettle.server.service.manager.IPunchInManager;
 import com.punchsettle.server.utiis.DateUtils;
 import com.punchsettle.server.utiis.UserUtils;
@@ -56,7 +59,10 @@ public class PunchInManagerImpl implements IPunchInManager {
             .orElseThrow(() -> BusinessException.fail("无法获取当前用户信息,无法查询打卡任务"));
 
         // 查询打卡任务
-        List<PunchIn> punchIns = punchInService.listByCreatedBy(currentUserId);
+        PunchInQuery punchInQuery = new PunchInQuery();
+        punchInQuery.setArchiveFlag(false);
+        punchInQuery.setUserIds(Arrays.asList(currentUserId));
+        List<PunchIn> punchIns = punchInService.listByCondition(punchInQuery);
         if (CollectionUtils.isEmpty(punchIns)) {
             log.info("用户:{} 没有查询到生效的打卡任务");
             return List.of();
@@ -149,10 +155,25 @@ public class PunchInManagerImpl implements IPunchInManager {
     public void saveOrUpdatePunchIn(PunchInDto dto) {
         Assert.isNullInBusiness(dto, "请传入任务信息");
 
+        if (PunchInCategoryEnum.COUNT.equals(dto.getCategory())
+                && (Objects.isNull(dto.getRule()) || Objects.isNull(dto.getCountTrack()))) {
+            throw BusinessException.fail("打卡类型:计数,比较规则和次数不能为空");
+        }
+
+        if (PunchInCategoryEnum.TIME.equals(dto.getCategory())
+                && (Objects.isNull(dto.getRule()) || Objects.isNull(dto.getTimeTrack()))) {
+            throw BusinessException.fail("打卡类型:计时,比较规则和时间不能为空");
+        }
+
         PunchIn punchIn = new PunchIn();
         BeanUtils.copyProperties(dto, punchIn);
         punchIn.setArchiveFlag(false);
-        punchInService.insertOrUpdate(punchIn);
+
+        if (Objects.isNull(punchIn.getId())) {
+            punchInService.insert(punchIn);
+        } else {
+            punchInService.update(punchIn);
+        }
     }
 
     @Override
@@ -163,24 +184,62 @@ public class PunchInManagerImpl implements IPunchInManager {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void doPunchIn(Long punchInId) {
-        Assert.isNullInBusiness(punchInId, "请传入待打卡的任务");
+    public void doPunchIn(PunchInDto punchInDto) {
+        if (Objects.isNull(punchInDto) || Objects.isNull(punchInDto.getId())) {
+            BusinessException.throwFail("请传入待打卡的任务");
+        }
 
-        // 判断是否重复打卡
+        PunchIn punchIn = Optional.ofNullable(punchInService.getById(punchInDto.getId()))
+                .orElseThrow(() -> BusinessException.fail("无法查询到该打卡任务"));
+        if (PunchInCategoryEnum.TIME.equals(punchIn.getCategory()) && Objects.isNull(punchInDto.getTimeTrack())) {
+            BusinessException.throwFail("打卡类型:计时,请传入时间记录");
+        }
+
+        // 查询今天的打卡记录
         LocalDate today = LocalDate.now();
         PunchInRecordQuery punchInRecordQuery = new PunchInRecordQuery();
-        punchInRecordQuery.setPunchInIds(Arrays.asList(punchInId));
-        punchInRecordQuery.setStartDate(today.toString());
-        punchInRecordQuery.setEndDate(today.toString());
-        List<PunchInRecord> punchInRecords = punchInRecordService.listByCondition(punchInRecordQuery);
-        if (!CollectionUtils.isEmpty(punchInRecords)) {
+        punchInRecordQuery.setPunchInDate(today.toString());
+        punchInRecordQuery.setPunchInId(punchInDto.getId());
+        PunchInRecord oldPunchInRecord = punchInRecordService.selectOneByCondition(punchInRecordQuery);
+
+        // 打卡类型:单次打卡,需要判断是否重复打卡
+        if (PunchInCategoryEnum.SINGLE.equals(punchIn.getCategory()) && !Objects.isNull(oldPunchInRecord)) {
             throw BusinessException.fail("已打卡");
         }
 
-        // 创建打卡记录
-        PunchInRecord punchInRecord = new PunchInRecord();
-        punchInRecord.setPunchInId(punchInId);
-        punchInRecord.setPunchInDate(LocalDate.now().toString());
-        punchInRecordService.insert(punchInRecord);
+        // 获取或创建打卡记录
+        PunchInRecord punchInRecord = Optional.ofNullable(oldPunchInRecord).orElseGet(() -> {
+            PunchInRecord record = new PunchInRecord();
+            record.setPunchInId(punchInDto.getId());
+            record.setPunchInDate(LocalDate.now().toString());
+            return record;
+        });
+
+        // 打卡类型:计数,需要累加打卡次数
+        if (PunchInCategoryEnum.COUNT.equals(punchIn.getCategory())) {
+            punchInDto.setCountTrack(Optional.ofNullable(punchIn.getCountTrack()).orElse(0) + 1);
+        }
+
+        // 打卡类型:计时,需要记录最新打卡时长
+        if (PunchInCategoryEnum.TIME.equals(punchIn.getCategory())) {
+            punchInDto.setTimeTrack(punchIn.getTimeTrack());
+        }
+
+        // 新增或更新
+        if (Objects.isNull(punchInRecord.getId())) {
+            punchInRecordService.insert(punchInRecord);
+        } else {
+            punchInRecordService.update(punchInRecord);
+        }
+    }
+
+    @Override
+    public void archivePunchIn(Long punchInId) {
+        Assert.isNullInBusiness(punchInId, "请选择待归档的任务");
+
+        PunchIn punchIn = new PunchIn();
+        punchIn.setId(punchInId);
+        punchIn.setArchiveFlag(true);
+        punchInService.update(punchIn);
     }
 }

+ 19 - 9
src/main/java/com/punchsettle/server/service/manager/impl/RewardManagerImpl.java

@@ -1,11 +1,15 @@
 package com.punchsettle.server.service.manager.impl;
 
 import java.sql.Timestamp;
+import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 
 import com.punchsettle.server.atomic.entity.User;
 import com.punchsettle.server.atomic.service.IUserService;
+import com.punchsettle.server.dto.reward.ClaimRewardRecordDto;
+import com.punchsettle.server.dto.reward.ClaimRewardRecordQuery;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -14,10 +18,10 @@ import com.punchsettle.server.atomic.entity.UserClaimRewardRecord;
 import com.punchsettle.server.atomic.service.IUserClaimRewardRecordService;
 import com.punchsettle.server.common.exception.BusinessException;
 import com.punchsettle.server.common.utils.Assert;
-import com.punchsettle.server.dto.ClaimRewardDto;
-import com.punchsettle.server.dto.UserRewardDto;
+import com.punchsettle.server.dto.reward.ClaimRewardDto;
 import com.punchsettle.server.service.manager.IRewardManager;
 import com.punchsettle.server.utiis.UserUtils;
+import org.springframework.util.StringUtils;
 
 /**
  * @author tyuio
@@ -71,13 +75,19 @@ public class RewardManagerImpl implements IRewardManager {
     }
 
     @Override
-    public UserRewardDto queryReward() {
-        Long currentUserId = UserUtils.getCurrentUserId();
-        User user = userService.getById(currentUserId);
-        Assert.isNullInBusiness(user, "用户没有奖励信息");
+    public List<ClaimRewardRecordDto> queryClaimRewardRecords(ClaimRewardRecordQuery query) {
+        if (Objects.isNull(query) || !StringUtils.hasText(query.getStartDate()) || !StringUtils.hasText(query.getEndDate())) {
+            BusinessException.throwFail("请选择待查询的领奖记录时间范围");
+        }
+
+        query.setStartDate(String.format("%s 00:00:00.000", query.getStartDate()));
+        query.setEndDate(String.format("%s 23:59:59.999", query.getEndDate()));
 
-        UserRewardDto userRewardDto = new UserRewardDto();
-        userRewardDto.setUnclaimedRewardNum(user.getUnclaimedRewardNum());
-        return userRewardDto;
+        List<UserClaimRewardRecord> userClaimRewardRecords = userClaimRewardRecordService.listByCondition(query);
+        return userClaimRewardRecords.stream().map(record -> {
+            ClaimRewardRecordDto dto = new ClaimRewardRecordDto();
+            BeanUtils.copyProperties(record, dto);
+            return dto;
+        }).toList();
     }
 }

+ 102 - 0
src/main/java/com/punchsettle/server/service/manager/impl/ScratchManagerImpl.java

@@ -0,0 +1,102 @@
+package com.punchsettle.server.service.manager.impl;
+
+import com.punchsettle.server.atomic.entity.LotteryScratchRecord;
+import com.punchsettle.server.atomic.entity.User;
+import com.punchsettle.server.atomic.service.ILotteryScratchRecordService;
+import com.punchsettle.server.atomic.service.IUserService;
+import com.punchsettle.server.common.exception.BusinessException;
+import com.punchsettle.server.constant.ScratchActionTypeEnum;
+import com.punchsettle.server.dto.scratch.ScratchDto;
+import com.punchsettle.server.dto.scratch.ScratchQuery;
+import com.punchsettle.server.service.manager.IScratchManager;
+import com.punchsettle.server.utiis.UserUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description TODO
+ * @date 2024/12/13 16:25
+ */
+public class ScratchManagerImpl implements IScratchManager {
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private ILotteryScratchRecordService scratchRecordService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void modifyScratchAmount(ScratchDto dto) {
+        Long currentUserId = UserUtils.getCurrentUserId();
+        User user = Optional.ofNullable(userService.getById(currentUserId)).orElseThrow(() -> BusinessException.fail("无法获取当前用户信息"));
+
+        User updateUser = new User();
+        updateUser.setId(user.getId());
+        if (ScratchActionTypeEnum.INVEST.equals(dto.getActionType())) {
+            updateUser.setLotteryInvestAmount(user.getLotteryInvestAmount().add(dto.getAmount()));
+        }
+        if (ScratchActionTypeEnum.WIN.equals(dto.getActionType())) {
+            updateUser.setLotteryWinAmount(user.getLotteryWinAmount().add(dto.getAmount()));
+        }
+        userService.updateById(updateUser);
+
+        LotteryScratchRecord scratchRecord = new LotteryScratchRecord();
+        BeanUtils.copyProperties(dto, scratchRecord);
+        dto.setId(null);
+        scratchRecordService.insert(scratchRecord);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void revokeScratchRecord(ScratchDto dto) {
+        // 获取当前用户信息
+        Long currentUserId = UserUtils.getCurrentUserId();
+        User user = Optional.ofNullable(userService.getById(currentUserId)).orElseThrow(() -> BusinessException.fail("无法获取当前用户信息"));
+
+        // 获取待撤销的刮刮乐记录
+        LotteryScratchRecord scratchRecord = Optional.ofNullable(scratchRecordService.selectById(dto.getId())).orElseThrow(() -> BusinessException.fail("无法获取刮刮乐记录"));
+
+        // 待更新的用户信息
+        User updateUser = new User();
+        updateUser.setId(user.getId());
+        // 待更新的刮刮乐记录
+        LotteryScratchRecord updateScratchRecord = new LotteryScratchRecord();
+        updateScratchRecord.setId(scratchRecord.getId());
+        // 撤销投入
+        if (ScratchActionTypeEnum.INVEST.equals(scratchRecord.getActionType())) {
+            if (scratchRecord.getAmount().compareTo(user.getLotteryInvestAmount()) > 0) {
+                BusinessException.throwFail("撤销投入金额异常,用户已投入金额小于待撤销金额");
+            }
+            updateScratchRecord.setActionType(ScratchActionTypeEnum.REVOKE_INVEST);
+            updateUser.setLotteryInvestAmount(user.getLotteryInvestAmount().subtract(scratchRecord.getAmount()));
+        }
+        // 撤销中奖
+        if (ScratchActionTypeEnum.WIN.equals(scratchRecord.getActionType())) {
+            if (scratchRecord.getAmount().compareTo(user.getLotteryWinAmount()) > 0) {
+                BusinessException.throwFail("撤销中奖金额异常,用户已中奖金额小于待撤销金额");
+            }
+            updateScratchRecord.setActionType(ScratchActionTypeEnum.REVOKE_WIN);
+            updateUser.setLotteryWinAmount(user.getLotteryWinAmount().subtract(scratchRecord.getAmount()));
+        }
+
+        // 更新用户
+        userService.updateById(updateUser);
+
+        // 更新刮刮乐记录
+        scratchRecordService.update(updateScratchRecord);
+    }
+
+    @Override
+    public List<ScratchDto> queryScratchRecord(ScratchQuery query) {
+        return List.of();
+    }
+
+
+}

+ 238 - 0
src/main/java/com/punchsettle/server/service/manager/impl/SettleManagerImpl.java

@@ -0,0 +1,238 @@
+package com.punchsettle.server.service.manager.impl;
+
+import java.sql.Timestamp;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import com.punchsettle.server.atomic.entity.PunchIn;
+import com.punchsettle.server.atomic.entity.PunchInRecord;
+import com.punchsettle.server.atomic.entity.PunchInRecordSettlementRela;
+import com.punchsettle.server.atomic.entity.PunchInSettlement;
+import com.punchsettle.server.atomic.entity.SettlementTask;
+import com.punchsettle.server.atomic.entity.User;
+import com.punchsettle.server.atomic.service.IPunchInRecordService;
+import com.punchsettle.server.atomic.service.IPunchInRecordSettlementRelaService;
+import com.punchsettle.server.atomic.service.IPunchInService;
+import com.punchsettle.server.atomic.service.IPunchInSettlementService;
+import com.punchsettle.server.atomic.service.ISettlementTaskService;
+import com.punchsettle.server.atomic.service.IUserService;
+import com.punchsettle.server.dto.punchin.PunchInQuery;
+import com.punchsettle.server.dto.punchin.PunchInRecordQuery;
+import com.punchsettle.server.dto.task.SettleRewardTaskDto;
+import com.punchsettle.server.service.manager.ISettleManager;
+import com.punchsettle.server.utiis.DateUtils;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 结算服务类
+ * @date 2024/12/12 22:29
+ */
+@Slf4j
+@Service
+public class SettleManagerImpl implements ISettleManager {
+
+    @Autowired
+    private IPunchInService punchInService;
+
+    @Autowired
+    private IPunchInRecordService punchInRecordService;
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private IPunchInSettlementService punchInSettlementService;
+
+    @Autowired
+    private ISettlementTaskService settlementTaskService;
+
+    @Autowired
+    private IPunchInRecordSettlementRelaService punchInRecordSettlementRelaService;
+
+    @Override
+    public void settleReward() {
+
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void settleReward(SettleRewardTaskDto taskDto) {
+        if (Objects.isNull(taskDto) || Objects.isNull(taskDto.getSettleDate())) {
+            log.info("结算任务异常,原因:没有指定结算日期");
+            return;
+        }
+
+        log.info("结算任务开始,结算日期:{}, 结算用户:{}", taskDto.getSettleDate(), taskDto.getUserId());
+
+        Timestamp settleStartTime = new Timestamp(System.currentTimeMillis());
+
+        // 获取昨天的日期,
+        LocalDate settleDate = LocalDate.parse(taskDto.getSettleDate());
+        String settleDateStr = taskDto.getSettleDate();
+        // 判断是否是周末
+        boolean weekendFlag =
+                DayOfWeek.SATURDAY.equals(settleDate.getDayOfWeek()) || DayOfWeek.SUNDAY.equals(settleDate.getDayOfWeek());
+        boolean sundayFlag = DayOfWeek.SUNDAY.equals(settleDate.getDayOfWeek());
+
+        PunchInRecordQuery recordQuery = new PunchInRecordQuery();
+        recordQuery.setStartDate(settleDateStr);
+        recordQuery.setEndDate(settleDateStr);
+        List<PunchInRecord> punchInRecords = punchInRecordService.listByCondition(recordQuery);
+        if (CollectionUtils.isEmpty(punchInRecords)) {
+            log.info("结算任务结束,原因:没有打卡记录");
+            return;
+        }
+
+        List<Long> userIds = punchInRecords.stream().map(PunchInRecord::getCreatedBy).collect(Collectors.toList());
+
+        // 读取用户的打卡任务
+        PunchInQuery punchInQuery = new PunchInQuery();
+        punchInQuery.setUserIds(userIds);
+        List<PunchIn> punchIns = punchInService.listByCondition(punchInQuery);
+        if (CollectionUtils.isEmpty(punchIns)) {
+            log.info("结算任务结束,原因:根据打卡记录没有找到打卡任务");
+            return;
+        }
+
+        // 读取用户奖励数据
+        List<User> users = userService.listByIds(userIds);
+        if (CollectionUtils.isEmpty(users)) {
+            log.info("结算任务结束,原因:没有找到用户奖励信息");
+            return;
+        }
+
+        // 获取一周的打卡记录
+        Map<Long, List<PunchInRecord>> punchInRecordForWeek = Map.of();
+        if (sundayFlag) {
+            List<Long> punchInIds = punchIns.stream().map(PunchIn::getId).collect(Collectors.toList());
+            PunchInRecordQuery recordForWeekQuery = new PunchInRecordQuery();
+            recordForWeekQuery.setPunchInIds(punchInIds);
+            recordForWeekQuery.setStartDate(DateUtils.getLastWeekMondayStr());
+            recordForWeekQuery.setEndDate(DateUtils.getLastWeekSundayStr());
+            List<PunchInRecord> punchInRecordForWeeks = punchInRecordService.listByCondition(recordForWeekQuery);
+            if (!CollectionUtils.isEmpty(punchInRecordForWeeks)) {
+                punchInRecordForWeek =
+                        punchInRecordForWeeks.stream().collect(Collectors.groupingBy(PunchInRecord::getPunchInId));
+            }
+        }
+
+        // 打卡任务容器
+        Map<Long, PunchIn> punchInMap =
+                punchIns.stream().collect(Collectors.toMap(PunchIn::getId, Function.identity(), (key1, key2) -> key1));
+
+        // 用户-打卡记录分组
+        Map<Long, List<PunchInRecord>> userPunchInRecordMap =
+                punchInRecords.stream().collect(Collectors.groupingBy(PunchInRecord::getCreatedBy));
+
+        // 用户-奖励分组
+        Map<Long, User> userRewardMap = users.stream()
+                .collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key1));
+
+        // 先创建结算任务执行记录
+        SettlementTask settlementTask = new SettlementTask();
+        settlementTask.setSettleDate(settleDateStr);
+        settlementTask.setStartTime(settleStartTime);
+        settlementTask.setProcessedNum(userPunchInRecordMap.size());
+        settlementTaskService.insert(settlementTask);
+
+        // 结算时间
+        Timestamp settlementTime = new Timestamp(System.currentTimeMillis());
+        List<PunchInSettlement> addPunchInSettlements = new ArrayList<>();
+        List<User> updateUsers = new ArrayList<>();
+        List<PunchInRecordSettlementRela> punchInRecordSettlementRelas = new ArrayList<>();
+
+        // 有打卡记录的打卡任务则进行结算
+        for (Long userId : userPunchInRecordMap.keySet()) {
+            // 获取用户打卡记录
+            List<PunchInRecord> punchInRecordList = userPunchInRecordMap.get(userId);
+            if (CollectionUtils.isEmpty(punchInRecordList)) {
+                log.info("用户{}没有打卡记录,无须结算", userId);
+                continue;
+            }
+            // 获取用户打卡奖励
+            User user = userRewardMap.get(userId);
+            if (Objects.isNull(user)) {
+                log.info("用户{}没有奖励信息,无法结算", userId);
+                continue;
+            }
+
+            // 根据打卡记录上的打卡任务ID获取具体的打卡任务信息进行结算
+            int settleRewardNum = 0;
+            for (PunchInRecord punchInRecord : punchInRecordList) {
+                PunchIn punchIn = punchInMap.get(punchInRecord.getPunchInId());
+                if (Objects.isNull(punchIn)) {
+                    continue;
+                }
+                // 周末双倍奖励,否则计算普通奖励
+                settleRewardNum += weekendFlag ? punchIn.getRewardNum() * 2 : punchIn.getRewardNum();
+                // 周日计算一次全勤双倍奖励
+                if (sundayFlag && punchIn.getFullAttendanceFlag()) {
+                    List<PunchInRecord> tempRecordList = punchInRecordForWeek.get(punchInRecord.getPunchInId());
+                    if (!CollectionUtils.isEmpty(tempRecordList) && tempRecordList.size() >= 6) {
+                        settleRewardNum += punchIn.getRewardNum() * 2;
+                    }
+                }
+
+                // 构建结算任务与记录关联信息
+                PunchInRecordSettlementRela rela = new PunchInRecordSettlementRela();
+                rela.setRecordId(punchInRecord.getId());
+                rela.setSettlementId(settlementTask.getId());
+                punchInRecordSettlementRelas.add(rela);
+            }
+
+            // 计算结算前后,用户奖励数的变化
+            int beforeSettleRewardNum = user.getUnclaimedRewardNum();
+            int afterSettleRewardNum = beforeSettleRewardNum + settleRewardNum;
+            int totalRewardNum = user.getTotalRewardNum() + settleRewardNum;
+
+            // 构造结算信息
+            PunchInSettlement addPunchInSettlement = new PunchInSettlement();
+            addPunchInSettlement.setSettlementTaskId(settlementTask.getId());
+            addPunchInSettlement.setUserId(userId);
+            addPunchInSettlement.setSettleRewardNum(settleRewardNum);
+            addPunchInSettlement.setSettlementTime(settlementTime);
+            addPunchInSettlement.setBeforeSettleRewardNum(beforeSettleRewardNum);
+            addPunchInSettlement.setAfterSettleRewardNum(afterSettleRewardNum);
+            addPunchInSettlements.add(addPunchInSettlement);
+
+            // 构造用户奖励信息
+            User updateUser = new User();
+            updateUser.setId(user.getId());
+            updateUser.setTotalRewardNum(totalRewardNum);
+            updateUser.setUnclaimedRewardNum(afterSettleRewardNum);
+            updateUsers.add(updateUser);
+        }
+
+        // 更新用户奖励信息
+        userService.batchUpdateUser(updateUsers);
+
+        // 新增结算信息
+        punchInSettlementService.batchInsert(addPunchInSettlements);
+
+        // 构造并新增关联信息
+        punchInRecordSettlementRelaService.batchInsert(punchInRecordSettlementRelas);
+
+        // 构造并新增结算任务信息
+        settlementTask.setProcessedSettleNum(addPunchInSettlements.size());
+        settlementTask
+                .setProcessedUnsettleNum(settlementTask.getProcessedNum() - settlementTask.getProcessedSettleNum());
+        settlementTask.setEndTime(new Timestamp(System.currentTimeMillis()));
+        settlementTaskService.update(settlementTask);
+
+        log.info("结算任务结束");
+    }
+}

+ 9 - 195
src/main/java/com/punchsettle/server/service/manager/impl/TaskManagerImpl.java

@@ -1,34 +1,11 @@
 package com.punchsettle.server.service.manager.impl;
 
-import java.sql.Timestamp;
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import com.punchsettle.server.atomic.entity.User;
-import com.punchsettle.server.atomic.service.IUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 
-import com.punchsettle.server.atomic.entity.PunchIn;
-import com.punchsettle.server.atomic.entity.PunchInRecord;
-import com.punchsettle.server.atomic.entity.PunchInRecordSettlementRela;
-import com.punchsettle.server.atomic.entity.PunchInSettlement;
-import com.punchsettle.server.atomic.entity.SettlementTask;
-import com.punchsettle.server.atomic.service.IPunchInRecordService;
-import com.punchsettle.server.atomic.service.IPunchInRecordSettlementRelaService;
-import com.punchsettle.server.atomic.service.IPunchInService;
-import com.punchsettle.server.atomic.service.IPunchInSettlementService;
-import com.punchsettle.server.atomic.service.ISettlementTaskService;
-import com.punchsettle.server.dto.PunchInRecordQuery;
+import com.punchsettle.server.dto.task.SettleRewardTaskDto;
+import com.punchsettle.server.service.manager.ISettleManager;
 import com.punchsettle.server.service.manager.ITaskManager;
 import com.punchsettle.server.utiis.DateUtils;
 
@@ -45,181 +22,18 @@ import lombok.extern.slf4j.Slf4j;
 public class TaskManagerImpl implements ITaskManager {
 
     @Autowired
-    private IPunchInService punchInService;
-
-    @Autowired
-    private IPunchInRecordService punchInRecordService;
-
-    @Autowired
-    private IUserService userService;
-
-    @Autowired
-    private IPunchInSettlementService punchInSettlementService;
-
-    @Autowired
-    private ISettlementTaskService settlementTaskService;
-
-    @Autowired
-    private IPunchInRecordSettlementRelaService punchInRecordSettlementRelaService;
+    private ISettleManager settleManager;
 
     @Override
     @Scheduled(cron = "0 5 0 * * ?")
-    @Transactional(rollbackFor = Exception.class)
     public void autoSettle() {
-        log.info("结算任务开始");
-        Timestamp settleStartTime = new Timestamp(System.currentTimeMillis());
-
-        // 获取昨天的日期,
-        LocalDate yesterday = DateUtils.getYesterdayDate();
-        String yesterdayStr = DateUtils.getYesterdayDateStr();
-        // 判断是否是周末
-        boolean weekendFlag =
-            DayOfWeek.SATURDAY.equals(yesterday.getDayOfWeek()) || DayOfWeek.SUNDAY.equals(yesterday.getDayOfWeek());
-        boolean sundayFlag = DayOfWeek.SUNDAY.equals(yesterday.getDayOfWeek());
-
-        PunchInRecordQuery recordQuery = new PunchInRecordQuery();
-        recordQuery.setStartDate(yesterdayStr);
-        recordQuery.setEndDate(yesterdayStr);
-        List<PunchInRecord> punchInRecords = punchInRecordService.listByCondition(recordQuery);
-        if (CollectionUtils.isEmpty(punchInRecords)) {
-            log.info("结算任务结束,原因:没有打卡记录");
-            return;
-        }
-
-        List<Long> userIds = punchInRecords.stream().map(PunchInRecord::getCreatedBy).collect(Collectors.toList());
-
-        // 读取用户的打卡任务
-        List<PunchIn> punchIns = punchInService.listByCreatedBy(userIds);
-        if (CollectionUtils.isEmpty(punchIns)) {
-            log.info("结算任务结束,原因:根据打卡记录没有找到打卡任务");
-            return;
-        }
-
-        // 读取用户奖励数据
-        List<User> users = userService.listByIds(userIds);
-        if (CollectionUtils.isEmpty(users)) {
-            log.info("结算任务结束,原因:没有找到用户奖励信息");
-            return;
-        }
+        log.info("结算定时任务开始");
 
-        // 获取一周的打卡记录
-        Map<Long, List<PunchInRecord>> punchInRecordForWeek = Map.of();
-        if (sundayFlag) {
-            List<Long> punchInIds = punchIns.stream().map(PunchIn::getId).collect(Collectors.toList());
-            PunchInRecordQuery recordForWeekQuery = new PunchInRecordQuery();
-            recordForWeekQuery.setPunchInIds(punchInIds);
-            recordForWeekQuery.setStartDate(DateUtils.getLastWeekMondayStr());
-            recordForWeekQuery.setEndDate(DateUtils.getLastWeekSundayStr());
-            List<PunchInRecord> punchInRecordForWeeks = punchInRecordService.listByCondition(recordForWeekQuery);
-            if (!CollectionUtils.isEmpty(punchInRecordForWeeks)) {
-                punchInRecordForWeek =
-                    punchInRecordForWeeks.stream().collect(Collectors.groupingBy(PunchInRecord::getPunchInId));
-            }
-        }
+        SettleRewardTaskDto taskDto = new SettleRewardTaskDto();
+        taskDto.setSettleDate(DateUtils.getYesterdayDateStr());
+        settleManager.settleReward(taskDto);
 
-        // 打卡任务容器
-        Map<Long, PunchIn> punchInMap =
-            punchIns.stream().collect(Collectors.toMap(PunchIn::getId, Function.identity(), (key1, key2) -> key1));
-
-        // 用户-打卡记录分组
-        Map<Long, List<PunchInRecord>> userPunchInRecordMap =
-            punchInRecords.stream().collect(Collectors.groupingBy(PunchInRecord::getCreatedBy));
-
-        // 用户-奖励分组
-        Map<Long, User> userRewardMap = users.stream()
-            .collect(Collectors.toMap(User::getId, Function.identity(), (key1, key2) -> key1));
-
-        // 先创建结算任务执行记录
-        SettlementTask settlementTask = new SettlementTask();
-        settlementTask.setSettleDate(yesterdayStr);
-        settlementTask.setStartTime(settleStartTime);
-        settlementTask.setProcessedNum(userPunchInRecordMap.size());
-        settlementTaskService.insert(settlementTask);
-
-        // 结算时间
-        Timestamp settlementTime = new Timestamp(System.currentTimeMillis());
-        List<PunchInSettlement> addPunchInSettlements = new ArrayList<>();
-        List<User> updateUsers = new ArrayList<>();
-        List<PunchInRecordSettlementRela> punchInRecordSettlementRelas = new ArrayList<>();
-
-        // 有打卡记录的打卡任务则进行结算
-        for (Long userId : userPunchInRecordMap.keySet()) {
-            // 获取用户打卡记录
-            List<PunchInRecord> punchInRecordList = userPunchInRecordMap.get(userId);
-            if (CollectionUtils.isEmpty(punchInRecordList)) {
-                log.info("用户{}没有打卡记录,无须结算", userId);
-                continue;
-            }
-            // 获取用户打卡奖励
-            User user = userRewardMap.get(userId);
-            if (Objects.isNull(user)) {
-                log.info("用户{}没有奖励信息,无法结算", userId);
-                continue;
-            }
-
-            // 根据打卡记录上的打卡任务ID获取具体的打卡任务信息进行结算
-            int settleRewardNum = 0;
-            for (PunchInRecord punchInRecord : punchInRecordList) {
-                PunchIn punchIn = punchInMap.get(punchInRecord.getPunchInId());
-                if (Objects.isNull(punchIn)) {
-                    continue;
-                }
-                // 周末双倍奖励,否则计算普通奖励
-                settleRewardNum += weekendFlag ? punchIn.getRewardNum() * 2 : punchIn.getRewardNum();
-                // 周日计算一次全勤双倍奖励
-                if (sundayFlag && punchIn.getFullAttendanceFlag()) {
-                    List<PunchInRecord> tempRecordList = punchInRecordForWeek.get(punchInRecord.getPunchInId());
-                    if (!CollectionUtils.isEmpty(tempRecordList) && tempRecordList.size() >= 6) {
-                        settleRewardNum += punchIn.getRewardNum() * 2;
-                    }
-                }
-
-                // 构建结算任务与记录关联信息
-                PunchInRecordSettlementRela rela = new PunchInRecordSettlementRela();
-                rela.setRecordId(punchInRecord.getId());
-                rela.setSettlementId(settlementTask.getId());
-                punchInRecordSettlementRelas.add(rela);
-            }
-
-            // 计算结算前后,用户奖励数的变化
-            int beforeSettleRewardNum = user.getUnclaimedRewardNum();
-            int afterSettleRewardNum = beforeSettleRewardNum + settleRewardNum;
-            int totalRewardNum = user.getTotalRewardNum() + settleRewardNum;
-
-            // 构造结算信息
-            PunchInSettlement addPunchInSettlement = new PunchInSettlement();
-            addPunchInSettlement.setSettlementTaskId(settlementTask.getId());
-            addPunchInSettlement.setUserId(userId);
-            addPunchInSettlement.setSettleRewardNum(settleRewardNum);
-            addPunchInSettlement.setSettlementTime(settlementTime);
-            addPunchInSettlement.setBeforeSettleRewardNum(beforeSettleRewardNum);
-            addPunchInSettlement.setAfterSettleRewardNum(afterSettleRewardNum);
-            addPunchInSettlements.add(addPunchInSettlement);
-
-            // 构造用户奖励信息
-            User updateUser = new User();
-            updateUser.setId(user.getId());
-            updateUser.setTotalRewardNum(totalRewardNum);
-            updateUser.setUnclaimedRewardNum(afterSettleRewardNum);
-            updateUsers.add(updateUser);
-        }
-
-        // 更新用户奖励信息
-        userService.batchUpdateUser(updateUsers);
-
-        // 新增结算信息
-        punchInSettlementService.batchInsert(addPunchInSettlements);
-
-        // 构造并新增关联信息
-        punchInRecordSettlementRelaService.batchInsert(punchInRecordSettlementRelas);
-
-        // 构造并新增结算任务信息
-        settlementTask.setProcessedSettleNum(addPunchInSettlements.size());
-        settlementTask
-            .setProcessedUnsettleNum(settlementTask.getProcessedNum() - settlementTask.getProcessedSettleNum());
-        settlementTask.setEndTime(new Timestamp(System.currentTimeMillis()));
-        settlementTaskService.update(settlementTask);
-
-        log.info("结算任务结束");
+        log.info("结算定时任务结束");
     }
+
 }

+ 12 - 0
src/main/java/com/punchsettle/server/service/manager/impl/UserManagerImpl.java

@@ -3,6 +3,9 @@ package com.punchsettle.server.service.manager.impl;
 import java.math.BigDecimal;
 import java.util.Objects;
 
+import com.punchsettle.server.dto.UserInfoDto;
+import com.punchsettle.server.utiis.UserUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -54,4 +57,13 @@ public class UserManagerImpl implements IUserManager {
 
         return loginUserInfo;
     }
+
+    @Override
+    public UserInfoDto queryUserInfo() {
+        Long currentUserId = UserUtils.getCurrentUserId();
+        User user = userService.getById(currentUserId);
+        UserInfoDto userInfoDto = new UserInfoDto();
+        BeanUtils.copyProperties(user, userInfoDto);
+        return userInfoDto;
+    }
 }