refactor(ff-game): 移除未使用的代码和依赖

- 删除了 ApiMemberController 中未使用的 GameSecretKeyCurrencyDTO 相关代码
- 移除了 GamesPGTServiceImpl 中未使用的 IGamePlatformService、IGameSecretKeyService、IGameSecretKeyCurrencyService 和 IGameNameService 的注入
- 清理了 GamesPGTServiceImpl 中未
main-meitian
shi 2025-04-08 17:12:40 +08:00
parent b466e052f1
commit 58becaf578
51 changed files with 1189 additions and 653 deletions

View File

@ -51,7 +51,10 @@ public class CacheConstants {
*/
public static final String XK_GAMES = "xk_games:";
/**
* ae
*/
public static final String AE_GAMES = "ae_games:";
/**
* km
*/

View File

@ -0,0 +1,24 @@
package com.ff.base.enums;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
/**
*
*
* @author shi
* @date 2025/04/08
*/
@Getter
@AllArgsConstructor
public enum GameExchangeStep {
CREATE_ORDER(1, "创建订单"),
PLATFORM_TRANSACTION(2, "平台交易成功"),
PLATFORM_TRANSACTION_CONFIRM(3, "平台交易状态确认"),
TENANT_QUOTA_DEDUCTED(4, "租户额度扣减成功");
private final int code;
private final String description;
}

View File

@ -0,0 +1,21 @@
package com.ff.base.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
*
*
* @author shi
* @date 2025/04/08
*/
@Getter
@AllArgsConstructor
public enum GameExchangeStepStatus {
IN_PROGRESS(0, "进行中"),
SUCCESS(1, "成功"),
FAILURE(2, "失败");
private final int code;
private final String description;
}

View File

@ -9,7 +9,8 @@ package com.ff.base.enums;
*/
public enum TransferType {
ALL(1, "从游戏商转移额度到平台商(不看amount值全部转出"),
GAMES(2, "从平台商转移额度到游戏商");
GAMES(2, "从平台商转移额度到游戏商"),
;
private final Integer code;
private final String info;

View File

@ -585,12 +585,12 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
/**
*
*
* @param account
* @param suffix
* @param code
* @param suffix
* @return {@link String }
*/
public static String addSuffix(String account, String suffix) {
return account + suffix;
public static String addSuffix(String code, Object suffix) {
return code +"_"+ suffix;
}
/**

View File

@ -9,6 +9,7 @@ import com.ff.base.core.controller.BaseController;
import com.ff.base.core.domain.AjaxResult;
import com.ff.base.core.page.TableDataInfo;
import com.ff.base.enums.ErrorCode;
import com.ff.base.enums.TransferType;
import com.ff.base.exception.base.ApiException;
import com.ff.base.system.domain.TenantSecretKey;
import com.ff.base.utils.StringUtils;
@ -106,15 +107,10 @@ public class ApiGameController extends BaseController {
if (null == platform) {
continue;
}
// List<GameSecretKeyCurrencyDTO> gameSecretKeyCurrencies =
// gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(
// GameSecretKeyCurrencyDTO.builder().platformCode(gameResponse.getPlatformCode())
// .build()
// );
// List<String> currencyCode = gameSecretKeyCurrencies.stream().map(GameSecretKeyCurrencyDTO::getSystemCurrency).collect(Collectors.toList());
List<String> currencyCode = new ArrayList<>(platform.getCurrencyInfo().keySet());
gameResponse.setCurrencyCode(currencyCode);
}
return AjaxResult.success(gameResponses);
}
@ -129,7 +125,7 @@ public class ApiGameController extends BaseController {
@PostMapping("/login")
public AjaxResult login(@Validated @RequestBody GameLoginRequest loginRequest) {
Game game = gameService.selectGameById(loginRequest.getGameId());
Game game = gameService.selectGameByGameId(loginRequest.getGameId());
ApiException.notNull(game, ErrorCode.GAME_NOT_EXIST.getCode());
Platform platform = platformService.get(game.getPlatformCode());
@ -154,18 +150,6 @@ public class ApiGameController extends BaseController {
String targetLang = platform.getLangInfo().get(loginRequest.getLangCode());
ApiException.notNull(targetLang, ErrorCode.LANG_NOT_EXIST.getCode());
// TenantSecretKey tenantSecretKey = keyConfig.get();
// GameSecretKeyCurrencyDTO secretKeyCurrencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .platformCode(gamePlatform.getPlatformCode())
// .systemCurrency(memberCreateApiRequest.getCurrencyCode()).build());
// ApiException.notNull(secretKeyCurrencyDTO, ErrorCode.CURRENCY_NOT_EXIST.getCode());
// GameSecretKeyLangDTO gameSecretKeyLangDTO = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder()
// .platformCode(gamePlatform.getPlatformCode())
// .systemLangCode(memberCreateApiRequest.getLangCode())
// .build());
// ApiException.notNull(gameSecretKeyLangDTO, ErrorCode.LANG_NOT_EXIST.getCode());
Member member = memberService.selectMemberByAccount(loginRequest.getAccount(), loginRequest.getCurrencyCode(), platform.getPlatformCode());
ApiException.notNull(member, ErrorCode.ACCOUNT_NOT_EXIST.getCode());
@ -209,11 +193,6 @@ public class ApiGameController extends BaseController {
TenantSecretKey tenantSecretKey = keyConfig.get();
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .platformCode(gameExchangeBalanceRequest.getPlatformCode())
// .systemCurrency(gameExchangeBalanceRequest.getCurrencyCode()).build());
//
// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode());
Platform platform = platformService.get(gameExchangeBalanceRequest.getPlatformCode());
ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode());
@ -231,21 +210,24 @@ public class ApiGameController extends BaseController {
}
}
ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode());
BigDecimal quota = BigDecimal.ZERO;
//如果是扣钱提前扣
if (TransferType.GAMES.getCode().equals(gameExchangeBalanceRequest.getTransferType())) {
quota = tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder()
.platformCode(gameExchangeBalanceRequest.getPlatformCode())
.sourceId(gameExchangeBalanceRequest.getOrderId())
.currencyCode(gameExchangeBalanceRequest.getCurrencyCode())
.currency(targetCurrency)
.transferType(gameExchangeBalanceRequest.getTransferType())
.amount(gameExchangeBalanceRequest.getAmount())
.account(gameExchangeBalanceRequest.getAccount())
.tenantKey(tenantSecretKey.getTenantKey())
.systemCurrency(gameExchangeBalanceRequest.getCurrencyCode())
.agentId(keyInfo.getCode())
.agentKey(keyInfo.getKey())
.build());
}
BigDecimal quota = tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder()
.platformCode(gameExchangeBalanceRequest.getPlatformCode())
.sourceId(gameExchangeBalanceRequest.getOrderId())
.currencyCode(gameExchangeBalanceRequest.getCurrencyCode())
.currency(targetCurrency)
.transferType(gameExchangeBalanceRequest.getTransferType())
.amount(gameExchangeBalanceRequest.getAmount())
.account(gameExchangeBalanceRequest.getAccount())
.tenantKey(tenantSecretKey.getTenantKey())
.systemCurrency(gameExchangeBalanceRequest.getCurrencyCode())
.agentId(keyInfo.getCode())
.agentKey(keyInfo.getKey())
.build());
// 获取用户信息
Member member = memberService.selectMemberByAccount(gameExchangeBalanceRequest.getAccount(), gameExchangeBalanceRequest.getCurrencyCode(), gameExchangeBalanceRequest.getPlatformCode());
@ -258,7 +240,7 @@ public class ApiGameController extends BaseController {
.agentKey(keyInfo.getKey())
.orderId(gameExchangeBalanceRequest.getOrderId())
.account(member.getGameAccount())
.currency(/*gameSecretKey.getCurrency()*/targetCurrency)
.currency(targetCurrency)
.tenantKey(tenantSecretKey.getTenantKey())
.quota(quota)
.amount(gameExchangeBalanceRequest.getAmount())

View File

@ -144,6 +144,10 @@ public class ApiMemberController extends BaseController {
.build();
Boolean result = iGamesService.createMember(gamesBaseRequestDTO);
Assert.isTrue(result, "建立游戏账号失败");
return toAjax(Boolean.TRUE);
}

View File

@ -44,8 +44,8 @@ public class GameLoginRequest implements Serializable {
/**
* id
*/
@NotNull(message = "gameId不能为空")
private Long gameId;
@NotBlank(message = "gameId不能为空")
private String gameId;
/**

View File

@ -1,5 +1,6 @@
package com.ff.api.response;
import com.ff.game.domain.NameInfo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@ -27,7 +28,7 @@ public class GameResponse implements Serializable {
/**
* id
*/
private Long id;
private String id;
/**
*
@ -60,5 +61,8 @@ public class GameResponse implements Serializable {
*
*/
private List<String> currencyCode;
/**
*
*/
private List<NameInfo> nameInfo;
}

View File

@ -47,6 +47,12 @@ public class GameBalanceExchange extends GamesBaseRequestDTO implements Serializ
*/
private BigDecimal amount;
/**
*
*/
private BigDecimal amountActual;
/**
*
*/

View File

@ -271,13 +271,6 @@ public class TenantGameQuotaServiceImpl implements ITenantGameQuotaService {
*/
@Override
public BigDecimal gameBalanceExchange(GameBalanceExchange gameBalanceExchange) {
// 获取平台接口密钥
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .platformCode(gameBalanceExchange.getPlatformCode())
// .systemCurrency(gameBalanceExchange.getCurrencyCode()).build());
// 检查平台密钥是否存在,否则抛出异常
// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode());
TenantQuotaExchange tenantQuotaExchange = tenantQuotaExchangeService.getTenantQuotaExchange(Constants.USDT, gameBalanceExchange.getCurrencyCode());
ApiException.notNull(tenantQuotaExchange, ErrorCode.CURRENCY_EXCHANGE.getCode());

View File

@ -66,9 +66,9 @@ public interface IGamesService {
*
*
* @param exchangeTransferMoneyRequestDTO dto
* @return {@link Boolean }
* @return {@link ExchangeTransferStatusResponseDTO }
*/
Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO);
ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO);
/**

View File

@ -3,6 +3,8 @@ package com.ff.game.api.ae.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* aeexchange
@ -32,13 +34,13 @@ public class AEExchangeTransferStatusResponse {
*
*/
@JsonProperty("balance")
private double balance;
private BigDecimal balance;
/**
*
*/
@JsonProperty("transferAmount")
private double transferAmount;
private BigDecimal transferAmount;
/**
* DEPOSIT WITHDRAW

View File

@ -85,7 +85,6 @@ public class GamesAEServiceImpl implements IGamesService {
private static final Long GAME_ID = 1904452832756013817L;
/**
*
*
@ -194,18 +193,6 @@ public class GamesAEServiceImpl implements IGamesService {
@Transactional
@Override
public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) {
// GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID);
//没有此平台就新增一个平台
// if (ObjectUtils.isEmpty(gamePlatform)) {
// gamePlatform = new GamePlatform();
// gamePlatform.setId(PLATFORM_ID);
// gamePlatform.setPlatformCode(GamePlatforms.AE.getInfo());
// gamePlatform.setPlatformType(PlatformType.GAME_HALL.getCode());
// gamePlatform.setPlatformName(GamePlatforms.AE.getInfo() + PlatformType.GAME_HALL.getName());
// gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
// gamePlatform.setCreateBy(Constants.SYSTEM);
// gamePlatformService.insertGamePlatform(gamePlatform);
// }
Platform platform = gamesBaseRequestDTO.getVendor();
Game game = gameService.selectGameById(GAME_ID);
//不存在这个游戏
@ -213,7 +200,6 @@ public class GamesAEServiceImpl implements IGamesService {
game = new Game();
game.setId(GAME_ID);
game.setSortNo(gameService.selectMaxSortNo(PlatformType.GAME_HALL.getCode(), GamePlatforms.AE.getCode()) + 1);
//game.setPlatformId(gamePlatform.getId());
game.setPlatformCode(platform.getPlatformCode());
game.setPlatformType(PlatformType.GAME_HALL.getCode());
game.setGameCode("1");
@ -224,20 +210,10 @@ public class GamesAEServiceImpl implements IGamesService {
nameInfo.setLang("zh-CN");
nameInfo.setName("AE大厅");
game.setNameInfo(Collections.singletonList(nameInfo));
game.setGameId(StringUtils.addSuffix(GamePlatforms.AE.getCode(), 1));
gameService.insertGame(game);
}
/*GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID);
if (ObjectUtils.isEmpty(gameName)) {
gameNameService.insertGameName(GameName.builder()
.id(GAME_NAME_ID)
.gameId(game.getId())
.gameName(game.getGameName())
.langCode("zh-CN")
.createBy(Constants.SYSTEM)
.build());
}*/
return CacheConstants.XK_GAMES;
return CacheConstants.AE_GAMES;
}
/**
@ -250,10 +226,7 @@ public class GamesAEServiceImpl implements IGamesService {
@Transactional
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesAEServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .platformCode(GamePlatforms.AE.getInfo())
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
// .build());
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
String transactionId = GamePlatforms.AE.getCode() + IdUtils.simpleUUID();
@ -279,6 +252,12 @@ public class GamesAEServiceImpl implements IGamesService {
.platformCode(GamePlatforms.AE.getInfo())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
Map<String, Object> params = this.getKey(exchangeTransferMoneyRequestDTO);
AETransactionResponse deposit = null;
try {
@ -295,27 +274,30 @@ public class GamesAEServiceImpl implements IGamesService {
params.put("withdrawType", 1);
deposit = AEClient.withdraw(params);
}
} finally {
}finally {
BigDecimal coinBefore;
if (TransferType.GAMES.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) {
coinBefore = NumberUtil.sub(deposit.getCurrentBalance(), deposit.getAmount());
} else {
coinBefore = NumberUtil.add(deposit.getCurrentBalance(), deposit.getAmount());
}
//判断是否转移成功
if ("0000".equals(deposit.getStatus())) {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.IN_PROGRESS.getCode());
}
//更新数据
exchangeMoney.setBalance(deposit.getAmount());
exchangeMoney.setCoinBefore(coinBefore);
exchangeMoney.setCoinAfter(deposit.getCurrentBalance());
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
//判断是否转移成功
if ("0000".equals(deposit.getStatus())) {
exchangeMoney.setStatus(StatusType.SUCCESS.getValue());
} else {
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
}
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
}
@ -326,10 +308,10 @@ public class GamesAEServiceImpl implements IGamesService {
*
*
* @param exchangeTransferMoneyRequestDTO dto
* @return {@link Boolean }
* @return {@link ExchangeTransferStatusResponseDTO }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesAEServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
Map<String, Object> paramsMap = this.getKey(exchangeTransferMoneyRequestDTO);
@ -345,30 +327,22 @@ public class GamesAEServiceImpl implements IGamesService {
status = StatusType.FAILURE.getValue();
}
GameExchangeMoney exchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeMoneyId());
//如果失败扣除租户之前被扣额度
if (status.equals(StatusType.FAILURE.getValue())) {
Member member = memberService.selectMemberById(exchangeMoney.getMemberId());
tenantGameQuotaService.gameBalanceExchange(GameBalanceExchange.builder()
.platformCode(exchangeMoney.getPlatformCode())
.sourceId(exchangeMoney.getOrderId())
.currencyCode(exchangeMoney.getCurrencyCode())
.transferType(TransferType.ALL.getCode())
.amount(exchangeMoney.getBalance())
.account(member.getMemberAccount())
.tenantKey(exchangeMoney.getTenantKey())
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
.systemCurrency(exchangeTransferMoneyRequestDTO.getSystemCurrency())
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
.agentId(exchangeTransferMoneyRequestDTO.getAgentId())
.build());
//更新
BigDecimal coinBefore;
if (TransferType.GAMES.getCode().equals(exchangeMoney.getExchangeType())) {
coinBefore = NumberUtil.sub(exchangeTransferStatusResponse.getBalance(), exchangeTransferStatusResponse.getTransferAmount());
} else {
coinBefore = NumberUtil.add(exchangeTransferStatusResponse.getBalance(), exchangeTransferStatusResponse.getTransferAmount());
}
exchangeMoney.setStatus(status);
exchangeMoney.setUpdateBy(Constants.SYSTEM);
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
return Boolean.TRUE;
return ExchangeTransferStatusResponseDTO.builder()
.statusType(status)
.balance(exchangeTransferStatusResponse.getTransferAmount())
.coinBefore(coinBefore)
.coinAfter(exchangeTransferStatusResponse.getBalance())
.build();
}
@ -401,6 +375,7 @@ public class GamesAEServiceImpl implements IGamesService {
this.batchInsert(aeBetRecordResponse, betRecordByTimeDTO);
return Boolean.TRUE;
} else {
redisCache.deleteObject(CacheConstants.AE_TIME_FROM);
log.error("GamesAEServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", aeBetRecordResponse.getStatus(), aeBetRecordResponse.getDesc());
throw new BaseException(aeBetRecordResponse.getDesc());
}
@ -417,9 +392,7 @@ public class GamesAEServiceImpl implements IGamesService {
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
log.info("GamesAEServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO);
Map<String, Object> params = this.getKey(betRecordByTimeDTO);
long startTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getStartTime(), -40);
String startTime = DateUtils.convertTimestampToFormattedDate(startTimeLong, DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00";
String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00";
String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT, "GMT+8") + "+08:00";
@ -531,7 +504,7 @@ public class GamesAEServiceImpl implements IGamesService {
*
* @param aeBetRecordResponse aedto
*/
private void batchInsert(AEBetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) {
private synchronized void batchInsert(AEBetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<String> wagersIds = new ArrayList<>();
//数据组装
@ -578,10 +551,6 @@ public class GamesAEServiceImpl implements IGamesService {
//转化类
AEBetRecordResponse.Transaction resultBean = (AEBetRecordResponse.Transaction) gamesDataBuildDTO.getData();
/*GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
.platformCode(GamePlatforms.AE.getInfo())
.currency(resultBean.getCurrency())
.build());*/
Member member = memberService.selectMemberByGameAccount(resultBean.getUserId());
if (ObjectUtils.isEmpty(member)) {

View File

@ -55,6 +55,16 @@ public interface DGClient {
@Post(url = "/v2/api/transfer")
DGTransactionResponseDTO exchangeTransferByAgentId(@JSONBody Map<String, Object> params, @Header Map<String, Object> header);
/**
*
*
* @param params
* @param header
* @return {@link DGTransactionResponseDTO }
*/
@Post(url = "/v2/api/checkTransfer")
DGTransactionResponseDTO exchangeTransferStatus(@JSONBody Map<String, Object> params, @Header Map<String, Object> header);
/**
*
*

View File

@ -8,11 +8,13 @@ import com.ff.base.enums.*;
import com.ff.base.exception.base.ApiException;
import com.ff.base.exception.base.BaseException;
import com.ff.base.utils.DateUtils;
import com.ff.base.utils.SleepUtil;
import com.ff.base.utils.StringUtils;
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.ae.dto.AEExchangeTransferStatusResponse;
import com.ff.game.api.dg.client.DGClient;
import com.ff.game.api.dg.dto.*;
import com.ff.game.api.request.*;
@ -69,15 +71,6 @@ public class GamesDGServiceImpl implements IGamesService {
*/
private static final Long GAME_ID = 1904452832756003817L;
/**
* ID
*/
private static final Long PLATFORM_ID = 1904411420157108325L;
/**
* id
*/
private static final Long GAME_NAME_ID = 1904452832756002317L;
/**
*
@ -195,25 +188,13 @@ public class GamesDGServiceImpl implements IGamesService {
@Transactional
@Override
public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) {
//GamePlatform gamePlatform = gamePlatformService.selectGamePlatformById(PLATFORM_ID);
//没有此平台就新增一个平台
/*if (ObjectUtils.isEmpty(gamePlatform)) {
gamePlatform = new GamePlatform();
gamePlatform.setId(PLATFORM_ID);
gamePlatform.setPlatformCode(GamePlatforms.DG.getInfo());
gamePlatform.setPlatformType(PlatformType.CARD_GAME.getCode());
gamePlatform.setPlatformName(GamePlatforms.DG.getInfo() + PlatformType.CARD_GAME.getName());
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
gamePlatform.setCreateBy(Constants.SYSTEM);
gamePlatformService.insertGamePlatform(gamePlatform);
}*/
Game game = gameService.selectGameById(GAME_ID);
//不存在这个游戏
if (ObjectUtils.isEmpty(game)) {
game = new Game();
game.setId(GAME_ID);
game.setSortNo(1);
//game.setPlatformId(gamePlatform.getId());
game.setPlatformCode(GamePlatforms.DG.getCode());
game.setPlatformType(PlatformType.GAME_HALL.getCode());
game.setGameCode("1");
@ -221,18 +202,9 @@ public class GamesDGServiceImpl implements IGamesService {
game.setGameName("真人棋牌");
game.setCreateBy(Constants.SYSTEM);
game.setNameInfo(Collections.singletonList(new NameInfo("真人棋牌", "zh-CN")));
game.setGameId(StringUtils.addSuffix(GamePlatforms.DG.getCode(), 1));
gameService.insertGame(game);
}
/*GameName gameName = gameNameService.selectGameNameById(GAME_NAME_ID);
if (ObjectUtils.isEmpty(gameName)) {
gameNameService.insertGameName(GameName.builder()
.id(GAME_NAME_ID)
.gameId(game.getId())
.gameName(game.getGameName())
.langCode("zh-CN")
.createBy(Constants.SYSTEM)
.build());
}*/
return CacheConstants.DG_GAMES;
}
@ -246,10 +218,7 @@ public class GamesDGServiceImpl implements IGamesService {
@Transactional
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesDGServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .platformCode(GamePlatforms.DG.getInfo())
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
// .build());
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
String transactionId = GamePlatforms.DG.getInfo() + IdUtils.simpleUUID();
@ -275,7 +244,10 @@ public class GamesDGServiceImpl implements IGamesService {
.platformCode(GamePlatforms.DG.getInfo())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount();
if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) {
// 获取第三方钱包余额
@ -306,9 +278,13 @@ public class GamesDGServiceImpl implements IGamesService {
exchangeMoney.setCoinAfter(dgTransactionResponseDTO.getBalance());
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
exchangeMoney.setStatus(StatusType.SUCCESS.getValue());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
log.error("GamesDGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", dgTransactionResponseDTO.getCodeId(), dgTransactionResponseDTO.getMsg());
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
}
@ -320,11 +296,31 @@ public class GamesDGServiceImpl implements IGamesService {
*
*
* @param exchangeTransferMoneyRequestDTO dto
* @return {@link Boolean }
* @return {@link ExchangeTransferStatusResponseDTO }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
return Boolean.TRUE;
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesDGServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
Map<String, Object> params = new LinkedHashMap<>();
params.put("serial", exchangeTransferMoneyRequestDTO.getOrderId());
Map<String, Object> headerMap = this.getKey(exchangeTransferMoneyRequestDTO);
DGTransactionResponseDTO dgTransactionResponseDTO = DGClient.exchangeTransferStatus(params, headerMap);
Integer status = StatusType.IN_PROGRESS.getValue();
if (this.getIsSuccess(dgTransactionResponseDTO.getCodeId())) {
status = StatusType.SUCCESS.getValue();
} else {
status = StatusType.FAILURE.getValue();
}
return ExchangeTransferStatusResponseDTO.builder()
.statusType(status)
.balance(dgTransactionResponseDTO.getAmount().abs())
.coinBefore(NumberUtil.sub(dgTransactionResponseDTO.getBalance(), dgTransactionResponseDTO.getAmount().abs()).abs())
.coinAfter(dgTransactionResponseDTO.getBalance())
.build();
}
@ -336,6 +332,7 @@ public class GamesDGServiceImpl implements IGamesService {
*/
@Override
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
SleepUtil.sleep(50000);
//请求参数
log.info("GamesDGServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO);
Map<String, Object> key = this.getKey(betRecordByTimeDTO);
@ -360,7 +357,7 @@ public class GamesDGServiceImpl implements IGamesService {
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
return null;
return Boolean.FALSE;
}
/**

View File

@ -89,6 +89,11 @@ public interface FCClient {
ApiCFBalanceTransferResponseDTO exchangeTransferByAgentId(@JSONBody Map<String, Object> parameters);
@Post(url = "/GetSingleBill")
ApiCFBalanceTransferStatusResponseDTO exchangeTransferStatus(@JSONBody Map<String, Object> parameters);
/**
*
*

View File

@ -0,0 +1,96 @@
package com.ff.game.api.fc.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* api cfbalancedto
*
* @author shi
* @date 2025/04/08
*/
@Data
public class ApiCFBalanceTransferStatusResponseDTO {
/**
*
* 0
*/
@JsonProperty("Result")
private int result;
/**
* ID
*/
@JsonProperty("bankID")
private int bankId;
/**
* ID
*/
@JsonProperty("trsID")
private String trsId;
/**
*
*/
@JsonProperty("action")
private String action;
/**
*
*/
@JsonProperty("points")
private BigDecimal points;
/**
*
*/
@JsonProperty("account")
private String account;
/**
*
* 1:
*/
@JsonProperty("status")
private int status;
/**
*
*/
@JsonProperty("beforepoints")
private BigDecimal beforePoints;
/**
*
*/
@JsonProperty("afterpoints")
private BigDecimal afterPoints;
/**
*
*/
@JsonProperty("cdate")
private String createDate;
/**
*
*/
@JsonProperty("bdate")
private String updateDate;
/**
* ID
*/
@JsonProperty("eventID")
private String eventId;
/**
*
*/
@JsonProperty("currency")
private String currency;
}

View File

@ -14,6 +14,7 @@ import com.ff.base.utils.StringUtils;
import com.ff.base.utils.sign.Md5Utils;
import com.ff.config.KeyConfig;
import com.ff.game.api.IGamesService;
import com.ff.game.api.dg.dto.DGTransactionResponseDTO;
import com.ff.game.api.fc.client.FCClient;
import com.ff.game.api.fc.dto.*;
import com.ff.game.api.request.*;
@ -258,7 +259,6 @@ public class GamesFCServiceImpl implements IGamesService {
ApiFCGameListResponseDTO.GameDetails gameDetails = integerGameDetailsMap.get(gameIdKey);
Game game = Game.builder()
//.platformId(gamePlatform.getId())
.platformCode(GamePlatforms.FC.getCode())
.gameCode(gameIdKey)
.build();
@ -269,41 +269,23 @@ public class GamesFCServiceImpl implements IGamesService {
game.setGameSourceType(String.valueOf(PlatformType.ELECTRONIC.getCode()));
game.setFreespin(Boolean.FALSE);
game.setDemoStatus(Boolean.TRUE);
game.setPlatformCode(GamePlatforms.FC.getCode());
game.setPlatformType(platformType);
game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.FC.getCode()) + 1);
game.setGameName(gameDetails.getGameNameOfChinese());
game.setCreateBy(Constants.SYSTEM);
game.setPlatformCode(GamePlatforms.FC.getCode());
game.setPlatformType(platformType);
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(NameInfo.builder().lang("zh-CN").name(gameDetails.getGameNameOfChinese()).build());
nameInfos.add(NameInfo.builder().lang("en-US").name(gameDetails.getGameNameOfEnglish()).build());
game.setNameInfo(nameInfos);
game.setGameId(StringUtils.addSuffix(GamePlatforms.FC.getCode(), gameIdKey));
gameService.insertGame(game);
} else {
game = games.get(0);
}
gameDetails.setSystemGameId(game.getId());
/*List<GameName> gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(gameDetails.getGameNameOfChinese()).build());
if (CollectionUtils.isEmpty(gameNames)) {
gameNameService.insertGameName(GameName.builder()
.gameId(game.getId())
.gameName(gameDetails.getGameNameOfChinese())
.langCode("zh-CN")
.createBy(Constants.SYSTEM)
.build());
}
gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(gameDetails.getGameNameOfEnglish()).build());
if (CollectionUtils.isEmpty(gameNames)) {
gameNameService.insertGameName(GameName.builder()
.gameId(game.getId())
.gameName(gameDetails.getGameNameOfEnglish())
.langCode("en-US")
.createBy(Constants.SYSTEM)
.build());
}*/
gameDetails.setGameId(gameIdKey);
gameDetailsList.add(gameDetails);
}
@ -330,11 +312,6 @@ public class GamesFCServiceImpl implements IGamesService {
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesFCServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .platformCode(GamePlatforms.FC.getInfo())
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
// .currency(exchangeTransferMoneyRequestDTO.getCurrency())
// .build());
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.FC.getInfo(), 30);
@ -360,6 +337,11 @@ public class GamesFCServiceImpl implements IGamesService {
.platformCode(GamePlatforms.FC.getInfo())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
//获取余额
String type = TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType()) ? FCTransferType.TRANSFER_OUT_ALL.getValue() : FCTransferType.TRANSFER_OUT.getValue();
@ -398,10 +380,13 @@ public class GamesFCServiceImpl implements IGamesService {
exchangeMoney.setCoinAfter(transferResponseDTO.getAfterPoint());
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
exchangeMoney.setStatus(StatusType.SUCCESS.getValue());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
log.error("GamesFCServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", transferResponseDTO.getResult());
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
}
@ -412,11 +397,30 @@ public class GamesFCServiceImpl implements IGamesService {
*
*
* @param exchangeTransferMoneyRequestDTO dto
* @return {@link Boolean }
* @return {@link ExchangeTransferStatusResponseDTO }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesDGServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
Map<String, Object> paramsMap = new LinkedHashMap<>();
paramsMap.put("TrsID", exchangeTransferMoneyRequestDTO.getOrderId());
paramsMap.putAll(getKeyMap(paramsMap, exchangeTransferMoneyRequestDTO.getAgentKey(), exchangeTransferMoneyRequestDTO.getCurrency(), exchangeTransferMoneyRequestDTO.getAgentId()));
ApiCFBalanceTransferStatusResponseDTO apiCFBalanceTransferStatusResponseDTO = FCClient.exchangeTransferStatus(paramsMap);
Integer status = StatusType.IN_PROGRESS.getValue();
if (this.getIsSuccess(apiCFBalanceTransferStatusResponseDTO.getResult())) {
status = StatusType.SUCCESS.getValue();
} else {
status = StatusType.FAILURE.getValue();
}
return ExchangeTransferStatusResponseDTO.builder()
.statusType(status)
.balance(apiCFBalanceTransferStatusResponseDTO.getPoints())
.coinBefore(apiCFBalanceTransferStatusResponseDTO.getBeforePoints())
.coinAfter(apiCFBalanceTransferStatusResponseDTO.getAfterPoints())
.build();
}
@ -430,37 +434,29 @@ public class GamesFCServiceImpl implements IGamesService {
@Override
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
// List<GameSecretKeyCurrencyDTO> gameSecretKeyCurrencies = gameSecretKeyCurrencyService
// .findByGameSecretKeyCurrencyDTOList(GameSecretKeyCurrencyDTO.builder()
// .platformCode(GamePlatforms.FC.getInfo())
// .build());
Platform platform = betRecordByTimeDTO.getVendor();
//for (KeyInfo keyInfo : platform.getKeyInfo()) {
// for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) {
String startTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getStartTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
String endTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getEndTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("StartDate", startTime);
paramsMap.put("EndDate", endTime);
KeyInfo keyInfo = betRecordByTimeDTO.getKeyInfo();
String currency = keyInfo.getCurrency();
String targetCurrency = platform.getCurrencyInfo().get(currency);
if (StringUtils.isEmpty(targetCurrency)) {
log.error("获取不到币种,platformCode:{},{}->{}", platform.getPlatformCode(), currency, targetCurrency);
//continue;
return Boolean.FALSE;
}
String startTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getStartTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
String endTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getEndTime(), "America/New_York", DateUtils.YYYY_MM_DD_HH_MM_SS);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("StartDate", startTime);
paramsMap.put("EndDate", endTime);
KeyInfo keyInfo = betRecordByTimeDTO.getKeyInfo();
String currency = keyInfo.getCurrency();
String targetCurrency = platform.getCurrencyInfo().get(currency);
if (StringUtils.isEmpty(targetCurrency)) {
log.error("获取不到币种,platformCode:{},{}->{}", platform.getPlatformCode(), currency, targetCurrency);
return Boolean.FALSE;
}
paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), keyInfo.getCurrency(), betRecordByTimeDTO.getAgentId()));
paramsMap.putAll(getKeyMap(paramsMap, betRecordByTimeDTO.getAgentKey(), keyInfo.getCurrency(), betRecordByTimeDTO.getAgentId()));
ApiFCBetRecordResponseDTO betRecordByTime = FCClient.getBetRecordByTime(paramsMap);
ApiFCBetRecordResponseDTO betRecordByTime = FCClient.getBetRecordByTime(paramsMap);
if (this.getIsSuccess(betRecordByTime.getResult())) {
//数据组装
this.batchInsert(betRecordByTime, currency, targetCurrency);
}
//}
if (this.getIsSuccess(betRecordByTime.getResult())) {
//数据组装
this.batchInsert(betRecordByTime, currency, targetCurrency);
}
return Boolean.TRUE;
}
@ -476,7 +472,7 @@ public class GamesFCServiceImpl implements IGamesService {
Platform platform = betRecordByTimeDTO.getVendor();
for (KeyInfo keyInfo : platform.getKeyInfo()) {
// for (GameSecretKeyCurrency gameSecretKeyCurrency : gameSecretKeyCurrencies) {
//必须两个小时之前的数据
long startTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getStartTime(), -120);
long endTimeLong = DateUtils.addOrSubtractMinutes(betRecordByTimeDTO.getEndTime(), -120);

View File

@ -24,7 +24,7 @@ public class MyJILIAddressSource implements AddressSource {
@Override
public ForestAddress getAddress(ForestRequest request) {
String apiBaseUrl = platformService.get(GamePlatforms.FC.getCode())
String apiBaseUrl = platformService.get(GamePlatforms.JILI.getCode())
.getUrlInfo().getUrl();
return new ForestAddress("https", apiBaseUrl, 443, "api1");
}

View File

@ -63,6 +63,22 @@ public interface JILIClient {
)
JILIExchangeMoneyResponseDTO exchangeTransferByAgentId(@Var("parameters") String parameters,@Body("AgentId") String agentId);
/**
* id
*
* @param parameters
* @param agentId id
* @return {@link JILITransferStatusResponseDTO }
*/
@Post(
url = "/CheckTransferByTransactionId?${parameters}",
headers = {
"Content-type: application/x-www-form-urlencoded"
}
)
JILITransferStatusResponseDTO checkTransferByTransactionId(@Var("parameters") String parameters,@Body("AgentId") String agentId);
/**
*
*

View File

@ -0,0 +1,78 @@
package com.ff.game.api.jili.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* jilitransfer
*
* @author shi
* @date 2025/04/08
*/
@Data
public class JILITransferStatusResponseDTO {
/**
* 0
*/
@JsonProperty("ErrorCode")
private int errorCode;
/**
*
*/
@JsonProperty("Message")
private String message;
/**
*
*/
@JsonProperty("Data")
private TransferData data;
/**
*
*/
@Data
public static class TransferData {
/**
*
*/
@JsonProperty("Account")
private String account;
/**
* ID
*/
@JsonProperty("TransactionId")
private String transactionId;
/**
* ISO 86012023-03-13T01:13:59-04:00
*/
@JsonProperty("TransferTime")
private String transferTime;
/**
*
*/
@JsonProperty("Amount")
private BigDecimal amount;
/**
* 1
*/
@JsonProperty("Status")
private int status;
/**
* 1 2
*/
@JsonProperty("TransferType")
private int transferType;
}
}

View File

@ -15,6 +15,7 @@ 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.fc.dto.ApiCFBalanceTransferStatusResponseDTO;
import com.ff.game.api.jili.client.JILIClient;
import com.ff.game.api.jili.dto.*;
import com.ff.game.api.request.*;
@ -226,23 +227,8 @@ public class GamesJILIServiceImpl implements IGamesService {
if (this.getIsSuccess(jiliGames.getErrorCode())) {
for (JILIGamesDataDTO gamesDataDTO : jiliGames.getData()) {
/*GamePlatform gamePlatform = GamePlatform.builder()
.platformType(JILIGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()))
.platformCode(GamePlatforms.JILI.getInfo())
.build();
List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
//没有此平台就新增一个平台
if (CollectionUtils.isEmpty(gamePlatforms)) {
gamePlatform.setPlatformName(GamePlatforms.JILI.getInfo() + JILIGameType.findInfoByCode(gamesDataDTO.getGameCategoryId()));
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
gamePlatform.setCreateBy(Constants.SYSTEM);
gamePlatformService.insertGamePlatform(gamePlatform);
} else {
gamePlatform = gamePlatforms.get(0);
}*/
Integer platformType = JILIGameType.findSystemByCode(gamesDataDTO.getGameCategoryId());
Game game = Game.builder()
//.platformId(gamePlatform.getId())
.platformCode(GamePlatforms.JILI.getCode())
.platformType(platformType)
.gameCode(String.valueOf(gamesDataDTO.getGameId()))
@ -257,7 +243,7 @@ public class GamesJILIServiceImpl implements IGamesService {
game.setCreateBy(Constants.SYSTEM);
game.setPlatformType(platformType);
game.setPlatformCode(GamePlatforms.JILI.getCode());
game.setGameId(StringUtils.addSuffix(GamePlatforms.JILI.getCode(), gamesDataDTO.getGameId()));
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(gamesDataDTO.getName().getZhCN(), "zh-CN"));
nameInfos.add(new NameInfo(gamesDataDTO.getName().getEnUS(), "en-US"));
@ -270,27 +256,6 @@ public class GamesJILIServiceImpl implements IGamesService {
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());
gameNameService.insertGameName(GameName.builder()
.gameId(game.getId())
.gameName(gamesDataDTO.getName().getEnUS())
.langCode("en-US")
.createBy(Constants.SYSTEM)
.build());
}*/
}
redisCache.deleteObject(CacheConstants.JILI_GAMES);
@ -313,9 +278,6 @@ public class GamesJILIServiceImpl implements IGamesService {
@Override
@Transactional
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
// .currency(exchangeTransferMoneyRequestDTO.getCurrency()).build());
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
String transactionId = GamePlatforms.JILI.getInfo() + IdUtils.simpleUUID();
@ -343,8 +305,12 @@ public class GamesJILIServiceImpl implements IGamesService {
.platformCode(GamePlatforms.JILI.getInfo())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
//接口限制限制50字符
exchangeMoney.setTransactionId(transactionId);
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
String query = "Account=" + exchangeTransferMoneyRequestDTO.getAccount()
+ "&TransactionId=" + exchangeMoney.getTransactionId()
+ "&Amount=" + exchangeTransferMoneyRequestDTO.getAmount()
@ -371,10 +337,14 @@ public class GamesJILIServiceImpl implements IGamesService {
exchangeMoney.setCoinAfter(exchangeMoneyResponseData.getCoinAfter());
exchangeMoney.setCurrencyBefore(exchangeMoneyResponseData.getCurrencyBefore());
exchangeMoney.setCurrencyAfter(exchangeMoneyResponseData.getCurrencyAfter());
exchangeMoney.setStatus(exchangeMoneyResponseData.getStatus());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
throw new BaseException(exchangeMoneyResponse.getMessage());
}
@ -389,8 +359,32 @@ public class GamesJILIServiceImpl implements IGamesService {
* @return {@link Boolean }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
return Boolean.TRUE;
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesDGServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
String query = "TransactionId=" + exchangeTransferMoneyRequestDTO.getOrderId()
+ "&AgentId=" + exchangeTransferMoneyRequestDTO.getAgentId();
exchangeTransferMoneyRequestDTO.setQuery(query);
String key = this.getKey(exchangeTransferMoneyRequestDTO);
JILITransferStatusResponseDTO jiliTransferStatusResponseDTO = jiliClient.checkTransferByTransactionId(query + "&Key=" + key, exchangeTransferMoneyRequestDTO.getAgentId());
Integer status = StatusType.IN_PROGRESS.getValue();
if (this.getIsSuccess(jiliTransferStatusResponseDTO.getErrorCode())) {
status = StatusType.SUCCESS.getValue();
} else {
status = StatusType.FAILURE.getValue();
}
JILITransferStatusResponseDTO.TransferData data = jiliTransferStatusResponseDTO.getData();
ExchangeTransferStatusResponseDTO statusResponseDTO = ExchangeTransferStatusResponseDTO.builder()
.statusType(status)
.build();
if (!ObjectUtils.isEmpty(data)) {
statusResponseDTO.setBalance(data.getAmount());
}
return statusResponseDTO;
}
@ -452,7 +446,45 @@ public class GamesJILIServiceImpl implements IGamesService {
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
return null;
String startTime = DateUtils.formatDateToGMT4(new Date(betRecordByTimeDTO.getStartTime()));
String endTime = DateUtils.formatDateToGMT4(new Date(betRecordByTimeDTO.getEndTime()));
//请求参数
String query = "StartTime=" + startTime + "&EndTime=" + endTime + "&Page=" + betRecordByTimeDTO.getPage() + "&PageLimit=" + betRecordByTimeDTO.getPageLimit() + "&AgentId=" + betRecordByTimeDTO.getAgentId();
log.info("GamesJILIServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", query);
betRecordByTimeDTO.setQuery(query);
//获取key
String key = this.getKey(betRecordByTimeDTO);
JILIBetRecordResponseDTO betRecordJILIResponse = jiliClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId());
//判断是否获取成功
if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) {
//数据插入
this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO);
JILIBetRecordResponseDTO.DataBean dataBean = betRecordJILIResponse.getData();
//获取下一页数据
while (dataBean.getPagination().getCurrentPage() != dataBean.getPagination().getTotalPages() && dataBean.getPagination().getTotalPages() > 0) {
betRecordByTimeDTO.setPage(dataBean.getPagination().getCurrentPage() + 1);
//请求参数
query = "StartTime=" + startTime + "&EndTime=" + endTime + "&Page=" + betRecordByTimeDTO.getPage() + "&PageLimit=" + betRecordByTimeDTO.getPageLimit() + "&AgentId=" + betRecordByTimeDTO.getAgentId();
log.info("GamesJILIServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", query);
betRecordByTimeDTO.setQuery(query);
key = this.getKey(betRecordByTimeDTO);
betRecordJILIResponse = jiliClient.getBetRecordByTime(query + "&Key=" + key, betRecordByTimeDTO.getAgentId());
dataBean = betRecordJILIResponse.getData();
if (this.getIsSuccess(betRecordJILIResponse.getErrorCode())) {
//数据插入
this.batchInsert(betRecordJILIResponse, betRecordByTimeDTO);
} else {
log.error("GameBettingDataJILIServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage());
}
}
} else {
log.error("GameBettingDataJILIServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordJILIResponse.getErrorCode(), betRecordJILIResponse.getMessage());
return Boolean.FALSE;
}
return Boolean.TRUE;
}
@ -467,9 +499,6 @@ public class GamesJILIServiceImpl implements IGamesService {
String freeSpinValidity = DateUtils.formatDateToGMT4(new Date(createFreeSpinRequest.getFreeSpinValidity()));
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .code(createFreeSpinRequest.getAgentId())
// .currency(createFreeSpinRequest.getCurrency()).build());
List<Long> gameIds = createFreeSpinRequest.getGameIds();
GameUniqueDTO gameUniqueDTO = new GameUniqueDTO();
@ -678,7 +707,6 @@ public class GamesJILIServiceImpl implements IGamesService {
//请求参数
String query = "ReferenceId=" + cancelFreeSpinRequestDTO.getReferenceId()
+ "&AgentId=" + cancelFreeSpinRequestDTO.getAgentId();
;
log.info("GamesJILIServiceImpl [cancelFreeSpin] 请求参数 {}", query);
cancelFreeSpinRequestDTO.setQuery(query);
//获取key
@ -717,7 +745,7 @@ public class GamesJILIServiceImpl implements IGamesService {
* @param betRecordJILIResponse jiliresponse
* @return {@link Integer }
*/
private void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse, BetRecordByTimeDTO betRecordByTimeDTO) {
private synchronized void batchInsert(JILIBetRecordResponseDTO betRecordJILIResponse, BetRecordByTimeDTO betRecordByTimeDTO) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<String> wagersIds = new ArrayList<>();
//数据组装
@ -761,10 +789,6 @@ public class GamesJILIServiceImpl implements IGamesService {
//转化类
JILIBetRecordDataResponseDTO jiliBetRecordDataResponseDTO = (JILIBetRecordDataResponseDTO) gamesDataBuildDTO.getData();
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .code(jiliBetRecordDataResponseDTO.getAgentId())
// .platformCode(GamePlatforms.JILI.getInfo()).build());
Member member = memberService.selectMemberByGameAccount(jiliBetRecordDataResponseDTO.getAccount());
if (ObjectUtils.isEmpty(member)) {

View File

@ -3,6 +3,7 @@ package com.ff.game.api.km.client;
import com.dtflys.forest.annotation.*;
import com.ff.game.api.dg.dto.DGResponse;
import com.ff.game.api.fc.dto.ApiCFBalanceTransferStatusResponseDTO;
import com.ff.game.api.km.address.MyKMAddressSource;
import com.ff.game.api.km.dto.*;
import com.ff.game.api.success.MySuccessCondition;
@ -78,6 +79,16 @@ public interface KMClient {
@Get(url ="/v2/history/bets?{params}")
KMBetRecordResponse getBetRecordByTime(@Var("params")String params, @Header Map<String, Object> header);
/**
*
*
* @param params
* @param parameters
* @return {@link KMBalanceTransferStatusResponseDTO }
*/
@Post(url = "/history/transfers/{params}")
KMBalanceTransferStatusResponseDTO exchangeTransferStatus(@Var("params")String params,@JSONBody Map<String, Object> parameters);
/**
*

View File

@ -0,0 +1,77 @@
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/08
*/
@Data
public class KMBalanceTransferStatusResponseDTO {
/**
*
*/
@JsonProperty("err")
private Integer errorCode;
/**
*
*/
@JsonProperty("errdesc")
private String errorDescription;
/**
* ID
*/
@JsonProperty("txid")
private String txid;
/**
* ISO 86012017-12-12T12:11:16+08:00
*/
@JsonProperty("timestamp")
private String timestamp;
/**
* ID
*/
@JsonProperty("userid")
private String userid;
/**
*
*/
@JsonProperty("username")
private String username;
/**
* 1
*/
@JsonProperty("playertype")
private int playertype;
/**
*
*/
@JsonProperty("amt")
private BigDecimal amt;
/**
*
*/
@JsonProperty("postbal")
private BigDecimal postbal;
/**
* ISO 4217 THB
*/
@JsonProperty("cur")
private String cur;
}

View File

@ -15,6 +15,8 @@ import com.ff.base.utils.ip.IpUtils;
import com.ff.base.utils.uuid.IdUtils;
import com.ff.config.KeyConfig;
import com.ff.game.api.IGamesService;
import com.ff.game.api.fc.dto.ApiCFBalanceTransferStatusResponseDTO;
import com.ff.game.api.jili.dto.JILITransferStatusResponseDTO;
import com.ff.game.api.km.client.KMClient;
import com.ff.game.api.km.dto.*;
import com.ff.game.api.request.*;
@ -78,21 +80,6 @@ public class GamesKMServiceImpl implements IGamesService {
private IGameBettingDetailsService gameBettingDetailsService;
/**
* 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;
/**
*
*
@ -168,11 +155,7 @@ public class GamesKMServiceImpl implements IGamesService {
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", memberInfoRequestDTO.getCurrency());
@ -196,11 +179,7 @@ public class GamesKMServiceImpl implements IGamesService {
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())
@ -213,7 +192,6 @@ public class GamesKMServiceImpl implements IGamesService {
}
String loginUrl = platformService.get(GamePlatforms.KM.getCode()).getUrlInfo().getLoginUrl();
//String selectConfigByKey = configService.selectConfigByKey(Constants.KM_API_BASE_LOGIN_URL);
return loginUrl + "/gamelauncher?gpcode=" + gamesLogin.getGameType()
+ "&gcode=" + gamesLogin.getGameId()
@ -269,23 +247,9 @@ public class GamesKMServiceImpl implements IGamesService {
.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);
}*/
Integer platformType = KMGameType.findSystemByCode(game.getProviderCode());
Game gameOne = Game.builder()
//.platformId(gamePlatform.getId())
.platformCode(GamePlatforms.KM.getCode())
.platformType(platformType)
.gameCode(game.getCode())
@ -312,23 +276,8 @@ public class GamesKMServiceImpl implements IGamesService {
*/
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);
}*/
Integer platformType = KMGameType.findSystemByCode(gamesDataDTO.getProviderCode());
Game game = Game.builder()
//.platformId(gamePlatform.getId())
.platformCode(GamePlatforms.KM.getCode())
.platformType(platformType)
.gameCode(gamesDataDTO.getCode())
@ -345,6 +294,7 @@ public class GamesKMServiceImpl implements IGamesService {
game.setIngress(ingress);
game.setPlatformCode(GamePlatforms.KM.getCode());
game.setPlatformType(platformType);
game.setGameId(StringUtils.addSuffix(GamePlatforms.KM.getCode(), gamesDataDTO.getCode()));
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN"));
game.setNameInfo(nameInfos);
@ -353,16 +303,6 @@ public class GamesKMServiceImpl implements IGamesService {
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();
}
@ -377,10 +317,7 @@ public class GamesKMServiceImpl implements IGamesService {
@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();
@ -406,6 +343,11 @@ public class GamesKMServiceImpl implements IGamesService {
.platformCode(GamePlatforms.KM.getInfo())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount();
if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) {
@ -443,9 +385,13 @@ public class GamesKMServiceImpl implements IGamesService {
exchangeMoney.setCoinAfter(kmTransactionResponse.getBalance());
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
exchangeMoney.setStatus(StatusType.SUCCESS.getValue());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
log.error("GamesDGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", kmTransactionResponse.getErrorCode(), kmTransactionResponse.getErrorDescription());
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
}
@ -460,8 +406,25 @@ public class GamesKMServiceImpl implements IGamesService {
* @return {@link Boolean }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
return Boolean.TRUE;
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesKMServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
Map<String, Object> headerMap = this.getKey(exchangeTransferMoneyRequestDTO);
KMBalanceTransferStatusResponseDTO kmBalanceTransferStatusResponseDTO = KMClient.exchangeTransferStatus(exchangeTransferMoneyRequestDTO.getOrderId(), headerMap);
Integer status = StatusType.IN_PROGRESS.getValue();
if (ObjectUtils.isEmpty(kmBalanceTransferStatusResponseDTO.getErrorCode()) || this.getIsSuccess(kmBalanceTransferStatusResponseDTO.getErrorCode())) {
status = StatusType.SUCCESS.getValue();
} else {
status = StatusType.FAILURE.getValue();
}
return ExchangeTransferStatusResponseDTO.builder()
.statusType(status)
.balance(kmBalanceTransferStatusResponseDTO.getAmt())
.coinBefore(NumberUtil.sub(kmBalanceTransferStatusResponseDTO.getAmt(), kmBalanceTransferStatusResponseDTO.getPostbal()).abs())
.coinAfter(kmBalanceTransferStatusResponseDTO.getPostbal())
.build();
}
@ -514,7 +477,35 @@ public class GamesKMServiceImpl implements IGamesService {
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
return null;
log.info("GamesKMServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", 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, betRecordByTimeDTO);
return Boolean.TRUE;
} else {
log.error("GamesKMServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getErrorCode(), betRecordByTime.getErrorDescription());
throw new BaseException(betRecordByTime.getErrorDescription());
}
}
/**
@ -661,11 +652,7 @@ public class GamesKMServiceImpl implements IGamesService {
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());
@ -678,7 +665,6 @@ public class GamesKMServiceImpl implements IGamesService {
e -> e,
(existing, replacement) -> existing
));
;
KMGameResponse.Game gamesDataDTO = dataDTOMap.get(resultBean.getGCode());
//输赢状态
@ -702,7 +688,7 @@ public class GamesKMServiceImpl implements IGamesService {
.gameCode(gamesDataDTO.getCode())
.gameType(PlatformType.CARD_GAME.getCode())
.platformCode(GamePlatforms.KM.getCode())
.gameId(GAME_ID)
.gameId(gamesDataDTO.getSystemGameId())
.gameName(gamesDataDTO.getName())
.gameStatus(gameStatus)
.gameStatusType(1)

View File

@ -3,6 +3,7 @@ package com.ff.game.api.meitian.client;
import com.dtflys.forest.annotation.Address;
import com.dtflys.forest.annotation.Post;
import com.dtflys.forest.annotation.Var;
import com.ff.game.api.km.dto.KMBalanceTransferStatusResponseDTO;
import com.ff.game.api.meitian.address.MeiTianAddressSource;
import com.ff.game.api.meitian.dto.*;
@ -103,6 +104,22 @@ public interface MeiTianClient {
@Var("data") String data
);
/**
*
*
* @param merchantId ID
* @param playerName
* @param coins
* @return {@link MeiTianBalanceTransferStatusResponseDTO }
*/
@Post("dg/player/queryTransbyId/{playerName}/{merchantId}/{extTransId}")
MeiTianBalanceTransferStatusResponseDTO exchangeTransferStatus(
@Var("playerName") String merchantId,
@Var("merchantId") String playerName,
@Var("extTransId") String coins
);
/**
* recordId
*

View File

@ -0,0 +1,69 @@
package com.ff.game.api.meitian.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* dto
*
* @author shi
* @date 2025/04/08
*/
@Data
public class MeiTianBalanceTransferStatusResponseDTO {
/**
*
*/
@JsonProperty("resultCode")
private Integer resultCode;
/**
* ID
*/
@JsonProperty("transId")
private String transId;
/**
* yyyy-MM-dd HH:mm:ss
*/
@JsonProperty("transTime")
private String transTime;
/**
*
*/
@JsonProperty("transType")
private String transType;
/**
*
*/
@JsonProperty("transCoins")
private BigDecimal transCoins;
/**
*
*/
@JsonProperty("curBalance")
private BigDecimal curBalance;
/**
* GMT+8
*/
@JsonProperty("timeZone")
private String timeZone;
/**
* 1
*/
@JsonProperty("status")
private String status;
/**
* CNY
*/
@JsonProperty("currency")
private String currency;
}

View File

@ -2,6 +2,7 @@ package com.ff.game.api.meitian.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson2.JSON;
import com.ff.base.constant.CacheConstants;
import com.ff.base.constant.Constants;
@ -12,9 +13,11 @@ import com.ff.base.exception.base.BaseException;
import com.ff.base.system.domain.SysConfig;
import com.ff.base.system.service.impl.SysConfigServiceImpl;
import com.ff.base.utils.DateUtils;
import com.ff.base.utils.StringUtils;
import com.ff.base.utils.sign.Md5Utils;
import com.ff.base.utils.uuid.IdUtils;
import com.ff.game.api.IGamesService;
import com.ff.game.api.km.dto.KMBalanceTransferStatusResponseDTO;
import com.ff.game.api.meitian.client.MeiTianClient;
import com.ff.game.api.meitian.dto.*;
import com.ff.game.api.request.*;
@ -51,7 +54,7 @@ import java.util.stream.Collectors;
* @author shi
* @date 2024/10/21
*/
@Service("MeiTianService")
@Service("MTService")
@Slf4j
public class MeiTianGameServiceImpl implements IGamesService {
@ -217,23 +220,8 @@ public class MeiTianGameServiceImpl implements IGamesService {
MeiTianGamesDTO gameList = new MeiTianGamesDTO();
for (MeiTianGameDataDTO gamesDataDTO : gameList.getData()) {
/* GamePlatform gamePlatform = GamePlatform.builder()
.platformType(MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()))
.platformCode(GamePlatforms.MT.getCode())
.build();
List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
//没有此平台就新增一个平台
if (CollectionUtils.isEmpty(gamePlatforms)) {
gamePlatform.setPlatformName(GamePlatforms.MT.getInfo() + MeiTianGameType.findInfoByCode(gamesDataDTO.getGameCategoryId()));
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
gamePlatform.setCreateBy(Constants.SYSTEM);
gamePlatformService.insertGamePlatform(gamePlatform);
} else {
gamePlatform = gamePlatforms.get(0);
}*/
Integer platformType = MeiTianGameType.findSystemByCode(gamesDataDTO.getGameCategoryId());
Game game = Game.builder()
//.platformId(gamePlatform.getId())
.platformCode(GamePlatforms.MT.getCode())
.platformType(platformType)
.gameCode(String.valueOf(gamesDataDTO.getGameId()))
@ -248,7 +236,7 @@ public class MeiTianGameServiceImpl implements IGamesService {
game.setCreateBy(Constants.SYSTEM);
game.setPlatformType(platformType);
game.setPlatformCode(GamePlatforms.MT.getCode());
game.setGameId(StringUtils.addSuffix(GamePlatforms.MT.getCode(), gamesDataDTO.getGameId()));
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(gamesDataDTO.getCnName(), "zh-CN"));
nameInfos.add(new NameInfo(gamesDataDTO.getEnName(), "en-US"));
@ -259,22 +247,6 @@ public class MeiTianGameServiceImpl implements IGamesService {
}
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());
gameNameService.insertGameName(GameName.builder()
.gameId(game.getId())
.gameName(gamesDataDTO.getEnName())
.langCode("en-US")
.createBy(Constants.SYSTEM)
.build());
}*/
}
redisCache.deleteObject(CacheConstants.MeiTian_GAMES);
@ -293,9 +265,6 @@ public class MeiTianGameServiceImpl implements IGamesService {
@Override
@Transactional
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
// .currency(exchangeTransferMoneyRequestDTO.getCurrency()).build());
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
String transactionId = GamePlatforms.MT.getCode() + IdUtils.simpleUUID();
@ -323,15 +292,25 @@ public class MeiTianGameServiceImpl implements IGamesService {
.platformCode(GamePlatforms.MT.getCode())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
//接口限制限制50字符
exchangeMoney.setTransactionId(transactionId);
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
// String key = gameSecretKey.getKey();
String key = exchangeTransferMoneyRequestDTO.getAgentKey();
String merchantId = exchangeTransferMoneyRequestDTO.getAgentId();
String playerName = exchangeTransferMoneyRequestDTO.getAccount();
String coins = exchangeTransferMoneyRequestDTO.getAmount().setScale(4, RoundingMode.DOWN).toString();
if (exchangeTransferMoneyRequestDTO.getTransferType().equals(TransferType.ALL.getCode())){
MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder()
.accounts(member.getGameAccount())
.agentId(exchangeTransferMoneyRequestDTO.getAgentId())
.currency(exchangeTransferMoneyRequestDTO.getCurrency())
.agentKey(exchangeTransferMoneyRequestDTO.getAgentKey())
.build();
coins = this.getMemberInfo(gamesBaseRequestDTO).getBalance().setScale(4, RoundingMode.DOWN).toString();
}
Map<String, String> rawMap = new LinkedHashMap<>();
rawMap.put("merchantId", merchantId);
rawMap.put("playerName", playerName);
@ -362,16 +341,21 @@ public class MeiTianGameServiceImpl implements IGamesService {
//判断是否转移成功
if (this.isSuccess(exchangeMoneyResponse.getErrorCode())) {
//更新数据
exchangeMoney.setBalance(exchangeMoneyResponse.getBalance());
BigDecimal transAmount = exchangeTransferMoneyRequestDTO.getAmount();
BigDecimal transAmount =new BigDecimal(coins);
exchangeMoney.setBalance(transAmount);
exchangeMoney.setCoinBefore(exchangeMoneyResponse.getBalance().subtract(transAmount));
exchangeMoney.setCoinAfter(exchangeMoneyResponse.getBalance());
exchangeMoney.setCurrencyBefore(exchangeMoneyResponse.getBalance().subtract(transAmount));
exchangeMoney.setCurrencyAfter(exchangeMoneyResponse.getBalance());
exchangeMoney.setStatus(1); // SUCCESS
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
throw new BaseException(MeiTianExchangeMoneyResponseDTO.TransferIn.get(exchangeMoneyResponse.getErrorCode()).getMessage());
}
@ -390,15 +374,20 @@ public class MeiTianGameServiceImpl implements IGamesService {
//判断是否转移成功
if (this.isSuccess(exchangeMoneyResponse.getErrorCode())) {
//更新数据
exchangeMoney.setBalance(exchangeMoneyResponse.getBalance());
BigDecimal transAmount = exchangeTransferMoneyRequestDTO.getAmount();
BigDecimal transAmount =new BigDecimal(coins);
exchangeMoney.setBalance(transAmount);
exchangeMoney.setCoinBefore(exchangeMoneyResponse.getBalance().add(transAmount));
exchangeMoney.setCoinAfter(exchangeMoneyResponse.getBalance());
exchangeMoney.setCurrencyBefore(exchangeMoneyResponse.getBalance().add(transAmount));
exchangeMoney.setCurrencyAfter(exchangeMoneyResponse.getBalance());
exchangeMoney.setStatus(1); // SUCCESS
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
throw new BaseException(MeiTianExchangeMoneyResponseDTO.TransferOut.get(exchangeMoneyResponse.getErrorCode()).getMessage());
}
}
@ -412,8 +401,30 @@ public class MeiTianGameServiceImpl implements IGamesService {
* @return {@link Boolean }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
return Boolean.TRUE;
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("MeiTianGameServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
String merchantId = exchangeTransferMoneyRequestDTO.getAgentId();
String playerName = exchangeTransferMoneyRequestDTO.getAccount();
MeiTianBalanceTransferStatusResponseDTO meiTianBalanceTransferStatusResponseDTO = meiTianClient.exchangeTransferStatus(
playerName,
merchantId,
exchangeTransferMoneyRequestDTO.getOrderId()
);
Integer status = StatusType.IN_PROGRESS.getValue();
if (this.isSuccess(meiTianBalanceTransferStatusResponseDTO.getResultCode())&& "1".equals(meiTianBalanceTransferStatusResponseDTO.getStatus())) {
status = StatusType.SUCCESS.getValue();
} else {
status = StatusType.FAILURE.getValue();
}
return ExchangeTransferStatusResponseDTO.builder()
.statusType(status)
.balance(meiTianBalanceTransferStatusResponseDTO.getTransCoins())
.coinBefore(NumberUtil.sub(meiTianBalanceTransferStatusResponseDTO.getTransCoins(), meiTianBalanceTransferStatusResponseDTO.getCurBalance()).abs())
.coinAfter(meiTianBalanceTransferStatusResponseDTO.getCurBalance())
.build();
}

View File

@ -18,7 +18,6 @@ public class MyNGAddressSource implements AddressSource {
@Override
public ForestAddress getAddress(ForestRequest request) {
//String apiBaseUrl = configService.selectConfigByKey(Constants.NG_API_BASE_URL);
String apiBaseUrl = platformService.get(GamePlatforms.PG.getCode())
.getUrlInfo().getUrl();
return new ForestAddress("https", apiBaseUrl, 443, "api");

View File

@ -232,23 +232,8 @@ public class GamesPGServiceImpl implements IGamesService {
ApiNGResponseDTO<List<ApiGameInfoResponseDTO>> gameList = ngClient.getGameList(paramsMap, headerMap);
if (this.getIsSuccess(gameList.getCode())) {
for (ApiGameInfoResponseDTO apiGameInfoResponseDTO : gameList.getData()) {
/*GamePlatform gamePlatform = GamePlatform.builder()
.platformType(NGGameType.findSystemByCode(apiGameInfoResponseDTO.getGameType()))
.platformCode(GamePlatforms.PG.getCode())
.build();
List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
//没有此平台就新增一个平台
if (CollectionUtils.isEmpty(gamePlatforms)) {
gamePlatform.setPlatformName(GamePlatforms.PG.getInfo() + NGGameType.findInfoByCode(apiGameInfoResponseDTO.getGameType()));
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
gamePlatform.setCreateBy(Constants.SYSTEM);
gamePlatformService.insertGamePlatform(gamePlatform);
} else {
gamePlatform = gamePlatforms.get(0);
}*/
Integer platformType = NGGameType.findSystemByCode(apiGameInfoResponseDTO.getGameType());
Game game = Game.builder()
// .platformId(gamePlatform.getId())
.platformCode(GamePlatforms.PG.getCode())
.platformType(platformType)
.gameCode(apiGameInfoResponseDTO.getGameCode())
@ -264,6 +249,7 @@ public class GamesPGServiceImpl implements IGamesService {
game.setCreateBy(Constants.SYSTEM);
game.setPlatformCode(GamePlatforms.PG.getCode());
game.setPlatformType(platformType);
game.setGameId(StringUtils.addSuffix(GamePlatforms.PG.getCode(), apiGameInfoResponseDTO.getGameCode()));
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("zh-hans"), "zh-CN"));
nameInfos.add(new NameInfo(apiGameInfoResponseDTO.getGameName().get("zh-hant"), "zh-TW"));
@ -274,32 +260,6 @@ public class GamesPGServiceImpl implements IGamesService {
game = games.get(0);
}
apiGameInfoResponseDTO.setSystemGameId(game.getId());
/*Map<String, String> gameName = apiGameInfoResponseDTO.getGameName();
for (String key : gameName.keySet()) {
String name = gameName.get(key);
List<GameName> gameNames = gameNameService.selectGameNameList(GameName.builder().gameId(game.getId()).gameName(name).build());
if (CollectionUtils.isEmpty(gameNames)) {
if ("zh-hans".equals(key)) {
gameNameService.insertGameName(GameName.builder()
.gameId(game.getId())
.gameName(name)
.langCode("zh-CN")
.createBy(Constants.SYSTEM)
.build());
} else if (!"zh-hant".equals(key)) {
GameSecretKeyLangDTO gameSecretKeyLangDTO = gameSecretKeyLangService.findGameSecretKeyLangDTO(GameSecretKeyLangDTO.builder()
.platformCode(GamePlatforms.PG.getCode())
.lang(key)
.build());
gameNameService.insertGameName(GameName.builder()
.gameId(game.getId())
.gameName(name)
.langCode(gameSecretKeyLangDTO.getSystemLangCode())
.createBy(Constants.SYSTEM)
.build());
}
}
}*/
}
@ -324,11 +284,6 @@ public class GamesPGServiceImpl implements IGamesService {
public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesNGServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO);
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .platformCode(GamePlatforms.PG.getCode())
// .code(exchangeTransferMoneyRequestDTO.getAgentId())
// .currency(exchangeTransferMoneyRequestDTO.getCurrency())
// .build());
Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount());
String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.PG.getCode(), 32);
@ -354,6 +309,11 @@ public class GamesPGServiceImpl implements IGamesService {
.platformCode(GamePlatforms.PG.getCode())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
//获取余额
String type = TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType()) ? NGTransferType.TRANSFER_OUT.getValue() : NGTransferType.TRANSFER_IN.getValue();
@ -385,16 +345,13 @@ public class GamesPGServiceImpl implements IGamesService {
if (this.getIsSuccess(apiNGResponseDTO.getCode())) {
//更新数据
exchangeMoney.setBalance(exchangeTransferMoneyRequestDTO.getAmount());
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO();
exchangeTransferStatusRequestDTO.setAccount(exchangeTransferMoneyRequestDTO.getAccount());
exchangeTransferStatusRequestDTO.setCurrency(exchangeTransferMoneyRequestDTO.getCurrency());
exchangeTransferStatusRequestDTO.setOrderId(transactionId);
exchangeTransferStatusRequestDTO.setAgentId(exchangeTransferMoneyRequestDTO.getAgentId());
exchangeTransferStatusRequestDTO.setAgentKey(exchangeTransferMoneyRequestDTO.getAgentKey());
this.exchangeTransferStatus(exchangeTransferStatusRequestDTO);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
log.error("GamesPGServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{},错误信息{}", apiNGResponseDTO.getCode(), apiNGResponseDTO.getMsg());
throw new BaseException(apiNGResponseDTO.getMsg());
}
@ -408,7 +365,7 @@ public class GamesPGServiceImpl implements IGamesService {
* @return {@link Boolean }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
Map<String, Object> paramsMap = new HashMap<>();
@ -417,32 +374,24 @@ public class GamesPGServiceImpl implements IGamesService {
paramsMap.put("orderId", exchangeTransferMoneyRequestDTO.getOrderId());
Map<String, String> key = this.getKey(exchangeTransferMoneyRequestDTO);
ApiNGResponseDTO<ApiExchangeTransferStatusResponseDTO> apiNGResponseDTO = ngClient.exchangeTransferStatus(paramsMap, key);
Integer status = StatusType.IN_PROGRESS.getValue();
if (this.getIsSuccess(apiNGResponseDTO.getCode())) {
ApiExchangeTransferStatusResponseDTO apiNGResponseDTOData = apiNGResponseDTO.getData();
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
GameExchangeMoney.builder()
.platformCode(GamePlatforms.PG.getCode())
.transactionId(exchangeTransferMoneyRequestDTO.getOrderId())
.build()
);
for (GameExchangeMoney exchangeMoney : gameExchangeMonies) {
//更新数据
exchangeMoney.setBalance(apiNGResponseDTOData.getAmount().abs());
exchangeMoney.setCoinBefore(NumberUtil.sub(apiNGResponseDTOData.getAfterBalance(), apiNGResponseDTOData.getAmount()));
exchangeMoney.setCoinAfter(apiNGResponseDTOData.getAfterBalance());
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
exchangeMoney.setStatus(apiNGResponseDTOData.getStatus());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
}
return Boolean.TRUE;
status = StatusType.SUCCESS.getValue();
} else {
log.error("GamesPGServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", apiNGResponseDTO.getCode(), apiNGResponseDTO.getMsg());
return Boolean.FALSE;
status = StatusType.FAILURE.getValue();
}
ExchangeTransferStatusResponseDTO transferStatusResponseDTO = ExchangeTransferStatusResponseDTO.builder()
.statusType(status)
.build();
ApiExchangeTransferStatusResponseDTO apiNGResponseDTOData = apiNGResponseDTO.getData();
if (!ObjectUtils.isEmpty(apiNGResponseDTOData)) {
transferStatusResponseDTO.setBalance(apiNGResponseDTOData.getAmount());
transferStatusResponseDTO.setCoinBefore(NumberUtil.sub(apiNGResponseDTOData.getAmount(), apiNGResponseDTOData.getAfterBalance()).abs());
transferStatusResponseDTO.setCoinAfter(apiNGResponseDTOData.getAfterBalance());
}
return transferStatusResponseDTO;
}
@ -455,14 +404,6 @@ public class GamesPGServiceImpl implements IGamesService {
@Override
public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) {
// GameSecretKeyCurrencyDTO gameSecretKeyDTO = new GameSecretKeyCurrencyDTO();
// gameSecretKeyDTO.setPlatformCodes(NGPlatforms.getAllPlatforms());
// List<GameSecretKeyCurrencyDTO> currencyDTOList = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(gameSecretKeyDTO);
// List<String> currencys = currencyDTOList.stream()
// .map(GameSecretKeyCurrencyDTO::getCurrency)
// .distinct()
// .collect(Collectors.toList());
Platform platform = betRecordByTimeDTO.getVendor();
Set<String> cacheSet = redisCache.getCacheSet(CacheConstants.PG_GAMES_BET_CURRENCY);
@ -480,14 +421,7 @@ public class GamesPGServiceImpl implements IGamesService {
String firstCurrency = currencys.get(0);
// GameSecretKeyCurrencyDTO currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .platformCode(GamePlatforms.PG.getCode())
// .currency(firstCurrency)
// .build());
// betRecordByTimeDTO.setAgentId(currencyDTO.getCode());
// betRecordByTimeDTO.setAgentKey(currencyDTO.getKey());
int pageNo = 1;
int pageSize = 2000;
Map<String, Object> paramsMap = new HashMap<>();
@ -753,10 +687,6 @@ public class GamesPGServiceImpl implements IGamesService {
return null;
}
Game gamesDataDTO = games.get(0);
// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .platformCodes(NGPlatforms.getAllPlatforms())
// .currency(resultBean.getCurrency())
// .build());
Member member = memberService.selectMemberByGameAccount(resultBean.getPlayerId());
if (ObjectUtils.isEmpty(member)) {

View File

@ -4,7 +4,9 @@ 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.enums.GamePlatforms;
import com.ff.base.system.service.ISysConfigService;
import com.ff.game.service.IPlatformService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@ -18,13 +20,16 @@ import javax.annotation.Resource;
*/
@Component
public class MyPGTAddressSource implements AddressSource {
@Resource
private IPlatformService platformService;
@Resource
private ISysConfigService configService;
@Override
public ForestAddress getAddress(ForestRequest request) {
return new ForestAddress("https","test.ambsuperapi.com", 443,"");
String apiBaseUrl = platformService.get(GamePlatforms.PGT.getCode())
.getUrlInfo().getUrl();
return new ForestAddress("https",apiBaseUrl, 443,"");
}
}

View File

@ -64,8 +64,8 @@ public interface PGTClient {
* @param headerMap
* @return {@link PGTGameListResponse }
*/
@Get("/GetGameIconList")
PGTGameListResponse getGameList(@JSONBody Map<String, Object> parameters, @Header Map<String, String> headerMap);
@Get("/games?${parameters}")
PGTGameListResponse getGameList(@Var("parameters") String parameters, @Header Map<String, String> headerMap);
/**
@ -111,6 +111,15 @@ public interface PGTClient {
PGTTransactionDetailsResponse getBetRecordByTime(@Var("parameters") String parameters, @Header Map<String, String> headerMap);
/**
*
*
* @param parameters
* @param headerMap
* @return {@link PGTReplayUrlResponseDTO }
*/
@Get(url = "/betTransactionReplay?{parameters}")
PGTReplayUrlResponseDTO betTransactionReplay(@Var("parameters") String parameters, @Header Map<String, String> headerMap);

View File

@ -0,0 +1,50 @@
package com.ff.game.api.pgt.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* pgtreplay urldto
*
* @author shi
* @date 2025/04/08
*/
@Data
public class PGTReplayUrlResponseDTO {
/**
* ID
*/
@JsonProperty("reqId")
private String reqId;
/**
* 0
*/
@JsonProperty("code")
private int code;
/**
*
*/
@JsonProperty("message")
private String message;
/**
* URL
*/
@JsonProperty("data")
private Datas data;
/**
* URL
*/
@Data
public static class Datas {
/**
*
*/
@JsonProperty("url")
private String url;
}
}

View File

@ -3,6 +3,8 @@ package com.ff.game.api.pgt.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* pgtt
*
@ -73,18 +75,18 @@ public class PGTTransactionResponse {
*
*/
@JsonProperty("amount")
private String amount;
private BigDecimal amount;
/**
*
*/
@JsonProperty("beforeBalance")
private String beforeBalance;
private BigDecimal beforeBalance;
/**
*
*/
@JsonProperty("afterBalance")
private String afterBalance;
private BigDecimal afterBalance;
}
}

View File

@ -13,6 +13,7 @@ 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.sign.Base64;
import com.ff.config.KeyConfig;
import com.ff.game.api.IGamesService;
@ -24,6 +25,7 @@ import com.ff.game.api.request.*;
import com.ff.game.api.xk.dto.XKBetRecordResponseDTO;
import com.ff.game.api.xk.dto.XKGamesDTO;
import com.ff.game.domain.*;
import com.ff.game.dto.GameBettingDetailsDTO;
import com.ff.game.service.*;
import com.ff.member.domain.Member;
import com.ff.member.service.IMemberService;
@ -37,6 +39,7 @@ import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.TimeUnit;
@ -64,9 +67,6 @@ public class GamesPGTServiceImpl implements IGamesService {
private IGameExchangeMoneyService gameExchangeMoneyService;
@Resource
private IGameService gameService;
@ -89,6 +89,8 @@ public class GamesPGTServiceImpl implements IGamesService {
private IGameBettingDetailsService gameBettingDetailsService;
String productId = "PGSOFT";
/**
*
*
@ -115,7 +117,6 @@ public class GamesPGTServiceImpl implements IGamesService {
return headerMap;
}
String productId = "PGSOFT";
/**
*
@ -211,7 +212,7 @@ public class GamesPGTServiceImpl implements IGamesService {
log.info("GamesPGTServiceImpl [getGameList] 请求参数 {}", gamesBaseRequestDTO);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("productId", productId);
PGTGameListResponse gameList = pgtClient.getGameList(paramsMap, this.getKey(gamesBaseRequestDTO));
PGTGameListResponse gameList = pgtClient.getGameList(JsonUtil.mapToQueryString(paramsMap), this.getKey(gamesBaseRequestDTO));
if (this.getIsSuccess(gameList.getCode())) {
@ -233,13 +234,11 @@ public class GamesPGTServiceImpl implements IGamesService {
game.setPlatformCode(GamePlatforms.PGT.getCode());
game.setPlatformType(platformType);
game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.PGT.getCode()) + 1);
game.setGameName(gameIdKey.getLocale().getCn());
game.setGameName(gameIdKey.getName());
game.setCreateBy(Constants.SYSTEM);
game.setGameId(StringUtils.addSuffix(GamePlatforms.PGT.getCode(), gameIdKey.getCode()));
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(NameInfo.builder().lang("zh-CN").name(gameIdKey.getLocale().getCn()).build());
nameInfos.add(NameInfo.builder().lang("en-US").name(gameIdKey.getLocale().getEn()).build());
nameInfos.add(NameInfo.builder().lang("th-TH").name(gameIdKey.getLocale().getTh()).build());
nameInfos.add(NameInfo.builder().lang("en-US").name(gameIdKey.getName()).build());
game.setNameInfo(nameInfos);
gameService.insertGame(game);
} else {
@ -297,7 +296,10 @@ public class GamesPGTServiceImpl implements IGamesService {
.platformCode(GamePlatforms.PGT.getInfo())
.build();
exchangeMoney.setCreateBy(Constants.SYSTEM);
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
exchangeMoney.setStep(GameExchangeStep.CREATE_ORDER.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
BigDecimal amount = exchangeTransferMoneyRequestDTO.getAmount();
BigDecimal amountBefore = BigDecimal.ZERO;
@ -319,7 +321,7 @@ public class GamesPGTServiceImpl implements IGamesService {
Map<String, Object> paramsMap = new LinkedHashMap<>();
paramsMap.put("username", exchangeTransferMoneyRequestDTO.getAccount());
paramsMap.put("amount", amount);
paramsMap.put("amount", amount.setScale(2, RoundingMode.DOWN).toString());
paramsMap.put("transactionRef", transactionId);
paramsMap.put("productId", productId);
Map<String, String> key = this.getKey(exchangeTransferMoneyRequestDTO);
@ -339,17 +341,14 @@ public class GamesPGTServiceImpl implements IGamesService {
exchangeMoney.setCoinAfter(data.getBalance());
exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore());
exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter());
exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue());
gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney);
//查询交易状态
ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO();
exchangeTransferStatusRequestDTO.setAccount(exchangeTransferMoneyRequestDTO.getAccount());
exchangeTransferStatusRequestDTO.setCurrency(currency);
exchangeTransferStatusRequestDTO.setOrderId(transactionId);
exchangeTransferStatusRequestDTO.setAgentId(exchangeTransferMoneyRequestDTO.getAgentId());
exchangeTransferStatusRequestDTO.setAgentKey(exchangeTransferMoneyRequestDTO.getAgentKey());
this.exchangeTransferStatus(exchangeTransferStatusRequestDTO);
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.SUCCESS.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
} else {
exchangeMoney.setStep(GameExchangeStep.PLATFORM_TRANSACTION.getCode());
exchangeMoney.setStepStatus(GameExchangeStepStatus.FAILURE.getCode());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
log.error("GamesPGTServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", errorResponse.getCode());
throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode());
}
@ -363,7 +362,7 @@ public class GamesPGTServiceImpl implements IGamesService {
* @return {@link Boolean }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesPGTServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeMoneyId());
Map<String, Object> paramsMap = new LinkedHashMap<>();
@ -377,24 +376,21 @@ public class GamesPGTServiceImpl implements IGamesService {
}
Map<String, String> key = this.getKey(exchangeTransferMoneyRequestDTO);
PGTTransactionResponse transactionResponse = pgtClient.exchangeTransferStatus(paramsMap, key);
Integer status = StatusType.IN_PROGRESS.getValue();
if (this.getIsSuccess(transactionResponse.getCode())) {
List<GameExchangeMoney> gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList(
GameExchangeMoney.builder()
.platformCode(GamePlatforms.PGT.getCode())
.transactionId(exchangeTransferMoneyRequestDTO.getOrderId())
.build()
);
for (GameExchangeMoney exchangeMoney : gameExchangeMonies) {
//更新数据
exchangeMoney.setStatus(transactionResponse.getData().isSuccess() ? StatusType.SUCCESS.getValue() : StatusType.FAILURE.getValue());
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
}
return Boolean.TRUE;
status = transactionResponse.getData().isSuccess() ? StatusType.SUCCESS.getValue() : StatusType.FAILURE.getValue();
} else {
log.error("GamesPGTServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", transactionResponse.getCode(), transactionResponse.getMessage());
return Boolean.FALSE;
status = StatusType.FAILURE.getValue();
}
ExchangeTransferStatusResponseDTO transferStatusResponseDTO = ExchangeTransferStatusResponseDTO.builder()
.statusType(status)
.build();
if (!ObjectUtils.isEmpty(transactionResponse.getData())) {
transferStatusResponseDTO.setBalance(transactionResponse.getData().getAmount());
transferStatusResponseDTO.setCoinBefore(transactionResponse.getData().getBeforeBalance());
transferStatusResponseDTO.setCoinAfter(transactionResponse.getData().getAfterBalance());
}
return transferStatusResponseDTO;
}
@ -409,8 +405,8 @@ public class GamesPGTServiceImpl implements IGamesService {
//请求参数
log.info("GamesPGTServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO);
String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+8");
String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+8");
String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+0");
String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+0");
String nextId = redisCache.getCacheObject(CacheConstants.PGT_NEXT_ID);
@ -444,7 +440,34 @@ public class GamesPGTServiceImpl implements IGamesService {
*/
@Override
public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
//请求参数
log.info("GamesPGTServiceImpl [getBetRecordByTime] 请求参数 {}", betRecordByTimeDTO);
String startTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getStartTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+0");
String endTime = DateUtils.convertTimestampToFormattedDate(betRecordByTimeDTO.getEndTime(), DateUtils.ISO_8601_FORMAT_Z, "GMT+0");
String nextId = redisCache.getCacheObject(CacheConstants.PGT_NEXT_ID);
Map<String, Object> paramsMap = new LinkedHashMap<>();
paramsMap.put("productId", productId);
paramsMap.put("startTime", startTime);
paramsMap.put("endTime", endTime);
paramsMap.put("nextId", nextId);
Map<String, String> key = this.getKey(betRecordByTimeDTO);
PGTTransactionDetailsResponse betRecordByTime = pgtClient.getBetRecordByTime(JsonUtil.mapToQueryString(paramsMap), key);
if (this.getIsSuccess(betRecordByTime.getCode())) {
List<PGTTransactionDetailsResponse.Transaction> txns = betRecordByTime.getData().getTxns();
this.batchInsert(txns, betRecordByTimeDTO);
//保存本次请求的id
redisCache.setCacheObject(CacheConstants.PGT_NEXT_ID, betRecordByTime.getData().getNextId());
return Boolean.TRUE;
} else {
log.error("GamesPGXServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{},错误信息{}", betRecordByTime.getCode(), betRecordByTime.getMessage());
throw new BaseException(betRecordByTime.getMessage());
}
}
/**
@ -466,7 +489,34 @@ public class GamesPGTServiceImpl implements IGamesService {
*/
@Override
public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
//请求参数
log.info("GamesPGTServiceImpl [getGameDetail] 请求参数 {}", getGameDetailRequestDTO);
List<GameBettingDetails> gameBettingDetails = gameBettingDetailsService.selectGameBettingDetailsList(GameBettingDetailsDTO.builder()
.wagersId(getGameDetailRequestDTO.getWagersId())
.platformCode(GamePlatforms.PGT.getCode())
.build());
if (CollectionUtils.isEmpty(gameBettingDetails)) {
return null;
}
GameBettingDetails bettingDetails = gameBettingDetails.get(0);
Map<String, Object> paramsMap = new LinkedHashMap<>();
paramsMap.put("productId", productId);
paramsMap.put("betId", getGameDetailRequestDTO.getWagersId());
paramsMap.put("username", bettingDetails.getAccount());
Map<String, String> key = this.getKey(getGameDetailRequestDTO);
PGTReplayUrlResponseDTO pgtReplayUrlResponseDTO = pgtClient.betTransactionReplay(JsonUtil.mapToQueryString(paramsMap), key);
if (this.getIsSuccess(pgtReplayUrlResponseDTO.getCode())) {
return GetGameDetailResponseDTO.builder()
.url(pgtReplayUrlResponseDTO.getData().getUrl())
.build();
} else {
return null;
}
}
/**
@ -477,18 +527,7 @@ public class GamesPGTServiceImpl implements IGamesService {
*/
@Override
public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) {
log.info("GamesPGTServiceImpl [kickMember] 请求参数 {}", kickMemberRequestDTO);
Map<String, Object> paramsMap = new HashMap<>();
paramsMap.put("username", kickMemberRequestDTO.getAccount());
paramsMap.put("productId", productId);
Map<String, String> key = this.getKey(kickMemberRequestDTO);
PGTKickMemberResponse pgtKickMemberResponse = pgtClient.kickMember(paramsMap, key);
if (this.getIsSuccess(pgtKickMemberResponse.getCode())&&"SUCCESS".equals(pgtKickMemberResponse.getData().getStatus())) {
return Boolean.TRUE;
} else {
throw new ApiException(ErrorCode.KICK_OUT_AILED.getCode());
}
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}
/**
@ -541,7 +580,7 @@ public class GamesPGTServiceImpl implements IGamesService {
*
* @param dataBean bean
*/
private void batchInsert(List<PGTTransactionDetailsResponse.Transaction> dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) {
private synchronized void batchInsert(List<PGTTransactionDetailsResponse.Transaction> dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) {
List<GameBettingDetails> gameBettingDetails = new ArrayList<>();
List<String> wagersIds = new ArrayList<>();
@ -616,11 +655,11 @@ public class GamesPGTServiceImpl implements IGamesService {
.account(resultBean.getUsername())
.wagersId(resultBean.getBetId())
.wagersTime(resultBean.getAccountingDate().getTime())
.betAmount(resultBean.getPayout())
.betAmount(resultBean.getStake())
.payoffTime(resultBean.getAccountingDate().getTime())
.payoffAmount(resultBean.getStake())
.payoffAmount(resultBean.getPayout())
.settlementTime(resultBean.getAccountingDate().getTime())
.turnover(resultBean.getPayout())
.turnover(resultBean.getStake())
.orderNo(resultBean.getRoundId())
.settlementStatus(SettlementStatusEnum.COMPLETED.getCode())
.build();

View File

@ -12,6 +12,7 @@ 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.sign.Md5Utils;
import com.ff.config.KeyConfig;
import com.ff.game.api.IGamesService;
@ -142,7 +143,6 @@ public class GamesPGXServiceImpl implements IGamesService {
@Override
public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) {
log.info("GamesPGXServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO);
// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(memberInfoRequestDTO.getAgentId());
Map<String, Object> params = new LinkedHashMap<>();
params.put("operatorcode", memberInfoRequestDTO.getAgentId());
KeyInfo keyInfo = memberInfoRequestDTO.getKeyInfo();
@ -174,7 +174,6 @@ public class GamesPGXServiceImpl implements IGamesService {
@Override
public String loginWithoutRedirect(GamesLogin gamesLogin) {
log.info("GamesPGXServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin);
// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesLogin.getAgentId());
KeyInfo keyInfo = gamesLogin.getKeyInfo();
Map<String, Object> params = new LinkedHashMap<>();
@ -213,7 +212,6 @@ public class GamesPGXServiceImpl implements IGamesService {
return CacheConstants.PGX_GAMES;
}
// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(gamesBaseRequestDTO.getAgentId());
KeyInfo keyInfo = gamesBaseRequestDTO.getKeyInfo();
Map<String, Object> params = new LinkedHashMap<>();
params.put("operatorcode", gamesBaseRequestDTO.getAgentId());
@ -230,23 +228,8 @@ public class GamesPGXServiceImpl implements IGamesService {
List<PGXGameListResponse.Game> gameLists = JSON.parseArray(gameList.getGamelist(), PGXGameListResponse.Game.class);
for (PGXGameListResponse.Game gamesDataDTO : gameLists) {
/* GamePlatform gamePlatform = GamePlatform.builder()
.platformType(GPXGameType.SL.getSystemCode())
.platformCode(GamePlatforms.PGX.getInfo())
.build();
List<GamePlatform> gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform);
//没有此平台就新增一个平台
if (CollectionUtils.isEmpty(gamePlatforms)) {
gamePlatform.setPlatformName(GamePlatforms.PGX.getInfo() + XKGameType.findInfoByCode(GPXGameType.SL.getSystemCode()));
gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1);
gamePlatform.setCreateBy(Constants.SYSTEM);
gamePlatformService.insertGamePlatform(gamePlatform);
} else {
gamePlatform = gamePlatforms.get(0);
}*/
Integer platformType = GPXGameType.findSystemByCode(gamesDataDTO.getGameCode());
Game game = Game.builder()
//.platformId(gamePlatform.getId())
.gameCode(gamesDataDTO.getGameId())
.platformCode(GamePlatforms.PGX.getCode())
.platformType(platformType)
@ -261,24 +244,21 @@ public class GamesPGXServiceImpl implements IGamesService {
game.setCreateBy(Constants.SYSTEM);
game.setPlatformCode(GamePlatforms.PGX.getCode());
game.setPlatformType(platformType);
game.setGameId(StringUtils.addSuffix(GamePlatforms.PGX.getCode(), gamesDataDTO.getGameId()));
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(gamesDataDTO.getGameName(), "en-US"));
game.setNameInfo(nameInfos);
gameService.insertGame(game);
} else {
game = games.get(0);
game.setPlatformType(platformType);
game.setGameId(StringUtils.addSuffix(GamePlatforms.PGX.getCode(), gamesDataDTO.getGameId()));
List<NameInfo> nameInfos = new ArrayList<>();
nameInfos.add(new NameInfo(gamesDataDTO.getGameName(), "en-US"));
game.setNameInfo(nameInfos);
gameService.updateGame(game);
}
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("en-US")
.createBy(Constants.SYSTEM)
.build());
}*/
}
@ -406,7 +386,7 @@ public class GamesPGXServiceImpl implements IGamesService {
* @return {@link Boolean }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
log.info("GamesPGXServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO);
Map<String, Object> paramsMap = new LinkedHashMap<>();
paramsMap.put("operatorcode", exchangeTransferMoneyRequestDTO.getAgentId());
@ -428,10 +408,10 @@ public class GamesPGXServiceImpl implements IGamesService {
exchangeMoney.setStatus(PGXTransactionStatus.findValueByCode(exchangeTransferStatusResponse.getStatus()));
gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney);
}
return Boolean.TRUE;
return new ExchangeTransferStatusResponseDTO();
} else {
log.error("GamesPGXServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", exchangeTransferStatusResponse.getErrCode(), exchangeTransferStatusResponse.getErrMsg());
return Boolean.FALSE;
return new ExchangeTransferStatusResponseDTO();
}
}

View File

@ -0,0 +1,41 @@
package com.ff.game.api.request;
import com.ff.base.annotation.Excel;
import com.ff.base.enums.StatusType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
*
*
* @author shi
* @date 2025/04/08
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ExchangeTransferStatusResponseDTO {
/**
* StatusType
*/
private Integer statusType;
/** 操作金额 */
private BigDecimal balance;
/** 转账前金额(游戏币) */
private BigDecimal coinBefore;
/** 转账后金额(游戏币) */
private BigDecimal coinAfter;
}

View File

@ -1,5 +1,7 @@
package com.ff.game.api.request;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -11,6 +13,8 @@ import lombok.NoArgsConstructor;
*/
@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public class GetGameDetailResponseDTO {

View File

@ -377,7 +377,7 @@ public class GamesSAServiceImpl implements IGamesService {
* @return {@link Boolean }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode());
}

View File

@ -369,8 +369,8 @@ public class GamesXKServiceImpl implements IGamesService {
* @return {@link Boolean }
*/
@Override
public Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
return Boolean.TRUE;
public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) {
return new ExchangeTransferStatusResponseDTO();
}

View File

@ -94,5 +94,13 @@ public class Game extends BaseEntity {
*/
private Integer platformType;
/**
*
*/
private List<NameInfo> nameInfo;
/**
* id
*/
private String gameId;
}

View File

@ -90,5 +90,13 @@ public class GameExchangeMoney extends BaseEntity
@Excel(name = "状态 1 成功 2失败")
private Integer status;
/**
* GameExchangeStep
*/
private Integer step;
/**
* GameExchangeStepStatus
*/
private Integer stepStatus;
}

View File

@ -15,6 +15,12 @@ import java.io.Serializable;
@Builder
@NoArgsConstructor
public class NameInfo implements Serializable {
/**
*
*/
private String name;
/**
*
*/
private String lang;
}

View File

@ -23,6 +23,15 @@ public interface GameMapper {
*/
Game selectGameById(Long id);
/**
* id
*
* @param gameId id
* @return {@link Game }
*/
Game selectGameByGameId(String gameId);
/**
*
*

View File

@ -22,6 +22,15 @@ public interface IGameService {
*/
Game selectGameById(Long id);
/**
* id
*
* @param gameId id
* @return {@link Game }
*/
Game selectGameByGameId(String gameId);
/**
*
*

View File

@ -48,6 +48,17 @@ public class GameServiceImpl implements IGameService {
return gameMapper.selectGameById(id);
}
/**
* id
*
* @param gameId id
* @return {@link Game }
*/
@Override
public Game selectGameByGameId(String gameId) {
return gameMapper.selectGameByGameId(gameId);
}
/**
*
*

View File

@ -131,7 +131,7 @@ public class MemberServiceImpl implements IMemberService {
*/
@Override
public Member selectMemberByGameAccount(String gameAccount) {
return memberMapper.selectMemberByGameAccount(gameAccount.toLowerCase());
return memberMapper.selectMemberByGameAccount(gameAccount);
}
/**

View File

@ -206,9 +206,6 @@ public class GameTask {
List<GameExchangeMoney> gameExchangeMoneyList = gameExchangeMoneyService.selectGameExchangeMoneyList(GameExchangeMoney.builder().status(StatusType.IN_PROGRESS.getValue()).build());
for (GameExchangeMoney exchangeMoney : gameExchangeMoneyList) {
try {
// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder()
// .platformCode(exchangeMoney.getPlatformCode())
// .systemCurrency(exchangeMoney.getCurrencyCode()).build());
Platform platform = platformService.get(exchangeMoney.getPlatformCode());
if (null == platform) {
log.error("平台不存在platformCode:{}", exchangeMoney.getPlatformCode());

View File

@ -23,6 +23,8 @@
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="step" column="step"/>
<result property="stepStatus" column="step_status"/>
</resultMap>
@ -48,6 +50,8 @@
<result property="updateTime" column="update_time"/>
<result property="memberAccount" column="member_account"/>
<result property="gameAccount" column="game_account"/>
<result property="step" column="step"/>
<result property="stepStatus" column="step_status"/>
</resultMap>
<sql id="selectGameExchangeMoneyVo">
@ -69,7 +73,9 @@
create_by,
create_time,
update_by,
update_time
update_time,
step,
step_status
from ff_game_exchange_money
</sql>
@ -275,6 +281,12 @@
<if test="updateTime != null">
update_time,
</if>
<if test="step != null">
step,
</if>
<if test="stepStatus != null">
step_status,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
@ -334,6 +346,12 @@
<if test="updateTime != null">
#{updateTime},
</if>
<if test="step != null">
#{step},
</if>
<if test="stepStatus != null">
#{stepStatus},
</if>
</trim>
</insert>
@ -394,6 +412,12 @@
<if test="updateTime != null">
update_time = #{updateTime},
</if>
<if test="step != null">
step = #{step},
</if>
<if test="stepStatus != null">
step_status = #{stepStatus},
</if>
</trim>
where id = #{id}
</update>

View File

@ -7,12 +7,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<resultMap type="Game" id="GameResult">
<result property="id" column="id" />
<result property="sortNo" column="sort_no" />
<result property="platformId" column="platform_id" />
<result property="gameCode" column="game_code" />
<result property="ingress" column="ingress" />
<result property="gameSourceType" column="game_source_type" />
<result property="gameName" column="game_name" />
<result property="nameInfo" column="name_info" typeHandler="com.ff.base.handler.JsonListHandler" javaType="com.ff.game.domain.NameInfo" />
<result property="gameId" column="game_id" />
<result property="platformCode" column="platform_code" />
<result property="platformType" column="platform_type" />
<result property="freespin" column="freespin" />
<result property="demoStatus" column="demo_status" />
<result property="stopStatus" column="stop_status" />
@ -23,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectGameVo">
select id, sort_no, platform_id, game_code,ingress, game_source_type, game_name, freespin, demo_status, stop_status, create_by, create_time, update_by, update_time from ff_game
select id, sort_no, game_code,ingress, game_source_type, game_name, freespin, demo_status, stop_status, create_by, create_time, update_by, update_time, name_info, game_id, platform_code, platform_type from ff_game
</sql>
@ -33,7 +35,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectGameVo"/>
<where>
<if test="sortNo != null "> and sort_no = #{sortNo}</if>
<if test="platformId != null "> and platform_id = #{platformId}</if>
<if test="gameCode != null "> and game_code = #{gameCode}</if>
<if test="ingress != null "> and ingress = #{ingress}</if>
<if test="gameSourceType != null "> and game_source_type = #{gameSourceType}</if>
@ -50,7 +51,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectGameDTOList" parameterType="com.ff.game.dto.GameDTO" resultMap="GameResult">
select g.id,
g.sort_no,
g.platform_id,
g.game_code,
g.ingress,
g.game_source_type,
@ -63,25 +63,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
g.update_by,
g.update_time
from ff_game g
inner join ff_game_platform p on g.platform_id = p.id
<where>
<if test="sortNo != null "> and g.sort_no = #{sortNo}</if>
<if test="platformId != null "> and g.platform_id = #{platformId}</if>
<if test="gameCode != null "> and g.game_code = #{gameCode}</if>
<if test="ingress != null "> and g.ingress = #{ingress}</if>
<if test="gameSourceType != null "> and g.game_source_type = #{gameSourceType}</if>
<if test="gameName != null and gameName != ''"> and game_name like concat('%', #{gameName}, '%')</if>
<if test="gameName != null and gameName != ''"> and name_info like concat('%', #{gameName}, '%')</if>
<if test="freespin != null "> and g.freespin = #{freespin}</if>
<if test="demoStatus != null "> and g.demo_status = #{demoStatus}</if>
<if test="stopStatus != null "> and g.stop_status = #{stopStatus}</if>
<if test="platformCodes != null and platformCodes.size()>0"> and p.platform_code in
<foreach collection="platforms" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
<if test="platformCode != null and platformCode != ''"> and p.platform_code = #{platformCode}</if>
<if test="platformCode != null and platformCode != ''"> and g.platform_code = #{platformCode}</if>
</where>
</select>
@ -93,11 +86,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where id = #{id}
</select>
<select id="selectGameByGameId" resultMap="GameResult">
<include refid="selectGameVo"/>
where game_id = #{gameId}
</select>
<insert id="insertGame" parameterType="Game" useGeneratedKeys="true" keyProperty="id">
insert into ff_game
<trim prefix="(" suffix=")" suffixOverrides=","><if test="id != null">id,</if>
<if test="sortNo != null">sort_no,</if>
<if test="platformId != null">platform_id,</if>
<if test="gameCode != null">game_code,</if>
<if test="ingress != null">ingress,</if>
<if test="gameSourceType != null">game_source_type,</if>
@ -109,10 +106,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="nameInfo != null ">name_info,</if>
<if test="gameId != null and gameId != ''">game_id,</if>
<if test="platformCode != null and platformCode != ''">platform_code,</if>
<if test="platformType != null and platformType != ''">platform_type,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null">#{id},</if>
<if test="sortNo != null">#{sortNo},</if>
<if test="platformId != null">#{platformId},</if>
<if test="gameCode != null">#{gameCode},</if>
<if test="ingress != null">#{ingress},</if>
<if test="gameSourceType != null">#{gameSourceType},</if>
@ -124,6 +124,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="nameInfo != null">#{nameInfo, typeHandler=com.ff.base.handler.JsonListHandler,javaType=com.ff.game.domain.NameInfo},</if>
<if test="gameId != null and gameId != ''">#{gameId},</if>
<if test="platformCode != null and platformCode != ''">#{platformCode},</if>
<if test="platformType != null and platformType != ''">#{platformType},</if>
</trim>
</insert>
@ -131,7 +135,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
update ff_game
<trim prefix="SET" suffixOverrides=",">
<if test="sortNo != null">sort_no = #{sortNo},</if>
<if test="platformId != null">platform_id = #{platformId},</if>
<if test="gameCode != null">game_code = #{gameCode},</if>
<if test="ingress != null">ingress = #{ingress},</if>
<if test="gameSourceType != null">game_source_type = #{gameSourceType},</if>
@ -143,6 +146,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="nameInfo != null">name_info = #{nameInfo, typeHandler=com.ff.base.handler.JsonListHandler,javaType=com.ff.game.domain.NameInfo},</if>
<if test="gameId != null and gameId != ''">game_id = #{gameId},</if>
<if test="platformCode != null and platformCode != ''">platform_code = #{platformCode},</if>
<if test="platformType != null and platformType != ''">platform_type = #{platformType},</if>
</trim>
where id = #{id}
</update>
@ -159,11 +166,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</delete>
<select id="selectMaxSortNoByPlatformId" parameterType="Long" resultType="java.lang.Integer">
select ifnull(max(sort_no), 0)
from ff_game
where platform_id = #{platformId}
</select>
<select id="selectMaxSortNoBy" resultType="java.lang.Integer">
select ifnull(max(sort_no), 0)
@ -171,29 +174,30 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where platform_type = #{platformType} and platform_code = #{platformCode}
</select>
<resultMap id="GameResponseResultMap" type="com.ff.api.response.GameResponse">
<result property="id" column="id"/>
<result property="id" column="game_id"/>
<result property="gameName" column="game_name"/>
<result property="freeSpin" column="freespin"/>
<result property="demoStatus" column="demo_status"/>
<result property="platformCode" column="platform_code"/>
<result property="platformType" column="platform_type"/>
<result property="platformCode" column="platform_code"/>
<result property="ingress" column="ingress"/>
<result property="nameInfo" column="name_info" typeHandler="com.ff.base.handler.JsonHandler" javaType="com.ff.game.domain.NameInfo"/>
</resultMap>
<select id="selectGameResponseList" resultMap="GameResponseResultMap">
select
g.id,
g.game_id,
g.game_name,
g.freespin,
g.demo_status,
gp.platform_code,
g.ingress,
gp.platform_type
g.platform_type,
g.platform_code,
g.name_info
from ff_game g
inner join ff_game_platform gp on g.platform_id=gp.id
where gp.stop_status=1 and g.stop_status=1
where g.stop_status=1
</select>
@ -205,7 +209,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectGameVo"/>
<where>
<if test="sortNo != null "> and sort_no = #{sortNo}</if>
<if test="platformId != null "> and platform_id = #{platformId}</if>
<if test="gameCode != null "> and game_code = #{gameCode}</if>
<if test="ingress != null "> and ingress = #{ingress}</if>
<if test="gameSourceType != null "> and game_source_type = #{gameSourceType}</if>