|
|
@@ -7,17 +7,12 @@ import org.dromara.business.domain.PlayerItems;
|
|
|
import org.dromara.business.domain.PlayersItemsLog;
|
|
|
import org.dromara.business.domain.RewardClaims;
|
|
|
import org.dromara.business.domain.bo.RewardClaimsBo;
|
|
|
-import org.dromara.business.domain.enums.ItermTypeLogEnum;
|
|
|
import org.dromara.business.domain.enums.RewardStatusEnum;
|
|
|
-import org.dromara.business.domain.vo.ItemsVo;
|
|
|
-import org.dromara.business.domain.vo.PlayerItemsVo;
|
|
|
-import org.dromara.business.domain.vo.RewardClaimsVo;
|
|
|
-import org.dromara.business.domain.vo.RewardVo;
|
|
|
+import org.dromara.business.domain.vo.*;
|
|
|
import org.dromara.business.mapper.*;
|
|
|
import org.dromara.business.service.IItemsService;
|
|
|
import org.dromara.business.service.IRewardClaimsService;
|
|
|
import org.dromara.business.utils.ItemOperationLock;
|
|
|
-import org.dromara.common.core.constant.Constants;
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
@@ -65,6 +60,8 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
|
|
|
private final ItemsMapper itemsMapper;
|
|
|
|
|
|
|
|
|
+ private final MessageReceiversMapper messageReceiversMapper;
|
|
|
+
|
|
|
/**
|
|
|
* 查询用户参赛
|
|
|
*
|
|
|
@@ -269,101 +266,116 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
|
|
|
try {
|
|
|
// 1. 校验领取状态,防止重复领取
|
|
|
RewardClaimsVo rewardClaimsVo = baseMapper.selectInfoById(bo.getId());
|
|
|
- if (rewardClaimsVo.getClaimed()!=0L) {
|
|
|
- throw new RuntimeException("该奖励已处理,请勿重复操作");
|
|
|
- }
|
|
|
- String rewardKey="reward:"+bo.getId();
|
|
|
- if(RedisUtils.isExistsObject(rewardKey)){
|
|
|
- throw new RuntimeException("该奖励已处理,请勿重复操作");
|
|
|
- }
|
|
|
+ // 是否已领取奖励 0未领取 1已领取 2 已提交待审核
|
|
|
+ if (rewardClaimsVo.getClaimed()==2L) {
|
|
|
+ String rewardKey="reward:"+bo.getId();
|
|
|
+ if(RedisUtils.isExistsObject(rewardKey)){
|
|
|
+ throw new RuntimeException("该奖励已处理,请勿重复操作");
|
|
|
+ }
|
|
|
|
|
|
- // TODO 验证 在校验领取记录里面是否存在 奖励发放之后放入redis中 表示已经发放 SYSTEM
|
|
|
- RedisUtils.setCacheObject(rewardKey, bo.getId(), Duration.ofMinutes(60*24));
|
|
|
+ // TODO 验证 在校验领取记录里面是否存在 奖励发放之后放入redis中 表示已经发放 SYSTEM
|
|
|
+ RedisUtils.setCacheObject(rewardKey, bo.getId(), Duration.ofMinutes(60*24));
|
|
|
|
|
|
- // 2. 解析 JSON 奖励数据(保留原始 Map 方式)
|
|
|
- String rewardJson = bo.getRewardJson();
|
|
|
- List<Map<String, Object>> list = objectMapper.readValue(
|
|
|
- rewardJson,
|
|
|
- new TypeReference<List<Map<String, Object>>>() {}
|
|
|
- );
|
|
|
+ // 2. 解析 JSON 奖励数据(保留原始 Map 方式)
|
|
|
+ String rewardJson = bo.getRewardJson();
|
|
|
+ List<Map<String, Object>> list = objectMapper.readValue(
|
|
|
+ rewardJson,
|
|
|
+ new TypeReference<List<Map<String, Object>>>() {}
|
|
|
+ );
|
|
|
|
|
|
- List<PlayerItems> items = new ArrayList<>();
|
|
|
- List<PlayersItemsLog> playersItemsLogs = new ArrayList<>();
|
|
|
+ List<PlayerItems> items = new ArrayList<>();
|
|
|
+ List<PlayersItemsLog> playersItemsLogs = new ArrayList<>();
|
|
|
|
|
|
- for (Map<String, Object> item : list) {
|
|
|
- Integer itemId = (Integer) item.get("itemId");
|
|
|
- Integer quantity = (Integer) item.get("quantity");
|
|
|
+ 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或数量不能为空");
|
|
|
- }
|
|
|
+ if (itemId == null || quantity == null) {
|
|
|
+ throw new IllegalArgumentException("道具ID或数量不能为空");
|
|
|
+ }
|
|
|
|
|
|
- Long playerId = bo.getPlayerId();
|
|
|
-
|
|
|
- PlayerItems playerItem = new PlayerItems();
|
|
|
- playerItem.setPlayerId(playerId);
|
|
|
- playerItem.setItemId(itemId.longValue());
|
|
|
- playerItem.setQuantity(quantity.longValue());
|
|
|
-
|
|
|
- items.add(playerItem);
|
|
|
-
|
|
|
- ItemsVo itemsVo = itemsMapper.selectVoByIdInfo(itemId.longValue());
|
|
|
-
|
|
|
- // 查询玩家当前道具信息
|
|
|
- PlayerItemsVo playerItemsVos = playerItemsMapper.selectPlayerItems(playerItem);
|
|
|
- Integer beforeNum = playerItemsVos != null ? Integer.valueOf(playerItemsVos.getQuantity().toString()) : 0;
|
|
|
- Integer afterNum = beforeNum + quantity;
|
|
|
-
|
|
|
- PlayersItemsLog logEntry = new PlayersItemsLog();
|
|
|
- logEntry.setItemId(itemId.longValue());
|
|
|
- logEntry.setScoreNum(quantity.longValue());
|
|
|
- logEntry.setAfterNum(afterNum.longValue());
|
|
|
- logEntry.setUserId(playerId);
|
|
|
- logEntry.setType(1L);
|
|
|
- logEntry.setBeforeNum(beforeNum.longValue());
|
|
|
- /* logEntry.setItemType(ItermTypeLogEnum.COMPETITION.getCode());*/
|
|
|
- logEntry.setItemTypeText(itemsVo.getName());
|
|
|
- logEntry.setRemark(itemsVo.getItemDesc());
|
|
|
- playersItemsLogs.add(logEntry);
|
|
|
- }
|
|
|
+ Long playerId = bo.getPlayerId();
|
|
|
|
|
|
- // 3. 获取分布式锁
|
|
|
- boolean lockAcquired = ItemOperationLock.tryLock(bo.getPlayerId(), 3000);
|
|
|
- if (!lockAcquired) {
|
|
|
- throw new RuntimeException("获取道具操作锁失败,请稍后再试");
|
|
|
- }
|
|
|
+ PlayerItems playerItem = new PlayerItems();
|
|
|
+ playerItem.setPlayerId(playerId);
|
|
|
+ playerItem.setItemId(itemId.longValue());
|
|
|
+ playerItem.setQuantity(quantity.longValue());
|
|
|
|
|
|
- try {
|
|
|
+ items.add(playerItem);
|
|
|
|
|
|
- // 4. 插入道具日志
|
|
|
- int logCount = playersItemsLogMapper.batchInsertPlayerItemLog(playersItemsLogs);
|
|
|
- if (logCount <= 0) {
|
|
|
- throw new RuntimeException("道具日志记录失败");
|
|
|
- }
|
|
|
+ ItemsVo itemsVo = itemsMapper.selectVoByIdInfo(itemId.longValue());
|
|
|
|
|
|
- // 5. 批量插入或更新道具
|
|
|
- int insertCount = playerItemsMapper.batchInsertOrUpdatePlayerItems(items);
|
|
|
- if (insertCount <= 0) {
|
|
|
- throw new RuntimeException("道具发放失败");
|
|
|
+ // 查询玩家当前道具信息
|
|
|
+ PlayerItemsVo playerItemsVos = playerItemsMapper.selectPlayerItems(playerItem);
|
|
|
+ Integer beforeNum = playerItemsVos != null ? Integer.valueOf(playerItemsVos.getQuantity().toString()) : 0;
|
|
|
+ Integer afterNum = beforeNum + quantity;
|
|
|
+
|
|
|
+ PlayersItemsLog logEntry = new PlayersItemsLog();
|
|
|
+ logEntry.setItemId(itemId.longValue());
|
|
|
+ logEntry.setScoreNum(quantity.longValue());
|
|
|
+ logEntry.setAfterNum(afterNum.longValue());
|
|
|
+ logEntry.setUserId(playerId);
|
|
|
+ logEntry.setType(1L);
|
|
|
+ logEntry.setBeforeNum(beforeNum.longValue());
|
|
|
+ /* logEntry.setItemType(ItermTypeLogEnum.COMPETITION.getCode());*/
|
|
|
+ logEntry.setItemTypeText(itemsVo.getName());
|
|
|
+ logEntry.setRemark(itemsVo.getItemDesc());
|
|
|
+ playersItemsLogs.add(logEntry);
|
|
|
}
|
|
|
- // 7. 更新奖励记录状态
|
|
|
- int rewardUpdateCount = baseMapper.updateUserRewardClaimed(bo.getId());
|
|
|
- if (rewardUpdateCount <= 0) {
|
|
|
- throw new RuntimeException("更新奖励记录失败");
|
|
|
+
|
|
|
+ // 3. 获取分布式锁
|
|
|
+ boolean lockAcquired = ItemOperationLock.tryLock(bo.getPlayerId(), 3000);
|
|
|
+ if (!lockAcquired) {
|
|
|
+ throw new RuntimeException("获取道具操作锁失败,请稍后再试");
|
|
|
}
|
|
|
|
|
|
- // TODO app收到消息 用户提交领取状态 审核 发放
|
|
|
- // 6. 更新用户消息状态
|
|
|
- int messageUpdateCount = userMessageStatusMapper.updateUserMessageClaimed(bo.getId());
|
|
|
- if (messageUpdateCount <= 0) {
|
|
|
- throw new RuntimeException("更新用户消息状态失败");
|
|
|
+ try {
|
|
|
+
|
|
|
+ // 4. 插入道具日志
|
|
|
+ int logCount = playersItemsLogMapper.batchInsertPlayerItemLog(playersItemsLogs);
|
|
|
+ if (logCount <= 0) {
|
|
|
+ throw new RuntimeException("道具日志记录失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 批量插入或更新道具
|
|
|
+ int insertCount = playerItemsMapper.batchInsertOrUpdatePlayerItems(items);
|
|
|
+ if (insertCount <= 0) {
|
|
|
+ throw new RuntimeException("道具发放失败");
|
|
|
+ }
|
|
|
+ // 7. 更新奖励记录状态
|
|
|
+ int rewardUpdateCount = baseMapper.updateUserRewardClaimed(bo.getId());
|
|
|
+ if (rewardUpdateCount <= 0) {
|
|
|
+ throw new RuntimeException("更新奖励记录失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ //todo 查询用户是哪条消息 根据 reward_claims中的id 需要修改
|
|
|
+
|
|
|
+ MessageReceiversVo receiversVo = messageReceiversMapper.selectVoRewardIdById(bo.getId());
|
|
|
+ if(receiversVo!=null){
|
|
|
+
|
|
|
+ // 更新状态表的 reward_claims中的id 进 user_message_status 中
|
|
|
+ userMessageStatusMapper.updateUserMessageRewardId(receiversVo.getRewardId(), receiversVo.getId());
|
|
|
+
|
|
|
+ // TODO app收到消息 用户提交领取状态 审核 发放 修改消息状态表的领取状态
|
|
|
+ userMessageStatusMapper.updateUserMessageClaimed(bo.getId());
|
|
|
+
|
|
|
+ // TODO app收到消息 用户提交领取状态 审核 发放
|
|
|
+ // 6. 更新用户消息状态
|
|
|
+ /*int messageUpdateCount = userMessageStatusMapper.updateUserMessageClaimed(bo.getId());
|
|
|
+ if (messageUpdateCount <= 0) {
|
|
|
+ throw new RuntimeException("更新用户消息状态失败");
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+
|
|
|
+ } finally {
|
|
|
+ ItemOperationLock.releaseLock(bo.getPlayerId()); // 确保释放锁
|
|
|
}
|
|
|
|
|
|
- } finally {
|
|
|
- ItemOperationLock.releaseLock(bo.getPlayerId()); // 确保释放锁
|
|
|
+ return Boolean.TRUE;
|
|
|
+ }else{
|
|
|
+ throw new RuntimeException("该奖励已处理,请勿重复操作");
|
|
|
}
|
|
|
|
|
|
- return Boolean.TRUE;
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
log.error("审核并发放奖励过程中发生异常,rewardId={}", bo.getId(), e);
|