Bladeren bron

feat(system): 优化扑克牌解析和奖励申领功能

- 新增扑克牌解析工具类 PokerCardParserUtils,用于解析板牌和底牌
- 在 HandHistoryVo 中添加 publicBrand 字段,用于存储公牌信息
- 优化 RewardClaimsMapper 中的删除操作,改为软删除
- 重构 RewardClaimsServiceImpl 中的 deleteByCriteria 方法,增加日志记录和异常处理
fugui001 5 maanden geleden
bovenliggende
commit
d6c2713130

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

@@ -97,5 +97,10 @@ public class HandHistoryVo implements Serializable {
      */
     private String operateText;
 
+    /**
+     * 公牌
+     */
+    private String publicBrand;
+
 
 }

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

@@ -10,6 +10,7 @@ import org.dromara.business.mapper.HandHistoryMapper;
 import org.dromara.business.service.IHandHistoryService;
 import org.dromara.business.utils.ActionParserUtils;
 import org.dromara.business.utils.PageUtils;
+import org.dromara.business.utils.PokerCardParserUtils;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -26,6 +27,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
+import java.util.stream.Collectors;
 
 /**
  * 【请填写功能名称】Service业务层处理
@@ -162,7 +164,15 @@ public class HandHistoryServiceImpl implements IHandHistoryService {
                 for (String s : actionsToChineseList) {
                     HandHistoryVo handHistoryVo1 = new HandHistoryVo();
                     handHistoryVo1.setOperateText(s);
+
+                    List<String> parseBoardCards = PokerCardParserUtils.parseBoardCards(handHistoryVo.getBoardCards());
+                    if(parseBoardCards.size()>0){
+                        String result = parseBoardCards.stream().collect(Collectors.joining(" "));
+                        handHistoryVo1.setPublicBrand(result);
+                    }
+
                     handHistoryVoList.add(handHistoryVo1);
+
                 }
 
                 // 调用分页方法

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

@@ -26,6 +26,8 @@ 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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import java.util.*;
@@ -41,6 +43,8 @@ import java.util.*;
 @Service
 public class RewardClaimsServiceImpl implements IRewardClaimsService {
 
+    private static final Logger logger = LoggerFactory.getLogger(RewardClaimsServiceImpl.class);
+
     private final RewardClaimsMapper baseMapper;
 
     private final IItemsService itemsService;
@@ -179,10 +183,35 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
 
     @Override
     public Boolean deleteByCriteria(RewardClaimsBo bo) {
-        //todo 移除需要查看用户领取状态情况
-        //查看用户是哪个 本次奖励多少  把之前发到player_items 中的扣除 更新一下
-        RewardClaimsVo rewardClaimsVo = baseMapper.selectInfoById(bo.getId());
-        //移除领奖排名
+        try {
+            // 查询奖励领取信息
+            RewardClaimsVo rewardClaimsVo = baseMapper.selectInfoById(bo.getId());
+
+            // 检查是否存在并且已被认领
+            if (rewardClaimsVo == null || rewardClaimsVo.getClaimed() != 1) {
+                logger.warn("Attempt to delete unclaimed or non-existent reward claim. ID: {}", bo.getId());
+                return false;
+            }
+
+            // 执行删除操作
+            int rowsAffected = baseMapper.deleteByCriteria(bo.getId(), bo.getTournamentId());
+
+            // 判断删除是否成功
+            boolean isDeleted = rowsAffected > 0;
+            if (isDeleted) {
+                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());
+            }
+
+            return isDeleted;
+        } catch (Exception e) {
+            logger.error("Error occurred while trying to delete reward claim. ID: {}, Tournament ID: {}", bo.getId(), bo.getTournamentId(), e);
+            return false;
+        }
+    }
+
+        /*//移除领奖排名
         int rewardClaimed = baseMapper.delUserRewardClaimed(bo.getId());
         //如果是已经领取的就进行退还操作
         if(rewardClaimsVo.getClaimed()==1){
@@ -227,10 +256,7 @@ public class RewardClaimsServiceImpl implements IRewardClaimsService {
             }catch (Exception e){
                 e.printStackTrace();
             }
-        }
-        return baseMapper.deleteByCriteria(bo.getId(),bo.getTournamentId())>0;
-    }
-
+        }*/
     /**
      * 审核并发放奖励
      */

+ 123 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/business/utils/PokerCardParserUtils.java

