|
|
@@ -6,13 +6,17 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import org.dromara.business.domain.PlayerItems;
|
|
|
import org.dromara.business.domain.PlayersItemsLog;
|
|
|
import org.dromara.business.domain.RewardClaims;
|
|
|
+import org.dromara.business.domain.RewardClaimsLog;
|
|
|
import org.dromara.business.domain.bo.RewardClaimsBo;
|
|
|
import org.dromara.business.domain.enums.RewardStatusEnum;
|
|
|
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.service.IUserService;
|
|
|
import org.dromara.business.utils.ItemOperationLock;
|
|
|
+import org.dromara.business.utils.RedisKeys;
|
|
|
+import org.dromara.business.utils.RedisUtil;
|
|
|
import org.dromara.common.core.utils.MapstructUtils;
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
@@ -25,11 +29,13 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.dromara.common.redis.utils.RedisUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.time.Duration;
|
|
|
import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 用户参赛Service业务层处理
|
|
|
@@ -64,6 +70,17 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
|
|
|
|
|
|
private final UserComplaintsMapper userComplaintsMapper;
|
|
|
|
|
|
+ private final RewardClaimsLogMapper rewardClaimsLogMapper;
|
|
|
+
|
|
|
+ private final PrizeDistributionsMapper prizeDistributionsMapper;
|
|
|
+
|
|
|
+ private final PrizeDistributionItemsMapper prizeDistributionItemsMapper;
|
|
|
+
|
|
|
+ private final IUserService iUserService;
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ RedisUtil redisUtil;
|
|
|
|
|
|
/**
|
|
|
* 查询用户参赛
|
|
|
@@ -192,17 +209,103 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
|
|
|
RewardClaimsVo rewardClaimsVo = baseMapper.selectInfoById(bo.getId());
|
|
|
|
|
|
// 检查是否存在并且已被认领
|
|
|
- if (rewardClaimsVo == null || rewardClaimsVo.getClaimed() != 1) {
|
|
|
+ if (rewardClaimsVo == null) {
|
|
|
logger.warn("Attempt to delete unclaimed or non-existent reward claim. ID: {}", bo.getId());
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- // 执行删除操作
|
|
|
+ //获奖名单信息 只要有认领了 审核通过后就不能删除了 都是未领取才能删除
|
|
|
+ List<RewardClaimsVo> rewardClaimsVosList = baseMapper.selectByCriteria(bo.getTournamentId());
|
|
|
+ boolean hasClaimed = rewardClaimsVosList.stream()
|
|
|
+ .anyMatch(vo -> vo.getClaimed() != null && vo.getClaimed() == 1);
|
|
|
+ if(hasClaimed){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 执行删除操作 baseMapper.deleteByCriteria(bo.getId(), bo.getTournamentId())
|
|
|
int rowsAffected = baseMapper.deleteByCriteria(bo.getId(), bo.getTournamentId());
|
|
|
|
|
|
// 判断删除是否成功
|
|
|
boolean isDeleted = rowsAffected > 0;
|
|
|
if (isDeleted) {
|
|
|
+ //本次奖品信息
|
|
|
+ List<RewardVo> itemsPrizeList=new ArrayList<>();
|
|
|
+ //排名
|
|
|
+ List<PrizeDistributionsVo> prizeDistributionsVos = prizeDistributionsMapper.selectByTournamentId(bo.getTournamentId());
|
|
|
+ if(prizeDistributionsVos!=null){
|
|
|
+ // 提取并按排名正序排序后,取出 id 列表
|
|
|
+ List<Long> ids = prizeDistributionsVos.stream()
|
|
|
+ .sorted(Comparator.comparing(PrizeDistributionsVo::getPaiming))
|
|
|
+ .map(PrizeDistributionsVo::getId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ for (Long id2 : ids) {
|
|
|
+ //奖品
|
|
|
+ PrizeDistributionItemsVo prizeDistributionItemsVos = prizeDistributionItemsMapper.selectByPrizeDistributionId(id2);
|
|
|
+ RewardVo rewardVo = new RewardVo();
|
|
|
+ rewardVo.setItemId(prizeDistributionItemsVos.getItemId());
|
|
|
+ rewardVo.setItemName(prizeDistributionItemsVos.getItemsName());
|
|
|
+ rewardVo.setQuantity(prizeDistributionItemsVos.getQuantity());
|
|
|
+ itemsPrizeList.add(rewardVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ String itemsPrizeListString = "";
|
|
|
+ if(itemsPrizeList.size()>0){
|
|
|
+ try {
|
|
|
+ itemsPrizeListString = objectMapper.writeValueAsString(itemsPrizeList);
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ System.out.println(itemsPrizeListString);
|
|
|
+ }
|
|
|
+
|
|
|
+ //获奖名单信息
|
|
|
+ for (RewardClaimsVo claimsVo : rewardClaimsVosList) {
|
|
|
+ //先把操作的记录赋值的到日志表
|
|
|
+ RewardClaimsLog rewardClaimsLog = new RewardClaimsLog();
|
|
|
+
|
|
|
+ // 复制同名同类型的属性(自动忽略不匹配的字段)
|
|
|
+ BeanUtils.copyProperties(claimsVo, rewardClaimsLog);
|
|
|
+ // 插入日志记录
|
|
|
+ rewardClaimsLogMapper.insertRewardClaimsLog(rewardClaimsLog);
|
|
|
+ }
|
|
|
+ //删除原来的获奖信息列表
|
|
|
+ for (RewardClaimsVo claimsVo : rewardClaimsVosList) {
|
|
|
+ baseMapper.deleteById(claimsVo.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ //排名列表信息
|
|
|
+ //todo 删除成功之后进行替补 1:后面的往前推送 增加记录表 记录源数据来源 2:修改列表排名数据
|
|
|
+ Long tournamentId=bo.getTournamentId();
|
|
|
+ String leaderboardJson = redisUtil.get(RedisKeys.tournamentLeaderboard(tournamentId));
|
|
|
+ ObjectMapper objectMapper = new ObjectMapper();
|
|
|
+
|
|
|
+ List<PlayerVo> players = null;
|
|
|
+ players = objectMapper.readValue(leaderboardJson,
|
|
|
+ objectMapper.getTypeFactory().constructCollectionType(List.class, PlayerVo.class));
|
|
|
+
|
|
|
+ // 3. 从 players 中取出前 claimedCount 名选手(防止越界)
|
|
|
+ List<PlayerVo> topPlayers = new ArrayList<>();
|
|
|
+ if (players != null && !players.isEmpty()) {
|
|
|
+ int endIndex = Math.min(rewardClaimsVosList.size(), players.size()); // 防止索引越界
|
|
|
+ topPlayers = players.subList(0, endIndex);
|
|
|
+ }
|
|
|
+ for (PlayerVo topPlayer : topPlayers) {
|
|
|
+ UserVo userVo = iUserService.queryById(topPlayer.getId());
|
|
|
+ RewardClaims rewardClaims=new RewardClaims();
|
|
|
+ rewardClaims.setTournamentId(tournamentId);
|
|
|
+ rewardClaims.setPlayerId(topPlayer.getId());
|
|
|
+ rewardClaims.setRank(topPlayer.getRank());
|
|
|
+ rewardClaims.setPlayerName(userVo.getNickName());
|
|
|
+ rewardClaims.setClaimed(0L);
|
|
|
+ if(userVo!=null){
|
|
|
+ rewardClaims.setPhone(userVo.getPhone());
|
|
|
+ }
|
|
|
+ rewardClaims.setIsDelete(false);
|
|
|
+ rewardClaims.setRewardJson(itemsPrizeListString);
|
|
|
+ baseMapper.insert(rewardClaims);
|
|
|
+ }
|
|
|
+
|
|
|
logger.info("Reward claim successfully deleted. ID: {}, Tournament ID: {}", bo.getId(), bo.getTournamentId());
|
|
|
} else {
|
|
|
logger.warn("Failed to delete reward claim. ID: {}, Tournament ID: {}", bo.getId(), bo.getTournamentId());
|
|
|
@@ -210,6 +313,7 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
|
|
|
|
|
|
return isDeleted;
|
|
|
} catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
logger.error("Error occurred while trying to delete reward claim. ID: {}, Tournament ID: {}", bo.getId(), bo.getTournamentId(), e);
|
|
|
return false;
|
|
|
}
|
|
|
@@ -328,6 +432,7 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
|
|
|
/* logEntry.setItemType(ItermTypeLogEnum.COMPETITION.getCode());*/
|
|
|
logEntry.setItemTypeText(itemsVo.getName());
|
|
|
logEntry.setRemark(itemsVo.getItemDesc());
|
|
|
+ logEntry.setCreatedAt(new Date());
|
|
|
playersItemsLogs.add(logEntry);
|
|
|
}
|
|
|
|