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 8df3d35..27a3135 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游戏 */ @@ -68,6 +71,11 @@ public class CacheConstants { */ public static final String PG_GAMES = "pg_games:"; + /** + * pgt游戏 + */ + public static final String PGT_GAMES = "pgt_games:"; + /** * fc游戏 @@ -93,6 +101,12 @@ public class CacheConstants { */ public static final String PG_GAMES_BET_CURRENCY = "pg_games:bet:currency"; + + /** + * pgt下一个id + */ + public static final String PGT_NEXT_ID = "pgt_next:id:"; + /** * ae时间从 */ 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/GamePlatforms.java b/ff-base/src/main/java/com/ff/base/enums/GamePlatforms.java index a952382..89a6973 100644 --- a/ff-base/src/main/java/com/ff/base/enums/GamePlatforms.java +++ b/ff-base/src/main/java/com/ff/base/enums/GamePlatforms.java @@ -14,8 +14,8 @@ public enum GamePlatforms { MT("MT", "美天棋牌"), AE("AE", "AE"), KM("KM", "KM"), - - FBSports("FBSports", "FB体育"); + PGT("PGT", "PGT"), + ; private final String code; private final String info; diff --git a/ff-base/src/main/java/com/ff/base/enums/PGTBetStatus.java b/ff-base/src/main/java/com/ff/base/enums/PGTBetStatus.java new file mode 100644 index 0000000..f5537c2 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/PGTBetStatus.java @@ -0,0 +1,24 @@ +package com.ff.base.enums; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +/** + * 完成 + * + * @author shi + * @date 2025/04/07 + */ +@Getter +@AllArgsConstructor +public enum PGTBetStatus { + OPEN(1, "打开 或 未结算", "OPEN"), + SETTLED(2, "已结算", "SETTLED"), + UNSETTLED(1, "未结算", "UNSETTLED"), + VOID(3, "作废 或 无效", "VOID"); + + private final int code; + private final String description; + private final String type; +} diff --git a/ff-base/src/main/java/com/ff/base/enums/PGTGameType.java b/ff-base/src/main/java/com/ff/base/enums/PGTGameType.java new file mode 100644 index 0000000..94ebdb1 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/PGTGameType.java @@ -0,0 +1,43 @@ +package com.ff.base.enums; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +import java.util.Optional; +import java.util.stream.Stream; + +/** + * pgt名称类型 + * + * @author shi + * @date 2025/04/07 + */ +@Getter +@AllArgsConstructor +public enum PGTGameType { + EGAMES("EGAMES",1, "游戏老虎机"), + LIVECASINO("LIVECASINO",2, "现场赌场"), + SPORT("SPORT",8, "体育"), + POKER("POKER",2, "扑克"), + TRADING("TRADING",1, "贸易"); + + // 枚举字段 + private final String code; + private final Integer systemCode; + private final String description; + + /** + * 按代码查找系统 + * + * @param code 代码 + * @return {@link Integer } + */ + public static Integer findSystemByCode(String code) { + Optional system = Stream.of(PGTGameType.values()) + .filter(gameType -> gameType.getCode().equals(code)) + .map(PGTGameType::getSystemCode) + .findFirst(); + return system.orElse(null); + } +} diff --git a/ff-base/src/main/java/com/ff/base/enums/PGTPayoutStatus.java b/ff-base/src/main/java/com/ff/base/enums/PGTPayoutStatus.java new file mode 100644 index 0000000..7c62692 --- /dev/null +++ b/ff-base/src/main/java/com/ff/base/enums/PGTPayoutStatus.java @@ -0,0 +1,35 @@ +package com.ff.base.enums; + +import com.dtflys.forest.annotation.Get; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +/** + * pgtplayout状态 + * + * @author shi + * @date 2025/04/07 + */ +@Getter +@AllArgsConstructor +public enum PGTPayoutStatus { + + LOSE("LOSE", 2, "输"), + WIN("WIN",1, "赢"), + DRAW("DRAW",3, "平"), + UNKNOWN("UNKNOWN",4, "未知"); + + private final String code; + private final Integer systemCode; + private final String description; + + public static PGTPayoutStatus getByCode(String code) { + for (PGTPayoutStatus status : PGTPayoutStatus.values()) { + if (status.getCode().equals(code)) { + return status; + } + } + return UNKNOWN; + } +} 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/DateUtils.java b/ff-base/src/main/java/com/ff/base/utils/DateUtils.java index 36043d1..4f598c9 100644 --- a/ff-base/src/main/java/com/ff/base/utils/DateUtils.java +++ b/ff-base/src/main/java/com/ff/base/utils/DateUtils.java @@ -40,6 +40,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { public static final String ISO_8601_FORMAT= "yyyy-MM-dd'T'HH:mm:ss"; + + + public static final String ISO_8601_FORMAT_Z= "yyyy-MM-dd'T'HH:mm:ss'Z'"; + + /** * 获取当前Date型日期 * diff --git a/ff-base/src/main/java/com/ff/base/utils/NumberUtils.java b/ff-base/src/main/java/com/ff/base/utils/NumberUtils.java index bfc3134..0ea20e8 100644 --- a/ff-base/src/main/java/com/ff/base/utils/NumberUtils.java +++ b/ff-base/src/main/java/com/ff/base/utils/NumberUtils.java @@ -9,7 +9,6 @@ import java.util.concurrent.ThreadLocalRandom; public class NumberUtils { - /** * 计算比例 * @@ -68,17 +67,13 @@ public class NumberUtils { Random random = new Random(); StringBuilder sb = new StringBuilder(); - // 每位字符可以是字母(A-Z, a-z)或数字(0-9) - for (int i = 0; i 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); } @@ -126,7 +122,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()); @@ -151,18 +147,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()); @@ -206,11 +190,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()); @@ -228,21 +207,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()); @@ -255,7 +237,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 130cf65..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 @@ -108,13 +108,8 @@ public class ApiMemberController extends BaseController { } } ApiException.notNull(keyInfo, ErrorCode.CURRENCY_NOT_EXIST.getCode()); -// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(memberCreateApiRequest.getPlatformCode()) -// .systemCurrency(memberCreateApiRequest.getCurrencyCode()).build()); -// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); - - String gameAccount = StringUtils.addSuffix(memberService.getMemberGameAccount(memberCreateApiRequest.getPlatformCode()), tenantSecretKey.getTenantSn()); + String gameAccount =memberService.getMemberGameAccount(memberCreateApiRequest.getPlatformCode(), tenantSecretKey.getTenantSn()); // 获取用户信息 @@ -149,6 +144,10 @@ public class ApiMemberController extends BaseController { .build(); Boolean result = iGamesService.createMember(gamesBaseRequestDTO); Assert.isTrue(result, "建立游戏账号失败"); + + + + return toAjax(Boolean.TRUE); } @@ -166,12 +165,6 @@ public class ApiMemberController extends BaseController { ApiException.notNull(iGamesService, ErrorCode.PLATFORM_NOT_EXIST.getCode()); - TenantSecretKey tenantSecretKey = keyConfig.get(); -// GameSecretKeyCurrencyDTO gameSecretKey = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(memberInfoApiRequest.getPlatformCode()) -// .systemCurrency(memberInfoApiRequest.getCurrencyCode()).build()); -// -// ApiException.notNull(gameSecretKey, ErrorCode.CURRENCY_NOT_EXIST.getCode()); Platform platform = platformService.get(request.getPlatformCode()); ApiException.notNull(platform, ErrorCode.PLATFORM_NOT_EXIST.getCode()); 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 7bafc53..ed79abd 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 @@ -269,13 +269,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 17453f3..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 @@ -84,15 +84,6 @@ public class GamesAEServiceImpl implements IGamesService { */ private static final Long GAME_ID = 1904452832756013817L; - /** - * 平台ID - */ - private static final Long PLATFORM_ID = 1904411420257108325L; - - /** - * 游戏名称id - */ - private static final Long GAME_NAME_ID = 1904452833756002317L; /** * 获得就是成功 @@ -202,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); //不存在这个游戏 @@ -221,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"); @@ -232,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; } /** @@ -258,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(); @@ -287,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 { @@ -303,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); } @@ -334,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); @@ -353,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(); } @@ -409,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()); } @@ -425,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"; @@ -539,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<>(); //数据组装 @@ -586,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 9a480ea..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 @@ -2,13 +2,11 @@ package com.ff.game.api.km.client; import com.dtflys.forest.annotation.*; -import com.ff.game.api.dg.dto.DGBetRecordResponseDTO; import com.ff.game.api.dg.dto.DGResponse; -import com.ff.game.api.dg.dto.DGUserListResponseDTO; +import com.ff.game.api.fc.dto.ApiCFBalanceTransferStatusResponseDTO; import com.ff.game.api.km.address.MyKMAddressSource; import com.ff.game.api.km.dto.*; -import com.ff.game.api.km.success.MyKMSuccessCondition; -import com.ff.game.api.xk.dto.XKBetRecordResponseDTO; +import com.ff.game.api.success.MySuccessCondition; import java.util.Map; @@ -19,7 +17,7 @@ import java.util.Map; * @date 2025/02/10 */ @Address(source = MyKMAddressSource.class) -@Success(condition = MyKMSuccessCondition.class) +@Success(condition = MySuccessCondition.class) public interface KMClient { /** * 创建成员 @@ -81,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 305a9eb..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.*; @@ -24,8 +27,6 @@ import com.ff.game.service.IGameExchangeMoneyService; import com.ff.game.service.IGameService; import com.ff.member.domain.Member; import com.ff.member.service.IMemberService; -import com.ff.utils.CalculateDateDaysAgo; -import com.ff.utils.TimestampFromString; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -38,6 +39,10 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -49,7 +54,7 @@ import java.util.stream.Collectors; * @author shi * @date 2024/10/21 */ -@Service("MeiTianService") +@Service("MTService") @Slf4j public class MeiTianGameServiceImpl implements IGamesService { @@ -215,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())) @@ -246,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")); @@ -257,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); @@ -291,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(); @@ -321,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); @@ -360,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(StatusType.SUCCESS.getValue()); // 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()); } @@ -388,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(StatusType.SUCCESS.getValue()); // 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()); } } @@ -410,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(); } @@ -483,7 +496,7 @@ public class MeiTianGameServiceImpl implements IGamesService { boolean doSyncRecordByDate(BetRecordByTimeDTO betRecordByTimeDTO, int daysToSubtract) { - String date = CalculateDateDaysAgo.getStr(daysToSubtract); + String date = getDateStr(daysToSubtract); String configKey = GamePlatforms.MT.getCode() + ":lastSyncDate"; String syncDateStr = sysConfigServiceImpl.selectConfigByKey(configKey); Map syncDateMap = new HashMap<>(); @@ -746,9 +759,9 @@ public class MeiTianGameServiceImpl implements IGamesService { Map dataDTOMap = gameDatas.stream().collect(Collectors.toMap(MeiTianGameDataDTO::getGameId, e -> e)); MeiTianGameDataDTO gamesDataDTO = dataDTOMap.get(dataBean.getGameCode()); BigDecimal originPayoffAmount = new BigDecimal(dataBean.getIncome()); // 这个值是到手的 - BigDecimal betAmount = new BigDecimal(dataBean.getBetAmount()); - int compareResult = originPayoffAmount.compareTo(betAmount); - long gameTime = TimestampFromString.from(dataBean.getGameDate()); + + int compareResult = originPayoffAmount.compareTo(BigDecimal.ZERO); + long gameTime = getTime(dataBean.getGameDate()); Platform platform = gamesDataBuildDTO.getPlatform(); String systemCurrency = platform.getOurCurrency(dataBean.getCurrency()); //数据构造 @@ -780,4 +793,30 @@ public class MeiTianGameServiceImpl implements IGamesService { gameBettingDetails.setCreateTime(DateUtils.getNowDate()); return gameBettingDetails; } + + public long getTime(String date) { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date parse = simpleDateFormat.parse(date); + return parse.getTime(); + } catch (ParseException e) { + return System.currentTimeMillis(); + } + } + + public LocalDate getDate(int daysToSubtract) { + return LocalDate.now().minusDays(daysToSubtract); // 获取当前日期减去两天 + } + + public String getDateStr(int daysToSubtract) { + // 获取当前日期减去指定天数 + LocalDate date = LocalDate.now().minusDays(daysToSubtract); + + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // 返回格式化日期字符串 + return date.format(formatter); + } + } 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 new file mode 100644 index 0000000..f8e4654 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/address/MyPGTAddressSource.java @@ -0,0 +1,35 @@ +package com.ff.game.api.pgt.address; + +import com.dtflys.forest.callback.AddressSource; +import com.dtflys.forest.http.ForestAddress; +import com.dtflys.forest.http.ForestRequest; +import com.ff.base.constant.Constants; +import com.ff.base.enums.GamePlatforms; +import com.ff.base.system.service.ISysConfigService; +import com.ff.game.service.IPlatformService; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + + +/** + * 我 pt 泰国来源 + * + * @author shi + * @date 2025/02/10 + */ +@Component +public class MyPGTAddressSource implements AddressSource { + @Resource + private IPlatformService platformService; + @Resource + private ISysConfigService configService; + + + @Override + public ForestAddress getAddress(ForestRequest request) { + 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 new file mode 100644 index 0000000..14952d5 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/client/PGTClient.java @@ -0,0 +1,139 @@ +package com.ff.game.api.pgt.client; + +import com.dtflys.forest.annotation.*; +import com.ff.game.api.dg.dto.DGResponse; +import com.ff.game.api.fc.dto.ApiFCGameListResponseDTO; +import com.ff.game.api.jili.dto.JILIKickMemberAllDTO; +import com.ff.game.api.jili.dto.JILIKickMemberDTO; +import com.ff.game.api.ng.dto.ApiExchangeTransferStatusResponseDTO; +import com.ff.game.api.ng.dto.ApiNGResponseDTO; +import com.ff.game.api.pgt.address.MyPGTAddressSource; +import com.ff.game.api.pgt.dto.*; +import com.ff.game.api.pgx.dto.PGXPlayerStatusResponse; +import com.ff.game.api.success.MySuccessCondition; +import com.ff.game.api.xk.dto.XKKickMemberAllDTO; + +import java.util.Map; + +/** + * pt 泰国 + * + * @author shi + * @date 2025/02/10 + */ +@Address(source = MyPGTAddressSource.class) +@Success(condition = MySuccessCondition.class) +public interface PGTClient { + /** + * 创建成员 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link String } + */ + @Post("/member") + PGTCreateMemberResponse createMember(@JSONBody Map parameters, @Header Map headerMap); + + /** + * 获取会员信息 + * + * @param parameters 范围 + * @return {@link PGTBalanceResponse } + */ + @Get("/balance?${parameters}") + PGTBalanceResponse getMemberInfo(@Var("parameters") String parameters, @Header Map headerMap); + + + + + + /** + * 无重定向登录 + * + * @param parameters 范围 + * @return {@link PGTLoginResponse } + */ + @Post("/logIn") + PGTLoginResponse loginWithoutRedirect(@JSONBody Map parameters, @Header Map headerMap); + + + /** + * 获取游戏列表 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTGameListResponse } + */ + @Get("/games?${parameters}") + PGTGameListResponse getGameList(@Var("parameters") String parameters, @Header Map headerMap); + + + /** + * 押金 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTExchangeTransferResponse } + */ + @Post(url = "/deposit") + PGTExchangeTransferResponse deposit(@JSONBody Map parameters, @Header Map headerMap); + + + /** + * 收回 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTExchangeTransferResponse } + */ + @Post(url = "/withdraw") + PGTExchangeTransferResponse withdraw(@JSONBody Map parameters, @Header Map headerMap); + + /** + * 汇兑转移状态 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link ApiNGResponseDTO }<{@link ApiExchangeTransferStatusResponseDTO }> + */ + @Post(url = "/verifyDepositWithdraw") + PGTTransactionResponse exchangeTransferStatus(@JSONBody Map parameters, @Header Map headerMap); + + + /** + * 按时间获取投注记录 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTTransactionDetailsResponse } + */ + @Get(url = "/betTransactionsV2?{parameters}") + 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); + + + + /** + * 踢出队员 + * + * @param parameters 范围 + * @param headerMap 标题映射 + * @return {@link PGTKickMemberResponse } + */ + @Post("/seamless/kickOutPlayer") + PGTKickMemberResponse kickMember(@JSONBody Map parameters, @Header Map headerMap); + + + + +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTBalanceResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTBalanceResponse.java new file mode 100644 index 0000000..d60c33e --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTBalanceResponse.java @@ -0,0 +1,62 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * PG平衡响应 + * + * @author shi + * @date 2025/04/03 + */ +@Data +public class PGTBalanceResponse { + + /** + * 每个请求的唯一引用 + */ + @JsonProperty("reqId") + private String reqId; + + /** + * 响应状态,通常为 0 表示成功,其他值表示错误 + */ + @JsonProperty("code") + private int code; + + /** + * 关于响应状态的其他信息 + */ + @JsonProperty("message") + private String message; + + /** + * 获取余额数据 + */ + @JsonProperty("data") + private BalanceData data; + + @Data + public static class BalanceData { + + /** + * 用户名 + */ + @JsonProperty("username") + private String username; + + /** + * 每个 productId 的当前余额 + */ + @JsonProperty("balance") + private BigDecimal balance; + + /** + * 响应状态 + */ + @JsonProperty("status") + private String status; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTCreateMemberResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTCreateMemberResponse.java new file mode 100644 index 0000000..8f7537a --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTCreateMemberResponse.java @@ -0,0 +1,60 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * pgtcreate成员响应 + * + * @author shi + * @date 2025/04/03 + */ +@Data +public class PGTCreateMemberResponse { + + /** + * 请求的唯一标识符 + */ + @JsonProperty("reqId") + private String reqId; + + /** + * 状态码,0 表示成功,其他值表示错误 + */ + @JsonProperty("code") + private int code; + + /** + * 响应消息,通常用于提供请求处理的结果 + */ + @JsonProperty("message") + private String message; + + /** + * 响应的实际数据 + */ + @JsonProperty("data") + private ResponseData data; + + @Data + public static class ResponseData { + + /** + * 用户名 + */ + @JsonProperty("username") + private String username; + + /** + * 货币类型 + */ + @JsonProperty("currency") + private String currency; + + /** + * 操作状态 + */ + @JsonProperty("status") + private String status; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTExchangeTransferResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTExchangeTransferResponse.java new file mode 100644 index 0000000..9bb67a7 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTExchangeTransferResponse.java @@ -0,0 +1,80 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * pgtexchange传输响应 + * + * @author shi + * @date 2025/04/03 + */ +@Data +public class PGTExchangeTransferResponse { + + /** + * 每个请求的唯一引用 + */ + @JsonProperty("reqId") + private String reqId; + + /** + * 响应状态,通常为 0 表示成功,其他值表示错误 + */ + @JsonProperty("code") + private int code; + + /** + * 关于响应状态的其他信息 + */ + @JsonProperty("message") + private String message; + + /** + * 包含余额相关的数据 + */ + @JsonProperty("data") + private BalanceData data; + + @Data + public static class BalanceData { + + /** + * 响应状态,成功/失败 + */ + @JsonProperty("status") + private String status; + + /** + * 存款金额(十进制 2 位数字) + */ + @JsonProperty("amount") + private BigDecimal amount; + + /** + * 存款后每个 productId 的余额(十进制 2 位数字) + */ + @JsonProperty("balance") + private BigDecimal balance; + + /** + * 交易 ID + */ + @JsonProperty("txId") + private String txId; + + /** + * 用户名 + */ + @JsonProperty("username") + private String username; + + /** + * 存款前每个 productId 的余额(十进制 2 位数字 + */ + @JsonProperty("beforeBalance") + private BigDecimal beforeBalance; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTGameListResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTGameListResponse.java new file mode 100644 index 0000000..28d0704 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTGameListResponse.java @@ -0,0 +1,133 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.util.List; + +/** + * pgtgame列表响应 + * + * @author shi + * @date 2025/04/07 + */ +@Data +public class PGTGameListResponse { + /** + * 每个请求的唯一引用 + */ + @JsonProperty("reqId") + private String reqId; + + /** + * 响应状态,0 表示成功,其他值表示错误 + */ + @JsonProperty("code") + private int code; + + /** + * 有关响应状态的其他信息 + */ + @JsonProperty("message") + private String message; + + /** + * 包含游戏数据的对象 + */ + @JsonProperty("data") + private GameData data; + + @Data + public static class GameData { + + /** + * 游戏列表 + */ + @JsonProperty("games") + private List games; + } + + @Data + public static class Game { + + /** + * 游戏名称 + */ + @JsonProperty("name") + private String name; + + /** + * 游戏类别 + */ + @JsonProperty("category") + private String category; + + /** + * 游戏类型 + */ + @JsonProperty("type") + private String type; + + /** + * 游戏代码 + */ + @JsonProperty("code") + private String code; + + /** + * 游戏图片链接 + */ + @JsonProperty("img") + private String img; + + /** + * 系统游戏id + */ + private Long systemGameId; + + /** + * 游戏排名 + */ + @JsonProperty("rank") + private int rank; + + /** + * 游戏提供者代码 + */ + @JsonProperty("providerCode") + private String providerCode; + + + /** + * 场所 + */ + @JsonProperty("locale") + private Locale locale; + } + + /** + * 场所 + * + * @author shi + * @date 2025/04/07 + */ + @Data + public class Locale { + /** + * 泰文 + */ + @JsonProperty("TH") + private String th; + /** + * 英语 + */ + @JsonProperty("EN") + private String en; + /** + * 中国 + */ + @JsonProperty("CN") + private String cn; + } + +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTKickMemberResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTKickMemberResponse.java new file mode 100644 index 0000000..2735bf7 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTKickMemberResponse.java @@ -0,0 +1,56 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * pgtkick成员响应 + * + * @author shi + * @date 2025/04/07 + */ +@Data +public class PGTKickMemberResponse { + + + /** + * 每个请求的唯一引用 + */ + @JsonProperty("reqId") + private String reqId; + + /** + * 响应状态代码 + * 0:成功,其他代码表示失败 + */ + @JsonProperty("code") + private int code; + + /** + * 消息描述 + */ + @JsonProperty("message") + private String message; + + /** + * 交易数据 + */ + @JsonProperty("data") + private TransactionData data; + + @Data + public static class TransactionData { + + /** + * 交易成功的状态描述 + */ + @JsonProperty("status") + private String status; + + /** + * 玩家用户名 + */ + @JsonProperty("username") + private String username; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTLoginResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTLoginResponse.java new file mode 100644 index 0000000..57590a7 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTLoginResponse.java @@ -0,0 +1,54 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * pgtlogin响应 + * + * @author shi + * @date 2025/04/03 + */ +@Data +public class PGTLoginResponse { + + /** + * 每个请求的唯一引用 + */ + @JsonProperty("reqId") + private String reqId; + + /** + * 响应状态,通常为 0 表示成功,其他值表示错误 + */ + @JsonProperty("code") + private int code; + + /** + * 关于响应状态的其他信息 + */ + @JsonProperty("message") + private String message; + + /** + * 包含登录相关数据 + */ + @JsonProperty("data") + private LoginData data; + + @Data + public static class LoginData { + + /** + * 登录 URL 链接 + */ + @JsonProperty("url") + private String url; + + /** + * 用户名 + */ + @JsonProperty("username") + private String username; + } +} 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/PGTTransactionDetailsResponse.java b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionDetailsResponse.java new file mode 100644 index 0000000..096183e --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionDetailsResponse.java @@ -0,0 +1,153 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * pgtt交易详情响应 + * + * @author shi + * @date 2025/04/07 + */ +@Data +public class PGTTransactionDetailsResponse { + + /** + * 每个请求的唯一引用 + */ + @JsonProperty("reqId") + private String reqId; + + /** + * 响应状态,通常为 0 表示成功,其他值表示错误 + */ + @JsonProperty("code") + private int code; + + /** + * 关于响应状态的其他信息 + */ + @JsonProperty("message") + private String message; + + /** + * 包含交易数据的对象 + */ + @JsonProperty("data") + private TransactionData data; + + @Data + public static class TransactionData { + + /** + * 下一批数据的 ID + */ + @JsonProperty("nextId") + private String nextId; + + /** + * 交易列表 + */ + @JsonProperty("txns") + private List txns; + } + + @Data + public static class Transaction { + + /** + * 交易 ID + */ + @JsonProperty("id") + private String id; + + /** + * 用户投注 ID + */ + @JsonProperty("betId") + private String betId; + + /** + * 用户名 + */ + @JsonProperty("username") + private String username; + + /** + * ISO 4217 货币代码 + */ + @JsonProperty("currency") + private String currency; + + /** + * 结算时间 + */ + @JsonProperty("accountingDate") + private Date accountingDate; + + /** + * 最新更新时间 + */ + @JsonProperty("updatedDate") + private Date updatedDate; + + /** + * 质押金额 + */ + @JsonProperty("stake") + private BigDecimal stake; + + /** + * 支付金额(包括本金) + */ + @JsonProperty("payout") + private BigDecimal payout; + + /** + * 产品 ID + */ + @JsonProperty("productId") + private String productId; + + /** + * 游戏代码 + */ + @JsonProperty("gameCode") + private String gameCode; + + /** + * 游戏名称 + */ + @JsonProperty("gameName") + private String gameName; + + /** + * 轮次 ID + */ + @JsonProperty("roundId") + private String roundId; + + /** + * 投注状态(未结、已结算、未结算、无效) + * OPEN, SETTLED, UNSETTLED, VOID + */ + @JsonProperty("betStatus") + private String betStatus; + + /** + * 支付状态(LOSE、WIN、DRAW、UNKNOWN) + */ + @JsonProperty("payoutStatus") + private String payoutStatus; + + /** + * 佣金 + */ + @JsonProperty("commission") + private double commission; + } +} 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 new file mode 100644 index 0000000..d794122 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/dto/PGTTransactionResponse.java @@ -0,0 +1,92 @@ +package com.ff.game.api.pgt.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * pgtt交易响应 + * + * @author shi + * @date 2025/04/07 + */ +@Data +public class PGTTransactionResponse { + + /** + * 每个请求的唯一引用 + */ + @JsonProperty("reqId") + private String reqId; + + /** + * 响应状态,通常为 0 表示成功,其他值表示错误 + */ + @JsonProperty("code") + private int code; + + /** + * 关于响应状态的其他信息 + */ + @JsonProperty("message") + private String message; + + /** + * 包含交易相关的数据 + */ + @JsonProperty("data") + private TransactionData data; + + @Data + public static class TransactionData { + + /** + * 交易是否成功 + */ + @JsonProperty("success") + private boolean success; + + /** + * 用户名 + */ + @JsonProperty("username") + private String username; + + /** + * 产品ID,例如 "SEXY" 等 + */ + @JsonProperty("productId") + private String productId; + + /** + * 货币类型,如 "THB" + */ + @JsonProperty("currency") + private String currency; + + /** + * 交易参考号 + */ + @JsonProperty("transactionRef") + private String transactionRef; + + /** + * 当前交易的金额 + */ + @JsonProperty("amount") + private BigDecimal amount; + + /** + * 交易前的余额 + */ + @JsonProperty("beforeBalance") + private BigDecimal beforeBalance; + + /** + * 交易后的余额 + */ + @JsonProperty("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 new file mode 100644 index 0000000..02f89a9 --- /dev/null +++ b/ff-game/src/main/java/com/ff/game/api/pgt/impl/GamesPGTServiceImpl.java @@ -0,0 +1,670 @@ +package com.ff.game.api.pgt.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson2.JSON; +import com.ff.base.config.RedisConfig; +import com.ff.base.constant.CacheConstants; +import com.ff.base.constant.Constants; +import com.ff.base.core.redis.RedisCache; +import com.ff.base.enums.*; +import com.ff.base.exception.base.ApiException; +import com.ff.base.exception.base.BaseException; +import com.ff.base.system.service.ISysConfigService; +import com.ff.base.utils.DateUtils; +import com.ff.base.utils.JsonUtil; +import com.ff.base.utils.StringUtils; +import com.ff.base.utils.sign.Base64; +import com.ff.config.KeyConfig; +import com.ff.game.api.IGamesService; +import com.ff.game.api.fc.dto.ApiFCGameListResponseDTO; +import com.ff.game.api.fc.dto.ApiFCResult; +import com.ff.game.api.pgt.client.PGTClient; +import com.ff.game.api.pgt.dto.*; +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; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.Base64Utils; +import org.springframework.util.CollectionUtils; +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; +import java.util.stream.Collectors; + + +/** + * pg泰 + * + * @author shi + * @date 2025/03/27 + */ +@Service("PGTService") +@Slf4j +public class GamesPGTServiceImpl implements IGamesService { + + + @Resource + private ISysConfigService configService; + + @Resource + private RedisCache redisCache; + + @Resource + private IGameExchangeMoneyService gameExchangeMoneyService; + + + @Resource + private IGameService gameService; + + + @Resource + private IMemberService memberService; + + @Resource + private IGameFreeRecordService gameFreeRecordService; + + + @Resource + private PGTClient pgtClient; + + + @Resource + private KeyConfig keyConfig; + + @Resource + private IGameBettingDetailsService gameBettingDetailsService; + + + String productId = "PGSOFT"; + + /** + * 获得就是成功 + * + * @param errorCode 错误代码 + * @return {@link Boolean } + */ + private Boolean getIsSuccess(Integer errorCode) { + + return 0 == errorCode; + } + + + /** + * 获取密钥 + * + * @return {@link String } + */ + private Map getKey(GamesBaseRequestDTO gamesBaseRequestDTO) { + Map headerMap = new LinkedHashMap<>(); + String auth = gamesBaseRequestDTO.getAgentId() + ":" + gamesBaseRequestDTO.getAgentKey(); + String encodedAuth = Base64Utils.encodeToString(auth.getBytes()); + headerMap.put("Authorization", "Basic " + encodedAuth); + + return headerMap; + } + + + /** + * 创建成员 + * + * @param createMemberRequestDTO 创建成员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean createMember(CreateMemberRequestDTO createMemberRequestDTO) { + log.info("GamesPGTServiceImpl [createMember] 请求参数 {}", createMemberRequestDTO); + Map headerMap = this.getKey(createMemberRequestDTO); + Map params = new LinkedHashMap<>(); + params.put("username", createMemberRequestDTO.getAccount()); + params.put("productId", productId); + + PGTCreateMemberResponse member = pgtClient.createMember(params, headerMap); + if (this.getIsSuccess(member.getCode())) { + return Boolean.TRUE; + } + //判断是否获取成功 + return Boolean.FALSE; + } + + + /** + * 获取会员信息 + * + * @param memberInfoRequestDTO 会员信息请求dto + * @return {@link MemberInfoResponseDTO } + */ + @Override + public MemberInfoResponseDTO getMemberInfo(MemberInfoRequestDTO memberInfoRequestDTO) { + log.info("GamesPGTServiceImpl [getMemberInfo] 请求参数 {}", memberInfoRequestDTO); + Map params = new LinkedHashMap<>(); + params.put("username", memberInfoRequestDTO.getAccounts()); + params.put("productId", productId); + Map headerMap = this.getKey(memberInfoRequestDTO); + PGTBalanceResponse memberInfo = pgtClient.getMemberInfo(JsonUtil.mapToQueryString(params), headerMap); + //判断是否获取成功 + if (this.getIsSuccess(memberInfo.getCode())) { + MemberInfoResponseDTO memberInfoResponseDTO = MemberInfoResponseDTO.builder() + .status(GameMemberStatus.UNKNOWN.getCode()) + .balance(memberInfo.getData().getBalance()) + .account(memberInfoRequestDTO.getAccounts()) + .build(); + return memberInfoResponseDTO; + } else { + throw new BaseException(memberInfo.getMessage()); + } + } + + /** + * 无重定向登录 + * + * @param gamesLogin 游戏登录 + * @return {@link String } + */ + @Override + public String loginWithoutRedirect(GamesLogin gamesLogin) { + log.info("GamesPGTServiceImpl [loginWithoutRedirect] 请求参数 {}", gamesLogin); + Map params = new LinkedHashMap<>(); + params.put("username", gamesLogin.getAccount()); + params.put("productId", productId); + params.put("gameCode", gamesLogin.getGameId()); + params.put("isMobileLogin", PlatformHomeType.APP.getValue().equals(gamesLogin.getPlatform())); + params.put("language", gamesLogin.getLang()); + Map key = this.getKey(gamesLogin); + PGTLoginResponse pgtLoginResponse = pgtClient.loginWithoutRedirect(params, key); + //判断是否获取成功 + if (this.getIsSuccess(pgtLoginResponse.getCode())) { + return pgtLoginResponse.getData().getUrl(); + } else { + throw new BaseException(pgtLoginResponse.getMessage()); + } + } + + + /** + * 获取游戏列表 + * + * @param gamesBaseRequestDTO 游戏请求dto + * @return {@link String } + */ + @Transactional + @Override + public String getGameList(GamesBaseRequestDTO gamesBaseRequestDTO) { + List apiGameInfoResponseDTOS = redisCache.getCacheList(CacheConstants.PGT_GAMES); + if (!CollectionUtils.isEmpty(apiGameInfoResponseDTOS)) { + return CacheConstants.PGT_GAMES; + } + + + log.info("GamesPGTServiceImpl [getGameList] 请求参数 {}", gamesBaseRequestDTO); + Map paramsMap = new HashMap<>(); + paramsMap.put("productId", productId); + PGTGameListResponse gameList = pgtClient.getGameList(JsonUtil.mapToQueryString(paramsMap), this.getKey(gamesBaseRequestDTO)); + if (this.getIsSuccess(gameList.getCode())) { + + + //新增游戏 + for (PGTGameListResponse.Game gameIdKey : gameList.getData().getGames()) { + + Game game = Game.builder() + .platformCode(GamePlatforms.PGT.getCode()) + .gameCode(gameIdKey.getCode()) + .build(); + List games = gameService.selectGameList(game); + int platformType = PGTGameType.findSystemByCode(gameIdKey.getCategory()); + //不存在这个游戏 + if (CollectionUtils.isEmpty(games)) { + + game.setGameSourceType(gameIdKey.getCategory()); + game.setFreespin(Boolean.FALSE); + game.setDemoStatus(Boolean.FALSE); + game.setPlatformCode(GamePlatforms.PGT.getCode()); + game.setPlatformType(platformType); + game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.PGT.getCode()) + 1); + 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("en-US").name(gameIdKey.getName()).build()); + game.setNameInfo(nameInfos); + gameService.insertGame(game); + } else { + game = games.get(0); + } + gameIdKey.setSystemGameId(game.getId()); + } + + + redisCache.deleteObject(CacheConstants.PGT_GAMES); + redisCache.setCacheList(CacheConstants.PGT_GAMES, gameList.getData().getGames()); + redisCache.expire(CacheConstants.PGT_GAMES, 5L, TimeUnit.HOURS); + } else { + throw new ApiException(ErrorCode.ERROR.getCode()); + } + return CacheConstants.PGT_GAMES; + } + + /** + * 按代理id进行交换转账 + * + * @param exchangeTransferMoneyRequestDTO 外汇转账moeny dto + * @return {@link Long } + */ + @Override + @Transactional + public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesPGTServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); + + String currency = exchangeTransferMoneyRequestDTO.getCurrency(); + + + Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); + String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.PGX.getInfo(), 17); + List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( + GameExchangeMoney.builder() + .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .build() + ); + Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); + + + //获取下一个自增id + GameExchangeMoney exchangeMoney = GameExchangeMoney + .builder() + .tenantKey(exchangeTransferMoneyRequestDTO.getTenantKey()) + .orderId(exchangeTransferMoneyRequestDTO.getOrderId()) + .quota(exchangeTransferMoneyRequestDTO.getQuota()) + .balance(exchangeTransferMoneyRequestDTO.getAmount()) + .exchangeType(exchangeTransferMoneyRequestDTO.getTransferType()) + .currencyCode(currency) + .memberId(member.getId()) + .transactionId(transactionId) + .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; + + // 获取第三方钱包余额 + MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() + .accounts(exchangeTransferMoneyRequestDTO.getAccount()) + .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) + .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) + .build(); + + + //判断是不是提出 + if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { + amountBefore = this.getMemberInfo(gamesBaseRequestDTO).getBalance(); + amount = amountBefore; + } + + + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("username", exchangeTransferMoneyRequestDTO.getAccount()); + paramsMap.put("amount", amount.setScale(2, RoundingMode.DOWN).toString()); + paramsMap.put("transactionRef", transactionId); + paramsMap.put("productId", productId); + Map key = this.getKey(exchangeTransferMoneyRequestDTO); + PGTExchangeTransferResponse errorResponse; + //判断是不是提出 + if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { + errorResponse = pgtClient.withdraw(paramsMap, key); + } else { + errorResponse = pgtClient.deposit(paramsMap, key); + } + + if (this.getIsSuccess(errorResponse.getCode())) { + PGTExchangeTransferResponse.BalanceData data = errorResponse.getData(); + //更新数据 + exchangeMoney.setBalance(data.getAmount()); + exchangeMoney.setCoinBefore(data.getBeforeBalance()); + exchangeMoney.setCoinAfter(data.getBalance()); + exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); + exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); + 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()); + } + return exchangeMoney.getId(); + } + + /** + * 汇兑转移状态 + * + * @param exchangeTransferMoneyRequestDTO 兑换转账请求dto + * @return {@link Boolean } + */ + @Override + public ExchangeTransferStatusResponseDTO exchangeTransferStatus(ExchangeTransferStatusRequestDTO exchangeTransferMoneyRequestDTO) { + log.info("GamesPGTServiceImpl [exchangeTransferStatus] 请求参数 {}", exchangeTransferMoneyRequestDTO); + GameExchangeMoney gameExchangeMoney = gameExchangeMoneyService.selectGameExchangeMoneyById(exchangeTransferMoneyRequestDTO.getGameExchangeMoneyId()); + Map paramsMap = new LinkedHashMap<>(); + paramsMap.put("username", exchangeTransferMoneyRequestDTO.getAccount()); + paramsMap.put("transactionRef", exchangeTransferMoneyRequestDTO.getOrderId()); + paramsMap.put("productId", productId); + if (TransferType.ALL.getCode().equals(gameExchangeMoney.getExchangeType())) { + paramsMap.put("type", "WITHDRAW"); + } else { + paramsMap.put("type", "DEPOSIT"); + } + Map key = this.getKey(exchangeTransferMoneyRequestDTO); + PGTTransactionResponse transactionResponse = pgtClient.exchangeTransferStatus(paramsMap, key); + Integer status = StatusType.IN_PROGRESS.getValue(); + if (this.getIsSuccess(transactionResponse.getCode())) { + status = transactionResponse.getData().isSuccess() ? StatusType.SUCCESS.getValue() : StatusType.FAILURE.getValue(); + } else { + 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; + } + + + /** + * 按时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link List }<{@link GameBettingDetails }> + */ + @Override + public Boolean getBetRecordByTime(BetRecordByTimeDTO betRecordByTimeDTO) { + //请求参数 + 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()); + } + } + + /** + * 按历史时间获取投注记录 + * + * @param betRecordByTimeDTO 按时间dto投注记录 + * @return {@link Boolean } + */ + @Override + public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { + //请求参数 + 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()); + } + } + + /** + * 赠送免费局数 + * + * @param createFreeSpinRequest 创建自由旋转请求 + * @return {@link Boolean } + */ + @Override + public Boolean createFreeSpin(CreateFreeSpinRequestDTO createFreeSpinRequest) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 获取游戏详细信息 + * + * @param getGameDetailRequestDTO 获取游戏详细信息请求dto + * @return {@link GetGameDetailResponseDTO } + */ + @Override + public GetGameDetailResponseDTO getGameDetail(GetGameDetailRequestDTO getGameDetailRequestDTO) { + //请求参数 + 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; + } + } + + /** + * 强制会员从游戏注销 + * + * @param kickMemberRequestDTO 踢会员请求dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMember(KickMemberRequestDTO kickMemberRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 踢成员全部 + * + * @param kickMemberAllDTO 踢成员全部dto + * @return {@link Boolean } + */ + @Override + public Boolean kickMemberAll(KickMemberAllDTO kickMemberAllDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 免费游戏玩家使用的纪录 + * + * @param getFreeSpinDashflowRequestDTO 获取自由旋转dashflow请求dto + * @return {@link List }<{@link GameFreeRecord }> + */ + @Override + public List getFreeSpinDashflow(GetFreeSpinDashflowRequestDTO getFreeSpinDashflowRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 取消赠送免费局数 + * + * @param cancelFreeSpinRequestDTO 取消免费旋转请求 + * @return {@link Boolean } + */ + @Override + public Boolean cancelFreeSpin(CancelFreeSpinRequestDTO cancelFreeSpinRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + /** + * 游戏演示登录 + * + * @param gameDemoLoginRequestDTO 游戏演示登录请求dto + * @return {@link GameDemoLoginResponseDTO } + */ + @Override + public GameDemoLoginResponseDTO gameDemoLogin(GameDemoLoginRequestDTO gameDemoLoginRequestDTO) { + throw new ApiException(ErrorCode.PLATFORM_NOT_METHODS.getCode()); + } + + + /** + * 批量插入 + * + * @param dataBean 数据bean + */ + private synchronized void batchInsert(List dataBean, GamesBaseRequestDTO gamesBaseRequestDTO) { + List gameBettingDetails = new ArrayList<>(); + List wagersIds = new ArrayList<>(); + + //数据转化 + for (PGTTransactionDetailsResponse.Transaction bean : dataBean) { + GameBettingDetails bettingDetails = this.dataBuild(GamesDataBuildDTO.builder().agentId(gamesBaseRequestDTO.getAgentId()) + .platform(gamesBaseRequestDTO.getVendor()) + .data(bean).build()); + if (!ObjectUtils.isEmpty(bettingDetails)) { + bettingDetails.setId(IdUtil.getSnowflakeNextId()); + gameBettingDetails.add(bettingDetails); + } + wagersIds.add(String.valueOf(bean.getId())); + } + if (!CollectionUtils.isEmpty(gameBettingDetails)) { + //查询重复数据id + List removeWagersIds = gameBettingDetailsService.selectGameBettingDetailsByWagersId(wagersIds, GamePlatforms.PGX.getInfo()); + //用steam流清除list中与wagersIds集合相同的数据 + gameBettingDetails = gameBettingDetails.stream() + .filter(detail -> !removeWagersIds.contains(detail.getWagersId())) + .collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(gameBettingDetails)) { + gameBettingDetailsService.batchInsert(gameBettingDetails); + + + } + } + + } + + /** + * 数据构建 + * + * @param gamesDataBuildDTO 数据 + * @return {@link GameBettingDetails } + */ + @Override + public GameBettingDetails dataBuild(GamesDataBuildDTO gamesDataBuildDTO) { + //转化类 + PGTTransactionDetailsResponse.Transaction resultBean = (PGTTransactionDetailsResponse.Transaction) gamesDataBuildDTO.getData(); + + + //只要结算的数据 + if (!PGTBetStatus.SETTLED.getType().equals(resultBean.getBetStatus())) { + return null; + } + + + Member member = memberService.selectMemberByGameAccount(resultBean.getUsername()); + if (ObjectUtils.isEmpty(member)) { + return null; + } + List gamesDatas = redisCache.getCacheList(CacheConstants.PGT_GAMES); + Map dataDTOMap = gamesDatas.stream().collect(Collectors.toMap(PGTGameListResponse.Game::getCode, e -> e)); + PGTGameListResponse.Game gamesDataDTO = dataDTOMap.get(resultBean.getGameCode()); + + + //数据构造 + GameBettingDetails gameBettingDetails = GameBettingDetails.builder() + .tenantKey(member.getTenantKey()) + //保存我们的币种id + .currencyCode(gamesDataBuildDTO.getPlatform().getOurCurrency(resultBean.getCurrency())) + .memberId(member.getId()) + .gameCode(resultBean.getGameCode()) + .gameType(PGTGameType.findSystemByCode(gamesDataDTO.getCategory())) + .platformCode(GamePlatforms.PGT.getCode()) + .gameId(gamesDataDTO.getSystemGameId()) + .gameName(gamesDataDTO.getName()) + .gameStatus(PGTPayoutStatus.getByCode(resultBean.getPayoutStatus()).getSystemCode()) + .gameStatusType(1) + .gameCurrencyCode(resultBean.getCurrency()) + .account(resultBean.getUsername()) + .wagersId(resultBean.getBetId()) + .wagersTime(resultBean.getAccountingDate().getTime()) + .betAmount(resultBean.getStake()) + .payoffTime(resultBean.getAccountingDate().getTime()) + .payoffAmount(resultBean.getPayout()) + .settlementTime(resultBean.getAccountingDate().getTime()) + .turnover(resultBean.getStake()) + .orderNo(resultBean.getRoundId()) + .settlementStatus(SettlementStatusEnum.COMPLETED.getCode()) + .build(); + gameBettingDetails.setCreateBy(Constants.SYSTEM); + gameBettingDetails.setCreateTime(DateUtils.getNowDate()); + return gameBettingDetails; + } +} diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/client/PGXClient.java b/ff-game/src/main/java/com/ff/game/api/pgx/client/PGXClient.java index baf98c1..d85909f 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgx/client/PGXClient.java +++ b/ff-game/src/main/java/com/ff/game/api/pgx/client/PGXClient.java @@ -106,13 +106,13 @@ public interface PGXClient { * * @return {@link PGXBetHistoryResponse } */ - @Get(url = "http://fetch.336699bet.com/fetchbykey.aspx?{parameters}") - PGXBetHistoryResponse getBetRecordByTime(@Var("parameters") String parameters); + @Get(url = "{url}/fetchbykey.aspx?{parameters}") + PGXBetHistoryResponse getBetRecordByTime(@Var("url") String url,@Var("parameters") String parameters); - @Get(url = "http://fetch.336699bet.com/fetchArchieve.aspx?{parameters}") - PGXBetHistoryResponse getBetRecordByHistoryTime(@Var("parameters") String parameters); + @Get(url = "{url}/fetchArchieve.aspx?{parameters}") + PGXBetHistoryResponse getBetRecordByHistoryTime(@Var("url") String url,@Var("parameters") String parameters); /** diff --git a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXExchangeTransferStatusResponse.java b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXExchangeTransferStatusResponse.java index e91c2a7..30881ba 100644 --- a/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXExchangeTransferStatusResponse.java +++ b/ff-game/src/main/java/com/ff/game/api/pgx/dto/PGXExchangeTransferStatusResponse.java @@ -3,6 +3,8 @@ package com.ff.game.api.pgx.dto; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; +import java.math.BigDecimal; + /** * pgxexchange传输状态响应 * @@ -45,7 +47,7 @@ public class PGXExchangeTransferStatusResponse { /** 交易金额 (double类型) */ @JsonProperty("amount") - private double amount; + private BigDecimal amount; /** 运营商的参考ID (String类型) */ @JsonProperty("ref_id") 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..65c4e08 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,37 +228,23 @@ 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) + .platformType(GPXGameType.SL.getSystemCode()) .build(); List games = gameService.selectGameList(game); //不存在这个游戏 if (CollectionUtils.isEmpty(games)) { game.setGameSourceType(GPXGameType.SL.getCode()); game.setFreespin(Boolean.FALSE); - game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.PGX.getCode()) + 1); + game.setSortNo(gameService.selectMaxSortNo(GPXGameType.SL.getSystemCode(), GamePlatforms.PGX.getCode()) + 1); game.setGameName(gamesDataDTO.getGameName()); game.setCreateBy(Constants.SYSTEM); game.setPlatformCode(GamePlatforms.PGX.getCode()); - game.setPlatformType(platformType); + game.setPlatformType(GPXGameType.SL.getSystemCode()); + game.setGameId(StringUtils.addSuffix(GamePlatforms.PGX.getCode(), gamesDataDTO.getGameId())); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(gamesDataDTO.getGameName(), "en-US")); game.setNameInfo(nameInfos); @@ -269,16 +253,6 @@ public class GamesPGXServiceImpl 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("en-US") - .createBy(Constants.SYSTEM) - .build()); - }*/ - } @@ -303,11 +277,6 @@ public class GamesPGXServiceImpl implements IGamesService { public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesPGXServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.PGX.getInfo()) -// .code(exchangeTransferMoneyRequestDTO.getAgentId()) -// .currency(exchangeTransferMoneyRequestDTO.getCurrency()) -// .build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); String transactionId = gameExchangeMoneyService.getTransactionId(GamePlatforms.PGX.getInfo(), 17); @@ -319,7 +288,6 @@ public class GamesPGXServiceImpl implements IGamesService { ); Assert.isTrue(CollectionUtils.isEmpty(gameExchangeMonies), "订单号重复"); -// GameSecretKey gameSecretKey = gameSecretKeyService.selectGameSecretKeyByCode(exchangeTransferMoneyRequestDTO.getAgentId()); //获取下一个自增id GameExchangeMoney exchangeMoney = GameExchangeMoney @@ -335,7 +303,10 @@ public class GamesPGXServiceImpl implements IGamesService { .platformCode(GamePlatforms.PGX.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()) ? PGXTransferType.WITHDRAW.getCode() : PGXTransferType.DEPOSIT.getCode(); @@ -346,6 +317,10 @@ public class GamesPGXServiceImpl implements IGamesService { MemberInfoRequestDTO gamesBaseRequestDTO = MemberInfoRequestDTO.builder() .accounts(exchangeTransferMoneyRequestDTO.getAccount()) .agentId(exchangeTransferMoneyRequestDTO.getAgentId()) + .vendor(exchangeTransferMoneyRequestDTO.getVendor()) + .keyInfo(exchangeTransferMoneyRequestDTO.getKeyInfo()) + .systemCurrency(exchangeTransferMoneyRequestDTO.getSystemCurrency()) + .currency(exchangeTransferMoneyRequestDTO.getCurrency()) .agentKey(exchangeTransferMoneyRequestDTO.getAgentKey()) .build(); @@ -383,16 +358,13 @@ public class GamesPGXServiceImpl implements IGamesService { exchangeMoney.setCurrencyBefore(exchangeMoney.getCoinBefore()); exchangeMoney.setCurrencyAfter(exchangeMoney.getCoinAfter()); exchangeMoney.setStatus(StatusType.IN_PROGRESS.getValue()); - - gameExchangeMoneyService.insertGameExchangeMoney(exchangeMoney); - //确认状态 - ExchangeTransferStatusRequestDTO exchangeTransferStatusRequestDTO = new ExchangeTransferStatusRequestDTO(); - exchangeTransferStatusRequestDTO.setAccount(member.getGameAccount()); - exchangeTransferStatusRequestDTO.setOrderId(exchangeMoney.getTransactionId()); - exchangeTransferStatusRequestDTO.setAgentId(keyInfo.getCode()); - exchangeTransferStatusRequestDTO.setAgentKey(keyInfo.getKey()); - 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("GamesFCServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", errorResponse.getErrCode()); throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } @@ -406,7 +378,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()); @@ -415,24 +387,16 @@ public class GamesPGXServiceImpl implements IGamesService { paramsMap.put("signature", key); PGXExchangeTransferStatusResponse exchangeTransferStatusResponse = PGXClient.exchangeTransferStatus(JsonUtil.mapToQueryString(paramsMap)); + Integer status = StatusType.IN_PROGRESS.getValue(); if (this.getIsSuccess(exchangeTransferStatusResponse.getErrCode())) { - List gameExchangeMonies = gameExchangeMoneyService.selectGameExchangeMoneyList( - GameExchangeMoney.builder() - .platformCode(GamePlatforms.PGX.getInfo()) - .transactionId(exchangeTransferMoneyRequestDTO.getOrderId()) - .build() - ); - - for (GameExchangeMoney exchangeMoney : gameExchangeMonies) { - //更新数据 - exchangeMoney.setStatus(PGXTransactionStatus.findValueByCode(exchangeTransferStatusResponse.getStatus())); - gameExchangeMoneyService.updateGameExchangeMoney(exchangeMoney); - } - return Boolean.TRUE; + status= PGXTransactionStatus.findValueByCode(exchangeTransferStatusResponse.getStatus()); } else { - log.error("GamesPGXServiceImpl [exchangeTransferStatus]错误代码{},错误信息{}", exchangeTransferStatusResponse.getErrCode(), exchangeTransferStatusResponse.getErrMsg()); - return Boolean.FALSE; + status = StatusType.FAILURE.getValue(); } + return ExchangeTransferStatusResponseDTO.builder() + .statusType(status) + .balance(exchangeTransferStatusResponse.getAmount()) + .build(); } @@ -451,7 +415,8 @@ public class GamesPGXServiceImpl implements IGamesService { String key = this.getKey(paramsMap, betRecordByTimeDTO); paramsMap.put("versionkey", 0); paramsMap.put("signature", key); - PGXBetHistoryResponse betRecordByTime = PGXClient.getBetRecordByTime(JsonUtil.mapToQueryString(paramsMap)); + String betUrl = betRecordByTimeDTO.getVendor().getUrlInfo().getBetUrl(); + PGXBetHistoryResponse betRecordByTime = PGXClient.getBetRecordByTime(betUrl,JsonUtil.mapToQueryString(paramsMap)); if (this.getIsSuccess(betRecordByTime.getErrCode())) { List results = JSON.parseArray(betRecordByTime.getResult(), PGXBetHistoryResponse.Result.class); @@ -478,7 +443,8 @@ public class GamesPGXServiceImpl implements IGamesService { String key = this.getKey(paramsMap, betRecordByTimeDTO); paramsMap.put("versionkey", 0); paramsMap.put("signature", key); - PGXBetHistoryResponse betRecordByTime = PGXClient.getBetRecordByHistoryTime(JsonUtil.mapToQueryString(paramsMap)); + String betUrl = betRecordByTimeDTO.getVendor().getUrlInfo().getBetUrl(); + PGXBetHistoryResponse betRecordByTime = PGXClient.getBetRecordByHistoryTime(betUrl,JsonUtil.mapToQueryString(paramsMap)); if (this.getIsSuccess(betRecordByTime.getErrCode())) { List results = JSON.parseArray(betRecordByTime.getResult(), PGXBetHistoryResponse.Result.class); @@ -623,10 +589,7 @@ public class GamesPGXServiceImpl implements IGamesService { //转化类 PGXBetHistoryResponse.Result resultBean = (PGXBetHistoryResponse.Result) gamesDataBuildDTO.getData(); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.PGX.getInfo()) -// .code(gamesDataBuildDTO.getAgentId()) -// .build()); + Member member = memberService.selectMemberByGameAccount(resultBean.getMember()); if (ObjectUtils.isEmpty(member)) { 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..c697f95 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 @@ -221,18 +221,7 @@ public class GamesSAServiceImpl 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.SA.getInfo()); - gamePlatform.setPlatformType(PlatformType.CARD_GAME.getCode()); - gamePlatform.setPlatformName(GamePlatforms.SA.getInfo() + PlatformType.CARD_GAME.getName()); - gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); - gamePlatform.setCreateBy(Constants.SYSTEM); - gamePlatformService.insertGamePlatform(gamePlatform); - }*/ + Game game = gameService.selectGameById(GAME_ID); Integer platformType = PlatformType.CARD_GAME.getCode(); //不存在这个游戏 @@ -240,7 +229,6 @@ public class GamesSAServiceImpl implements IGamesService { game = new Game(); game.setId(GAME_ID); game.setSortNo(gameService.selectMaxSortNo(platformType, GamePlatforms.SA.getCode()) + 1); - //game.setPlatformId(gamePlatform.getId()); game.setPlatformCode(GamePlatforms.SA.getCode()); game.setPlatformType(platformType); game.setGameCode("1"); @@ -249,19 +237,11 @@ public class GamesSAServiceImpl implements IGamesService { game.setCreateBy(Constants.SYSTEM); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo("真人棋牌", "zh-CN")); + game.setGameId(StringUtils.addSuffix(GamePlatforms.SA.getCode(), 1)); game.setNameInfo(nameInfos); - gameService.insertGame(game); + gameService.updateGame(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.SA_GAMES; } @@ -275,10 +255,6 @@ public class GamesSAServiceImpl implements IGamesService { @Transactional public Long exchangeTransferByAgentId(ExchangeTransferMoneyRequestDTO exchangeTransferMoneyRequestDTO) { log.info("GamesSAServiceImpl [exchangeTransferByAgentId] 请求参数 {}", exchangeTransferMoneyRequestDTO); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.SA.getInfo()) -// .code(exchangeTransferMoneyRequestDTO.getAgentId()) -// .build()); Member member = memberService.selectMemberByGameAccount(exchangeTransferMoneyRequestDTO.getAccount()); @@ -310,6 +286,11 @@ public class GamesSAServiceImpl implements IGamesService { .platformCode(GamePlatforms.SA.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); + if (TransferType.ALL.getCode().equals(exchangeTransferMoneyRequestDTO.getTransferType())) { Map params = new LinkedHashMap<>(); params.put("Username", exchangeTransferMoneyRequestDTO.getAccount()); @@ -330,9 +311,13 @@ public class GamesSAServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(BigDecimal.ZERO); exchangeMoney.setCurrencyBefore(exchangeMoney.getCurrencyBefore()); exchangeMoney.setCurrencyAfter(exchangeMoney.getCurrencyAfter()); - 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("GamesXKServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", errorCode); throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } @@ -358,9 +343,13 @@ public class GamesSAServiceImpl implements IGamesService { exchangeMoney.setCoinAfter(saCreditBalanceResponse.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("GamesXKServiceImpl [exchangeTransferByAgentId] 金额转移失败,错误代码{}", errorCode); throw new ApiException(ErrorCode.BALANCE_TRANSFER_FAILED.getCode()); } @@ -377,7 +366,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()); } @@ -414,7 +403,7 @@ public class GamesSAServiceImpl implements IGamesService { return Boolean.TRUE; } else { - log.error("GamesXKServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{}", errorCode); + log.error("GamesSAServiceImpl [getBetRecordByTime] 获取投注记录失败,错误代码{}", errorCode); } return Boolean.FALSE; } @@ -427,7 +416,33 @@ public class GamesSAServiceImpl implements IGamesService { */ @Override public Boolean getBetRecordByHistoryTime(BetRecordByTimeDTO betRecordByTimeDTO) { - return Boolean.TRUE; + String startTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getStartTime(), "Asia/Shanghai", DateUtils.YYYY_MM_DD_HH_MM_SS); + String endTime = DateUtils.convertTimeZone(betRecordByTimeDTO.getEndTime(), "Asia/Shanghai", DateUtils.YYYY_MM_DD_HH_MM_SS); + + //请求参数 + log.info("GamesSAServiceImpl [getBetRecordByHistoryTime] 请求参数 {}", betRecordByTimeDTO); + Map params = new LinkedHashMap<>(); + params.put("FromTime", startTime); + params.put("ToTime", endTime); + String query = JsonUtil.mapToQueryString(params); + betRecordByTimeDTO.setQuery(query); + String key = this.getKey(betRecordByTimeDTO, "GetAllBetDetailsForTimeIntervalDV"); + + String result = SAClient.getBetRecordByTime(key); + SAGetAllBetDetailsResponse saGetAllBetDetailsResponse = XmlUtils.xmlDecrypt(result, SAGetAllBetDetailsResponse.class); + Integer errorCode = saGetAllBetDetailsResponse.getErrorMsgId(); + + + //判断是否获取成功 + if (this.getIsSuccess(errorCode)) { + //数据组装 + this.batchInsert(saGetAllBetDetailsResponse, betRecordByTimeDTO); + + return Boolean.TRUE; + } else { + log.error("GamesSAServiceImpl [getBetRecordByHistoryTime] 获取投注记录失败,错误代码{}", errorCode); + } + return Boolean.FALSE; } /** @@ -569,10 +584,6 @@ public class GamesSAServiceImpl implements IGamesService { //转化类 SAGetAllBetDetailsResponse.BetDetail resultBean = (SAGetAllBetDetailsResponse.BetDetail) gamesDataBuildDTO.getData(); -// GameSecretKeyCurrency currencyDTO = gameSecretKeyCurrencyService.findByGameSecretKeyCurrencyDTO(GameSecretKeyCurrencyDTO.builder() -// .platformCode(GamePlatforms.SA.getInfo()) -// .currency(resultBean.getCurrency()) -// .build()); Member member = memberService.selectMemberByGameAccount(resultBean.getUsername()); if (ObjectUtils.isEmpty(member)) { diff --git a/ff-game/src/main/java/com/ff/game/api/km/success/MyKMSuccessCondition.java b/ff-game/src/main/java/com/ff/game/api/success/MySuccessCondition.java similarity index 90% rename from ff-game/src/main/java/com/ff/game/api/km/success/MyKMSuccessCondition.java rename to ff-game/src/main/java/com/ff/game/api/success/MySuccessCondition.java index 3a29b10..f1c97d2 100644 --- a/ff-game/src/main/java/com/ff/game/api/km/success/MyKMSuccessCondition.java +++ b/ff-game/src/main/java/com/ff/game/api/success/MySuccessCondition.java @@ -1,4 +1,4 @@ -package com.ff.game.api.km.success; +package com.ff.game.api.success; import com.dtflys.forest.callback.SuccessWhen; @@ -11,7 +11,7 @@ import com.dtflys.forest.http.ForestResponse; * @author shi * @date 2025/04/02 */ -public class MyKMSuccessCondition implements SuccessWhen { +public class MySuccessCondition implements SuccessWhen { /** * 请求成功条件 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..c916bb1 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 @@ -10,6 +10,7 @@ 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.JsonUtil; +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; @@ -226,20 +227,6 @@ public class GamesXKServiceImpl implements IGamesService { if (this.getIsSuccess(xkGamesDTO.getCode())) { for (XKGamesDTO.DataBean gamesDataDTO : xkGamesDTO.getData()) { - /*GamePlatform gamePlatform = GamePlatform.builder() - .platformType(XKGameType.findSystemByCode(gamesDataDTO.getGameCategoryId())) - .platformCode(GamePlatforms.XK.getCode()) - .build(); - List gamePlatforms = gamePlatformService.selectGamePlatformList(gamePlatform); - //没有此平台就新增一个平台 - if (CollectionUtils.isEmpty(gamePlatforms)) { - gamePlatform.setPlatformName(GamePlatforms.XK.getInfo() + XKGameType.findInfoByCode(gamesDataDTO.getGameCategoryId())); - gamePlatform.setSortNo(gamePlatformService.selectMaxSortNo() + 1); - gamePlatform.setCreateBy(Constants.SYSTEM); - gamePlatformService.insertGamePlatform(gamePlatform); - } else { - gamePlatform = gamePlatforms.get(0); - }*/ Integer platformType = XKGameType.findSystemByCode(gamesDataDTO.getGameCategoryId()); Game game = Game.builder() //.platformId(gamePlatform.getId()) @@ -257,7 +244,7 @@ public class GamesXKServiceImpl implements IGamesService { game.setPlatformType(platformType); game.setGameName(gamesDataDTO.getName()); game.setCreateBy(Constants.SYSTEM); - + game.setGameId(StringUtils.addSuffix(GamePlatforms.SA.getCode(), 1)); List nameInfos = new ArrayList<>(); nameInfos.add(new NameInfo(gamesDataDTO.getName(), "zh-CN")); game.setNameInfo(nameInfos); @@ -267,15 +254,6 @@ public class GamesXKServiceImpl 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()); - }*/ } redisCache.deleteObject(CacheConstants.XK_GAMES); @@ -369,8 +347,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/GameBettingDetails.java b/ff-game/src/main/java/com/ff/game/domain/GameBettingDetails.java index 06791d1..76a5785 100644 --- a/ff-game/src/main/java/com/ff/game/domain/GameBettingDetails.java +++ b/ff-game/src/main/java/com/ff/game/domain/GameBettingDetails.java @@ -67,8 +67,8 @@ public class GameBettingDetails extends BaseEntity @Excel(name = "游戏名称") private String gameName; - /** 注单状态 1: 赢 2: 输 3: 平局 */ - @Excel(name = "注单状态 1: 赢 2: 输 3: 平局") + /** 注单状态 1: 赢 2: 输 3: 平局 4 未知 */ + @Excel(name = "注单状态 1: 赢 2: 输 3: 平局 4 未知") private Integer gameStatus; /** 注单类型 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/domain/Platform.java b/ff-game/src/main/java/com/ff/game/domain/Platform.java index 6352a41..f786d52 100644 --- a/ff-game/src/main/java/com/ff/game/domain/Platform.java +++ b/ff-game/src/main/java/com/ff/game/domain/Platform.java @@ -64,6 +64,12 @@ public class Platform extends BaseEntity { return this.type == Type.MULTI.getCode(); } + /** + * 获取我们货币 + * + * @param currency 它们的货币 + * @return {@link String } + */ public String getOurCurrency(String currency) { Set> entrySet= currencyInfo.entrySet(); for (Map.Entry entry : entrySet) { diff --git a/ff-game/src/main/java/com/ff/game/domain/UrlInfo.java b/ff-game/src/main/java/com/ff/game/domain/UrlInfo.java index c8f3f96..2dfb5bf 100644 --- a/ff-game/src/main/java/com/ff/game/domain/UrlInfo.java +++ b/ff-game/src/main/java/com/ff/game/domain/UrlInfo.java @@ -13,4 +13,8 @@ public class UrlInfo implements Serializable { private String url; private String loginUrl; private String hallCode; + /** + * 投注网址 + */ + private String betUrl; } 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/IMemberService.java b/ff-game/src/main/java/com/ff/member/service/IMemberService.java index c31748e..6aa977d 100644 --- a/ff-game/src/main/java/com/ff/member/service/IMemberService.java +++ b/ff-game/src/main/java/com/ff/member/service/IMemberService.java @@ -30,9 +30,11 @@ public interface IMemberService /** * 生成会员游戏账号 * + * @param platformCode 平台代码 + * @param tenantSn 租户sn * @return {@link String } */ - String getMemberGameAccount(String platformCode); + String getMemberGameAccount(String platformCode,String tenantSn); /** * 新增会员 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 971752c..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 @@ -53,19 +53,21 @@ public class MemberServiceImpl implements IMemberService { * @return {@link String } */ @Override - public synchronized String getMemberGameAccount(String platformCode) { + public synchronized String getMemberGameAccount(String platformCode,String tenantSn) { String gameAccount = null; if (GamePlatforms.DG.getInfo().equals(platformCode) || GamePlatforms.KM.getInfo().equals(platformCode)) { + tenantSn=tenantSn.toUpperCase(); do { - gameAccount = RandomGeneratorUtils.generateRandomAccountUpper(); + gameAccount = RandomGeneratorUtils.generateRandomAccountUpper()+tenantSn; } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); - } else if (GamePlatforms.PG.getInfo().equals(platformCode) || GamePlatforms.PGX.getInfo().equals(platformCode)) { + } else if (GamePlatforms.PG.getInfo().equals(platformCode) || GamePlatforms.PGX.getInfo().equals(platformCode) || GamePlatforms.PGT.getInfo().equals(platformCode)) { + tenantSn=tenantSn.toLowerCase(); do { - gameAccount = RandomGeneratorUtils.generateRandomAccountLower(); + gameAccount = RandomGeneratorUtils.generateRandomAccountLower()+tenantSn; } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); } else { do { - gameAccount = RandomGeneratorUtils.generateRandomAccount(); + gameAccount = RandomGeneratorUtils.generateRandomAccount()+tenantSn; } while (!ObjectUtils.isEmpty(memberMapper.selectMemberByGameAccount(gameAccount))); } @@ -129,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..882bbf0 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 @@ -92,6 +92,7 @@ public class GameTask { * @param backTimeMin */ public void syncRealtimeBetRecord(String platformCode, Integer backTimeMin) { + this.syncGameList(platformCode); //捞取指定分钟前的数据 Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTimeMin); Long endTime = DateUtils.getNowDate(); @@ -134,7 +135,7 @@ public class GameTask { * @param backTimeMin */ public void syncHistoryBetRecord(String platformCode, Integer backTimeMin) { - + this.syncGameList(platformCode); //捞取指定分钟前的数据 Long startTime = DateUtils.addOrSubtractMinutes(DateUtils.getNowDate(), backTimeMin); Long endTime = DateUtils.getNowDate(); @@ -206,9 +207,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 910da1b..48f1b77 100644 --- a/ff-game/src/main/resources/mapper/game/GameMapper.xml +++ b/ff-game/src/main/resources/mapper/game/GameMapper.xml @@ -12,11 +12,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + - - @@ -24,7 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select * 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 @@ -48,19 +49,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" @@ -72,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, @@ -88,6 +106,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" create_time, update_by, update_time, + name_info, + game_id, + platform_code, + platform_type, #{id}, #{sortNo}, @@ -102,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}, @@ -120,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} @@ -136,11 +166,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + - + - + + @@ -181,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}