Explorar o código

Merge branch 'package' of GameCenter/game-center into dev

zhimo hai 5 meses
pai
achega
49a74406de

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java

@@ -23,7 +23,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 < (发码器隐藏前端手机号100・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 < (修复判断异常, 礼包码没有收回的问题 ・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 23 - 7
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackCodeLogServiceImpl.java

@@ -20,6 +20,7 @@ import com.zanxiang.game.module.mybatis.mapper.GameGiftPackCodeLogMapper;
 import com.zanxiang.module.redis.service.IDistributedLockComponent;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.bean.BeanUtil;
+import com.zanxiang.module.util.exception.BaseException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.util.Strings;
@@ -147,17 +148,14 @@ public class GameGiftPackCodeLogServiceImpl extends ServiceImpl<GameGiftPackCode
         roleOperateService.roleOperateUpdate(userPhone, linkLog);
         //构造记录
         GameGiftPackCodeLog gameGiftPackCodeLog = this.transform(linkLog, userPhone);
-        //从缓存中获取一个礼包码id, 如果缓存中不存在则是领完了
-        String codeId = redisUtil.popOfSet(RedisKeyConstant.GAME_GIFT_PACK_CODE + linkLog.getLinkId());
-        if (Strings.isBlank(codeId)) {
+        //判断礼包码是否存在, 缓存不存在, 或者长度为零, 没有礼包码可领取
+        String codeKey = RedisKeyConstant.GAME_GIFT_PACK_CODE + linkLog.getLinkId();
+        if (!redisUtil.hasKey(codeKey) || redisUtil.getSetSize(codeKey) <= 0) {
             String msg = "该礼包已被领取完, 请联系客服小姐姐领取其他礼包";
             gameGiftPackCodeLog.setMsg(msg);
             super.save(gameGiftPackCodeLog);
             return Tuple2.with(Boolean.FALSE, msg);
         }
-        //查询礼包码具体信息, 礼包码必须存在, 且未被领取, 否则数据错误
-        GameGiftPackCode gameGiftPackCode = gameGiftPackCodeService.getById(Long.valueOf(codeId));
-        Assert.notNull(gameGiftPackCode, "礼包码数据错误, 请联系客服小姐姐处理");
         //判断是否满足领取条件
         Tuple2<Boolean, String> conditionCheck = this.conditionCheck(linkLog);
         //设置判定消息
@@ -167,8 +165,26 @@ public class GameGiftPackCodeLogServiceImpl extends ServiceImpl<GameGiftPackCode
             super.save(gameGiftPackCodeLog);
             return Tuple2.with(Boolean.FALSE, "角色不满足该礼包领取条件, 请联系客服领取其他礼包");
         }
+        //从缓存中获取一个礼包码id, 如果缓存中不存在则是领完了
+        String codeId = redisUtil.popOfSet(codeKey);
+        if (Strings.isBlank(codeId)) {
+            String msg = "该礼包已被领取完, 请联系客服小姐姐领取其他礼包";
+            gameGiftPackCodeLog.setMsg(msg);
+            super.save(gameGiftPackCodeLog);
+            return Tuple2.with(Boolean.FALSE, msg);
+        }
+        //查询礼包码具体信息, 礼包码必须存在, 且未被领取, 否则数据错误
+        GameGiftPackCode gameGiftPackCode = gameGiftPackCodeService.getById(Long.valueOf(codeId));
+        Assert.notNull(gameGiftPackCode, "礼包码数据错误, 请联系客服小姐姐处理");
         //成功领取礼包码记录数据更新
-        this.codeSendUpdate(gameGiftPackCode, linkLog, gameGiftPackCodeLog);
+        try {
+            this.codeSendUpdate(gameGiftPackCode, linkLog, gameGiftPackCodeLog);
+        } catch (Exception e) {
+            //出现数据更新异常, 礼包码放回去
+            redisUtil.addToSet(codeKey);
+            log.error("数据库表同步更新异常, e: {}", e.getMessage(), e);
+            throw new BaseException("礼包码数据更新异常, 请联系客服小姐姐处理");
+        }
         //返回礼包码
         return Tuple2.with(Boolean.TRUE, gameGiftPackCode.getCode());
     }

+ 31 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/utils/RedisUtil.java

@@ -92,6 +92,21 @@ public class RedisUtil<T> {
         return false;
     }
 
+    /**
+     * 是否存在缓存
+     *
+     * @param key : 缓存key
+     * @return : 返回是否存在缓存
+     */
+    public boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            log.error("判断缓存key是否存在异常, key : {}, e : {}", key, e.getMessage());
+        }
+        return false;
+    }
+
     /**
      * set集合添加元素
      *
@@ -161,6 +176,22 @@ public class RedisUtil<T> {
         return false;
     }
 
+    /**
+     * 查询set长度
+     *
+     * @param key : 缓存key
+     * @return : 返回set长度
+     */
+    public Long getSetSize(String key) {
+        try {
+            SetOperations<String, T> setOperations = redisTemplate.opsForSet();
+            return setOperations.size(key);
+        } catch (Exception e) {
+            log.error("Set列表长度获取异常, key : {}, e : {}", key, e.getMessage());
+        }
+        return 0L;
+    }
+
     /**
      * 添加单个缓存到list
      *