|
|
@@ -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);
|