Merge remote-tracking branch 'origin/main' into main-meitian

# Conflicts:
#	ff-base/src/main/java/com/ff/base/constant/CacheConstants.java
main-meitian
liaoyong 2025-04-03 11:21:43 +08:00
commit f1aa9d26e7
34 changed files with 1739 additions and 15 deletions

View File

@ -51,6 +51,13 @@ public class CacheConstants {
*/
public static final String XK_GAMES = "xk_games:";
/**
* km
*/
public static final String KM_GAMES = "km_games:";
/**
* pgx
*/
@ -94,6 +101,12 @@ public class CacheConstants {
public static final String Platform = "platform:";
/**
* km
*/
public static final String KM_USER_TOKEN = "km:user:token:";
}

View File

@ -227,6 +227,17 @@ public class Constants {
*/
public static final String MEITIAN_API_BASE_URL = "meitian.api.base.url";
/**
* km-apiurl
*/
public static final String KM_API_BASE_URL_LOGIN = "km.api.base.url";
/**
* km-apiurl
*/
public static final String KM_API_BASE_LOGIN_URL = "km.api.base.login.url";
/**
*
*/
@ -238,15 +249,12 @@ public class Constants {
public static final String SYSTEM = "system";
/**
*
*/
public static final String DATA_SOURCE = "master";
/**
* id
*/
@ -300,5 +308,5 @@ public class Constants {
/**
*
*/
public static final BigDecimal HUNDRED =new BigDecimal("100") ;
public static final BigDecimal HUNDRED = new BigDecimal("100");
}

View File

@ -13,6 +13,7 @@ public enum GamePlatforms {
DG("DG", "DG"),
MT("MT", "美天棋牌"),
AE("AE", "AE"),
KM("KM", "KM")
;
private final String code;

View File

@ -0,0 +1,70 @@
package com.ff.base.enums;
import java.util.Optional;
import java.util.stream.Stream;
/**
* xkgame
*
* @author shi
* @date 2024/11/13
*/
public enum KMGameType {
ELECTRON("KMQM", 1,"电子")
;
private final String code;
private final Integer systemCode;
private final String info;
KMGameType(String code, Integer systemCode, String info)
{
this.code = code;
this.systemCode = systemCode;
this.info = info;
}
public String getCode()
{
return code;
}
public Integer getSystemCode()
{
return systemCode;
}
public String getInfo()
{
return info;
}
/**
*
*
* @param code
* @return {@link String }
*/
public static Integer findSystemByCode(String code) {
Optional<Integer> system = Stream.of(KMGameType.values())
.filter(gameType -> gameType.getCode().equals(code))
.map(KMGameType::getSystemCode)
.findFirst();
return system.orElse(null);
}
/**
*
*
* @param code
* @return {@link String }
*/
public static String findInfoByCode(String code) {
Optional<String> system = Stream.of(KMGameType.values())
.filter(gameType -> gameType.getCode().equals(code))
.map(KMGameType::getInfo)
.findFirst();
return system.orElse(null);
}
}

View File

@ -108,7 +108,7 @@ public class JsonUtil {
*
* @param map
* @return {@link String }
*/// 将LinkedHashMap转换为查询字符串
*/ // 将LinkedHashMap转换为查询字符串
public static String mapToQueryString(Map<String, Object> map) {
return map.entrySet().stream()
.map(entry -> entry.getKey() + "=" + entry.getValue())

View File

@ -422,7 +422,6 @@ public class ApiGameController extends BaseController {
ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode());
KickMemberAllDTO kickMemberAllDTO = KickMemberAllDTO.builder()
.agentId(gameSecretKey.getCode())
.agentKey(gameSecretKey.getKey())
@ -589,4 +588,43 @@ public class ApiGameController extends BaseController {
return AjaxResult.success(balanceMap);
}
/**
*
*
* @param gameDemoLoginRequest
* @return {@link AjaxResult }
*/
@PostMapping("/demo/login")
public AjaxResult demoLogin(@Validated @RequestBody GameDemoLoginRequest gameDemoLoginRequest) {
Game game = gameService.selectGameById(gameDemoLoginRequest.getGameId());
ApiException.notNull(game, ErrorCode.GAME_NOT_EXIST.getCode());
GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(game.getPlatformId());
ApiException.notNull(gamePlatform, ErrorCode.PLATFORM_NOT_EXIST.getCode());
IGamesService iGamesService = gamesService.get(gamePlatform.getPlatformCode() + Constants.SERVICE);
GameSecretKeyLangDTO gameSecretKeyLangDTO = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder()
.platformCode(gamePlatform.getPlatformCode())
.systemLangCode(gameDemoLoginRequest.getLangCode())
.build());
ApiException.notNull(gameSecretKeyLangDTO, ErrorCode.LANG_NOT_EXIST.getCode());
GameDemoLoginRequestDTO gamesLogin = GameDemoLoginRequestDTO.builder()
.gameId(game.getGameCode())
.gameType(game.getGameSourceType())
.lang(gameSecretKeyLangDTO.getLang())
.build();
GameDemoLoginResponseDTO gameDemoLoginResponseDTO = iGamesService.gameDemoLogin(gamesLogin);
GameDemoLoginResponse gameDemoLoginResponse = new GameDemoLoginResponse();
BeanUtils.copyProperties(gameDemoLoginResponseDTO, gameDemoLoginResponse);
return AjaxResult.success(gameDemoLoginResponse);
}
}

View File

@ -133,6 +133,7 @@ public class ApiMemberController extends BaseController {
.agentId(gameSecretKey.getCode())
.agentKey(gameSecretKey.getKey())
.betLimit(memberCreateApiRequest.getBetLimit())
.platformType(memberCreateApiRequest.getPlatformType())
.currency(gameSecretKey.getCurrency())
.build();
Boolean result = iGamesService.createMember(gamesBaseRequestDTO);

View File

@ -0,0 +1,53 @@
package com.ff.api.request;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Map;
/**
*
*
* @author shi
* @date 2025/02/11
*/
@Data
public class GameDemoLoginRequest implements Serializable {
private final static long serialVersionUID = 7699430372422335056L;
/**
* id
*/
@NotBlank(message = "langCode不能为空")
@Length(max = 32, message = "langCode长度不能超过32个字符")
private String langCode;
/**
* id
*/
@NotNull(message = "gameId不能为空")
private Long gameId;
/**
*
*/
private String homeUrl;
/**
* web app
*/
private String platform;
/**
* 1
*/
private Integer disableFullScreen;
}

View File

@ -40,4 +40,8 @@ public class MemberCreateApiRequest implements Serializable{
*/
private Map<String, Map<String, Map<String, Object>>> betLimit;
/**
* 0 1
*/
private Integer platformType;
}

View File

@ -0,0 +1,28 @@
package com.ff.api.response;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
*
*
* @author shi
* @date 2025/04/03
*/
@Data
public class GameDemoLoginResponse implements Serializable {
private final static long serialVersionUID = 7699430372422335056L;
/**
*
*/
private String url;
}

View File

@ -96,6 +96,8 @@ public interface IGamesService {
*/
Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest);
/**
*
*
@ -136,6 +138,13 @@ public interface IGamesService {
*/
Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO);
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO);
/**

View File

@ -531,6 +531,17 @@ public class GamesAEServiceImpl implements IGamesService {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
@Override
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*

View File

@ -501,6 +501,19 @@ public class GamesDGServiceImpl implements IGamesService {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
@Override
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*

View File

@ -610,6 +610,17 @@ public class GamesFCServiceImpl implements IGamesService {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
@Override
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*

View File

@ -692,6 +692,17 @@ public class GamesJILIServiceImpl implements IGamesService {
throw new BaseException(cancelFreeSpinResponseDTO.getMessage());
}
}
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
@Override
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**

View File

@ -0,0 +1,31 @@
package com.ff.game.api.km.address;
import com.dtflys.forest.callback.AddressSource;
import com.dtflys.forest.http.ForestAddress;
import com.dtflys.forest.http.ForestRequest;
import com.ff.base.constant.Constants;
import com.ff.base.system.service.ISysConfigService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* jili address
*
* @author shi
* @date 2025/02/10
*/
@Component
public class MyKMAddressSource implements AddressSource {
@Resource
private ISysConfigService configService;
@Override
public ForestAddress getAddress(ForestRequest request) {
String apiBaseUrl = configService.selectConfigByKey(Constants.KM_API_BASE_URL_LOGIN);
return new ForestAddress("https",apiBaseUrl, 443,"api");
}
}

View File

@ -0,0 +1,95 @@
package com.ff.game.api.km.client;
import com.dtflys.forest.annotation.*;
import com.ff.game.api.dg.dto.DGBetRecordResponseDTO;
import com.ff.game.api.dg.dto.DGResponse;
import com.ff.game.api.dg.dto.DGUserListResponseDTO;
import com.ff.game.api.km.address.MyKMAddressSource;
import com.ff.game.api.km.dto.*;
import com.ff.game.api.km.success.MyKMSuccessCondition;
import com.ff.game.api.xk.dto.XKBetRecordResponseDTO;
import java.util.Map;
/**
* dg
*
* @author shi
* @date 2025/02/10
*/
@Address(source = MyKMAddressSource.class)
@Success(condition = MyKMSuccessCondition.class)
public interface KMClient {
/**
*
*
* @param params
* @param header
* @return {@link DGResponse }
*/
@Post("/player/authorize")
KMAuthTokenResponse createMember(@JSONBody Map<String, Object> params, @Header Map<String, Object> header);
/**
*
*
* @param params
*/
@Get("/player/balance?{params}")
KMBalanceResponse getMemberInfo(@Var("params") String params, @Header Map<String, Object> header);
/**
*
*
* @param params
* @param header
* @return {@link KMGameResponse }
*/
@Get("/games?{params}")
KMGameResponse getGameList(@Var("params") String params, @Header Map<String, Object> header);
/**
*
*
* @param params
* @param header
* @return {@link KMTransactionResponse }
*/
@Post(url = "/wallet/credit")
KMTransactionResponse credit(@JSONBody Map<String, Object> params, @Header Map<String, Object> header);
/**
*
*
* @param params
* @param header
* @return {@link KMTransactionResponse }
*/
@Post(url = "/wallet/debit")
KMTransactionResponse debit(@JSONBody Map<String, Object> params, @Header Map<String, Object> header);
/**
*
*
* @param params
* @return {@link KMBetRecordResponse }
*/
@Get(url ="/v2/history/bets?{params}")
KMBetRecordResponse getBetRecordByTime(@Var("params")String params, @Header Map<String, Object> header);
/**
*
*
* @param params
* @param header
* @return {@link KMKickMemberResponse }
*/
@Post(url = "/player/deauthorize")
KMKickMemberResponse kickMember(@JSONBody Map<String, Object> params, @Header Map<String, Object> header);
}

View File

@ -0,0 +1,37 @@
package com.ff.game.api.km.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* kmaust
*
* @author shi
* @date 2025/04/02
*/
@Data
public class KMAuthTokenResponse {
/**
*
*/
@JsonProperty("err")
private Integer errorCode;
/**
*
*/
@JsonProperty("errdesc")
private String errorDescription;
/**
*
*/
@JsonProperty("authtoken")
private String authToken;
/**
*
*/
@JsonProperty("isnew")
private Boolean isNew;
}

View File

@ -0,0 +1,38 @@
package com.ff.game.api.km.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* km
*
* @author shi
* @date 2025/04/02
*/
@Data
public class KMBalanceResponse {
/**
*
*/
@JsonProperty("err")
private Integer errorCode;
/**
*
*/
@JsonProperty("errdesc")
private String errorDescription;
/**
*
*/
@JsonProperty("bal")
private BigDecimal balance;
/**
*
*/
@JsonProperty("cur")
private String currency;
}

View File

@ -0,0 +1,145 @@
package com.ff.game.api.km.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* kmbet
*
* @author shi
* @date 2025/04/02
*/
@Data
public class KMBetRecordResponse {
/**
*
*/
@JsonProperty("err")
private Integer errorCode;
/**
*
*/
@JsonProperty("errdesc")
private String errorDescription;
/**
* bets
*/
@JsonProperty("bets")
private List<Bet> bets;
@Data
public static class Bet {
/**
* KM
*/
@JsonProperty("id")
private String id;
/**
* KMISO 8601
*/
@JsonProperty("beton")
private Date beton; // 使用 Date 类型来表示 ISO 8601 格式的时间
/**
* ISO 8601null
*/
@JsonProperty("closedon")
private Date closedon; // 使用 Date 类型来表示 ISO 8601 格式的时间
/**
*
*/
@JsonProperty("roundid")
private String roundId;
/**
*
*/
@JsonProperty("externalroundid")
private String externalRoundId;
/**
* "KMQM"
*/
@JsonProperty("gpcode")
private String gpCode;
/**
*
*/
@JsonProperty("gcode")
private String gCode;
/**
*
*/
@JsonProperty("platformtype")
private Integer platformType;
/**
*
*/
@JsonProperty("userid")
private String userId;
/**
* KM使
*/
@JsonProperty("cur")
private String currency;
/**
*
*/
@JsonProperty("riskamt")
private BigDecimal riskAmount;
/**
* 0
*/
@JsonProperty("winamt")
private BigDecimal winAmount;
/**
*
*/
@JsonProperty("validbet")
private BigDecimal validBet;
/**
*
*/
@JsonProperty("commission")
private BigDecimal commission;
/**
* null
*/
@JsonProperty("jackpot")
private Jackpot jackpot;
@Data
public static class Jackpot {
/**
*
*/
@JsonProperty("contrib")
private BigDecimal contrib;
/**
*
*/
@JsonProperty("winamt")
private BigDecimal winAmount;
}
}
}

View File

@ -0,0 +1,130 @@
package com.ff.game.api.km.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* kmgame
*
* @author shi
* @date 2025/04/02
*/
@Data
public class KMGameResponse {
/**
*
*/
@JsonProperty("err")
private Integer errorCode;
/**
*
*/
@JsonProperty("errdesc")
private String errorDescription;
/**
*
*/
@JsonProperty("iconres")
private List<String> iconResolutions;
/**
*
*/
@JsonProperty("games")
private List<Game> games;
@Data
public static class Game {
/**
*
*/
@JsonProperty("externalid")
private String externalId;
/**
*
*/
@JsonProperty("code")
private String code;
/**
*
*/
@JsonProperty("name")
private String name;
/**
*
*/
@JsonProperty("description")
private String description;
/**
*
*/
@JsonProperty("providercode")
private String providerCode;
/**
*
*/
@JsonProperty("isactive")
private Boolean isActive;
/**
*
*/
@JsonProperty("type")
private Integer type;
/**
* URL
*/
@JsonProperty("iconurl")
private String iconUrl;
/**
* id
*/
private Long systemGameId;
/**
*
*/
@JsonProperty("supportdemourl")
private Boolean supportDemoUrl;
/**
*
*/
@JsonProperty("betlimits")
private List<BetLimit> betLimits;
@Data
public static class BetLimit {
/**
*
*/
@JsonProperty("id")
private String id;
/**
*
*/
@JsonProperty("min")
private BigDecimal min;
/**
*
*/
@JsonProperty("max")
private BigDecimal max;
}
}
}

View File

@ -0,0 +1,37 @@
package com.ff.game.api.km.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* kmkick
*
* @author shi
* @date 2025/04/03
*/
@Data
public class KMKickMemberResponse {
/**
*
*/
@JsonProperty("err")
private Integer errorCode;
/**
*
*/
@JsonProperty("errdesc")
private String errorDescription;
/**
* true false
*/
@JsonProperty("success")
private boolean success;
/**
*
*/
@JsonProperty("desc")
private String description;
}

View File

@ -0,0 +1,59 @@
package com.ff.game.api.km.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* km
*
* @author shi
* @date 2025/04/02
*/
@Data
public class KMTransactionResponse {
/**
*
*/
@JsonProperty("err")
private Integer errorCode;
/**
*
*/
@JsonProperty("errdesc")
private String errorDescription;
/**
*
*/
@JsonProperty("bal")
private BigDecimal balance;
/**
*
*/
@JsonProperty("cur")
private String currency;
/**
* ID
*/
@JsonProperty("txid")
private String txId;
/**
* ID
*/
@JsonProperty("ptxid")
private String ptxId;
/**
*
*/
@JsonProperty("dup")
private Boolean isDuplicate;
}

View File

@ -0,0 +1,733 @@
package com.ff.game.api.km.impl;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.druid.support.json.JSONUtils;
import com.ff.base.constant.CacheConstants;
import com.ff.base.constant.ConfigConstants;
import com.ff.base.constant.Constants;
import com.ff.base.core.redis.RedisCache;
import com.ff.base.enums.*;
import com.ff.base.exception.base.ApiException;
import com.ff.base.exception.base.BaseException;
import com.ff.base.system.service.ISysConfigService;
import com.ff.base.utils.DateUtils;
import com.ff.base.utils.JsonUtil;
import com.ff.base.utils.StringUtils;
import com.ff.base.utils.ip.IpUtils;
import com.ff.base.utils.sign.Md5Utils;
import com.ff.base.utils.uuid.IdUtils;
import com.ff.config.KeyConfig;
import com.ff.game.api.IGamesService;
import com.ff.game.api.dg.dto.DGBetRecordResponseDTO;
import com.ff.game.api.dg.dto.DGResponse;
import com.ff.game.api.dg.dto.DGUserListResponseDTO;
import com.ff.game.api.jili.dto.JILIGamesDataDTO;
import com.ff.game.api.km.client.KMClient;
import com.ff.game.api.km.dto.*;
import com.ff.game.api.request.*;
import com.ff.game.api.xk.dto.XKGamesDTO;
import com.ff.game.domain.*;
import com.ff.game.dto.GameSecretKeyCurrencyDTO;
import com.ff.game.service.*;
import com.ff.member.domain.Member;
import com.ff.member.service.IMemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* DG impl
*
* @author shi
* @date 2024/11/12
*/
@Service("KMService")
@Slf4j
public class GamesKMServiceImpl implements IGamesService {
@Resource
private ISysConfigService configService;
@Resource
private RedisCache redisCache;
@Resource
private IGameExchangeMoneyService gameExchangeMoneyService;
@Resource
private IGamePlatformService gamePlatformService;
@Resource
private IGameService gameService;
@Resource
private IMemberService memberService;
@Resource
private IGameFreeRecordService gameFreeRecordService;
@Resource
private IGameSecretKeyService gameSecretKeyService;
@Resource
private IGameSecretKeyCurrencyService gameSecretKeyCurrencyService;
@Resource
private KMClient KMClient;
@Resource
private KeyConfig keyConfig;
@Resource
private IGameBettingDetailsService gameBettingDetailsService;
@Resource
private IGameNameService gameNameService;
/**
* id
*/
private static final Long GAME_ID = 1904452832756003817L;
/**
* ID
*/
private static final Long PLATFORM_ID = 1904411420157108325L;
/**
* id
*/
private static final Long GAME_NAME_ID = 1904452832756002317L;
/**
*
*
* @param errorCode
* @return {@link Boolean }
*/
private Boolean getIsSuccess(Integer errorCode) {
return 200 == errorCode;
}
/**
*
*
* @param gamesBaseRequestDTO dto
* @return {@link String }
*/
private Map<String, Object> getKey(GamesBaseRequestDTO gamesBaseRequestDTO) {
//取出对应的key跟密钥跟请求参数
String agentKey = gamesBaseRequestDTO.getAgentKey();
String agentId = gamesBaseRequestDTO.getAgentId();
Map<String, Object> keyMap = new HashMap<>();
keyMap.put("X-QM-ClientId", agentId);
keyMap.put("X-QM-ClientSecret", agentKey);
return keyMap;
}
/**
*
*
* @param createMemberRequestDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) {
log.info("GamesKMServiceImpl [createMember] 请求参数 {}", createMemberRequestDTO);
Map<String, Object> params = new LinkedHashMap<>();
params.put("ipaddress", IpUtils.getHostIp());
params.put("username", createMemberRequestDTO.getAccount());
params.put("userid", createMemberRequestDTO.getAccount());
params.put("lang", "en-US");
params.put("cur", createMemberRequestDTO.getCurrency());
/* 1 -
2 -
3 -
4 -*/
params.put("betlimitid", 4);
//TODO 后面去掉
params.put("istestplayer", Boolean.TRUE);
params.put("platformtype", ObjectUtils.isEmpty(createMemberRequestDTO.getPlatformType()) ? 1 : createMemberRequestDTO.getPlatformType());
Map<String, Object> headerMap = this.getKey(createMemberRequestDTO);
KMAuthTokenResponse member = KMClient.createMember(params, headerMap);
if (ObjectUtils.isEmpty(member.getErrorCode()) || this.getIsSuccess(member.getErrorCode())) {
redisCache.setCacheObject(CacheConstants.KM_USER_TOKEN + createMemberRequestDTO.getAccount(), member.getAuthToken());
return Boolean.TRUE;
}
//判断是否获取成功
return Boolean.FALSE;
}
/**
*
*
* @param memberInfoRequestDTO dto
* @return {@link MemberInfoResponseDTO }
*/
@Override
public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) {
log.info("GamesDGServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO);
Map<String, Object> paramsMap = new HashMap<>();
Member member = memberService.selectMemberByGameAccount(memberInfoRequestDTO.getAccounts());
GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
.platformCode(GamePlatforms.KM.getInfo())
.currency(member.getCurrencyCode())
.build());
paramsMap.put("userid", memberInfoRequestDTO.getAccounts());
paramsMap.put("cur", currencyDTO.getCurrency());
Map<String, Object> headerMap = this.getKey(memberInfoRequestDTO);
KMBalanceResponse memberInfo = KMClient.getMemberInfo(JsonUtil.mapToQueryString(paramsMap), headerMap);
if (ObjectUtils.isEmpty(memberInfo.getErrorCode()) || this.getIsSuccess(memberInfo.getErrorCode())) {
return MemberInfoResponseDTO.builder().account(memberInfoRequestDTO.getAccounts()).balance(memberInfo.getBalance()).status(GameMemberStatus.UNKNOWN.getCode()).build();
} else {
throw new ApiException(ErrorCode.ACCOUNT_NOT_EXIST.getCode());
}
}
/**
*
*
* @param gamesLogin
* @return {@link String }
*/
@Override
public String loginWithoutRedirect(GamesLogin gamesLogin) {
log.info("GamesKMServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin);
String kmUserToken = redisCache.getCacheObject(CacheConstants.KM_USER_TOKEN + gamesLogin.getAccount());
if (StringUtils.isEmpty(kmUserToken)) {
Member member = memberService.selectMemberByGameAccount(gamesLogin.getAccount());
GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
.platformCode(GamePlatforms.KM.getInfo())
.currency(member.getCurrencyCode())
.build());
CreateMemberRequestDTO gamesBaseRequestDTO = CreateMemberRequestDTO.builder()
.account(gamesLogin.getAccount())
.agentId(gamesLogin.getAgentId())
.agentKey(gamesLogin.getAgentKey())
.currency(currencyDTO.getCurrency())
.build();
this.createMember(gamesBaseRequestDTO);
kmUserToken = redisCache.getCacheObject(CacheConstants.KM_USER_TOKEN + gamesLogin.getAccount());
}
String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL);
return selectConfigByKey + "/gamelauncher?gpcode=" + gamesLogin.getGameType()
+ "&gcode=" + gamesLogin.getGameId()
+ "&token=" + kmUserToken
+ "&lang=" + gamesLogin.getLang();
}
/**
*
*
* @param gamesBaseRequestDTO dto
* @return {@link String }
*/
@Transactional
@Override
public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) {
List<XKGamesDTO.DataBean> gamesDatas = redisCache.getCacheList(CacheConstants.KM_GAMES);
if (!CollectionUtils.isEmpty(gamesDatas)) {
return CacheConstants.KM_GAMES;
}
Map<String, Object> params = new LinkedHashMap<>();
params.put("lang", "zh-CN");
params.put("platformtype", 1);
Map<String, Object> headerMap = this.getKey(gamesBaseRequestDTO);
KMGameResponse gameMobiles = KMClient.getGameList(JsonUtil.mapToQueryString(params), headerMap);
//判断是否获取成功
List<KMGameResponse.Game> gameListData = new ArrayList<>();
if (ObjectUtils.isEmpty(gameMobiles.getErrorCode()) || this.getIsSuccess(gameMobiles.getErrorCode())) {
gameListData.addAll(this.gameList(gameMobiles, IngressType.MOBILE_WEB.getValue()));
} else {
throw new BaseException(gameMobiles.getErrorDescription());
}
params = new LinkedHashMap<>();
params.put("lang", "zh-CN");
params.put("platformtype", 0);
KMGameResponse gamePCs = KMClient.getGameList(JsonUtil.mapToQueryString(params), headerMap);
//判断是否获取成功
if (ObjectUtils.isEmpty(gamePCs.getErrorCode()) || this.getIsSuccess(gamePCs.getErrorCode())) {
gameListData.addAll(this.gameList(gamePCs, IngressType.PC_WEB.getValue()));
} else {
throw new BaseException(gamePCs.getErrorDescription());
}
// 使用集合操作来找出相同 code 的对象
List<KMGameResponse.Game> games = gameMobiles.getGames().stream()
.filter(mobile -> gamePCs.getGames().stream()
.anyMatch(pc -> pc.getCode().equals(mobile.getCode())))
.collect(Collectors.toList());
for (KMGameResponse.Game game : games) {
GamePlatform gamePlatform = GamePlatform.builder()
.platformType(KMGameType.findSystemByCode(game.getProviderCode()))
.platformCode(GamePlatforms.KM.getCode())
.build();
List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
//没有此平台就新增一个平台
if (CollectionUtils.isEmpty(gamePlatforms)) {
gamePlatform.setPlatformName(GamePlatforms.KM.getInfo() + KMGameType.findInfoByCode(game.getProviderCode()));
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
gamePlatform.setCreateBy(Constants.SYSTEM);
gamePlatformService.insertGamePlatform(gamePlatform);
} else {
gamePlatform = gamePlatforms.get(0);
}
Game gameOne = Game.builder()
.platformId(gamePlatform.getId())
.gameCode(game.getCode())
.build();
List<Game> gameOnes = gameService.selectGameList(gameOne);
for (Game one : gameOnes) {
one.setIngress(IngressType.PC_AND_MOBILE_WEB.getValue());
gameService.updateGame(one);
}
}
redisCache.deleteObject(CacheConstants.KM_GAMES);
redisCache.setCacheList(CacheConstants.KM_GAMES, gameListData);
redisCache.expire(CacheConstants.KM_GAMES, 5L, TimeUnit.HOURS);
return CacheConstants.KM_GAMES;
}
/**
*
*
* @param gameList
* @param ingress
* @return {@link List }<{@link KMGameResponse.Game }>
*/
private List<KMGameResponse.Game> gameList(KMGameResponse gameList, Integer ingress) {
for (KMGameResponse.Game gamesDataDTO : gameList.getGames()) {
GamePlatform gamePlatform = GamePlatform.builder()
.platformType(KMGameType.findSystemByCode(gamesDataDTO.getProviderCode()))
.platformCode(GamePlatforms.KM.getCode())
.build();
List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
//没有此平台就新增一个平台
if (CollectionUtils.isEmpty(gamePlatforms)) {
gamePlatform.setPlatformName(GamePlatforms.KM.getInfo() + KMGameType.findInfoByCode(gamesDataDTO.getProviderCode()));
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
gamePlatform.setCreateBy(Constants.SYSTEM);
gamePlatformService.insertGamePlatform(gamePlatform);
} else {
gamePlatform = gamePlatforms.get(0);
}
Game game = Game.builder()
.platformId(gamePlatform.getId())
.gameCode(gamesDataDTO.getCode())
.build();
List<Game> games = gameService.selectGameList(game);
//不存在这个游戏
if (CollectionUtils.isEmpty(games)) {
game.setGameSourceType(gamesDataDTO.getProviderCode());
game.setFreespin(Boolean.FALSE);
game.setDemoStatus(gamesDataDTO.getSupportDemoUrl());
game.setSortNo(gameService.selectMaxSortNoByPlatformId(gamePlatform.getId()) + 1);
game.setGameName(gamesDataDTO.getName());
game.setCreateBy(Constants.SYSTEM);
game.setIngress(ingress);
gameService.insertGame(game);
} else {
game = games.get(0);
}
gamesDataDTO.setSystemGameId(game.getId());
List<GameName> gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(game.getGameName()).build());
if (CollectionUtils.isEmpty(gameNames)) {
gameNameService.insertGameName(GameName.builder()
.gameId(game.getId())
.gameName(game.getGameName())
.langCode("zh-CN")
.createBy(Constants.SYSTEM)
.build());
}
}
return gameList.getGames();
}
/**
* id
*
* @param exchangeTransferMoneyRequestDTO moeny dto
* @return {@link Long }
*/
@Override
@Transactional
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesKMServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
.platformCode(GamePlatforms.KM.getInfo())
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
.build());
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
String transactionId = GamePlatforms.KM.getInfo() + IdUtils.simpleUUID();
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
GameExchangeMoney.builder()
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
.build()
);
Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复");
//获取下一个自增id
GameExchangeMoney exchangeMoney = GameExchangeMoney
.builder()
.tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey())
.orderId(exchangeTransferMoneyRequestDTO.getOrderId())
.quota(exchangeTransferMoneyRequestDTO.getQuota())
.balance(exchangeTransferMoneyRequestDTO.getAmount())
.exchangeType(exchangeTransferMoneyRequestDTO.getTransferType())
.currencyCode(currencyDTO.getSystemCurrency())
.memberId(member.getId())
.transactionId(transactionId)
.platformCode(GamePlatforms.KM.getInfo())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount();
if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) {
// 获取第三方钱包余额
MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder()
.accounts(member.getGameAccount())
.agentId(exchangeTransferMoneyRequestDTO.getAgentId())
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
.build();
amount = this.getMemberInfo(gamesBaseRequestDTO).getBalance();
}
Map<String, Object> params = new LinkedHashMap<>();
params.put("userid", exchangeTransferMoneyRequestDTO.getAccount());
params.put("amt", amount);
params.put("cur", currencyDTO.getCurrency());
params.put("txid", transactionId);
Map<String, Object> headerMap = this.getKey(exchangeTransferMoneyRequestDTO);
KMTransactionResponse kmTransactionResponse;
if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) {
kmTransactionResponse = KMClient.debit(params, headerMap);
} else {
kmTransactionResponse = KMClient.credit(params, headerMap);
}
//判断是否转移成功
if (ObjectUtils.isEmpty(kmTransactionResponse.getErrorCode()) || this.getIsSuccess(kmTransactionResponse.getErrorCode())) {
//更新数据
exchangeMoney.setBalance(amount);
exchangeMoney.setCoinBefore(NumberUtil.sub(amount, kmTransactionResponse.getBalance()).abs());
exchangeMoney.setCoinAfter(kmTransactionResponse.getBalance());
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
exchangeMoney.setStatus(StatusType.SUCCESS.getValue());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
} else {
log.error("GamesDGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", kmTransactionResponse.getErrorCode(), kmTransactionResponse.getErrorDescription());
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
}
return exchangeMoney.getId();
}
/**
*
*
* @param exchangeTransferMoneyRequestDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
return Boolean.TRUE;
}
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link List }<{@link GameBettingDetails }>
*/
@Override
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
//请求参数
log.info("GamesKMServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO);
Map<String, Object> key = this.getKey(betRecordByTimeDTO);
String startTime = null;
String endTime = null;
try {
startTime = URLEncoder.encode(DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00", "UTF-8");
endTime = URLEncoder.encode(DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00", "UTF-8");
} catch (Exception e) {
throw new BaseException(e.getMessage());
}
Map<String, Object> params = new LinkedHashMap<>();
params.put("startdate", startTime);
params.put("enddate", endTime);
params.put("includetestplayers", Boolean.TRUE);
params.put("issettled", Boolean.TRUE);
KMBetRecordResponse betRecordByTime = KMClient.getBetRecordByTime(JsonUtil.mapToQueryString(params), key);
if (ObjectUtils.isEmpty(betRecordByTime.getErrorCode()) || this.getIsSuccess(betRecordByTime.getErrorCode())) {
this.batchInsert(betRecordByTime);
return Boolean.TRUE;
} else {
log.error("GamesKMServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrorCode(), betRecordByTime.getErrorDescription());
throw new BaseException(betRecordByTime.getErrorDescription());
}
}
/**
*
*
* @param betRecordByTimeDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
return null;
}
/**
*
*
* @param createFreeSpinRequest
* @return {@link Boolean }
*/
@Override
public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param getGameDetailRequestDTO dto
* @return {@link GetGameDetailResponseDTO }
*/
@Override
public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param kickMemberRequestDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) {
log.info("GamesKMServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO);
Map<String, Object> key = this.getKey(kickMemberRequestDTO);
Map<String, Object> params = new LinkedHashMap<>();
params.put("userid", kickMemberRequestDTO.getAccount());
KMKickMemberResponse kickMember = KMClient.kickMember(params, key);
if (ObjectUtils.isEmpty(kickMember.getErrorCode()) || this.getIsSuccess(kickMember.getErrorCode())) {
redisCache.deleteObject(CacheConstants.KM_USER_TOKEN + kickMemberRequestDTO.getAccount());
return kickMember.isSuccess();
}else {
throw new BaseException(kickMember.getDescription());
}
}
/**
*
*
* @param kickMemberAllDTO dto
* @return {@link Boolean }
*/
@Override
public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
* 使
*
* @param getFreeSpinDashflowRequestDTO dashflowdto
* @return {@link List }<{@link GameFreeRecord }>
*/
@Override
public List<GameFreeRecord> getFreeSpinDashflow(GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param cancelFreeSpinRequestDTO
* @return {@link Boolean }
*/
@Override
public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
@Override
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
log.info("GamesKMServiceImpl [gameDemoLogin] 请求参数 {}", gameDemoLoginRequestDTO);
Map<String, Object> params = new LinkedHashMap<>();
params.put("lang", gameDemoLoginRequestDTO.getLang());
String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL);
return GameDemoLoginResponseDTO.builder()
.url(selectConfigByKey + "/demolauncher?gpcode=" + gameDemoLoginRequestDTO.getGameType()
+ "&gcode=" + gameDemoLoginRequestDTO.getGameId()
+ "&lang=" + gameDemoLoginRequestDTO.getLang())
.build();
}
/**
*
*
* @param betRecordByTime dgdto
*/
private void batchInsert(KMBetRecordResponse betRecordByTime) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<String> wagersIds = new ArrayList<>();
//数据组装
List<KMBetRecordResponse.Bet> report = betRecordByTime.getBets();
//数据转化
for (KMBetRecordResponse.Bet bean : report) {
GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().data(bean).build());
if (!ObjectUtils.isEmpty(bettingDetails)) {
bettingDetails.setId(IdUtil.getSnowflakeNextId());
gameBettingDetails.add(bettingDetails);
}
wagersIds.add(String.valueOf(bean.getId()));
}
if (!CollectionUtils.isEmpty(gameBettingDetails)) {
//查询重复数据id
List<String> removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.KM.getInfo());
//用steam流清除list中与wagersIds集合相同的数据
gameBettingDetails = gameBettingDetails.stream()
.filter(detail -> !removeWagersIds.contains(detail.getWagersId()))
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(gameBettingDetails)) {
gameBettingDetailsService.batchInsert(gameBettingDetails);
}
}
}
/**
*
*
* @param gamesDataBuildDTO
* @return {@link GameBettingDetails }
*/
@Override
public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) {
//转化类
KMBetRecordResponse.Bet resultBean = (KMBetRecordResponse.Bet) gamesDataBuildDTO.getData();
GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
.platformCode(GamePlatforms.KM.getInfo())
.currency(resultBean.getCurrency())
.build());
Member member = memberService.selectMemberByGameAccount(resultBean.getUserId());
if (ObjectUtils.isEmpty(member)) {
return null;
}
List<KMGameResponse.Game> gamesDatas = redisCache.getCacheList(CacheConstants.KM_GAMES);
Map<String, KMGameResponse.Game> dataDTOMap = gamesDatas.stream() .collect(Collectors.toMap(
KMGameResponse.Game::getCode,
e -> e,
(existing, replacement) -> existing
));;
KMGameResponse.Game gamesDataDTO = dataDTOMap.get(resultBean.getGCode());
//输赢状态
Integer gameStatus = GameStatus.FLAT.getCode();
BigDecimal payoffAmount =NumberUtil.sub(resultBean.getWinAmount(), resultBean.getRiskAmount().abs());
if (payoffAmount.compareTo(BigDecimal.ZERO) > 0) {
gameStatus = GameStatus.WIN.getCode();
} else if (payoffAmount.compareTo(BigDecimal.ZERO) < 0) {
gameStatus = GameStatus.FAIL.getCode();
}
//数据构造
GameBettingDetails gameBettingDetails = GameBettingDetails.builder()
.tenantKey(member.getTenantKey())
//保存我们的币种id
.currencyCode(currencyDTO.getSystemCurrency())
.memberId(member.getId())
.gameCode(gamesDataDTO.getCode())
.gameType(PlatformType.CARD_GAME.getCode())
.platformCode(GamePlatforms.KM.getInfo())
.gameId(GAME_ID)
.gameName(gamesDataDTO.getName())
.gameStatus(gameStatus)
.gameStatusType(1)
.gameCurrencyCode(currencyDTO.getCurrency())
.account(resultBean.getUserId())
.wagersId(resultBean.getId())
.wagersTime(resultBean.getBeton().getTime())
.betAmount(resultBean.getRiskAmount().abs())
.payoffTime(resultBean.getClosedon().getTime())
.payoffAmount(payoffAmount.abs())
.settlementTime(resultBean.getClosedon().getTime())
.turnover(resultBean.getValidBet())
.settlementStatus(SettlementStatusEnum.COMPLETED.getCode())
.orderNo(resultBean.getExternalRoundId())
.round(resultBean.getRoundId())
.build();
gameBettingDetails.setCreateBy(Constants.SYSTEM);
gameBettingDetails.setCreateTime(DateUtils.getNowDate());
return gameBettingDetails;
}
}

