|  | @@ -94,7 +94,7 @@ public class GameBackLogMediaSdkServiceImpl extends ServiceImpl<GameBackLogMedia
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          //线程锁, 避免重复请求
 | 
	
		
			
				|  |  |          String lockKey = this.getLockKey(param, userData.getUserId());
 | 
	
		
			
				|  |  | -        if (!distributedLockComponent.doLock(lockKey, 0L, 20L, TimeUnit.SECONDS)) {
 | 
	
		
			
				|  |  | +        if (!distributedLockComponent.doLock(lockKey, 0L, 1L, TimeUnit.MINUTES)) {
 | 
	
		
			
				|  |  |              log.error("重复请求触发线程锁, 直接返回false, lockKey : {}", lockKey);
 | 
	
		
			
				|  |  |              return resultMap;
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -202,6 +202,18 @@ public class GameBackLogMediaSdkServiceImpl extends ServiceImpl<GameBackLogMedia
 | 
	
		
			
				|  |  |                  return false;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        //等级提升回传, 判断当前等级是否已执行回传
 | 
	
		
			
				|  |  | +        if (Objects.equals(param.getCallBackTypeEnum(), CallBackTypeEnum.CALL_BACK_UPDATE_LEVEL)) {
 | 
	
		
			
				|  |  | +            if (super.count(new LambdaQueryWrapper<GameBackLogMediaSdk>()
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getGameId, user.getGameId())
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getUserId, user.getId())
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getRoleId, param.getRoleId())
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getLevel, param.getLevel())
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getCallBackTypeEnum, CallBackTypeEnum.CALL_BACK_UPDATE_LEVEL.getValue())
 | 
	
		
			
				|  |  | +            ) > 0) {
 | 
	
		
			
				|  |  | +                return false;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          //测试账号, 回传默认全量回传, 不做判断
 | 
	
		
			
				|  |  |          resultMap.put("callBack", Boolean.TRUE);
 | 
	
		
			
				|  |  |          resultMap.put("backMsg", "测试账号, 回传默认全量回传, 不做判断");
 | 
	
	
		
			
				|  | @@ -245,6 +257,8 @@ public class GameBackLogMediaSdkServiceImpl extends ServiceImpl<GameBackLogMedia
 | 
	
		
			
				|  |  |          Long gameId = agent.getGameId();
 | 
	
		
			
				|  |  |          //角色id
 | 
	
		
			
				|  |  |          String roleId = param.getRoleId();
 | 
	
		
			
				|  |  | +        //角色等级
 | 
	
		
			
				|  |  | +        Long level = param.getLevel();
 | 
	
		
			
				|  |  |          //回传类型
 | 
	
		
			
				|  |  |          CallBackTypeEnum callBackTypeEnum = param.getCallBackTypeEnum();
 | 
	
		
			
				|  |  |          //按不同类型判断
 | 
	
	
		
			
				|  | @@ -254,11 +268,11 @@ public class GameBackLogMediaSdkServiceImpl extends ServiceImpl<GameBackLogMedia
 | 
	
		
			
				|  |  |              case CALL_BACK_REGISTER:
 | 
	
		
			
				|  |  |              case CALL_BACK_ACTIVATE:
 | 
	
		
			
				|  |  |              case CALL_BACK_CREATE_ROLE:
 | 
	
		
			
				|  |  | -                Tuple2<Boolean, String> distinctCheck = this.callBackDistinctCheck(callBackTypeEnum, gameId, userId, roleId);
 | 
	
		
			
				|  |  | +            case CALL_BACK_UPDATE_LEVEL:
 | 
	
		
			
				|  |  | +                Tuple2<Boolean, String> distinctCheck = this.callBackDistinctCheck(callBackTypeEnum, gameId, userId, roleId, level);
 | 
	
		
			
				|  |  |                  resultMap.put("callBack", distinctCheck.first);
 | 
	
		
			
				|  |  |                  resultMap.put("backMsg", distinctCheck.second);
 | 
	
		
			
				|  |  |                  break;
 | 
	
		
			
				|  |  | -            case CALL_BACK_UPDATE_LEVEL:
 | 
	
		
			
				|  |  |              case CALL_BACK_ADD_TO_WISHLIST:
 | 
	
		
			
				|  |  |              case CALL_BACK_ON_SHARE_TIME_LINE:
 | 
	
		
			
				|  |  |              case CALL_BACK_ON_SHARE_APP_MESSAGE:
 | 
	
	
		
			
				|  | @@ -288,7 +302,8 @@ public class GameBackLogMediaSdkServiceImpl extends ServiceImpl<GameBackLogMedia
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private Tuple2<Boolean, String> callBackDistinctCheck(CallBackTypeEnum callBackTypeEnum, Long gameId, Long userId, String roleId) {
 | 
	
		
			
				|  |  | +    private Tuple2<Boolean, String> callBackDistinctCheck(CallBackTypeEnum callBackTypeEnum, Long gameId, Long userId,
 | 
	
		
			
				|  |  | +                                                          String roleId, Long level) {
 | 
	
		
			
				|  |  |          //注册回传去重判断
 | 
	
		
			
				|  |  |          if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_REGISTER)
 | 
	
		
			
				|  |  |                  && super.count(new LambdaQueryWrapper<GameBackLogMediaSdk>()
 | 
	
	
		
			
				|  | @@ -320,6 +335,28 @@ public class GameBackLogMediaSdkServiceImpl extends ServiceImpl<GameBackLogMedia
 | 
	
		
			
				|  |  |                  return Tuple2.with(Boolean.FALSE, "当前用户注册未回传, 无法执行创角回传");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        //等级提升回传去重和前置条件判断
 | 
	
		
			
				|  |  | +        if (Objects.equals(callBackTypeEnum, CallBackTypeEnum.CALL_BACK_UPDATE_LEVEL)) {
 | 
	
		
			
				|  |  | +            //当前等级是否已回传, 已回传则不重复执行
 | 
	
		
			
				|  |  | +            if (super.count(new LambdaQueryWrapper<GameBackLogMediaSdk>()
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getGameId, gameId)
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getUserId, userId)
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getRoleId, roleId)
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getLevel, level)
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getCallBackTypeEnum, CallBackTypeEnum.CALL_BACK_UPDATE_LEVEL.getValue())
 | 
	
		
			
				|  |  | +            ) > 0) {
 | 
	
		
			
				|  |  | +                return Tuple2.with(Boolean.FALSE, "角色当前等级已回传, 不重复执行");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            //腾讯小游戏的等级提升回传, 可以判断前置创角回传是否已执行, 未执行无法回传
 | 
	
		
			
				|  |  | +            if (super.count(new LambdaQueryWrapper<GameBackLogMediaSdk>()
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getGameId, gameId)
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getUserId, userId)
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getRoleId, roleId)
 | 
	
		
			
				|  |  | +                    .eq(GameBackLogMediaSdk::getCallBackTypeEnum, CallBackTypeEnum.CALL_BACK_CREATE_ROLE.getValue())
 | 
	
		
			
				|  |  | +            ) <= 0) {
 | 
	
		
			
				|  |  | +                return Tuple2.with(Boolean.FALSE, "角色创角未回传, 无法执行等级提升回传");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          return Tuple2.with(Boolean.TRUE, "执行回传");
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -391,7 +428,8 @@ public class GameBackLogMediaSdkServiceImpl extends ServiceImpl<GameBackLogMedia
 | 
	
		
			
				|  |  |          GameUserRole gameUserRole = gameUserRoleService.getOne(new LambdaQueryWrapper<GameUserRole>()
 | 
	
		
			
				|  |  |                  .eq(GameUserRole::getUserId, userId)
 | 
	
		
			
				|  |  |                  .eq(GameUserRole::getGameId, gameId)
 | 
	
		
			
				|  |  | -                .eq(GameUserRole::getRoleId, roleId));
 | 
	
		
			
				|  |  | +                .eq(GameUserRole::getRoleId, roleId)
 | 
	
		
			
				|  |  | +                .orderByDesc(GameUserRole::getCreateTime).last("limit 1"));
 | 
	
		
			
				|  |  |          if (gameUserRole == null || gameUserRole.getRoleLevel() == null) {
 | 
	
		
			
				|  |  |              return Tuple2.with(Boolean.FALSE, "角色信息或者角色等级信息不存在, 无法执行新手引导回传, roleId : " + roleId);
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -443,6 +481,9 @@ public class GameBackLogMediaSdkServiceImpl extends ServiceImpl<GameBackLogMedia
 | 
	
		
			
				|  |  |              if (callBackJudgeResult.containsKey("orderId")) {
 | 
	
		
			
				|  |  |                  gameBackLogMediaSdk.setOrderId(String.valueOf(callBackJudgeResult.get("orderId")));
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +            if (callBackJudgeResult.containsKey("level")) {
 | 
	
		
			
				|  |  | +                gameBackLogMediaSdk.setLevel(Long.parseLong(String.valueOf(callBackJudgeResult.get("level"))));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return super.save(gameBackLogMediaSdk);
 | 
	
		
			
				|  |  |      }
 |