Prechádzať zdrojové kódy

feat(system): 重构消息接收者模型并添加玩家道具服务

- 重构 MessageReceivers 表结构,增加消息类型、目标类型等字段
- 新增 PlayerItems 相关实体和服务,用于管理玩家道具
- 在 RewardClaimsMapper 中添加更新用户奖励申领状态的方法
- 优化 XssFilter 过滤路径,只对 /api/receivers/* 进行过滤
fugui001 5 mesiacov pred
rodič
commit
1be1cbdf60
26 zmenil súbory, kde vykonal 1075 pridanie a 88 odobranie
  1. 1 2
      ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java
  2. 9 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/RewardClaimsController.java
  3. 45 11
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/MessageReceivers.java
  4. 44 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/PlayerItems.java
  5. 65 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/UserMessageStatus.java
  6. 38 14
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/MessageReceiversBo.java
  7. 48 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/PlayerItemsBo.java
  8. 36 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/enums/MessageTargetTypeEnum.java
  9. 56 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/enums/RewardStatusEnum.java
  10. 58 18
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/MessageReceiversVo.java
  11. 53 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/PlayerItemsVo.java
  12. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/RewardClaimsVo.java
  13. 57 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/UserMessageStatusVo.java
  14. 29 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PlayerItemsMapper.java
  15. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/RewardClaimsMapper.java
  16. 25 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/UserMessageStatusMapper.java
  17. 68 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IPlayerItemsService.java
  18. 8 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IRewardClaimsService.java
  19. 39 6
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/MessageReceiversServiceImpl.java
  20. 133 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/PlayerItemsServiceImpl.java
  21. 80 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/RewardClaimsServiceImpl.java
  22. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/utils/NotificationUtils.java
  23. 102 35
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/MessageReceiversMapper.xml
  24. 49 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PlayerItemsMapper.xml
  25. 9 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/RewardClaimsMapper.xml
  26. 16 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/UserMessageStatusMapper.xml

+ 1 - 2
ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/config/FilterConfig.java

@@ -27,8 +27,7 @@ public class FilterConfig {
         registration.setFilter(new XssFilter());
 
         // 只针对指定的URL进行过滤
-        registration.addUrlPatterns("/api/messages/*");
-        registration.addUrlPatterns("/api/notice/*");
+        registration.addUrlPatterns("/api/receivers/*");
 
         registration.setName("xssFilter");
         registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE + 1);

+ 9 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/controller/RewardClaimsController.java

@@ -115,4 +115,13 @@ public class RewardClaimsController extends BaseController {
     }
 
 
+    @SaCheckPermission("business:claims:auditSendReward")
+    @Log(title = "奖励审核发放")
+    @RepeatSubmit()
+    @PostMapping("/auditSendReward")
+    public R<Void> auditSendReward(@RequestBody RewardClaimsBo bo) {
+        Boolean result = rewardClaimsService.auditSendReward(bo);
+        return result != null && result ? R.ok("审核并发放奖励成功") : R.fail("操作失败");
+    }
+
 }

+ 45 - 11
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/MessageReceivers.java

@@ -25,34 +25,68 @@ public class MessageReceivers {
     private Long id;
 
     /**
-     * 关联 messages.id
+     * 接收人 ID
      */
-    private Long messageId;
+    private Long userId;
 
     /**
-     * 接收人 ID
+     * 标题
      */
-    private Long userId;
+    private String title;
 
     /**
-     * 0-未读 1-已读
+     * 消息内容
      */
-    private Long readStatus;
+    private String content;
 
     /**
-     * 阅读时间
+     * 消息目标类型(广播 or 定向)'BROADCAST', 'SINGLE'
      */
-    private Date readTime;
+    private String targetType;
 
     /**
-     *
+     * 奖励ID
      */
-    private Date createdAt;
+    private Long rewardId;
 
     /**
-     *
+     * 模版CODE
+     */
+    private String templateCode;
+
+    /**
+     * 消息类型    SYSTEM("SYSTEM", "系统公告"),
+     REWARD("REWARD", "获得奖励"),
+     POINTS("POINTS", "积分变动"),
+     NOTICE("NOTICE", "通用通知"),
+     ACTIVITY("ACTIVITY", "活动通知"),
+     ORDER("ORDER", "订单通知"),
+     TASK("TASK", "任务通知");
+     */
+    private String messageType;
+
+    /**
+     * 发送时间
+     */
+    private Date sendTime;
+
+    /**
+     * 更新时间
      */
     private Date updatedAt;
 
+    /**
+     * 创建时间
+     */
+    private Date createdAt;
+
+
+    private String createBy;
+
+
+    /**
+     * 发送人
+     */
+    private String sendName;
 
 }

+ 44 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/PlayerItems.java