@@ -0,0 +1,123 @@
+package org.dromara.business.utils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PokerCardParserUtils {
+
+    // 枚举映射:Suit 和 Rank
+    //CLUBS: 梅花(♣)
+    //DIAMONDS: 方块(♦)
+    //HEARTS: 红桃(♥)
+    //SPADES: 黑桃(♠)
+    public enum Suit {
+        CLUBS, DIAMONDS, HEARTS, SPADES
+    }
+
+    public enum Rank {
+        TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
+    }
+
+    // 用于将 Rank 枚举转为字符串表示(2~A)
+    private static final String[] RANK_SYMBOLS = {
+        "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"
+    };
+
+    // 用于将 Suit 枚举转为符号表示(♣♦♥♠)
+    private static final char[] SUIT_SYMBOLS = { '♣', '♦', '♥', '♠' };
+
+    /**
+     * 解析 boardCards 字符串,返回标准扑克牌表示的列表
+     * @param boardCards 格式如 "111,33,110,00"
+     * @return 牌的字符串列表,如 ["K♦", "5♠", "Q♦", "2♣"]
+     */
+    public static List<String> parseBoardCards(String boardCards) {
+        List<String> result = new ArrayList<>();
+        String[] parts = boardCards.split(",");
+
+        for (String part : parts) {
+            if (part.length() < 2 || !part.matches("\\d+")) {
+                continue; // 忽略非法格式
+            }
+
+            int suitIndex = Character.getNumericValue(part.charAt(0));
+            int rankIndex = Integer.parseInt(part.substring(1));
+
+            if (suitIndex < 0 || suitIndex > 3 || rankIndex < 0 || rankIndex > 12) {
+                continue; // 忽略非法索引
+            }
+
+            String card = RANK_SYMBOLS[rankIndex] + SUIT_SYMBOLS[suitIndex];
+            result.add(card);
+        }
+
+        return result;
+    }
+
+
+    /**
+     * 解析 showdown 节点并打印玩家的手牌
+     *
+     * @param jsonInput 完整的 JSON 字符串
+     */
+    public static void parseShowdown(String jsonInput) throws Exception {
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode rootNode = mapper.readTree(jsonInput);
+
+        JsonNode showdownNode = rootNode.path("showdown");
+
+        for (JsonNode playerNode : showdownNode) {
+            int seatId = playerNode.get("seatId").asInt();
+            String holeCards = playerNode.get("holeCards").asText();
+
+            List<String> parsedHoleCards = parseHoleCards(holeCards);
+            System.out.println("Seat ID: " + seatId + ", Hole Cards: " + String.join(", ", parsedHoleCards));
+        }
+    }
+
+
+    /**
+     * 解析 holeCards 字符串,返回标准扑克牌表示的列表
+     *
+     * @param holeCards 格式如 "210,211"
+     * @return 牌的字符串列表,如 ["Q♥", "K♥"]
+     */
+    public static List<String> parseHoleCards(String holeCards) {
+        List<String> result = new ArrayList<>();
+        String[] parts = holeCards.split(",");
+
+        for (String part : parts) {
+            if (part.length() != 3 || !part.matches("\\d{3}")) {
+                continue; // 忽略非法格式
+            }
+
+            int suitIndex = Character.getNumericValue(part.charAt(0));
+            int rankIndex = Integer.parseInt(part.substring(1));
+
+            if (suitIndex < 0 || suitIndex > 3 || rankIndex < 0 || rankIndex > 12) {
+                continue; // 忽略非法索引
+            }
+
+            String card = RANK_SYMBOLS[rankIndex] + SUIT_SYMBOLS[suitIndex];
+            result.add(card);
+        }
+
+        return result;
+    }
+
+    // 测试方法
+    public static void main(String[] args) {
+        String boardCards = "19,21,10,210,01";
+        List<String> parsedCards = parseBoardCards(boardCards);
+        System.out.println("解析后的公共牌:");
+        for (String card : parsedCards) {
+            System.out.println(card);
+        }
+    }
+
+
+
+}

+ 4 - 3
ruoyi-modules/ruoyi-system/src/main/resources/mapper/business/RewardClaimsMapper.xml

@@ -108,13 +108,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </delete>
 
     <!-- 条件删除 -->
-    <delete id="deleteByCriteria">
-        DELETE FROM reward_claims
+    <update id="deleteByCriteria">
+        UPDATE reward_claims SET
+            is_delete = true
         <where>
             <if test="id != null">AND id = #{id}</if>
             <if test="tournamentId != null">AND tournament_id = #{tournamentId}</if>
         </where>
-    </delete>
+    </update>
 
 
     <update id="updateUserRewardClaimed">