diff --git a/ff-base/src/main/java/com/ff/base/constant/CacheConstants.java b/ff-base/src/main/java/com/ff/base/constant/CacheConstants.java index 401a331..9df0da0 100644 --- a/ff-base/src/main/java/com/ff/base/constant/CacheConstants.java +++ b/ff-base/src/main/java/com/ff/base/constant/CacheConstants.java @@ -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游戏 */ diff --git a/ff-base/src/main/java/com/ff/base/enums/GameExchangeStep.java b/ff-base/src/main/java/com/ff/base/enums/GameExchangeStep.java new file mode 100644 index 0000000..2f13939 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/GameExchangeStep.java @@ -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; +} diff --git a/ff-base/src/main/java/com/ff/base/enums/GameExchangeStepStatus.java b/ff-base/src/main/java/com/ff/base/enums/GameExchangeStepStatus.java new file mode 100644 index 0000000..fd70790 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/GameExchangeStepStatus.java @@ -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; +} diff --git a/ff-base/src/main/java/com/ff/base/enums/TransferType.java b/ff-base/src/main/java/com/ff/base/enums/TransferType.java index 6ebbfac..8d110ab 100644 --- a/ff-base/src/main/java/com/ff/base/enums/TransferType.java +++ b/ff-base/src/main/java/com/ff/base/enums/TransferType.java @@ -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; diff --git a/ff-base/src/main/java/com/ff/base/utils/StringUtils.java b/ff-base/src/main/java/com/ff/base/utils/StringUtils.java index e8fbe8d..d35bd9e 100644 --- a/ff-base/src/main/java/com/ff/base/utils/StringUtils.java +++ b/ff-base/src/main/java/com/ff/base/utils/StringUtils.java @@ -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; } /** diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java index 76ecf27..2cac157 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiGameController.java @@ -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 gameSecretKeyCurrencies = -// gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList( -// GameSecretKeyCurrencyDTO.builder().platformCode(gameResponse.getPlatformCode()) -// .build() -// ); -// List currencyCode = gameSecretKeyCurrencies.stream().map(GameSecretKeyCurrencyDTO::getSystemCurrency).collect(Collectors.toList()); List 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()) diff --git a/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java b/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java index a25f0ac..56bd037 100644 --- a/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java +++ b/ff-game/src/main/java/com/ff/api/controller/ApiMemberController.java @@ -144,6 +144,10 @@ public class ApiMemberController extends BaseController { .build(); Boolean result = iGamesService.createMember(gamesBaseRequestDTO); Assert.isTrue(result, "建立游戏账号失败"); + + + + return toAjax(Boolean.TRUE); } diff --git a/ff-game/src/main/java/com/ff/api/request/GameLoginRequest.java b/ff-game/src/main/java/com/ff/api/request/GameLoginRequest.java index a90f562..9c2d5f4 100644 --- a/ff-game/src/main/java/com/ff/api/request/GameLoginRequest.java +++ b/ff-game/src/main/java/com/ff/api/request/GameLoginRequest.java @@ -44,8 +44,8 @@ public class GameLoginRequest implements Serializable { /** * 游戏id */ - @NotNull(message = "gameId不能为空") - private Long gameId; + @NotBlank(message = "gameId不能为空") + private String gameId; /** diff --git a/ff-game/src/main/java/com/ff/api/response/GameResponse.java b/ff-game/src/main/java/com/ff/api/response/GameResponse.java index 8f4eee3..4b24077 100644 --- a/ff-game/src/main/java/com/ff/api/response/GameResponse.java +++ b/ff-game/src/main/java/com/ff/api/response/GameResponse.java @@ -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 currencyCode; - + /** + * 名称 + */ + private List nameInfo; } diff --git a/ff-game/src/main/java/com/ff/common/dto/GameBalanceExchange.java b/ff-game/src/main/java/com/ff/common/dto/GameBalanceExchange.java index 055ae84..15c82ff 100644 --- a/ff-game/src/main/java/com/ff/common/dto/GameBalanceExchange.java +++ b/ff-game/src/main/java/com/ff/common/dto/GameBalanceExchange.java @@ -47,6 +47,12 @@ public class GameBalanceExchange extends GamesBaseRequestDTO implements Serializ */ private BigDecimal amount; + + /** + * + */ + private BigDecimal amountActual; + /** * 账户 */ diff --git a/ff-game/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java b/ff-game/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java index 4307341..25f5253 100644 --- a/ff-game/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java +++ b/ff-game/src/main/java/com/ff/common/service/impl/TenantGameQuotaServiceImpl.java @@ -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()); diff --git a/ff-game/src/main/java/com/ff/game/api/IGamesService.java b/ff-game/src/main/java/com/ff/game/api/IGamesService.java index 1ee439d..d8ed023 100644 --- a/ff-game/src/main/java/com/ff/game/api/IGamesService.java +++ b/ff-game/src/main/java/com/ff/game/api/IGamesService.java @@ -66,9 +66,9 @@ public interface IGamesService { * 汇兑转移状态确认 * * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto - * @return {@link Boolean } + * @return {@link ExchangeTransferStatusResponseDTO } */ - Boolean exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO); + ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO); /** diff --git a/ff-game/src/main/java/com/ff/game/api/ae/dto/AEExchangeTransferStatusResponse.java b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEExchangeTransferStatusResponse.java index c2d064e..8e68c0f 100644 --- a/ff-game/src/main/java/com/ff/game/api/ae/dto/AEExchangeTransferStatusResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/ae/dto/AEExchangeTransferStatusResponse.java @@ -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) diff --git a/ff-game/src/main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java index 0b5396c..612c597 100644 --- a/ff-game/src/main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/ae/impl/GamesAEServiceImpl.java @@ -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 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 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 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 ae下注记录响应dto */ - private void batchInsert(AEBetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { + private synchronized void batchInsert(AEBetRecordResponse aeBetRecordResponse, BetRecordByTimeDTO betRecordByTimeDTO) { List gameBettingDetails = new ArrayList<>(); List 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)) { diff --git a/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java b/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java index bc58304..15679c4 100644 --- a/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java +++ b/ff-game/src/main/java/com/ff/game/api/dg/client/DGClient.java @@ -55,6 +55,16 @@ public interface DGClient { @Post(url = "/v2/api/transfer") DGTransactionResponseDTO exchangeTransferByAgentId(@JSONBody Map params, @Header Map header); + + /** + * 汇兑转移状态 + * + * @param params 参数 + * @param header 头球 + * @return {@link DGTransactionResponseDTO } + */ + @Post(url = "/v2/api/checkTransfer") + DGTransactionResponseDTO exchangeTransferStatus(@JSONBody Map params, @Header Map header); /** * 按时间获取投注记录 * diff --git a/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java index 7a55494..b4315e9 100644 --- a/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/dg/service/impl/GamesDGServiceImpl.java @@ -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 params = new LinkedHashMap<>(); + params.put("serial", exchangeTransferMoneyRequestDTO.getOrderId()); + + Map 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 key = this.getKey(betRecordByTimeDTO); @@ -360,7 +357,7 @@ public class GamesDGServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return null; + return Boolean.FALSE; } /** diff --git a/ff-game/src/main/java/com/ff/game/api/fc/client/FCClient.java b/ff-game/src/main/java/com/ff/game/api/fc/client/FCClient.java index cdb3e12..5c31ed9 100644 --- a/ff-game/src/main/java/com/ff/game/api/fc/client/FCClient.java +++ b/ff-game/src/main/java/com/ff/game/api/fc/client/FCClient.java @@ -89,6 +89,11 @@ public interface FCClient { ApiCFBalanceTransferResponseDTO exchangeTransferByAgentId(@JSONBody Map parameters); + @Post(url = "/GetSingleBill") + ApiCFBalanceTransferStatusResponseDTO exchangeTransferStatus(@JSONBody Map parameters); + + + /** * 按时间获取投注记录 * diff --git a/ff-game/src/main/java/com/ff/game/api/fc/dto/ApiCFBalanceTransferStatusResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/fc/dto/ApiCFBalanceTransferStatusResponseDTO.java new file mode 100644 index 0000000..ecae0ae --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/fc/dto/ApiCFBalanceTransferStatusResponseDTO.java @@ -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 cfbalance传输状态响应dto + * + * @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; +} diff --git a/ff-game/src/main/java/com/ff/game/api/fc/impl/GamesFCServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/fc/impl/GamesFCServiceImpl.java index faae116..1c4a951 100644 --- a/ff-game/src/main/java/com/ff/game/api/fc/impl/GamesFCServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/fc/impl/GamesFCServiceImpl.java @@ -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 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 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 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 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 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 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); diff --git a/ff-game/src/main/java/com/ff/game/api/jili/address/MyJILIAddressSource.java b/ff-game/src/main/java/com/ff/game/api/jili/address/MyJILIAddressSource.java index 66ef096..592bae2 100644 --- a/ff-game/src/main/java/com/ff/game/api/jili/address/MyJILIAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/jili/address/MyJILIAddressSource.java @@ -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"); } diff --git a/ff-game/src/main/java/com/ff/game/api/jili/client/JILIClient.java b/ff-game/src/main/java/com/ff/game/api/jili/client/JILIClient.java index bcc4bae..7f38bac 100644 --- a/ff-game/src/main/java/com/ff/game/api/jili/client/JILIClient.java +++ b/ff-game/src/main/java/com/ff/game/api/jili/client/JILIClient.java @@ -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); + + /** * 按时间获取投注记录 * diff --git a/ff-game/src/main/java/com/ff/game/api/jili/dto/JILITransferStatusResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/jili/dto/JILITransferStatusResponseDTO.java new file mode 100644 index 0000000..ea53732 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/jili/dto/JILITransferStatusResponseDTO.java @@ -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 8601,如:2023-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; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java index 6219b33..f82a544 100644 --- a/ff-game/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/jili/service/impl/GamesJILIServiceImpl.java @@ -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 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 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 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 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 = new ArrayList<>(); List 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)) { diff --git a/ff-game/src/main/java/com/ff/game/api/km/client/KMClient.java b/ff-game/src/main/java/com/ff/game/api/km/client/KMClient.java index 0085fd9..77009c2 100644 --- a/ff-game/src/main/java/com/ff/game/api/km/client/KMClient.java +++ b/ff-game/src/main/java/com/ff/game/api/km/client/KMClient.java @@ -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 header); + /** + * 汇兑转移状态 + * + * @param params 参数 + * @param parameters 范围 + * @return {@link KMBalanceTransferStatusResponseDTO } + */ + @Post(url = "/history/transfers/{params}") + KMBalanceTransferStatusResponseDTO exchangeTransferStatus(@Var("params")String params,@JSONBody Map parameters); + /** * 踢腿队员 diff --git a/ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceTransferStatusResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceTransferStatusResponseDTO.java new file mode 100644 index 0000000..9a30d2d --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/km/dto/KMBalanceTransferStatusResponseDTO.java @@ -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 8601,如:2017-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; +} diff --git a/ff-game/src/main/java/com/ff/game/api/km/impl/GamesKMServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/km/impl/GamesKMServiceImpl.java index bcb8108..6029bbc 100644 --- a/ff-game/src/main/java/com/ff/game/api/km/impl/GamesKMServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/km/impl/GamesKMServiceImpl.java @@ -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 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 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 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 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 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 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 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 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 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) diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/client/MeiTianClient.java b/ff-game/src/main/java/com/ff/game/api/meitian/client/MeiTianClient.java index e712c0e..8f1fb3e 100644 --- a/ff-game/src/main/java/com/ff/game/api/meitian/client/MeiTianClient.java +++ b/ff-game/src/main/java/com/ff/game/api/meitian/client/MeiTianClient.java @@ -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获取投注记录 * diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBalanceTransferStatusResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBalanceTransferStatusResponseDTO.java new file mode 100644 index 0000000..4c95d1c --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/meitian/dto/MeiTianBalanceTransferStatusResponseDTO.java @@ -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; +} diff --git a/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java index 4741aa6..c01c1aa 100644 --- a/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/meitian/impl/MeiTianGameServiceImpl.java @@ -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 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 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 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 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(); } diff --git a/ff-game/src/main/java/com/ff/game/api/ng/address/MyNGAddressSource.java b/ff-game/src/main/java/com/ff/game/api/ng/address/MyNGAddressSource.java index c1b3d32..3a6b35a 100644 --- a/ff-game/src/main/java/com/ff/game/api/ng/address/MyNGAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/ng/address/MyNGAddressSource.java @@ -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"); diff --git a/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java index 861735d..c1b9208 100644 --- a/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/ng/service/impl/GamesPGServiceImpl.java @@ -232,23 +232,8 @@ public class GamesPGServiceImpl implements IGamesService { ApiNGResponseDTO> 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 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 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 gameName = apiGameInfoResponseDTO.getGameName(); - for (String key : gameName.keySet()) { - String name = gameName.get(key); - List 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 paramsMap = new HashMap<>(); @@ -417,32 +374,24 @@ public class GamesPGServiceImpl implements IGamesService { paramsMap.put("orderId", exchangeTransferMoneyRequestDTO.getOrderId()); Map key = this.getKey(exchangeTransferMoneyRequestDTO); ApiNGResponseDTO apiNGResponseDTO = ngClient.exchangeTransferStatus(paramsMap, key); + Integer status = StatusType.IN_PROGRESS.getValue(); if (this.getIsSuccess(apiNGResponseDTO.getCode())) { - ApiExchangeTransferStatusResponseDTO apiNGResponseDTOData = apiNGResponseDTO.getData(); - List 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 currencyDTOList = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTOList(gameSecretKeyDTO); -// List currencys = currencyDTOList.stream() -// .map(GameSecretKeyCurrencyDTO::getCurrency) -// .distinct() -// .collect(Collectors.toList()); - Platform platform = betRecordByTimeDTO.getVendor(); Set 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 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)) { diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/address/MyPGTAddressSource.java b/ff-game/src/main/java/com/ff/game/api/pgt/address/MyPGTAddressSource.java index be49b4c..f8e4654 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/address/MyPGTAddressSource.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/address/MyPGTAddressSource.java @@ -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,""); } } \ No newline at end of file diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java index 186d702..14952d5 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java @@ -64,8 +64,8 @@ public interface PGTClient { * @param headerMap 标题映射 * @return {@link PGTGameListResponse } */ - @Get("/GetGameIconList") - PGTGameListResponse getGameList(@JSONBody Map parameters, @Header Map headerMap); + @Get("/games?${parameters}") + PGTGameListResponse getGameList(@Var("parameters") String parameters, @Header Map headerMap); /** @@ -111,6 +111,15 @@ public interface PGTClient { PGTTransactionDetailsResponse getBetRecordByTime(@Var("parameters") String parameters, @Header Map headerMap); + /** + * 投注交易回放 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTReplayUrlResponseDTO } + */ + @Get(url = "/betTransactionReplay?{parameters}") + PGTReplayUrlResponseDTO betTransactionReplay(@Var("parameters") String parameters, @Header Map headerMap); diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTReplayUrlResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTReplayUrlResponseDTO.java new file mode 100644 index 0000000..1389e4f --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTReplayUrlResponseDTO.java @@ -0,0 +1,50 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * pgtreplay url响应dto + * + * @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; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java index d0776f9..d794122 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java @@ -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; } } diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java index 4deda5f..02f89a9 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -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 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 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 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 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 paramsMap = new LinkedHashMap<>(); @@ -377,24 +376,21 @@ public class GamesPGTServiceImpl implements IGamesService { } Map key = this.getKey(exchangeTransferMoneyRequestDTO); PGTTransactionResponse transactionResponse = pgtClient.exchangeTransferStatus(paramsMap, key); + Integer status = StatusType.IN_PROGRESS.getValue(); if (this.getIsSuccess(transactionResponse.getCode())) { - List 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 paramsMap = new LinkedHashMap<>(); + paramsMap.put("productId", productId); + paramsMap.put("startTime", startTime); + paramsMap.put("endTime", endTime); + paramsMap.put("nextId", nextId); + Map key = this.getKey(betRecordByTimeDTO); + + PGTTransactionDetailsResponse betRecordByTime = pgtClient.getBetRecordByTime(JsonUtil.mapToQueryString(paramsMap), key); + + if (this.getIsSuccess(betRecordByTime.getCode())) { + List 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 = gameBettingDetailsService.selectGameBettingDetailsList(GameBettingDetailsDTO.builder() + .wagersId(getGameDetailRequestDTO.getWagersId()) + .platformCode(GamePlatforms.PGT.getCode()) + .build()); + if (CollectionUtils.isEmpty(gameBettingDetails)) { + return null; + } + GameBettingDetails bettingDetails = gameBettingDetails.get(0); + + + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("productId", productId); + paramsMap.put("betId", getGameDetailRequestDTO.getWagersId()); + paramsMap.put("username", bettingDetails.getAccount()); + Map 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 paramsMap = new HashMap<>(); - paramsMap.put("username", kickMemberRequestDTO.getAccount()); - paramsMap.put("productId", productId); - Map 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 dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) { + private synchronized void batchInsert(List dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) { List gameBettingDetails = new ArrayList<>(); List 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(); diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/impl/GamesPGXServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/pgx/impl/GamesPGXServiceImpl.java index b8439e5..bf99cec 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgx/impl/GamesPGXServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/pgx/impl/GamesPGXServiceImpl.java @@ -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 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 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 params = new LinkedHashMap<>(); params.put("operatorcode", gamesBaseRequestDTO.getAgentId()); @@ -230,23 +228,8 @@ public class GamesPGXServiceImpl implements IGamesService { List 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 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 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 nameInfos = new ArrayList<>(); + nameInfos.add(new NameInfo(gamesDataDTO.getGameName(), "en-US")); + game.setNameInfo(nameInfos); + gameService.updateGame(game); } gamesDataDTO.setSystemGameId(game.getId()); - /*List 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 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(); } } diff --git a/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusResponseDTO.java new file mode 100644 index 0000000..7f4a698 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/request/ExchangeTransferStatusResponseDTO.java @@ -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; + + +} diff --git a/ff-game/src/main/java/com/ff/game/api/request/GetGameDetailResponseDTO.java b/ff-game/src/main/java/com/ff/game/api/request/GetGameDetailResponseDTO.java index 373d4ed..b3debb2 100644 --- a/ff-game/src/main/java/com/ff/game/api/request/GetGameDetailResponseDTO.java +++ b/ff-game/src/main/java/com/ff/game/api/request/GetGameDetailResponseDTO.java @@ -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 { diff --git a/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java index 8ad3da3..779c1b2 100644 --- a/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/sa/impl/GamesSAServiceImpl.java @@ -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()); } diff --git a/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java b/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java index cef2595..88d4365 100644 --- a/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/api/xk/service/impl/GamesXKServiceImpl.java @@ -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(); } diff --git a/ff-game/src/main/java/com/ff/game/domain/Game.java b/ff-game/src/main/java/com/ff/game/domain/Game.java index 673c71c..5b65e5b 100644 --- a/ff-game/src/main/java/com/ff/game/domain/Game.java +++ b/ff-game/src/main/java/com/ff/game/domain/Game.java @@ -94,5 +94,13 @@ public class Game extends BaseEntity { */ private Integer platformType; + /** + * 名称信息 + */ private List nameInfo; + + /** + * 游戏id + */ + private String gameId; } diff --git a/ff-game/src/main/java/com/ff/game/domain/GameExchangeMoney.java b/ff-game/src/main/java/com/ff/game/domain/GameExchangeMoney.java index 6721e0b..336dd12 100644 --- a/ff-game/src/main/java/com/ff/game/domain/GameExchangeMoney.java +++ b/ff-game/src/main/java/com/ff/game/domain/GameExchangeMoney.java @@ -90,5 +90,13 @@ public class GameExchangeMoney extends BaseEntity @Excel(name = "状态 1 成功 2失败") private Integer status; + /** + * 步 GameExchangeStep 枚举 + */ + private Integer step; + /** + * 步骤状态 GameExchangeStepStatus 枚举 + */ + private Integer stepStatus; } diff --git a/ff-game/src/main/java/com/ff/game/domain/NameInfo.java b/ff-game/src/main/java/com/ff/game/domain/NameInfo.java index 76c12d8..f5896a9 100644 --- a/ff-game/src/main/java/com/ff/game/domain/NameInfo.java +++ b/ff-game/src/main/java/com/ff/game/domain/NameInfo.java @@ -15,6 +15,12 @@ import java.io.Serializable; @Builder @NoArgsConstructor public class NameInfo implements Serializable { + /** + * 名称 + */ private String name; + /** + * 长 + */ private String lang; } diff --git a/ff-game/src/main/java/com/ff/game/mapper/GameMapper.java b/ff-game/src/main/java/com/ff/game/mapper/GameMapper.java index c6deaeb..09ed960 100644 --- a/ff-game/src/main/java/com/ff/game/mapper/GameMapper.java +++ b/ff-game/src/main/java/com/ff/game/mapper/GameMapper.java @@ -23,6 +23,15 @@ public interface GameMapper { */ Game selectGameById(Long id); + + /** + * 按游戏id选择游戏 + * + * @param gameId 游戏id + * @return {@link Game } + */ + Game selectGameByGameId(String gameId); + /** * 查询平台子游戏管理列表 * diff --git a/ff-game/src/main/java/com/ff/game/service/IGameService.java b/ff-game/src/main/java/com/ff/game/service/IGameService.java index 47d8f05..bab4681 100644 --- a/ff-game/src/main/java/com/ff/game/service/IGameService.java +++ b/ff-game/src/main/java/com/ff/game/service/IGameService.java @@ -22,6 +22,15 @@ public interface IGameService { */ Game selectGameById(Long id); + + /** + * 按游戏id选择游戏 + * + * @param gameId 游戏id + * @return {@link Game } + */ + Game selectGameByGameId(String gameId); + /** * 查询平台子游戏管理列表 * diff --git a/ff-game/src/main/java/com/ff/game/service/impl/GameServiceImpl.java b/ff-game/src/main/java/com/ff/game/service/impl/GameServiceImpl.java index 95df45c..4a1a969 100644 --- a/ff-game/src/main/java/com/ff/game/service/impl/GameServiceImpl.java +++ b/ff-game/src/main/java/com/ff/game/service/impl/GameServiceImpl.java @@ -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); + } + /** * 查询平台子游戏管理列表 * diff --git a/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java b/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java index 248cd38..a21b96a 100644 --- a/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java +++ b/ff-game/src/main/java/com/ff/member/service/impl/MemberServiceImpl.java @@ -131,7 +131,7 @@ public class MemberServiceImpl implements IMemberService { */ @Override public Member selectMemberByGameAccount(String gameAccount) { - return memberMapper.selectMemberByGameAccount(gameAccount.toLowerCase()); + return memberMapper.selectMemberByGameAccount(gameAccount); } /** diff --git a/ff-game/src/main/java/com/ff/quartz/task/GameTask.java b/ff-game/src/main/java/com/ff/quartz/task/GameTask.java index afd632e..7bcead7 100644 --- a/ff-game/src/main/java/com/ff/quartz/task/GameTask.java +++ b/ff-game/src/main/java/com/ff/quartz/task/GameTask.java @@ -206,9 +206,6 @@ public class GameTask { List 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()); diff --git a/ff-game/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml b/ff-game/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml index 2783b81..306cb37 100644 --- a/ff-game/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameExchangeMoneyMapper.xml @@ -23,6 +23,8 @@ + + @@ -48,6 +50,8 @@ + + @@ -69,7 +73,9 @@ create_by, create_time, update_by, - update_time + update_time, + step, + step_status from ff_game_exchange_money @@ -275,6 +281,12 @@ update_time, + + step, + + + step_status, + @@ -334,6 +346,12 @@ #{updateTime}, + + #{step}, + + + #{stepStatus}, + @@ -394,6 +412,12 @@ update_time = #{updateTime}, + + step = #{step}, + + + step_status = #{stepStatus}, + where id = #{id} diff --git a/ff-game/src/main/resources/mapper/game/GameMapper.xml b/ff-game/src/main/resources/mapper/game/GameMapper.xml index 3baffbe..48f1b77 100644 --- a/ff-game/src/main/resources/mapper/game/GameMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameMapper.xml @@ -7,12 +7,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + + + @@ -23,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - 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 @@ -33,7 +35,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and sort_no = #{sortNo} - and platform_id = #{platformId} and game_code = #{gameCode} and ingress = #{ingress} and game_source_type = #{gameSourceType} @@ -50,7 +51,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -93,11 +86,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} + + insert into ff_game id, sort_no, - platform_id, game_code, ingress, game_source_type, @@ -109,10 +106,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_time, update_by, update_time, + name_info, + game_id, + platform_code, + platform_type, #{id}, #{sortNo}, - #{platformId}, #{gameCode}, #{ingress}, #{gameSourceType}, @@ -124,6 +124,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{createTime}, #{updateBy}, #{updateTime}, + #{nameInfo, typeHandler=com.ff.base.handler.JsonListHandler,javaType=com.ff.game.domain.NameInfo}, + #{gameId}, + #{platformCode}, + #{platformType}, @@ -131,7 +135,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update ff_game sort_no = #{sortNo}, - platform_id = #{platformId}, game_code = #{gameCode}, ingress = #{ingress}, game_source_type = #{gameSourceType}, @@ -143,6 +146,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_time = #{createTime}, update_by = #{updateBy}, update_time = #{updateTime}, + name_info = #{nameInfo, typeHandler=com.ff.base.handler.JsonListHandler,javaType=com.ff.game.domain.NameInfo}, + game_id = #{gameId}, + platform_code = #{platformCode}, + platform_type = #{platformType}, where id = #{id} @@ -159,11 +166,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - + + @@ -205,7 +209,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and sort_no = #{sortNo} - and platform_id = #{platformId} and game_code = #{gameCode} and ingress = #{ingress} and game_source_type = #{gameSourceType}