Bläddra i källkod

重复红包积分领取

yuhongqi 1 dag sedan
förälder
incheckning
12796cecb4

+ 40 - 4
fs-service/src/main/java/com/fs/live/service/impl/LiveRedConfServiceImpl.java

@@ -281,6 +281,17 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
         record.setUserId(red.getUserId());
         record.setIntegral(integral);
         record.setCreateTime(new Date());
+        
+        // 检查数据库中是否已存在该记录(防止重复领取)
+        LiveUserRedRecord queryRecord = new LiveUserRedRecord();
+        queryRecord.setUserId(red.getUserId());
+        queryRecord.setRedId(red.getRedId());
+        List<LiveUserRedRecord> existingRecords = userRedRecordMapper.selectLiveUserRedRecordList(queryRecord);
+        if (existingRecords != null && !existingRecords.isEmpty()) {
+            log.warn("用户 {} 已领取过红包 redId: {},跳过重复处理", red.getUserId(), red.getRedId());
+            return R.error("您已经领取过红包了!");
+        }
+        
         // 更新用户余额
         BigDecimal balanceAmount = BigDecimal.valueOf(integral);
         int updateResult = fsUserScrmMapper.incrIntegral(red.getUserId(), balanceAmount);
@@ -306,6 +317,9 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
         integralLogs.setCreateTime(new Date());
         fsUserIntegralLogsMapper.insertFsUserIntegralLogs(integralLogs);
 
+        // 立即插入数据库记录,避免 redStatusUpdate 重复处理
+        userRedRecordMapper.insertLiveUserRedRecord(record);
+
         // WebSocket 通知
         //String msg = String.format("用户 %d 抢到了红包 %d,获得 %d 芳华币", userId, redId, integral);
         //WebSocketServer.notifyUsers(msg);
@@ -368,11 +382,33 @@ public class LiveRedConfServiceImpl implements ILiveRedConfService {
                 liveUserRedRecords = hashEntries.values().stream()
                         .map(value -> JSONUtil.toBean(JSONUtil.parseObj(value), LiveUserRedRecord.class))
                         .collect(Collectors.toList());
-                userRedRecordMapper.insertLiveUserRedRecordBatch(liveUserRedRecords);
+                
+                // 过滤掉已经存在于数据库中的记录(避免重复增加积分)
+                List<LiveUserRedRecord> newRecords = new ArrayList<>();
                 for (LiveUserRedRecord liveUserRedRecord : liveUserRedRecords) {
-                    userService.incrIntegral(Collections.singletonList(liveUserRedRecord.getUserId()), liveUserRedRecord.getIntegral());
-                    // 保存用户领取芳华币记录 方便统计计算
-                    saveUserRewardRecord(liveUserRedRecord);
+                    // 检查数据库中是否已存在该记录
+                    LiveUserRedRecord queryRecord = new LiveUserRedRecord();
+                    queryRecord.setUserId(liveUserRedRecord.getUserId());
+                    queryRecord.setRedId(liveUserRedRecord.getRedId());
+                    List<LiveUserRedRecord> existingRecords = userRedRecordMapper.selectLiveUserRedRecordList(queryRecord);
+                    
+                    // 如果不存在,则添加到新记录列表
+                    if (existingRecords == null || existingRecords.isEmpty()) {
+                        newRecords.add(liveUserRedRecord);
+                    } else {
+                        log.info("用户 {} 的红包记录已存在,跳过重复处理,redId: {}", liveUserRedRecord.getUserId(), liveUserRedRecord.getRedId());
+                    }
+                }
+                
+                // 只插入新记录
+                if (CollUtil.isNotEmpty(newRecords)) {
+                    userRedRecordMapper.insertLiveUserRedRecordBatch(newRecords);
+                    // 只为新记录增加积分(避免重复增加)
+                    for (LiveUserRedRecord liveUserRedRecord : newRecords) {
+                        userService.incrIntegral(Collections.singletonList(liveUserRedRecord.getUserId()), liveUserRedRecord.getIntegral());
+                        // 保存用户领取芳华币记录 方便统计计算
+                        saveUserRewardRecord(liveUserRedRecord);
+                    }
                 }
             }
             redisCache.deleteObject(hashKey);