View File

@ -0,0 +1,31 @@
package com.ff.game.api.km.success;
import com.dtflys.forest.callback.SuccessWhen;
import com.dtflys.forest.http.ForestRequest;
import com.dtflys.forest.http.ForestResponse;
/**
* kmsuccess
*
* @author shi
* @date 2025/04/02
*/
public class MyKMSuccessCondition implements SuccessWhen {
/**
*
* @param req Forest
* @param res Forest
* @return true: false:
*/
@Override
public boolean successWhen(ForestRequest req, ForestResponse res) {
// req 为Forest请求对象即 ForestRequest 类实例
// res 为Forest响应对象即 ForestResponse 类实例
// 返回值为 ture 则表示请求成功false 表示请求失败
return res.noException();
// 当然在这里也可以写其它条件,比如 通过 res.getResult() 或 res.getContent() 获取业务数据
// 再根据业务数据判断是否成功
}
}

View File

@ -683,6 +683,17 @@ public class MeiTianGameServiceImpl implements IGamesService {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
@Override
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*

View File

@ -645,7 +645,7 @@ public class GamesPGServiceImpl implements IGamesService {
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
return null;
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
@ -659,7 +659,7 @@ public class GamesPGServiceImpl implements IGamesService {
public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) {
return null;
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
@ -689,7 +689,7 @@ public class GamesPGServiceImpl implements IGamesService {
@Override
public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) {
return null;
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
@ -701,7 +701,7 @@ public class GamesPGServiceImpl implements IGamesService {
@Override
public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) {
return null;
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
@ -714,7 +714,7 @@ public class GamesPGServiceImpl implements IGamesService {
public List<GameFreeRecord> getFreeSpinDashflow(GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO) {
return Collections.emptyList();
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
@ -726,8 +726,19 @@ public class GamesPGServiceImpl implements IGamesService {
@Override
public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) {
return null;
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
@Override
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**

View File

@ -559,6 +559,17 @@ public class GamesPGXServiceImpl implements IGamesService {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
@Override
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*

View File

@ -29,5 +29,10 @@ public class CreateMemberRequestDTO extends GamesBaseRequestDTO {
*/
private Map<String, Map<String, Map<String, Object>>> betLimit;
/**
* 0 1
*/
private Integer platformType;
}

View File

@ -0,0 +1,34 @@
package com.ff.game.api.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* dto
*
* @author shi
* @date 2025/04/03
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder
public class GameDemoLoginRequestDTO extends GamesBaseRequestDTO{
/**
*
*/
private String lang;
/**
*
*/
private String gameType;
/**
* id
*/
private String gameId;
}

View File

@ -0,0 +1,23 @@
package com.ff.game.api.request;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* dto
*
* @author shi
* @date 2025/04/03
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class GameDemoLoginResponseDTO {
/**
*
*/
private String url;
}

View File

@ -524,6 +524,17 @@ public class GamesSAServiceImpl implements IGamesService {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
@Override
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*

View File

@ -535,6 +535,17 @@ public class GamesXKServiceImpl implements IGamesService {
public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
*
*
* @param gameDemoLoginRequestDTO dto
* @return {@link GameDemoLoginResponseDTO }
*/
@Override
public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**

View File

@ -55,15 +55,15 @@ public class MemberServiceImpl implements IMemberService {
@Override
public synchronized String getMemberGameAccount(String platformCode) {
String gameAccount = null;
if (GamePlatforms.DG.getInfo().equals(platformCode)) {
if (GamePlatforms.DG.getInfo().equals(platformCode) || GamePlatforms.KM.getInfo().equals(platformCode)) {
do {
gameAccount = RandomGeneratorUtils.generateRandomAccountUpper();
} while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount)));
}else if (GamePlatforms.PG.getInfo().equals(platformCode)||GamePlatforms.PGX.getInfo().equals(platformCode)){
} else if (GamePlatforms.PG.getInfo().equals(platformCode) || GamePlatforms.PGX.getInfo().equals(platformCode)) {
do {
gameAccount = RandomGeneratorUtils.generateRandomAccountLower();
} while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount)));
}else {
} else {
do {
gameAccount = RandomGeneratorUtils.generateRandomAccount();
} while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount)));