@@ -0,0 +1,44 @@
+package org.dromara.business.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+
+import java.io.Serial;
+
+/**
+ * 【请填写功能名称】对象 player_items
+ *
+ * @author Lion Li
+ * @date 2025-07-16
+ */
+@Data
+@TableName("player_items")
+public class PlayerItems{
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     *
+     */
+    private Long playerId;
+
+    /**
+     *
+     */
+    private Long itemId;
+
+    /**
+     * 道具数量
+     */
+    private Long quantity;
+
+
+}

+ 65 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/UserMessageStatus.java

@@ -0,0 +1,65 @@
+package org.dromara.business.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * 【请填写功能名称】对象 user_message_status
+ *
+ * @author Lion Li
+ * @date 2025-07-14
+ */
+@Data
+@TableName("user_message_status")
+public class UserMessageStatus {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     *
+     */
+    private Long userId;
+
+    /**
+     *
+     */
+    private Long messageId;
+
+    /**
+     *
+     */
+    private Boolean isRead;
+
+    /**
+     *
+     */
+    private Date readTime;
+
+    /**
+     * 是否已领取奖励
+     */
+    private Boolean isClaimed;
+
+    /**
+     * 领取时间
+     */
+    private Date claimedTime;
+
+    /**
+     * 领取时间
+     */
+    private Date createTime;
+
+
+}

+ 38 - 14
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/MessageReceiversBo.java

@@ -2,7 +2,6 @@ package org.dromara.business.domain.bo;
 
 import org.dromara.business.domain.MessageReceivers;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
-import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
@@ -27,36 +26,61 @@ public class MessageReceiversBo extends BaseEntity {
     private Long id;
 
     /**
-     * 关联 messages.id
+     * 接收人 ID
      */
-    @NotNull(message = "关联 messages.id不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long messageId;
+   // @NotNull(message = "接收人 ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long userId;
 
     /**
-     * 接收人 ID
+     * 标题
      */
-    @NotNull(message = "接收人 ID不能为空", groups = { AddGroup.class, EditGroup.class })
-    private Long userId;
+    private String title;
 
     /**
-     * 0-未读 1-已读
+     * 消息内容
      */
-    private Long readStatus;
+    private String content;
 
     /**
-     * 阅读时间
+     * 消息目标类型(广播 or 定向)'BROADCAST', 'SINGLE'
      */
-    private Date readTime;
+    private String targetType;
 
     /**
-     *
+     * 奖励ID
      */
-    private Date createdAt;
+    private Long rewardId;
 
     /**
-     *
+     * 模版CODE
+     */
+    private String templateCode;
+
+    /**
+     * 消息类型    SYSTEM("SYSTEM", "系统公告"),
+     REWARD("REWARD", "获得奖励"),
+     POINTS("POINTS", "积分变动"),
+     NOTICE("NOTICE", "通用通知"),
+     ACTIVITY("ACTIVITY", "活动通知"),
+     ORDER("ORDER", "订单通知"),
+     TASK("TASK", "任务通知");
+     */
+    private String messageType;
+
+    /**
+     * 发送时间
+     */
+    private Date sendTime;
+
+    /**
+     * 更新时间
      */
     private Date updatedAt;
 
+    /**
+     * 创建时间
+     */
+    private Date createdAt;
+
 
 }

+ 48 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/bo/PlayerItemsBo.java

@@ -0,0 +1,48 @@
+package org.dromara.business.domain.bo;
+
+import org.dromara.business.domain.PlayerItems;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 【请填写功能名称】业务对象 player_items
+ *
+ * @author Lion Li
+ * @date 2025-07-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PlayerItems.class, reverseConvertGenerate = false)
+public class PlayerItemsBo extends BaseEntity {
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long playerId;
+
+    /**
+     *
+     */
+    @NotNull(message = "不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long itemId;
+
+    /**
+     * 道具数量
+     */
+    @NotNull(message = "道具数量不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long quantity;
+
+
+}

+ 36 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/enums/MessageTargetTypeEnum.java

@@ -0,0 +1,36 @@
+package org.dromara.business.domain.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum MessageTargetTypeEnum {
+
+    SYSTEM("BROADCAST", "所有人"), //广播
+    REWARD("SINGLE", "个人");//定向
+
+
+    private final String code;
+    private final String description;
+
+    MessageTargetTypeEnum(String code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public static MessageTargetTypeEnum fromCode(String code) {
+        for (MessageTargetTypeEnum type : values()) {
+            if (type.getCode().equalsIgnoreCase(code)) {
+                return type;
+            }
+        }
+        throw new IllegalArgumentException("未知的消息类型: " + code);
+    }
+
+    /**
+     * 根据 code 获取 description
+     */
+    public static String getDescriptionByCode(String code) {
+        return fromCode(code).getDescription();
+    }
+
+}

+ 56 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/enums/RewardStatusEnum.java

@@ -0,0 +1,56 @@
+package org.dromara.business.domain.enums;
+
+public enum RewardStatusEnum {
+
+    NO_RECEIVE("0", "未领取"),
+    RECEIVED("1", "已领取"),
+    SUBMIT_AUDIT("2", "已提交待审核");
+
+    private final String code;
+    private final String description;
+
+    RewardStatusEnum(String code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * 根据 code 获取枚举实例
+     */
+    public static RewardStatusEnum fromCode(String code) {
+        for (RewardStatusEnum type : values()) {
+            if (type.getCode().equalsIgnoreCase(code)) {
+                return type;
+            }
+        }
+        throw new IllegalArgumentException("未知的接收类型: " + code);
+    }
+
+    /**
+     * 根据 code 获取 description
+     */
+    public static String getDescriptionByCode(String code) {
+        return fromCode(code).getDescription();
+    }
+
+    /**
+     * 判断是否是合法的 code
+     */
+    public static boolean isValidCode(String code) {
+        try {
+            fromCode(code);
+            return true;
+        } catch (IllegalArgumentException e) {
+            return false;
+        }
+    }
+
+}

+ 58 - 18
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/MessageReceiversVo.java

@@ -6,7 +6,8 @@ import cn.idev.excel.annotation.ExcelProperty;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import org.dromara.business.domain.MessageReceivers;
-
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
 import java.io.Serial;
 import java.io.Serializable;
 
@@ -32,12 +33,6 @@ public class MessageReceiversVo implements Serializable {
     @ExcelProperty(value = "")
     private Long id;
 
-    /**
-     * 关联 messages.id
-     */
-    @ExcelProperty(value = "关联 messages.id")
-    private Long messageId;
-
     /**
      * 接收人 ID
      */
@@ -45,28 +40,73 @@ public class MessageReceiversVo implements Serializable {
     private Long userId;
 
     /**
-     * 0-未读 1-已读
+     * 标题
      */
-    @ExcelProperty(value = "0-未读 1-已读")
-    private Long readStatus;
+    @ExcelProperty(value = "标题")
+    private String title;
 
     /**
-     * 阅读时间
+     * 消息内容
      */
-    @ExcelProperty(value = "阅读时间")
-    private Date readTime;
+    @ExcelProperty(value = "消息内容")
+    private String content;
 
     /**
-     *
+     * 消息目标类型(广播 or 定向)'BROADCAST', 'SINGLE'
      */
-    @ExcelProperty(value = "")
-    private Date createdAt;
+    @ExcelProperty(value = "消息目标类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "广=播,o=r,定=向")
+    private String targetType;
 
     /**
-     *
+     * 奖励ID
      */
-    @ExcelProperty(value = "")
+    @ExcelProperty(value = "奖励ID")
+    private Long rewardId;
+
+    /**
+     * 模版CODE
+     */
+    @ExcelProperty(value = "模版CODE")
+    private String templateCode;
+
+    /**
+     * 消息类型    SYSTEM("SYSTEM", "系统公告"),
+     REWARD("REWARD", "获得奖励"),
+     POINTS("POINTS", "积分变动"),
+     NOTICE("NOTICE", "通用通知"),
+     ACTIVITY("ACTIVITY", "活动通知"),
+     ORDER("ORDER", "订单通知"),
+     TASK("TASK", "任务通知");
+     */
+    private String messageType;
+
+    /**
+     * 发送时间
+     */
+    @ExcelProperty(value = "发送时间")
+    private Date sendTime;
+
+    /**
+     * 更新时间
+     */
+    @ExcelProperty(value = "更新时间")
     private Date updatedAt;
 
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createdAt;
+
+    @ExcelProperty(value = "消息内容text")
+    private String contentText;
+
+    private String createBy;
+
+    /**
+     * 发送人
+     */
+    private String sendName;
 
 }

+ 53 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/PlayerItemsVo.java

@@ -0,0 +1,53 @@
+package org.dromara.business.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.business.domain.PlayerItems;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+/**
+ * 【请填写功能名称】视图对象 player_items
+ *
+ * @author Lion Li
+ * @date 2025-07-16
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PlayerItems.class)
+public class PlayerItemsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long playerId;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long itemId;
+
+    /**
+     * 道具数量
+     */
+    @ExcelProperty(value = "道具数量")
+    private Long quantity;
+
+
+}

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/RewardClaimsVo.java

@@ -74,6 +74,10 @@ public class RewardClaimsVo implements Serializable {
     @ExcelProperty(value = "是否审核 ")
     private Long claimed;
 
+
+    @ExcelProperty(value = "是否审核 ")
+    private String claimedText;
+
     /**
      *
      */

+ 57 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/domain/vo/UserMessageStatusVo.java

@@ -0,0 +1,57 @@
+package org.dromara.business.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 【请填写功能名称】视图对象 user_message_status
+ *
+ * @author Lion Li
+ * @date 2025-07-14
+ */
+@Data
+public class UserMessageStatusVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    private Long id;
+
+    /**
+     *
+     */
+    private Long userId;
+
+    /**
+     *
+     */
+    private Long messageId;
+
+    /**
+     *
+     */
+    private Long isRead;
+
+    /**
+     *
+     */
+    private Date readTime;
+
+    /**
+     * 是否已领取奖励
+     */
+    private int isClaimed;
+
+    /**
+     * 领取时间
+     */
+    private Date claimedTime;
+
+}

+ 29 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/PlayerItemsMapper.java

@@ -0,0 +1,29 @@
+package org.dromara.business.mapper;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.business.domain.PlayerItems;
+import org.dromara.business.domain.vo.PlayerItemsVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-16
+ */
+@DS("mysql2")
+public interface PlayerItemsMapper extends BaseMapperPlus<PlayerItems, PlayerItemsVo> {
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    int batchInsertOrUpdatePlayerItems(@Param("list") List<PlayerItems> items);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void insertPlayerItem(PlayerItems playerItems);
+
+
+}

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/RewardClaimsMapper.java

@@ -41,5 +41,7 @@ public interface RewardClaimsMapper extends BaseMapperPlus<RewardClaims, RewardC
     @InterceptorIgnore(tenantLine = "true")
     int deleteByCriteria(@Param("id") Long id, @Param("tournamentId") Long tournamentId);
 
+    @InterceptorIgnore(tenantLine = "true")
+    int updateUserRewardClaimed(@Param("id") Long id);
 
 }

+ 25 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/mapper/UserMessageStatusMapper.java

@@ -0,0 +1,25 @@
+package org.dromara.business.mapper;
+
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.business.domain.UserMessageStatus;
+import org.dromara.business.domain.vo.UserMessageStatusVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 【请填写功能名称】Mapper接口
+ *
+ * @author Lion Li
+ * @date 2025-07-14
+ */
+@DS("mysql2")
+public interface UserMessageStatusMapper extends BaseMapperPlus<UserMessageStatus, UserMessageStatusVo> {
+
+
+    @InterceptorIgnore(tenantLine = "true")
+    int updateUserMessageClaimed(@Param("rewardId") Long rewardId);
+
+
+}

+ 68 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IPlayerItemsService.java

@@ -0,0 +1,68 @@
+package org.dromara.business.service;
+
+import org.dromara.business.domain.bo.PlayerItemsBo;
+import org.dromara.business.domain.vo.PlayerItemsVo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 【请填写功能名称】Service接口
+ *
+ * @author Lion Li
+ * @date 2025-07-16
+ */
+public interface IPlayerItemsService {
+
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param id 主键
+     * @return 【请填写功能名称】
+     */
+    PlayerItemsVo queryById(Long id);
+
+    /**
+     * 分页查询【请填写功能名称】列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 【请填写功能名称】分页列表
+     */
+    TableDataInfo<PlayerItemsVo> queryPageList(PlayerItemsBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的【请填写功能名称】列表
+     *
+     * @param bo 查询条件
+     * @return 【请填写功能名称】列表
+     */
+    List<PlayerItemsVo> queryList(PlayerItemsBo bo);
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param bo 【请填写功能名称】
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(PlayerItemsBo bo);
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param bo 【请填写功能名称】
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(PlayerItemsBo bo);
+
+    /**
+     * 校验并批量删除【请填写功能名称】信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 8 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/IRewardClaimsService.java

@@ -76,4 +76,12 @@ public interface IRewardClaimsService {
      */
     Boolean deleteByCriteria(RewardClaimsBo bo);
 
+
+    /**
+     * 批量审核发放奖励
+     * @param bo
+     * @return
+     */
+    Boolean auditSendReward(RewardClaimsBo bo);
+
 }

+ 39 - 6
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/MessageReceiversServiceImpl.java

@@ -2,10 +2,14 @@ package org.dromara.business.service.impl;
 
 import org.dromara.business.domain.MessageReceivers;
 import org.dromara.business.domain.bo.MessageReceiversBo;
+import org.dromara.business.domain.enums.MessageTargetTypeEnum;
+import org.dromara.business.domain.enums.MessageTypeEnum;
+import org.dromara.business.domain.enums.ReceiverTypeEnum;
 import org.dromara.business.domain.vo.MessageReceiversVo;
 import org.dromara.business.mapper.MessageReceiversMapper;
 import org.dromara.business.service.IMessageReceiversService;
 import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -13,9 +17,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.springframework.stereotype.Service;
 
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
@@ -55,6 +61,23 @@ public class MessageReceiversServiceImpl implements IMessageReceiversService {
     public TableDataInfo<MessageReceiversVo> queryPageList(MessageReceiversBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<MessageReceivers> lqw = buildQueryWrapper(bo);
         Page<MessageReceiversVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<MessageReceiversVo> records = result.getRecords();
+        for (MessageReceiversVo record : records) {
+            String contentText=replaceHtml(record.getContent());
+            record.setContentText(contentText);
+
+            String messageType = record.getMessageType();
+            if(StringUtils.isNotBlank(messageType)){
+                record.setMessageType(MessageTypeEnum.getDescriptionByCode(messageType));
+            }
+
+
+            String targetType = record.getTargetType();
+            if(StringUtils.isNotBlank(targetType)){
+                record.setTargetType(MessageTargetTypeEnum.getDescriptionByCode(targetType));
+            }
+
+        }
         return TableDataInfo.build(result);
     }
 
@@ -74,10 +97,8 @@ public class MessageReceiversServiceImpl implements IMessageReceiversService {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<MessageReceivers> lqw = Wrappers.lambdaQuery();
         lqw.orderByAsc(MessageReceivers::getId);
-        lqw.eq(bo.getMessageId() != null, MessageReceivers::getMessageId, bo.getMessageId());
+        lqw.eq(bo.getTitle() != null, MessageReceivers::getTitle, bo.getTitle());
         lqw.eq(bo.getUserId() != null, MessageReceivers::getUserId, bo.getUserId());
-        lqw.eq(bo.getReadStatus() != null, MessageReceivers::getReadStatus, bo.getReadStatus());
-        lqw.eq(bo.getReadTime() != null, MessageReceivers::getReadTime, bo.getReadTime());
         lqw.eq(bo.getCreatedAt() != null, MessageReceivers::getCreatedAt, bo.getCreatedAt());
         lqw.eq(bo.getUpdatedAt() != null, MessageReceivers::getUpdatedAt, bo.getUpdatedAt());
         return lqw;
@@ -93,9 +114,11 @@ public class MessageReceiversServiceImpl implements IMessageReceiversService {
     public Boolean insertByBo(MessageReceiversBo bo) {
         MessageReceivers add = MapstructUtils.convert(bo, MessageReceivers.class);
         validEntityBeforeSave(add);
-
-
-
+        add.setSendTime(new Date());
+        add.setCreateBy(LoginHelper.getUsername());
+        add.setMessageType(MessageTypeEnum.SYSTEM.getCode());
+        add.setTargetType(MessageTargetTypeEnum.SYSTEM.getCode());
+        add.setSendName("三湘杯赛事组");
         boolean flag = baseMapper.insertMessageReceiver(add) > 0;
         if (flag) {
             bo.setId(add.getId());
@@ -137,4 +160,14 @@ public class MessageReceiversServiceImpl implements IMessageReceiversService {
         }
         return baseMapper.deleteMessageReceiversById(ids) > 0;
     }
+
+
+    public static String replaceHtml(String html) {
+        if (html == null || html.isEmpty()) {
+            return "";
+        }
+        // 正则表达式移除所有的HTML标签
+        return html.replaceAll("<[^>]*>", "");
+    }
+
 }

+ 133 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/PlayerItemsServiceImpl.java

@@ -0,0 +1,133 @@
+package org.dromara.business.service.impl;
+
+import org.dromara.business.domain.PlayerItems;
+import org.dromara.business.domain.bo.PlayerItemsBo;
+import org.dromara.business.domain.vo.PlayerItemsVo;
+import org.dromara.business.mapper.PlayerItemsMapper;
+import org.dromara.business.service.IPlayerItemsService;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 【请填写功能名称】Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2025-07-16
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class PlayerItemsServiceImpl implements IPlayerItemsService {
+
+    private final PlayerItemsMapper baseMapper;
+
+    /**
+     * 查询【请填写功能名称】
+     *
+     * @param id 主键
+     * @return 【请填写功能名称】
+     */
+    @Override
+    public PlayerItemsVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询【请填写功能名称】列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 【请填写功能名称】分页列表
+     */
+    @Override
+    public TableDataInfo<PlayerItemsVo> queryPageList(PlayerItemsBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<PlayerItems> lqw = buildQueryWrapper(bo);
+        Page<PlayerItemsVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的【请填写功能名称】列表
+     *
+     * @param bo 查询条件
+     * @return 【请填写功能名称】列表
+     */
+    @Override
+    public List<PlayerItemsVo> queryList(PlayerItemsBo bo) {
+        LambdaQueryWrapper<PlayerItems> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<PlayerItems> buildQueryWrapper(PlayerItemsBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<PlayerItems> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(PlayerItems::getId);
+        lqw.eq(bo.getPlayerId() != null, PlayerItems::getPlayerId, bo.getPlayerId());
+        lqw.eq(bo.getItemId() != null, PlayerItems::getItemId, bo.getItemId());
+        lqw.eq(bo.getQuantity() != null, PlayerItems::getQuantity, bo.getQuantity());
+        return lqw;
+    }
+
+    /**
+     * 新增【请填写功能名称】
+     *
+     * @param bo 【请填写功能名称】
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(PlayerItemsBo bo) {
+        PlayerItems add = MapstructUtils.convert(bo, PlayerItems.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改【请填写功能名称】
+     *
+     * @param bo 【请填写功能名称】
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(PlayerItemsBo bo) {
+        PlayerItems update = MapstructUtils.convert(bo, PlayerItems.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(PlayerItems entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除【请填写功能名称】信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 80 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/service/impl/RewardClaimsServiceImpl.java

@@ -3,12 +3,17 @@ package org.dromara.business.service.impl;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.dromara.business.domain.PlayerItems;
 import org.dromara.business.domain.RewardClaims;
 import org.dromara.business.domain.bo.RewardClaimsBo;
+import org.dromara.business.domain.dto.ItemsPrizeDto;
+import org.dromara.business.domain.enums.RewardStatusEnum;
 import org.dromara.business.domain.vo.ItemsVo;
 import org.dromara.business.domain.vo.RewardClaimsVo;
 import org.dromara.business.domain.vo.RewardVo;
+import org.dromara.business.mapper.PlayerItemsMapper;
 import org.dromara.business.mapper.RewardClaimsMapper;
+import org.dromara.business.mapper.UserMessageStatusMapper;
 import org.dromara.business.service.IItemsService;
 import org.dromara.business.service.IRewardClaimsService;
 import org.dromara.common.core.utils.MapstructUtils;
@@ -20,7 +25,11 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
@@ -40,6 +49,12 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
 
     private final IItemsService itemsService;
 
+    private final UserMessageStatusMapper userMessageStatusMapper;
+
+    private final PlayerItemsMapper playerItemsMapper;
+
+    @Autowired
+    private ObjectMapper objectMapper;
 
     /**
      * 查询用户参赛
@@ -75,7 +90,9 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
                 }
                 resultRecord.setRewardVoList(items);
             }
-        }
+            Long isClaimed= resultRecord.getClaimed();
+            resultRecord.setClaimedText(RewardStatusEnum.getDescriptionByCode(String.valueOf(isClaimed)));
+       }
         return TableDataInfo.build(result);
     }
 
@@ -165,4 +182,66 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
 
         return baseMapper.deleteByCriteria(bo.getId(),bo.getTournamentId())>0;
     }
+
+    /**
+     * 审核并发放奖励
+     */
+    @Override
+    public Boolean auditSendReward(RewardClaimsBo bo) {
+        try {
+            // 1. 查询领取状态,防止重复领取
+            RewardClaimsVo rewardClaimsVo = baseMapper.selectInfoById(bo.getId());
+            if (rewardClaimsVo.getClaimed() != 2L) {
+                throw new IllegalArgumentException("该奖励已处理,请勿重复操作");
+            }
+
+            // 2. 解析 JSON 奖励数据
+            String rewardJson = bo.getRewardJson();
+            List<Map<String, Object>> list = objectMapper.readValue(
+                rewardJson,
+                new TypeReference<List<Map<String, Object>>>() {}
+            );
+
+            List<PlayerItems> items = new ArrayList<>();
+            for (Map<String, Object> item : list) {
+                Integer itemId = (Integer) item.get("itemId");
+                Integer quantity = (Integer) item.get("quantity");
+
+                if (itemId == null || quantity == null) {
+                    throw new IllegalArgumentException("道具ID或数量不能为空");
+                }
+
+                PlayerItems playerItem = new PlayerItems();
+                playerItem.setPlayerId(bo.getPlayerId());
+                playerItem.setItemId(itemId.longValue());
+                playerItem.setQuantity(quantity.longValue());
+
+                items.add(playerItem);
+            }
+
+            // 3. 批量插入或更新道具(存在则叠加)
+            int insertCount = playerItemsMapper.batchInsertOrUpdatePlayerItems(items);
+            if (insertCount <= 0) {
+                throw new RuntimeException("道具发放失败");
+            }
+
+            // 4. 更新用户消息状态
+            int messageUpdateCount = userMessageStatusMapper.updateUserMessageClaimed(bo.getId());
+            if (messageUpdateCount <= 0) {
+                throw new RuntimeException("更新用户消息状态失败");
+            }
+
+            // 5. 更新奖励记录状态
+            int rewardUpdateCount = baseMapper.updateUserRewardClaimed(bo.getId());
+            if (rewardUpdateCount <= 0) {
+                throw new RuntimeException("更新奖励记录失败");
+            }
+
+            return Boolean.TRUE;
+
+        } catch (Exception e) {
+            // 抛出运行时异常触发事务回滚
+            throw new RuntimeException("审核并发放奖励过程中发生异常", e);
+        }
+    }
 }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/utils/NotificationUtils.java

@@ -73,7 +73,7 @@ public class NotificationUtils {
             List<MessageReceivers> receiverList = users.stream()
                 .map(user -> {
                     MessageReceivers receiver = new MessageReceivers();
-                    receiver.setMessageId(messageId);
+                 /*   receiver.setMessageId(messageId);*/
                     receiver.setUserId(user.getId());
                     return receiver;
                 })

+ 102 - 35
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/MessageReceiversMapper.xml

@@ -5,84 +5,151 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 <mapper namespace="org.dromara.business.mapper.MessageReceiversMapper">
 
 
+    <!-- 查询分页 VO -->
     <select id="selectVoPage" resultType="org.dromara.business.domain.vo.MessageReceiversVo">
         SELECT
-            id, message_id, user_id, read_status, read_time, created_at, updated_at
-        FROM message_receivers  ${ew.customSqlSegment}
+            id,
+            user_id,
+            title,
+            content,
+            target_type,
+            reward_id,
+            template_code,
+            message_type,
+            create_by,
+            send_time,
+            created_at,
+            updated_at,
+            send_name
+        FROM message_receivers
+                 ${ew.customSqlSegment}
     </select>
 
-
+    <!-- 查询列表 -->
     <select id="selectMessagesReceiversList" resultType="org.dromara.business.domain.vo.MessageReceiversVo">
         SELECT
-            id, message_id, user_id, read_status, read_time, created_at, updated_at
-        FROM message_receivers   ${ew.customSqlSegment}
+            id,
+            user_id,
+            title,
+            content,
+            target_type,
+            reward_id,
+            template_code,
+            message_type,
+            create_by,
+            send_time,
+            created_at,
+            updated_at,
+            send_name
+        FROM message_receivers
+                 ${ew.customSqlSegment}
     </select>
 
+    <!-- 根据 ID 查询详情 -->
     <select id="selectVoInfoById" resultType="org.dromara.business.domain.vo.MessageReceiversVo">
         SELECT
-            id, message_id, user_id, read_status, read_time, created_at, updated_at
-        FROM message_receivers   WHERE id =  #{id}
+            id,
+            user_id,
+            title,
+            content,
+            target_type,
+            reward_id,
+            template_code,
+            message_type,
+            create_by,
+            send_time,
+            created_at,
+            updated_at,
+            send_name
+        FROM message_receivers
+        WHERE id = #{id}
     </select>
 
+
     <update id="updateMessageReceiver">
         UPDATE message_receivers
         <set>
-            <if test="readStatus != null">read_status = #{readStatus},</if>
-            read_time=now()
+            <if test="title != null">title = #{title},</if>
+            <if test="content != null">content = #{content},</if>
+            updated_at = now()
         </set>
         WHERE id = #{id}
     </update>
 
-    <insert id="insertMessageReceiver"  useGeneratedKeys="true" keyProperty="id">
+    <!-- 插入单条记录 -->
+    <insert id="insertMessageReceiver" useGeneratedKeys="true" keyProperty="id">
         INSERT INTO message_receivers
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="messageId != null">message_id,</if>
             <if test="userId != null">user_id,</if>
-            <if test="readStatus != null">read_status,</if>
-            <if test="readTime != null">read_time,</if>
+            <if test="title != null">title,</if>
+            <if test="content != null">content,</if>
+            <if test="targetType != null">target_type,</if>
+            <if test="rewardId != null">reward_id,</if>
+            <if test="templateCode != null">template_code,</if>
+            <if test="messageType != null">message_type,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="sendTime != null">send_time,</if>
+            <if test="sendName != null">send_name,</if>
         </trim>
         VALUES
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="messageId != null">#{messageId},</if>
             <if test="userId != null">#{userId},</if>
-            <if test="readStatus != null">#{readStatus},</if>
-            <if test="readTime != null">#{readTime},</if>
+            <if test="title != null">#{title},</if>
+            <if test="content != null">#{content},</if>
+            <if test="targetType != null">#{targetType},</if>
+            <if test="rewardId != null">#{rewardId},</if>
+            <if test="templateCode != null">#{templateCode},</if>
+            <if test="messageType != null">#{messageType},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="sendTime != null">#{sendTime},</if>
+            <if test="sendName != null">#{sendName},</if>
         </trim>
     </insert>
 
-
-    <delete id="deleteMessageReceiversById">
-        DELETE FROM message_receivers
-        <where>
-            id IN
-            <foreach item="id" collection="ids" open="(" separator="," close=")">
-                <if test="id > 0">
-                    #{id}
-                </if>
-            </foreach>
-        </where>
-    </delete>
-
+    <!-- 批量插入 -->
     <insert id="batchInsertMessageReceiver">
         INSERT INTO message_receivers
         <!-- 动态生成列名 -->
         <trim prefix="(" suffix=")" suffixOverrides=",">
-            <if test="list[0].messageId != null">message_id,</if>
             <if test="list[0].userId != null">user_id,</if>
-            <if test="list[0].readStatus != null">read_status,</if>
-            <if test="list[0].readTime != null">read_time,</if>
+            <if test="list[0].title != null">title,</if>
+            <if test="list[0].content != null">content,</if>
+            <if test="list[0].targetType != null">target_type,</if>
+            <if test="list[0].rewardId != null">reward_id,</if>
+            <if test="list[0].templateCode != null">template_code,</if>
+            <if test="list[0].messageType != null">message_type,</if>
+            <if test="list[0].createBy != null">create_by,</if>
+            <if test="list[0].sendTime != null">send_time,</if>
         </trim>
         <!-- 动态生成每条记录的值 -->
         VALUES
         <foreach collection="list" item="item" separator=",">
             <trim prefix="(" suffix=")" suffixOverrides=",">
-                <if test="item.messageId != null">#{item.messageId},</if>
                 <if test="item.userId != null">#{item.userId},</if>
-                <if test="item.readStatus != null">#{item.readStatus},</if>
-                <if test="item.readTime != null">#{item.readTime},</if>
+                <if test="item.title != null">#{item.title},</if>
+                <if test="item.content != null">#{item.content},</if>
+                <if test="item.targetType != null">#{item.targetType},</if>
+                <if test="item.rewardId != null">#{item.rewardId},</if>
+                <if test="item.templateCode != null">#{item.templateCode},</if>
+                <if test="item.messageType != null">#{item.messageType},</if>
+                <if test="item.createBy != null">#{item.createBy},</if>
+                <if test="item.sendTime != null">#{item.sendTime},</if>
             </trim>
         </foreach>
     </insert>
 
+    <!-- 根据 ID 删除 -->
+    <delete id="deleteMessageReceiversById">
+        DELETE FROM message_receivers
+        <where>
+            id IN
+            <foreach item="id" collection="ids" open="(" separator="," close=")">
+                <if test="id > 0">
+                    #{id}
+                </if>
+            </foreach>
+        </where>
+    </delete>
+
 
 </mapper>

+ 49 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/PlayerItemsMapper.xml

@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.business.mapper.PlayerItemsMapper">
+
+    <insert id="insertPlayerItem" parameterType="map">
+        INSERT INTO player_items
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="playerId != null">player_id,</if>
+            <if test="itemId != null">item_id,</if>
+            <if test="quantity != null">quantity,</if>
+        </trim>
+        VALUES
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="playerId != null">#{playerId},</if>
+            <if test="itemId != null">#{itemId},</if>
+            <if test="quantity != null">#{quantity},</if>
+        </trim>
+    </insert>
+
+
+    <insert id="batchInsertOrUpdatePlayerItems">
+        INSERT INTO player_items (
+        player_id,
+        item_id,
+        quantity
+        )
+        VALUES
+        <foreach collection="list" item="item" separator=",">
+            (
+            #{item.playerId},
+            #{item.itemId},
+            COALESCE(#{item.quantity}, 1)
+            )
+        </foreach>
+        ON DUPLICATE KEY UPDATE
+        quantity = quantity + VALUES(quantity) -- 叠加数量
+    </insert>
+
+
+
+    <select id="selectPlayerItems" resultType="org.dromara.business.domain.vo.PlayerItemsVo">
+        SELECT * FROM player_items
+        WHERE  player_id=#{playerId} and item_id= #{itemId}
+    </select>
+
+</mapper>
+

+ 9 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/RewardClaimsMapper.xml

@@ -117,4 +117,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
 
+    <update id="updateUserRewardClaimed">
+        UPDATE reward_claims
+        SET
+            claimed = 1,
+            updated_at = NOW()
+        WHERE  id=#{id}
+    </update>
+
+
 </mapper>

+ 16 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/UserMessageStatusMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.business.mapper.UserMessageStatusMapper">
+
+
+    <update id="updateUserMessageClaimed">
+        UPDATE user_message_status
+        SET
+            is_claimed = 1,
+            claimed_time = NOW()
+        WHERE  reward_id=#{rewardId}
+    </update>
+
+</mapper>